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}