/* * Copyright 2008 Lockheed Martin Corporation, except as stated in the file * entitled Licensing-Information. All modifications copyright 2009 Data Access Technologies, Inc. Licensed under the Academic Free License * version 3.0 (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. * * Contributors: * MDS - initial API and implementation * */ package org.modeldriven.fuml.assembly; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.modeldriven.fuml.xmi.XmiElement; public class AssemblerNode implements XmiElement { private static Log log = LogFactory.getLog(AssemblerNode.class); private List<AssemblerNode> assemblers; private XmiElement xmiElement; // FIXME: this is redundant!! See ElementAssembler.source protected AssemblerNode() { } public AssemblerNode(XmiElement xmiType) { this.xmiElement = xmiType; } public String getXmiType() { return xmiElement.getXmiType(); } public boolean hasXmiType() { String xmiType = xmiElement.getXmiType(); return xmiType != null && xmiType.length() > 0; } public String getLocalName() { return xmiElement.getLocalName(); } public String getNamespaceURI() { return xmiElement.getNamespaceURI(); } public String getPrefix() { return xmiElement.getPrefix(); } public String getData() { return xmiElement.getData(); } public String getXmiId() { return xmiElement.getXmiId(); } public void add(ElementAssembler assembler) { if (assemblers == null) assemblers = new ArrayList<AssemblerNode>(); assemblers.add(assembler); } public List<AssemblerNode> getNodes() { return assemblers; } public void accept(AssemblerVisitor visitor) { if (log.isDebugEnabled()) log.debug(this.getClass().getSimpleName()); acceptBreadthFirst(visitor); } public void acceptDepthFirst(AssemblerVisitor visitor) { try { accept(visitor, this, null, null, this, true, new HashMap<AssemblerNode, AssemblerNode>(), 0); } finally { } } public void acceptBreadthFirst(AssemblerVisitor visitor) { try { accept(visitor, this, null, null, this, false, new HashMap<AssemblerNode, AssemblerNode>(), 0); } finally { } } private void accept(AssemblerVisitor visitor, AssemblerNode target, AssemblerNode source, String sourceKey, AssemblerNode root, boolean depthFirst, Map<AssemblerNode, AssemblerNode> visited, int level) { if (log.isDebugEnabled()) log.debug("accept: " + target.getLocalName()); if (visited.get(target) == null) visited.put(target, target); else { if (log.isDebugEnabled()) log.debug("ignoring, " + target.getClass().getName()); return; } if (!depthFirst) visitor.begin(target, source, sourceKey, level); else visitor.end(target, source, sourceKey, level); List<AssemblerNode> nodes = target.getNodes(); if (nodes != null) for (int i = 0; i < nodes.size(); i++) { AssemblerNode child = nodes.get(i); if (log.isDebugEnabled()) log.debug("processing node: " + child.getLocalName()); accept(visitor, child, target, child.getLocalName(), root, depthFirst, visited, level++); } if (depthFirst) visitor.begin(target, source, sourceKey, level); else visitor.end(target, source, sourceKey, level); } }