/*
* 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.List;
import javax.xml.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.modeldriven.fuml.FumlObject;
import org.modeldriven.fuml.repository.Class_;
import org.modeldriven.fuml.repository.Classifier;
import org.modeldriven.fuml.repository.Repository;
import org.modeldriven.fuml.xmi.ModelSupport;
import org.modeldriven.fuml.xmi.XmiNode;
import org.modeldriven.fuml.xmi.stream.StreamNode;
import fUML.Syntax.Classes.Kernel.Comment;
import fUML.Syntax.Classes.Kernel.Element;
import fUML.Syntax.Classes.Kernel.NamedElement;
public class ElementStubAssembler implements AssemblerResults
{
public static String STUB_TOKEN = "#STUB#";
private static Log log = LogFactory.getLog(ElementStubAssembler.class);
private Repository metadata = Repository.INSTANCE;
private ElementAssembler result;
private ModelSupport modelSupport = new ModelSupport();
private XmiNode target;
private List<ElementAssemblerEventListener> eventListeners;
@SuppressWarnings("unused")
private ElementStubAssembler() {}
public ElementStubAssembler(XmiNode xmiRoot) {
this.target = xmiRoot;
}
public void start() {
assemble();
}
public void clear() {
this.result = null;
}
private void assemble()
{
StreamNode eventNode = (StreamNode)target;
Classifier classifier = modelSupport.findClassifier(target);
if (classifier == null)
{
classifier = metadata.findClassifier("Activity");
}
if (log.isDebugEnabled())
log.debug("identified element '" + target.getLocalName() + "' as classifier, "
+ classifier.getName());
ElementAssembler assembler = new ElementAssembler(target, null,
(Class_)classifier, null);
assembler.assembleElementClass();
// FIXME: need some UML model to represent a "stub" element that
// is intuitive and generic.
if (assembler.getTarget() instanceof NamedElement)
{
NamedElement namedElement = (NamedElement)assembler.getTarget();
namedElement.name = "unknown";
String name = target.getAttributeValue(new QName("name"));
if (name != null && name.trim().length() > 0)
namedElement.name = name;
Comment comment = new Comment();
comment.body = STUB_TOKEN;
assembler.getTarget().ownedComment.add(comment);
}
else
throw new AssemblyException("expected instance of NamedElement as target");
result = assembler;
if (eventListeners != null)
for (ElementAssemblerEventListener listener : eventListeners)
listener.elementStubAssembled(
new ElementAssemblerResultsEvent(this));
}
public void addErrorText(String text)
{
Comment comment = new Comment();
comment.body = text;
result.getTarget().ownedComment.add(comment);
}
public void addEventListener(ElementAssemblerEventListener eventListener) {
if (eventListeners == null)
eventListeners = new ArrayList<ElementAssemblerEventListener>();
this.eventListeners.add(eventListener);
}
public void removeEventListener(ElementAssemblerEventListener eventListener) {
if (eventListeners == null)
return;
this.eventListeners.remove(eventListener);
}
public Element getResult()
{
return result.getTarget();
}
public String getResultId()
{
return result.getXmiId();
}
public List<FumlObject> getResults() {
List<FumlObject> results = new ArrayList<FumlObject>();
results.add(result.getTarget());
return results;
}
public List<String> getResultsXmiIds() {
List<String> results = new ArrayList<String>();
results.add(result.getXmiId());
return results;
}
public Element lookupResult(String xmiId) {
if (result.getXmiId().equals(xmiId))
return result.getTarget();
else
return null;
}
}