001/*
002 * Copyright (c) 2009-2015 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: crawl $'
006 * '$Date: 2015-04-03 16:09:32 -0700 (Fri, 03 Apr 2015) $' 
007 * '$Revision: 33316 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029package org.kepler.profiling.gui;
030
031import java.awt.Component;
032import java.awt.Font;
033import java.util.Map;
034
035import javax.swing.JTree;
036import javax.swing.tree.DefaultTreeCellRenderer;
037import javax.swing.tree.TreeModel;
038
039import org.kepler.gui.AnnotatedPTree;
040import org.kepler.gui.OntologyTreeCellRenderer;
041import org.kepler.moml.NamedObjId;
042import org.kepler.objectmanager.lsid.KeplerLSID;
043import org.kepler.provenance.ProvenanceRecorder;
044import org.kepler.provenance.QueryException;
045import org.kepler.provenance.Queryable;
046
047import ptolemy.actor.Actor;
048import ptolemy.actor.IOPort;
049import ptolemy.kernel.util.NamedObj;
050
051/** A annotated tree and tree cell renderer showing port I/O amounts.
052 * 
053 * @author Daniel Crawl
054 * @version $Id: AnnotatedPTree.java 17480 2009-04-07 23:54:20Z aschultz $
055 */
056public class AnnotatedActorIOPTree extends AnnotatedPTree {
057
058        public AnnotatedActorIOPTree(TreeModel model, Component parent, boolean showRootIcon, NamedObj rootObj) {
059        super(model, parent, showRootIcon);
060
061        super.initAnotatedPTree();
062                setCellRenderer(new ActorIOOntologyTreeCellRenderer(showRootIcon, rootObj));
063                Font font = getFont();
064        setFont(new Font(font.getName(), font.getStyle(),
065                ExecutionMonitorPanel.FONT_SIZE));
066        }
067}
068
069class ActorIOOntologyTreeCellRenderer extends OntologyTreeCellRenderer {
070
071    public ActorIOOntologyTreeCellRenderer(NamedObj root) {
072        this(true, root);
073    }
074    
075    public ActorIOOntologyTreeCellRenderer(boolean useRootIcon, NamedObj root) {
076        super(useRootIcon);
077        _top = root;
078        try {
079            ProvenanceRecorder pr = ProvenanceRecorder.getDefaultProvenanceRecorder(_top);
080            _query = pr.getRecording().getQueryable(true);
081        } catch (Exception e) {
082            System.out.println("Exception getting queryable in ActorIOOntologyTreeCellRenderer: " + e.getMessage());
083        }
084        
085        _wfLSID = NamedObjId.getIdFor(_top);
086    }
087        
088        @Override
089    public Component getTreeCellRendererComponent(JTree tree, Object value,
090                        boolean selected, boolean expanded, boolean leaf, int row,
091                        boolean hasFocus) {
092
093        DefaultTreeCellRenderer component =
094            (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree,
095                value, selected, expanded, leaf, row, hasFocus);
096
097        if((value instanceof Actor) || (value instanceof IOPort))
098        {
099            NamedObj namedObj = (NamedObj)value;
100
101            if(_query != null) {
102                if(namedObj instanceof Actor) {
103                    Actor actor = (Actor)namedObj;
104                    
105                    int read = 0;
106                    int write = 0;
107                    
108                    try {
109                        read = _query.getTotalIOBytesForActor(_wfLSID, null, actor.getFullName(), true);
110                        write = _query.getTotalIOBytesForActor(_wfLSID, null, actor.getFullName(), false);
111                    } catch(QueryException e) {
112                        System.out.println("QueryException: " + e.getMessage());
113                        return component;
114                    };
115
116                    /*
117                    if(actor == _top) {
118                        _topRead = read;
119                        _topWrite = write;
120                    }
121
122                    double relativeRead = 0;
123                    if(_topRead > 0) {
124                        relativeRead = read * 100;
125                        relativeRead /= _topRead;
126                    }
127
128                    double relativeWrite = 0;
129                    if(_topWrite > 0) {
130                        relativeWrite = write * 100;
131                        relativeWrite /= _topWrite;
132                    }
133
134                    String relativeStr = String.format("r/w %5.2f/%5.2f", relativeRead, relativeWrite);
135                     */
136                    
137                    if(actor == _top) {
138                        component.setText(actor.getName() + " read/write bytes");//, max queue size");
139                    }
140                    else {
141                        component.setText(actor.getName() + " " + read + "/" + write);
142                    }
143                }
144                else if(namedObj instanceof IOPort) {
145                    IOPort port = (IOPort)namedObj;
146                    
147                    long totalRead = 0;
148                    long totalWrite = 0;
149
150                    Map<Integer,Integer> readMap;
151                    Map<Integer,Integer> writeMap;
152                    
153                    try {
154                        readMap = _query.getIOBytesForPort(_wfLSID, null, port.getFullName(), true);
155                        writeMap = _query.getIOBytesForPort(_wfLSID, null, port.getFullName(), false);
156                    }
157                    catch(QueryException e) {
158                        System.out.println("QueryException: " + e.getMessage());
159                        return component;
160                    };
161                    
162                    for(Integer bytes : readMap.values()) {
163                        totalRead += bytes;
164                    }
165                    for(Integer bytes : writeMap.values()) {
166                        totalWrite += bytes;
167                    }
168                    
169                    String text = port.getName() + " " + totalRead + "/" + totalWrite;
170                    
171                    /*
172                    if(port.isInput())
173                    {
174                        long maxqs = 0; //perf.getMaxQueueSize(port);
175                        text += ", " + maxqs;
176                    }
177                    */
178                    
179                    component.setText(text);
180                }
181            }
182        }
183        return component;
184        }
185
186        private Queryable _query;
187    private NamedObj _top;
188    private KeplerLSID _wfLSID;
189    //private int _topRead;
190    //private int _topWrite;
191    
192}