Author: bobtarling Date: 2010-12-01 14:32:43-0800 New Revision: 18862 Modified: trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDiagram.java trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java
Log: Move common functionality from UMLActivityDiagram up to BaseDiagram Modified: trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDiagram.java Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDiagram.java?view=diff&pathrev=18862&r1=18861&r2=18862 ============================================================================== --- trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDiagram.java (original) +++ trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/BaseDiagram.java 2010-12-01 14:32:43-0800 @@ -14,14 +14,22 @@ package org.argouml.activity2.diagram; import java.beans.PropertyVetoException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.swing.Action; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.argouml.model.Model; -import org.argouml.ui.CmdCreateNode; import org.argouml.uml.diagram.UMLMutableGraphSupport; import org.argouml.uml.diagram.UmlDiagramRenderer; import org.argouml.uml.diagram.ui.ActionSetMode; @@ -32,6 +40,13 @@ import org.tigris.gef.base.ModeCreatePolyEdge; import org.tigris.gef.graph.MutableGraphModel; import org.tigris.gef.presentation.FigNode; +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; abstract class BaseDiagram extends UMLDiagram { @@ -65,57 +80,132 @@ abstract UmlDiagramRenderer createDiagramRenderer(); abstract UMLMutableGraphSupport createGraphModel(); + private Map<String, Class<?>> metaTypeByName; + private Map<Class<?>, String> nameByMetaType; + @Override protected Object[] getUmlActions() { + try { + final Document doc = getDocument(); + final Element element = + getElement(doc.getDocumentElement(), "classes"); + final int size = element.getChildNodes().getLength(); + nameByMetaType = new HashMap<Class<?>, String>(size); + metaTypeByName = new HashMap<String, Class<?>>(size); + populateClassMaps(element, nameByMetaType, metaTypeByName); + + final Element toolbarElement = + getElement(doc.getDocumentElement(), "toolbar"); + return getToolbarActions(toolbarElement); + } catch (DOMException e) { + LOG.error("", e); + } catch (IOException e) { + LOG.error("", e); + } catch (ParserConfigurationException e) { + LOG.error("", e); + } catch (SAXException e) { + LOG.error("", e); + } + return null; + } + + /** + * Get the single (or first) child Element of the given element + * that has the given tag name. + * @param element + * @param tagName + * @return the child element + */ + private Element getElement(Element element, String tagName) { + final NodeList nl = element.getElementsByTagName(tagName); + if (nl.getLength() == 0) { + return null; + } + return (Element) nl.item(0); + } + + private Object[] getToolbarActions(Element toolbarNode) { - final Object[] edgeTools = getNewEdgeTypes(); - final Object[] nodeTools = getNewNodeTypes(); - final Object[] actions = - new Object[edgeTools.length + nodeTools.length]; - int i = 0; - for (Object meta : edgeTools) { - if (meta instanceof Object[]) { - Object[] childEdgeTools = (Object[]) meta; - final Object[] childActions = - new Object[childEdgeTools.length]; - int j = 0; - for (Object childMeta : childEdgeTools) { - childActions[j++] = getCreateEdgeAction(childMeta); - } - actions[i++] = childActions; - } else { - actions[i++] = getCreateEdgeAction(meta); + final NodeList nl = toolbarNode.getChildNodes(); + + List<Element> elements = new ArrayList<Element>(); + for (int i = 0; i < nl.getLength(); ++i) { + final Node n = nl.item(i); + if (n instanceof Element) { + elements.add((Element) n); } } - for (Object meta : nodeTools) { - if (meta instanceof Object[]) { - Object[] childNodeTools = (Object[]) meta; - final Object[] childActions = - new Object[childNodeTools.length]; - int j = 0; - for (Object childMeta : childNodeTools) { - childActions[j++] = getCreateNodeAction(childMeta); - } - actions[i++] = childActions; + + final Object[] toolbarActions = new Object[elements.size()]; + + for (int i = 0; i < elements.size(); ++i) { + final Element itemNode = elements.get(i); + Object o; + String style = itemNode.getNodeName(); + if (style.equals("dropdown")) { + o = getToolbarActions(itemNode); + } else if (style.equals("poly-edge")) { + final String type = itemNode.getAttribute("type"); + final Class<?> metaType = metaTypeByName.get(type); + o = getCreateEdgeAction(metaType); } else { - actions[i++] = getCreateNodeAction(meta); + final String type = itemNode.getAttribute("type"); + final Class<?> metaType = metaTypeByName.get(type); + o = new CreateDiagramElementAction( + metaType, + style, + Model.getMetaTypes().getName(metaType), + this); + } + toolbarActions[i] = o; + } + return toolbarActions; + } + + // TODO: This is currently duplicated from MetaDataCache - must find a + // common place in model facade + private void populateClassMaps( + final Element classesNode, + final Map<Class<?>, String> nameByMetaType, + final Map<String, Class<?>> metaTypeByName) { + final NodeList nl = classesNode.getElementsByTagName("class"); + for (int i = 0; i < nl.getLength(); ++i) { + Element classNode = (Element) nl.item(i); + String className = classNode.getTextContent(); + try { + final String name = + classNode.getAttribute("name"); + Class<?> clazz = Class.forName(className); + metaTypeByName.put(name, clazz); + nameByMetaType.put(clazz, name); + } catch (ClassNotFoundException e) { + LOG.error("Class not found " + className, e); } } - return actions; } - abstract Object[] getNewNodeTypes(); - abstract Object[] getNewEdgeTypes(); - /** - * @return Returns a diagram tool creation action. + * Get the diagram definition XML document + * @return + * @throws IOException + * @throws DOMException + * @throws ParserConfigurationException + * @throws SAXException */ - private Action getCreateNodeAction(Object metaType) { - String label = Model.getMetaTypes().getName(metaType); - return new RadioAction( - new CmdCreateNode(metaType, label)); + private Document getDocument() + throws IOException, DOMException, + ParserConfigurationException, SAXException { + final String filename = getDiagramXmlFile(); + InputStream inputStream = + this.getClass().getClassLoader().getResourceAsStream(filename); + InputSource inputSource = new InputSource(inputStream); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + return db.parse(inputSource); } + protected abstract String getDiagramXmlFile(); + protected Action getCreateEdgeAction(Object metaType) { String label = Model.getMetaTypes().getName(metaType); return new RadioAction( Modified: trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java?view=diff&pathrev=18862&r1=18861&r2=18862 ============================================================================== --- trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java (original) +++ trunk/src/argouml-core-diagrams-activity2/src/org/argouml/activity2/diagram/UMLActivityDiagram.java 2010-12-01 14:32:43-0800 @@ -14,18 +14,7 @@ package org.argouml.activity2.diagram; import java.awt.Rectangle; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import org.apache.log4j.Logger; import org.argouml.i18n.Translator; import org.argouml.model.ActivityDiagram; import org.argouml.model.Model; @@ -35,13 +24,6 @@ import org.argouml.uml.diagram.UmlDiagramRenderer; import org.argouml.uml.diagram.static_structure.ui.FigComment; import org.argouml.uml.diagram.ui.FigNodeModelElement; -import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; /** * Diagram class for UML2 Activity Diagram @@ -49,12 +31,6 @@ */ public class UMLActivityDiagram extends BaseDiagram implements ActivityDiagram { - private static final Logger LOG = Logger - .getLogger(UMLActivityDiagram.class); - - private Map<String, Class<?>> metaTypeByName; - private Map<Class<?>, String> nameByMetaType; - UMLActivityDiagram(Object activity) { super(activity); } @@ -70,136 +46,6 @@ } @Override - Object[] getNewEdgeTypes() { - return new Object[] { - Model.getMetaTypes().getControlFlow(), - Model.getMetaTypes().getObjectFlow() - }; - } - - @Override - Object[] getNewNodeTypes() { - return new Object[] { - new Object[] { - Model.getMetaTypes().getCallBehaviorAction(), - Model.getMetaTypes().getCreateObjectAction(), - Model.getMetaTypes().getDestroyObjectAction(), - }, - Model.getMetaTypes().getAcceptEventAction(), - Model.getMetaTypes().getSendSignalAction(), - new Object[] { - Model.getMetaTypes().getActivityParameterNode(), - Model.getMetaTypes().getCentralBufferNode(), - Model.getMetaTypes().getDataStoreNode(), - }, - Model.getMetaTypes().getInputPin(), - Model.getMetaTypes().getOutputPin(), - }; - } - - private List<Object> getToolbarActions(Element toolbarNode) { - List<Object> toolbarActions = new ArrayList<Object>(); - final NodeList nl = toolbarNode.getElementsByTagName("*"); - for (int i = 0; i < nl.getLength(); ++i) { - final Element itemNode = (Element) nl.item(i); - Object o; - String style = itemNode.getNodeName(); - if (style.equals("dropdown")) { - o = getToolbarActions(itemNode); - } else if (style.equals("poly-edge")) { - final String type = itemNode.getAttribute("type"); - final Class<?> metaType = metaTypeByName.get(type); - o = getCreateEdgeAction(metaType); - } else { - final String type = itemNode.getAttribute("type"); - final Class<?> metaType = metaTypeByName.get(type); - o = new CreateDiagramElementAction( - metaType, - style, - Model.getMetaTypes().getName(metaType), - this); - } - toolbarActions.add(o); - } - return toolbarActions; - } - - // TODO: This is currently duplicated from MetaDataCache - must find a - // common place in model facade - private void populateClassMaps( - final Element classesNode, - final Map<Class<?>, String> nameByMetaType, - final Map<String, Class<?>> metaTypeByName) { - final NodeList nl = classesNode.getElementsByTagName("class"); - for (int i = 0; i < nl.getLength(); ++i) { - Node classNode = nl.item(i); - String className = classNode.getTextContent(); - try { - final String name = - classNode.getAttributes().getNamedItem("name").getNodeValue(); - Class<?> clazz = Class.forName(className); - metaTypeByName.put(name, clazz); - nameByMetaType.put(clazz, name); - } catch (ClassNotFoundException e) { - LOG.error("Class not found " + className, e); - } - } - } - - /** - * Get the diagram definition XML document - * @return - * @throws IOException - * @throws DOMException - * @throws ParserConfigurationException - * @throws SAXException - */ - private Document getDocument() - throws IOException, DOMException, - ParserConfigurationException, SAXException { - final String filename; - filename = "org/argouml/activity2/diagram/diagram.xml"; - InputStream inputStream = - this.getClass().getClassLoader().getResourceAsStream(filename); - InputSource inputSource = new InputSource(inputStream); - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - return db.parse(inputSource); - } - - @Override - protected Object[] getUmlActions() { - try { - final Document doc = getDocument(); - final NodeList nl = doc.getDocumentElement().getChildNodes(); - for (int i = 0; i < nl.getLength(); ++i) { - final Node n = nl.item(i); - if (n.getNodeName().equals("classes")) { - final int size = n.getChildNodes().getLength(); - nameByMetaType = new HashMap<Class<?>, String>(size); - metaTypeByName = new HashMap<String, Class<?>>(size); - populateClassMaps((Element) n, nameByMetaType, metaTypeByName); - } else if (n.getNodeName().equals("toolbar")) { - List<Object> actions = getToolbarActions((Element) n); - return actions.toArray(); - } - } - } catch (DOMException e) { - LOG.error("", e); - } catch (IOException e) { - LOG.error("", e); - } catch (ParserConfigurationException e) { - LOG.error("", e); - } catch (SAXException e) { - LOG.error("", e); - } - return null; - } - - - - - @Override public void initialize(Object owner) { super.initialize(owner); ActivityDiagramGraphModel gm = @@ -221,6 +67,10 @@ return false; } + protected String getDiagramXmlFile() { + return "org/argouml/activity2/diagram/diagram.xml"; + } + public DiagramElement createDiagramElement( final Object modelElement, final Rectangle bounds) { ------------------------------------------------------ http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2687125 To unsubscribe from this discussion, e-mail: [[email protected]].
