// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui.editor.nodes;
import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IElementParameter;
import org.talend.designer.core.DesignerPlugin;
import org.talend.designer.core.ui.editor.nodecontainer.NodeContainer;
import org.talend.designer.runprocess.IPerformanceData;
import org.talend.designer.runprocess.IRunProcessService;
/**
* Element for the performance, linked to a NodeContainer. <br/>
*
* $Id: NodePerformance.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class NodePerformance extends Element {
private NodeContainer nodeContainer;
private String label = ""; //$NON-NLS-1$
private Dimension size = new Dimension();
public NodePerformance(NodeContainer nodeContainer) {
super();
this.nodeContainer = nodeContainer;
}
/**
* Format performance to a simple HTML.
*
* @param data Performance data to be rendered.
* @return HTML string.
*/
private String htmlFromPerformance(String data) {
StringBuffer html = new StringBuffer();
IRunProcessService service = DesignerPlugin.getDefault().getRunProcessService();
IPerformanceData perf = service.createPerformanceData(data);
if (IPerformanceData.ACTION_PERF.equals(perf.getAction())) {
final String perfPattern = "<font color=''#4477BB''>" + "{0, number,#} rows - {1,number,#.##}s<br>" //$NON-NLS-1$ //$NON-NLS-2$
+ "<b>{2,number,#.##} rows/s</b>" + "</font>"; //$NON-NLS-1$ //$NON-NLS-2$
long lineCount = perf.getLineCount();
long processingTime = perf.getProcessingTime();
double avg = processingTime > 0 ? (double) lineCount * 1000d / (double) processingTime : 0d;
MessageFormat mf = new MessageFormat(perfPattern, Locale.US);
html.append(mf.format(new Object[] { new Long(lineCount), new Double((double) processingTime / 1000d),
new Double(avg) }));
} else if (IPerformanceData.ACTION_START.equals(perf.getAction())) {
final String perfPattern = "<font color='#AA3322'>" + "<i>Starting</i>" + "</font>"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
html.append(perfPattern);
} else if (IPerformanceData.ACTION_STOP.equals(perf.getAction())) {
final String perfPattern = "<font color=''#229922''>" + "{0, number,#} rows in {1,number,#.##}s<br>" //$NON-NLS-1$ //$NON-NLS-2$
+ "<i>{2,number,#.##} rows/s</i>" + "</font>"; //$NON-NLS-1$ //$NON-NLS-2$
long lineCount = perf.getLineCount();
long processingTime = perf.getProcessingTime();
double avg = processingTime > 0 ? (double) lineCount * 1000d / (double) processingTime : 0d;
MessageFormat mf = new MessageFormat(perfPattern);
html.append(mf.format(new Object[] { new Long(lineCount), new Double((double) processingTime / 1000d),
new Double(avg) }));
}
return html.toString();
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.Element#getElementName()
*/
@Override
public String getElementName() {
return nodeContainer.getNode().getElementName();
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.Element#getElementParameters()
*/
@Override
public List<? extends IElementParameter> getElementParameters() {
return nodeContainer.getNode().getElementParameters();
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.Element#getPropertyValue(java.lang.Object)
*/
@Override
public Object getPropertyValue(String id) {
return nodeContainer.getNode().getPropertyValue(id);
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.Element#setPropertyValue(java.lang.Object, java.lang.Object)
*/
@Override
public void setPropertyValue(String id, Object value) {
nodeContainer.getNode().setPropertyValue(id, value);
}
public void setNodeContainer(NodeContainer nodeContainer) {
this.nodeContainer = nodeContainer;
}
public NodeContainer getNodeContainer() {
return this.nodeContainer;
}
public Dimension getSize() {
return this.size;
}
public void setSize(Dimension size) {
this.size = size;
}
/**
* DOC nrousseau Comment method "setPerfData".
*
* @param perfData
*/
public void setPerfData(String perfData) {
setLabel(htmlFromPerformance(perfData));
}
public String getLabel() {
return this.label;
}
public void setLabel(String label) {
this.label = label;
}
public Point getLocation() {
Point loc = this.getNodeContainer().getNode().getLocation().getCopy();
Point offset = this.getNodeContainer().getNodeLabel().getOffset();
Point textOffset = new Point();
textOffset.y = this.getNodeContainer().getNode().getSize().height + 16;
textOffset.x = (this.getNodeContainer().getNode().getSize().width - size.width) / 2;
loc.translate(textOffset.x + offset.x, textOffset.y + offset.y);
return loc;
}
public boolean isReadOnly() {
return nodeContainer.isReadOnly();
}
public void setReadOnly(boolean readOnly) {
}
}