/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.das2.dasml; import java.awt.Component; import java.awt.Dimension; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.das2.DasApplication; import org.das2.DasException; import org.das2.DasNameException; import org.das2.DasPropertyException; import org.das2.NameContext; import org.das2.dataset.DataSetDescriptor; import org.das2.datum.Datum; import org.das2.datum.TimeUtil; import org.das2.datum.Units; import org.das2.graph.DasAxis; import org.das2.graph.DasCanvas; import org.das2.graph.DasCanvasComponent; import org.das2.graph.DasColorBar; import org.das2.graph.DasColumn; import org.das2.graph.DasDevicePosition; import org.das2.graph.DasLabelAxis; import org.das2.graph.DasPlot; import org.das2.graph.DasRow; import org.das2.graph.DefaultPlotSymbol; import org.das2.graph.PlotSymbol; import org.das2.graph.Psym; import org.das2.graph.Renderer; import org.das2.graph.SeriesRenderer; import org.das2.graph.SpectrogramRenderer; import org.das2.graph.StackedHistogramRenderer; import org.das2.graph.SymColor; import org.das2.graph.SymbolLineRenderer; import org.das2.system.DasLogger; import org.das2.util.DasExceptionHandler; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Introduced to factor out all the dasml stuff from the graph package. * @author jbf */ public class Processor { /** Process an <axis> element. * * @param element The DOM tree node that represents the element */ static DasAxis processAxisElement(Element element, FormBase form) throws DasPropertyException, DasNameException, ParseException { String name = element.getAttribute("name"); boolean log = element.getAttribute(DasAxis.PROP_LOG).equals("true"); Datum dataMinimum; Datum dataMaximum; if ("TIME".equals(element.getAttribute("units"))) { String min = element.getAttribute("dataMinimum"); String max = element.getAttribute("dataMaximum"); dataMinimum = (min == null || min.equals("") ? TimeUtil.create("1979-02-26") : TimeUtil.create(min)); dataMaximum = (max == null || max.equals("") ? TimeUtil.create("1979-02-27") : TimeUtil.create(max)); } else { String min = element.getAttribute("dataMinimum"); String max = element.getAttribute("dataMaximum"); dataMinimum = (min == null || min.equals("") ? Datum.create(1.0) : Datum.create(Double.parseDouble(min))); dataMaximum = (max == null || max.equals("") ? Datum.create(10.0) : Datum.create(Double.parseDouble(max))); } int orientation = parseOrientationString(element.getAttribute("orientation")); DasAxis axis = new DasAxis(dataMinimum, dataMaximum, orientation, log); String rowString = element.getAttribute("row"); if (!rowString.equals("")) { DasRow row = (DasRow) form.checkValue(rowString, DasRow.class, ""); axis.setRow(row); } String columnString = element.getAttribute("column"); if (!columnString.equals("")) { DasColumn column = (DasColumn) form.checkValue(columnString, DasColumn.class, ""); axis.setColumn(column); } axis.setLabel(element.getAttribute(DasAxis.PROP_LABEL)); axis.setOppositeAxisVisible(!element.getAttribute(DasAxis.PROP_OPPOSITE_AXIS_VISIBLE).equals("false")); axis.setTickLabelsVisible(!element.getAttribute("tickLabelsVisible").equals("false")); axis.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, axis); return axis; } /** TODO * @param i * @return */ protected static String orientationToString(int i) { switch (i) { case DasAxis.TOP: return "top"; case DasAxis.BOTTOM: return "bottom"; case DasAxis.LEFT: return "left"; case DasAxis.RIGHT: return "right"; default: throw new IllegalStateException("invalid orienation: " + i); } } /** TODO * @param orientationString * @return */ protected static int parseOrientationString(String orientationString) { if (orientationString.equals("horizontal")) { return DasAxis.HORIZONTAL; } else if (orientationString.equals("vertical")) { return DasAxis.VERTICAL; } else if (orientationString.equals("left")) { return DasAxis.LEFT; } else if (orientationString.equals("right")) { return DasAxis.RIGHT; } else if (orientationString.equals("top")) { return DasAxis.TOP; } else if (orientationString.equals("bottom")) { return DasAxis.BOTTOM; } else { throw new IllegalArgumentException("Invalid orientation: " + orientationString); } } /** TODO * @param document * @return */ public static Element getDOMElement( DasAxis axis, Document document) { Element element; if (axis.isAttached()) { element = document.createElement("attachedaxis"); } else { element = document.createElement("axis"); } if (axis.isAttached()) { element.setAttribute("ref", axis.getMasterAxis().getDasName()); } else { String minimumStr = axis.getDataMinimum().toString(); element.setAttribute("dataMinimum", minimumStr); String maximumStr = axis.getDataMaximum().toString(); element.setAttribute("dataMaximum", maximumStr); } element.setAttribute("name", axis.getDasName()); element.setAttribute("row", axis.getRow().getDasName()); element.setAttribute("column", axis.getColumn().getDasName()); element.setAttribute(DasAxis.PROP_LABEL, axis.getLabel()); element.setAttribute(DasAxis.PROP_LOG, Boolean.toString(axis.isLog())); element.setAttribute("tickLabelsVisible", Boolean.toString(axis.isTickLabelsVisible())); element.setAttribute(DasAxis.PROP_OPPOSITE_AXIS_VISIBLE, Boolean.toString(axis.isOppositeAxisVisible())); element.setAttribute("animated", Boolean.toString(axis.isAnimated())); element.setAttribute("orientation", orientationToString(axis.getOrientation())); return element; } static DasAxis processTimeaxisElement(Element element, FormBase form) throws org.das2.DasPropertyException, org.das2.DasNameException, DasException, java.text.ParseException { String name = element.getAttribute("name"); Datum timeMinimum = TimeUtil.create(element.getAttribute("timeMinimum")); Datum timeMaximum = TimeUtil.create(element.getAttribute("timeMaximum")); int orientation = parseOrientationString(element.getAttribute("orientation")); DasAxis timeaxis = new DasAxis(timeMinimum, timeMaximum, orientation); String rowString = element.getAttribute("row"); if (!rowString.equals("")) { DasRow row = (DasRow) form.checkValue(rowString, DasRow.class, ""); timeaxis.setRow(row); } String columnString = element.getAttribute("column"); if (!columnString.equals("")) { DasColumn column = (DasColumn) form.checkValue(columnString, DasColumn.class, ""); timeaxis.setColumn(column); } timeaxis.setDataPath(element.getAttribute("dataPath")); timeaxis.setDrawTca(element.getAttribute("showTca").equals("true")); timeaxis.setLabel(element.getAttribute(DasAxis.PROP_LABEL)); timeaxis.setOppositeAxisVisible(!element.getAttribute(DasAxis.PROP_OPPOSITE_AXIS_VISIBLE).equals("false")); timeaxis.setTickLabelsVisible(!element.getAttribute("tickLabelsVisible").equals("false")); timeaxis.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, timeaxis); return timeaxis; } /** Process a <attachedaxis> element. * * @param element The DOM tree node that represents the element */ static DasAxis processAttachedaxisElement(Element element, FormBase form) throws DasPropertyException, DasNameException { String name = element.getAttribute("name"); DasAxis ref = (DasAxis) form.checkValue(element.getAttribute("ref"), DasAxis.class, ""); int orientation = (element.getAttribute("orientation").equals("horizontal") ? DasAxis.HORIZONTAL : DasAxis.VERTICAL); DasAxis axis = ref.createAttachedAxis(orientation); String rowString = element.getAttribute("row"); if (!rowString.equals("")) { DasRow row = (DasRow) form.checkValue(rowString, DasRow.class, ""); axis.setRow(row); } String columnString = element.getAttribute("column"); if (!columnString.equals("")) { DasColumn column = (DasColumn) form.checkValue(columnString, DasColumn.class, ""); axis.setColumn(column); } axis.setDataPath(element.getAttribute("dataPath")); axis.setDrawTca(element.getAttribute("showTca").equals("true")); axis.setLabel(element.getAttribute(DasAxis.PROP_LABEL)); axis.setOppositeAxisVisible(!element.getAttribute(DasAxis.PROP_OPPOSITE_AXIS_VISIBLE).equals("false")); axis.setTickLabelsVisible(!element.getAttribute("tickLabelsVisible").equals("false")); axis.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, axis); return axis; } /** TODO * @param name * @return */ public static DasAxis createNamedAxis(String name) { DasAxis axis = new DasAxis(Datum.create(1.0, Units.dimensionless), Datum.create(10.0, Units.dimensionless), DasAxis.HORIZONTAL); if (name == null) { name = "axis_" + Integer.toHexString(System.identityHashCode(axis)); } try { axis.setDasName(name); } catch (DasNameException dne) { DasExceptionHandler.handle(dne); } return axis; } /** TODO * @return * @param document */ public static Element getDOMElement( DasCanvas canvas, Document document) { Element element = document.createElement("canvas"); Dimension size = canvas.getPreferredSize(); element.setAttribute("name", canvas.getDasName()); element.setAttribute("width", Integer.toString(size.width)); element.setAttribute("height", Integer.toString(size.height)); for (int index = 0; index < canvas.devicePositionList().size(); index++) { Object obj = canvas.devicePositionList().get(index); if (obj instanceof DasRow) { DasRow row = (DasRow) obj; element.appendChild(getDOMElement(row,document)); } else if (obj instanceof DasColumn) { DasColumn column = (DasColumn) obj; element.appendChild(getDOMElement(column,document)); } } Component[] components = canvas.getCanvasComponents(); Map elementMap = new LinkedHashMap(); //THREE PASS ALGORITHM. //1. Process all DasAxis components. // Add all , , elements to elementList. //2. Process all DasColorBar components. // Remove all elements that correspond to axis property of colorbars. // Add all elements to elementList. //3. Process all DasSpectrogramPlot and DasPlot components. // Remove all , , , and elements // that correspond to xAxis, yAxis, and colorbar properties of // plots spectrograms and spectrogram renderers. // Add all elements to elementList. for (int index = 0; index < components.length; index++) { if (components[index] instanceof DasAxis) { DasAxis axis = (DasAxis) components[index]; elementMap.put(axis.getDasName(), getDOMElement( axis,document)); } } for (int index = 0; index < components.length; index++) { if (components[index] instanceof DasColorBar) { DasColorBar colorbar = (DasColorBar) components[index]; elementMap.put(colorbar.getDasName(), getDOMElement(colorbar,document)); } } for (int index = 0; index < components.length; index++) { if (components[index] instanceof DasPlot) { DasPlot plot = (DasPlot) components[index]; elementMap.remove(plot.getXAxis().getDasName()); elementMap.remove(plot.getYAxis().getDasName()); Renderer[] renderers = plot.getRenderers(); for (int i = 0; i < renderers.length; i++) { if (renderers[i] instanceof SpectrogramRenderer) { SpectrogramRenderer spectrogram = (SpectrogramRenderer) renderers[i]; elementMap.remove(spectrogram.getColorBar().getDasName()); } } elementMap.put(plot.getDasName(), getDOMElement(plot,document)); } } for (Iterator iterator = elementMap.values().iterator(); iterator.hasNext();) { Element e = (Element) iterator.next(); if (e != null) { element.appendChild(e); } } return element; } /** Process a <canvas> element. * * @param form * @param element The DOM tree node that represents the element * @throws DasPropertyException * @throws DasNameException * @throws ParsedExpressionException * @return */ public static DasCanvas processCanvasElement(Element element, FormBase form) throws DasPropertyException, DasNameException, DasException, ParsedExpressionException, java.text.ParseException { try { Logger log = DasLogger.getLogger(DasLogger.DASML_LOG); String name = element.getAttribute("name"); int width = Integer.parseInt(element.getAttribute("width")); int height = Integer.parseInt(element.getAttribute("height")); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); DasCanvas canvas = new DasCanvas(width, height); NodeList children = element.getChildNodes(); int childCount = children.getLength(); for (int index = 0; index < childCount; index++) { Node node = children.item(index); log.fine("node=" + node.getNodeName()); if (node instanceof Element) { String tagName = node.getNodeName(); if (tagName.equals("row")) { DasRow row = processRowElement((Element) node, canvas, form); } else if (tagName.equals("column")) { DasColumn column = processColumnElement((Element) node, canvas, form); } else if (tagName.equals("axis")) { DasAxis axis = processAxisElement((Element) node, form); canvas.add(axis); } else if (tagName.equals("timeaxis")) { DasAxis timeaxis = processTimeaxisElement((Element) node, form); canvas.add(timeaxis); } else if (tagName.equals("attachedaxis")) { DasAxis attachedaxis = processAttachedaxisElement((Element) node, form); canvas.add(attachedaxis); } else if (tagName.equals("colorbar")) { DasColorBar colorbar = processColorbarElement((Element) node, form); canvas.add(colorbar); } else if (tagName.equals("plot")) { DasPlot plot = processPlotElement((Element) node, form); canvas.add(plot); } else if (tagName.equals("spectrogram")) { DasPlot plot = processPlotElement((Element) node, form); canvas.add(plot); } } } canvas.setDasName(name); nc.put(name, canvas); return canvas; } catch (org.das2.DasPropertyException dpe) { if (!element.getAttribute("name").equals("")) { dpe.setObjectName(element.getAttribute("name")); } throw dpe; } } /** Process a <row> element. * * @param element The DOM tree node that represents the element */ static DasRow processRowElement(Element element, DasCanvas canvas, FormBase form) throws DasException { String name = element.getAttribute("name"); double minimum = Double.parseDouble(element.getAttribute("minimum")); double maximum = Double.parseDouble(element.getAttribute("maximum")); DasRow row = new DasRow(canvas, minimum, maximum); row.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, row); return row; } public static Element getDOMElement( DasRow row, Document document) { Element element = document.createElement("row"); element.setAttribute("name", row.getDasName()); element.setAttribute("minimum", Double.toString(row.getMinimum())); element.setAttribute("maximum", Double.toString(row.getMaximum())); return element; } /** Process a <column7gt; element. * * @param element The DOM tree node that represents the element */ static DasColumn processColumnElement(Element element, DasCanvas canvas, FormBase form) throws DasException { String name = element.getAttribute("name"); double minimum = Double.parseDouble(element.getAttribute("minimum")); double maximum = Double.parseDouble(element.getAttribute("maximum")); DasColumn column = new DasColumn(canvas, minimum, maximum); column.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, column); return column; } public static Element getDOMElement(DasColumn column, Document document) { Element element = document.createElement("column"); element.setAttribute("name", column.getDasName()); element.setAttribute("minimum", Double.toString(column.getMinimum())); element.setAttribute("maximum", Double.toString(column.getMaximum())); return element; } public static SpectrogramRenderer processSpectrogramElement( Element element, DasPlot parent, FormBase form) throws DasPropertyException, DasNameException, ParseException { String dataSetID = element.getAttribute("dataSetID"); DasColorBar colorbar = null; NodeList children = element.getChildNodes(); for (int index = 0; index < children.getLength(); index++) { Node node = children.item(index); if (node instanceof Element && node.getNodeName().equals("zAxis")) { colorbar = processZAxisElement((Element) node, form); } } if (colorbar == null) { try { colorbar = (DasColorBar) form.checkValue(element.getAttribute("colorbar"), DasColorBar.class, ""); } catch (DasPropertyException dpe) { dpe.setPropertyName("colorbar"); throw dpe; } } SpectrogramRenderer renderer = new SpectrogramRenderer( null, colorbar); parent.addRenderer(renderer); try { renderer.setDataSetID(dataSetID); } catch (DasException de) { DasExceptionHandler.handle(de); } return renderer; } private static DasColorBar processZAxisElement(Element element, FormBase form) throws DasPropertyException, DasNameException, ParseException { NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { if (node.getNodeName().equals("colorbar")) { return processColorbarElement((Element) node, form); } } } return null; } /** Process a <colorbar> element. * * @param element The DOM tree node that represents the element */ static DasColorBar processColorbarElement(Element element, FormBase form) throws org.das2.DasPropertyException,org.das2.DasNameException, java.text.ParseException { String name = element.getAttribute("name"); boolean log = element.getAttribute("log").equals("true"); String unitStr = element.getAttribute("units"); if (unitStr == null) { unitStr = ""; } Datum dataMinimum; Datum dataMaximum; if (unitStr.equals("TIME")) { String min = element.getAttribute("dataMinimum"); String max = element.getAttribute("dataMaximum"); dataMinimum = (min == null || min.equals("") ? TimeUtil.create("1979-02-26") : TimeUtil.create(min)); dataMaximum = (max == null || max.equals("") ? TimeUtil.create("1979-02-27") : TimeUtil.create(max)); } else { Units units = Units.getByName(unitStr); String min = element.getAttribute("dataMinimum"); String max = element.getAttribute("dataMaximum"); dataMinimum = (min == null || min.equals("") ? Datum.create(1.0, units) : Datum.create(Double.parseDouble(min), units)); dataMaximum = (max == null || max.equals("") ? Datum.create(10.0, units) : Datum.create(Double.parseDouble(max), units)); } int orientation = parseOrientationString(element.getAttribute("orientation")); DasColorBar cb = new DasColorBar(dataMinimum, dataMaximum, orientation, log); String rowString = element.getAttribute("row"); if (!rowString.equals("")) { DasRow row = (DasRow)form.checkValue(rowString, DasRow.class, ""); cb.setRow(row); } String columnString = element.getAttribute("column"); if (!columnString.equals("")) { DasColumn column = (DasColumn)form.checkValue(columnString, DasColumn.class, ""); cb.setColumn(column); } cb.setLabel(element.getAttribute("label")); cb.setOppositeAxisVisible(!element.getAttribute("oppositeAxisVisible").equals("false")); cb.setTickLabelsVisible(!element.getAttribute("tickLabelsVisible").equals("false")); cb.setType(DasColorBar.Type.parse(element.getAttribute(DasColorBar.PROPERTY_TYPE))); cb.setDasName(name); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, cb); return cb; } public static Element getDOMElement( DasColorBar colorbar, Document document) { Element element = document.createElement("colorbar"); String minimumStr = colorbar.getDataMinimum().toString(); element.setAttribute("dataMinimum", minimumStr); String maximumStr = colorbar.getDataMaximum().toString(); element.setAttribute("dataMaximum", maximumStr); element.setAttribute("name", colorbar.getDasName()); element.setAttribute("row", colorbar.getRow().getDasName()); element.setAttribute("column", colorbar.getColumn().getDasName()); element.setAttribute("label", colorbar.getLabel()); element.setAttribute("log", Boolean.toString(colorbar.isLog())); element.setAttribute("tickLabelsVisible", Boolean.toString(colorbar.isTickLabelsVisible())); element.setAttribute("oppositeAxisVisible", Boolean.toString(colorbar.isOppositeAxisVisible())); element.setAttribute("animated", Boolean.toString(colorbar.isAnimated())); element.setAttribute("orientation", orientationToString(colorbar.getOrientation())); element.setAttribute(DasColorBar.PROPERTY_TYPE, colorbar.getType().toString()); return element; } public static DasColorBar createNamedColorBar(String name) { DasColorBar cb = new DasColorBar(Datum.create(1.0, Units.dimensionless), Datum.create(10.0, Units.dimensionless), false); if (name == null) { name = "colorbar_" + Integer.toHexString(System.identityHashCode(cb)); } try { cb.setDasName(name); } catch (org.das2.DasNameException dne) { org.das2.util.DasExceptionHandler.handle(dne); } return cb; } public static DasPlot processPlotElement(Element element, FormBase form) throws org.das2.DasPropertyException, org.das2.DasNameException, DasException, java.text.ParseException { String name = element.getAttribute("name"); DasRow row = (DasRow) form.checkValue(element.getAttribute("row"), DasRow.class, ""); DasColumn column = (DasColumn) form.checkValue(element.getAttribute("column"), DasColumn.class, ""); DasAxis xAxis = null; DasAxis yAxis = null; DasColorBar colorbar = null; //Get the axes NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { if (node.getNodeName().equals("xAxis")) { xAxis = processXAxisElement((Element) node, row, column, form); } else if (node.getNodeName().equals("yAxis")) { yAxis = processYAxisElement((Element) node, row, column, form); } else if (node.getNodeName().equals("zAxis")) { colorbar = processZAxisElement((Element) node, row, column, form); } } } if (xAxis == null) { xAxis = (DasAxis) form.checkValue(element.getAttribute("xAxis"), DasAxis.class, " or "); } if (yAxis == null) { yAxis = (DasAxis) form.checkValue(element.getAttribute("yAxis"), DasAxis.class, " or "); } DasPlot plot = new DasPlot(xAxis, yAxis); if (element.getNodeName().equals("spectrogram")) { SpectrogramRenderer rend = new SpectrogramRenderer(null, colorbar); plot.addRenderer(rend); } plot.setTitle(element.getAttribute("title")); plot.setDasName(name); plot.setRow(row); plot.setColumn(column); DasApplication app = form.getDasApplication(); NameContext nc = app.getNameContext(); nc.put(name, plot); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { if (node.getNodeName().equals("renderers")) { processRenderersElement((Element) node, plot, form); } } } return plot; } private static DasAxis processXAxisElement(Element element, DasRow row, DasColumn column, FormBase form) throws org.das2.DasPropertyException, org.das2.DasNameException, DasException, java.text.ParseException { NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { Element e = (Element) node; if (node.getNodeName().equals("axis")) { DasAxis axis = processAxisElement(e, form); if (!axis.isHorizontal()) { axis.setOrientation(DasAxis.HORIZONTAL); } return axis; } else if (node.getNodeName().equals("timeaxis")) { DasAxis axis = processTimeaxisElement(e, form); if (!axis.isHorizontal()) { axis.setOrientation(DasAxis.HORIZONTAL); } return axis; } else if (node.getNodeName().equals("attachedaxis")) { DasAxis axis = processAttachedaxisElement(e, form); if (!axis.isHorizontal()) { axis.setOrientation(DasAxis.HORIZONTAL); } return axis; } } } return null; } private static DasAxis processYAxisElement(Element element, DasRow row, DasColumn column, FormBase form) throws org.das2.DasPropertyException, org.das2.DasNameException, org.das2.DasException, java.text.ParseException { NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { Element e = (Element) node; if (node.getNodeName().equals("axis")) { DasAxis axis = processAxisElement(e, form); if (axis.isHorizontal()) { axis.setOrientation(DasAxis.VERTICAL); } return axis; } else if (node.getNodeName().equals("timeaxis")) { DasAxis axis = processTimeaxisElement(e, form); if (axis.isHorizontal()) { axis.setOrientation(DasAxis.VERTICAL); } return axis; } else if (node.getNodeName().equals("attachedaxis")) { DasAxis axis = processAttachedaxisElement(e, form); if (axis.isHorizontal()) { axis.setOrientation(DasAxis.VERTICAL); } return axis; } } } return null; } private static DasColorBar processZAxisElement(Element element, DasRow row, DasColumn column, FormBase form) throws DasPropertyException, DasNameException, DasException, java.text.ParseException { NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { if (node.getNodeName().equals("colorbar")) { return processColorbarElement((Element) node, form); } } } return null; } private static void processRenderersElement(Element element, DasPlot parent, FormBase form) throws org.das2.DasPropertyException, org.das2.DasNameException, org.das2.DasException, java.text.ParseException { NodeList children = element.getChildNodes(); for (int index = 0; index < children.getLength(); index++) { Node node = children.item(index); if (node instanceof Element) { if (node.getNodeName().equals("spectrogram")) { parent.addRenderer( processSpectrogramElement((Element) node, parent, form)); } else if (node.getNodeName().equals("lineplot")) { parent.addRenderer( processLinePlotElement((Element) node, parent, form)); } } } } public static SeriesRenderer processLinePlotElement(Element element, DasPlot parent, FormBase form) { String dataSetID = element.getAttribute("dataSetID"); PlotSymbol psym = DefaultPlotSymbol.BOX; //TODO: parsePsym(element.getAttribute("psym")); SymColor color = SymColor.parseSymColor(element.getAttribute("color")); SeriesRenderer renderer = new SeriesRenderer(); parent.addRenderer(renderer); float lineWidth = Float.parseFloat(element.getAttribute("lineWidth")); try { renderer.setDataSetID(dataSetID); } catch (org.das2.DasException de) { org.das2.util.DasExceptionHandler.handle(de); } renderer.setPsym(psym); renderer.setColor(color); renderer.setLineWidth(lineWidth); return renderer; } public static Element getDOMElement(DasPlot plot,Document document) { Element element = document.createElement("plot"); element.setAttribute("name", plot.getDasName()); element.setAttribute("row", plot.getRow().getDasName()); element.setAttribute("column", plot.getColumn().getDasName()); element.setAttribute("title", plot.getTitle()); Element xAxisChild = document.createElement("xAxis"); Element xAxisElement = getDOMElement(plot.getXAxis(),document); xAxisElement.removeAttribute("orientation"); if (xAxisElement.getAttribute("row").equals(plot.getRow().getDasName())) { xAxisElement.removeAttribute("row"); } if (xAxisElement.getAttribute("column").equals(plot.getColumn().getDasName())) { xAxisElement.removeAttribute("column"); } xAxisChild.appendChild(xAxisElement); element.appendChild(xAxisChild); Element yAxisChild = document.createElement("yAxis"); Element yAxisElement = getDOMElement(plot.getYAxis(),document); yAxisElement.removeAttribute("orientation"); if (yAxisElement.getAttribute("row").equals(plot.getRow().getDasName())) { yAxisElement.removeAttribute("row"); } if (yAxisElement.getAttribute("column").equals(plot.getColumn().getDasName())) { yAxisElement.removeAttribute("column"); } yAxisChild.appendChild(yAxisElement); element.appendChild(yAxisChild); Renderer[] renderers = plot.getRenderers(); if (renderers.length > 0) { Element renderersChild = document.createElement("renderers"); for (int index = 0; index < renderers.length; index++) { renderersChild.appendChild( getDOMElement(renderers[index],document) ); } element.appendChild(renderersChild); } return element; } public static DasPlot createNamedPlot(String name) { DasAxis xAxis = createNamedAxis(null); xAxis.setOrientation(DasAxis.BOTTOM); DasAxis yAxis = createNamedAxis(null); yAxis.setOrientation(DasAxis.LEFT); DasPlot plot = new DasPlot(xAxis, yAxis); if (name == null) { name = "plot_" + Integer.toHexString(System.identityHashCode(plot)); } try { plot.setDasName(name); } catch (org.das2.DasNameException dne) { org.das2.util.DasExceptionHandler.handle(dne); } return plot; } public static Element getDOMElement( Renderer r, Document doc ) { Element element=null; if ( r instanceof SymbolLineRenderer ) { SymbolLineRenderer slr= (SymbolLineRenderer)r; element = doc.createElement("lineplot"); element.setAttribute("dataSetID", slr.getDataSetID()); element.setAttribute("psym", slr.getPsym().toString()); element.setAttribute("color", slr.getColor().toString()); } else if ( r instanceof SpectrogramRenderer ) { SpectrogramRenderer spec= (SpectrogramRenderer)r; element = doc.createElement("spectrogram"); element.setAttribute("dataSetID", spec.getDataSetID()); Element zAxisChild = doc.createElement("zAxis"); Element zAxisElement = getDOMElement( spec.getColorBar(),doc ); if (zAxisElement.getAttribute("row").equals(spec.getParent().getRow().getDasName())) { zAxisElement.removeAttribute("row"); } if (zAxisElement.getAttribute("column").equals(spec.getParent().getColumn().getDasName())) { zAxisElement.removeAttribute("column"); } zAxisChild.appendChild(zAxisElement); element.appendChild(zAxisChild); } else if ( r instanceof StackedHistogramRenderer ) { StackedHistogramRenderer shr= (StackedHistogramRenderer)r; element = doc.createElement("stackedHistogram"); element.setAttribute("zAxis", shr.getZAxis().getDasName() ); element.setAttribute("dataSetID", shr.getDataSetID() ); } return element; } public static Renderer processStackedHistogramElement(Element element, DasPlot parent, FormBase form) throws DasPropertyException, DasNameException, ParseException { String dataSetID = element.getAttribute("dataSetID"); Renderer renderer = new StackedHistogramRenderer( parent, (DataSetDescriptor)null, (DasAxis)null, (DasLabelAxis)parent.getYAxis() ); try { renderer.setDataSetID(dataSetID); } catch (DasException de) { DasExceptionHandler.handle(de); } return renderer; } /** * @param name * @param width * @param height * @return DasCanvas with a name. */ public static DasCanvas createFormCanvas(String name, int width, int height) { DasCanvas canvas = new DasCanvas(width, height); if (name == null) { name = "canvas_" + Integer.toHexString(System.identityHashCode(canvas)); } try { canvas.setDasName(name); } catch (org.das2.DasNameException dne) { org.das2.util.DasExceptionHandler.handle(dne); } return canvas; } /** TODO * @return */ public FormBase getForm( DasCanvas canvas ) { Component parent = canvas.getParent(); if (parent instanceof FormComponent) { return ((FormComponent) parent).getForm(); } return null; } public void deregisterComponent(DasCanvas canvas) { DasApplication app = canvas.getDasApplication(); if (app != null) { NameContext nc = app.getNameContext(); for (Iterator i = canvas.devicePositionList().iterator(); i.hasNext();) { DasDevicePosition dp = (DasDevicePosition) i.next(); try { if (nc.get(dp.getDasName()) == dp) { nc.remove(dp.getDasName()); } } catch (DasPropertyException dpe) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(dpe.toString()); se.initCause(dpe); throw se; } catch (java.lang.reflect.InvocationTargetException ite) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(ite.toString()); se.initCause(ite); throw se; } } for (int index = 0; index < canvas.getComponentCount(); index++) { Component c = canvas.getComponent(index); if (c instanceof DasCanvasComponent) { DasCanvasComponent cc = (DasCanvasComponent) c; try { if (nc.get(cc.getDasName()) == cc) { nc.remove(cc.getDasName()); } } catch (DasPropertyException dpe) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(dpe.toString()); se.initCause(dpe); throw se; } catch (java.lang.reflect.InvocationTargetException ite) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(ite.toString()); se.initCause(ite); throw se; } } } try { if (nc.get(canvas.getDasName()) == this) { nc.remove(canvas.getDasName()); } } catch (DasPropertyException dpe) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(dpe.toString()); se.initCause(dpe); throw se; } catch (java.lang.reflect.InvocationTargetException ite) { //This exception would only occur due to some invalid state. //So, wrap it and toss it. IllegalStateException se = new IllegalStateException(ite.toString()); se.initCause(ite); throw se; } } } public void registerComponent( DasCanvas canvas ) throws org.das2.DasException { try { DasApplication app = canvas.getDasApplication(); if (app != null) { NameContext nc = app.getNameContext(); for (Iterator i = canvas.devicePositionList().iterator(); i.hasNext();) { DasDevicePosition dp = (DasDevicePosition) i.next(); nc.put(dp.getDasName(), dp); } for (int index = 0; index < canvas.getComponentCount(); index++) { Component c = canvas.getComponent(index); if (c instanceof DasCanvasComponent) { DasCanvasComponent cc = (DasCanvasComponent) c; nc.put(cc.getDasName(), cc); } } nc.put(canvas.getDasName(), this); } } catch (DasNameException dne) { deregisterComponent(canvas); throw dne; } } public static final Pattern refPattern = Pattern.compile("\\$\\{([^\\}]+)\\}"); public static final Pattern intPattern = Pattern.compile("-?(0|[1-9][0-9]*)"); public static final Pattern floatPattern = Pattern.compile("-?[0-9]*(\\.[0-9]*)?([eE]-?[0-9]+)?"); protected static String replaceReferences( NameContext n, String str) throws DasPropertyException, InvocationTargetException { Matcher matcher = refPattern.matcher(str); while (matcher.find()) { String name = matcher.group(1).trim(); Object value = n.get(name); str = matcher.replaceFirst(value.toString()); matcher.reset(str); } return str; } /** * Parses the given String object in an attempt to * produce the an object of the given type. * * @param valueString the given String * @param type the given type */ public static Object parseValue( NameContext nameContext, String valueString, Class type) throws org.das2.dasml.ParsedExpressionException, InvocationTargetException, DasPropertyException { Object parsedValue; valueString = replaceReferences(nameContext,valueString); if (type == String.class) { return valueString; } else if (type == boolean.class || type == Boolean.class) { if (valueString.equals("true")) return Boolean.TRUE; if (valueString.equals("false")) return Boolean.FALSE; ParsedExpression exp = new ParsedExpression(valueString); Object o = exp.evaluate(nameContext); if (!(o instanceof Boolean)) throw new ParsedExpressionException("'" + valueString + "' does not evaluate to a boolean value"); return o; } else if (type == int.class || type == Integer.class) { if (intPattern.matcher(valueString).matches()) { return new Integer(valueString); } ParsedExpression exp = new ParsedExpression(valueString); Object o = exp.evaluate(nameContext); if (!(o instanceof Number)) throw new ParsedExpressionException("'" + valueString + "' does not evaluate to a numeric value"); return (o instanceof Integer ? (Integer)o : new Integer(((Number)o).intValue())); } else if (type == long.class || type == Long.class) { if (intPattern.matcher(valueString).matches()) { parsedValue = new Long(valueString); } ParsedExpression exp = new ParsedExpression(valueString); Object o = exp.evaluate(nameContext); if (!(o instanceof Number)) throw new ParsedExpressionException("'" + valueString + "' does not evaluate to a numeric value"); return new Long(((Number)o).longValue()); } else if (type == float.class || type == Float.class) { if (floatPattern.matcher(valueString).matches()) { parsedValue = new Float(valueString); } ParsedExpression exp = new ParsedExpression(valueString); Object o = exp.evaluate(nameContext); if (!(o instanceof Number)) throw new ParsedExpressionException("'" + valueString + "' does not evaluate to a numeric value"); return new Float(((Number)o).floatValue()); } else if (type == double.class || type == Double.class) { if (floatPattern.matcher(valueString).matches()) { parsedValue = new Double(valueString); } ParsedExpression exp = new ParsedExpression(valueString); Object o = exp.evaluate(nameContext); if (!(o instanceof Number)) throw new ParsedExpressionException("'" + valueString + "' does not evaluate to a numeric value"); return (o instanceof Double ? (Double)o : new Double(((Number)o).doubleValue())); } else if (type == Datum.class) { try { return TimeUtil.create(valueString); } catch ( java.text.ParseException ex ) { try { return Datum.create(Double.parseDouble(valueString)); } catch (NumberFormatException iae) { throw new ParsedExpressionException(valueString + " cannot be parsed as a Datum"); } } } else { throw new IllegalStateException(type.getName() + " is not a recognized type"); } } }