/* * 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.xmi; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.stream.events.Attribute; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.modeldriven.fuml.xmi.stream.StreamNode; import org.modeldriven.fuml.assembly.AssemblyAdapter; import org.modeldriven.fuml.assembly.AssemblyException; import org.modeldriven.fuml.common.reflect.ReflectionUtils; import org.modeldriven.fuml.config.FumlConfiguration; import org.modeldriven.fuml.config.ImportAdapter; import org.modeldriven.fuml.repository.Class_; import org.modeldriven.fuml.repository.Classifier; import org.modeldriven.fuml.repository.Property; /** * General XMINodeVisitor implementation superclass encapsulating common structure and * logic across both XMI validation and target structure assembly processing. * * @author Scott Cinnamond */ public abstract class AbstractXmiNodeVisitor { private static Log log = LogFactory.getLog(AbstractXmiNodeVisitor.class); protected XmiNode xmiRoot; protected ModelSupport modelSupport; protected Map<XmiNode, Classifier> classifierMap = new HashMap<XmiNode, Classifier>(); protected Map<String, XmiNode> nodeMap = new HashMap<String, XmiNode>(); protected List<XmiReference> references = new ArrayList<XmiReference>(); protected AbstractXmiNodeVisitor() { modelSupport = new ModelSupport(); } protected AbstractXmiNodeVisitor(XmiNode root) { this(); this.xmiRoot = root; } protected Classifier findClassifier(XmiNode target, XmiNode source) { Classifier classifier = modelSupport.findClassifier(target); if (classifier == null) { if (source != null) { Class_ sourceClassifier = (Class_ )classifierMap.get(source); if (sourceClassifier != null) classifier = modelSupport.findClassifier(target, sourceClassifier); } } return classifier; } protected Classifier findClassifierFromImportAdapter(XmiNode target) { Classifier classifier = null; ImportAdapter importAdapter = FumlConfiguration.getInstance().findImportAdapter( target.getLocalName()); if (importAdapter != null) { AssemblyAdapter adapter = null; try { adapter = (AssemblyAdapter) ReflectionUtils.instanceForName(importAdapter .getAdapterClassName()); } catch (Exception e) { throw new AssemblyException(e); } classifier = adapter.getClassifier((StreamNode) target); } return classifier; } protected boolean isNotReferenceElement(XmiNode node, Classifier classifier, boolean hasAttributes) { return modelSupport.isNotReferenceElement(node, classifier, hasAttributes); } protected boolean isInternalReferenceElement(XmiNode node, Classifier classifier, boolean hasAttributes) { return modelSupport.isInternalReferenceElement(node, classifier, hasAttributes); } protected boolean isExternalReferenceElement(XmiNode node, Classifier classifier, boolean hasAttributes) { return modelSupport.isExternalReferenceElement(node, classifier, hasAttributes); } protected boolean isAbstract(Classifier classifier) { return classifier.isAbstract(); } protected boolean isReferenceAttribute(Property property) { return modelSupport.isReferenceAttribute(property); } @Deprecated protected Attribute findAttribute(StreamNode node, String localName) { QName name = new QName(localName); return node.getStartElementEvent().asStartElement().getAttributeByName(name); /* while (attributes.hasNext()) { Attribute xmlAttrib = attributes.next(); QName name = xmlAttrib.getName(); if (localName.equals(name.getLocalPart())) return xmlAttrib; } return null; */ } }