package org.modeldriven.fuml.io;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.modeldriven.fuml.FumlException;
import org.modeldriven.fuml.assembly.ElementAssemblerEventListener;
import org.modeldriven.fuml.assembly.ElementGraphAssembler;
import org.modeldriven.fuml.xmi.stream.StreamNodeEvent;
import org.modeldriven.fuml.xmi.stream.StreamNodeListener;
import org.modeldriven.fuml.xmi.validation.ErrorSeverity;
import org.modeldriven.fuml.xmi.validation.ValidationErrorCollector;
import org.modeldriven.fuml.xmi.validation.ValidationEventListener;
public class BasicElementReader extends ElementReader
implements StreamNodeListener
{
private static Log log = LogFactory.getLog(BasicElementReader.class);
private static String STREAM_ELEMENT_NAME_XMI = "XMI";
private static String STREAM_ELEMENT_NAME_MODEL = "Model";
private static String STREAM_ELEMENT_NAME_PROFILE = "Profile";
public BasicElementReader() {
}
/**
* Returns element names which can be legal root elements in XMI.
*/
public String[] getElementNames()
{
return new String[] {
STREAM_ELEMENT_NAME_XMI,
STREAM_ELEMENT_NAME_MODEL,
STREAM_ELEMENT_NAME_PROFILE
};
}
public void nodeCreated(StreamNodeEvent event) {
// not interesting
}
public void nodeCompleted(StreamNodeEvent event) {
if (event.getParent() != null)
if (event.getParent().getLocalName().equals(STREAM_ELEMENT_NAME_XMI))
return; // ignore other than top level model elements
//if (!event.getSource().getContext().getUmlNamespace().getNamespaceURI().equals(
// event.getSource().getNamespaceURI()))
// throw new IOException("root node is not in UML namespace");
if (log.isDebugEnabled())
log.debug("validating: "
+ event.getSource().getXmiType() + "("
+ event.getSource().getXmiId() + ")");
ValidationErrorCollector errorCollector = new ValidationErrorCollector(
event.getSource());
errorCollector.setValidateExternalReferences(this.validateExternalReferences);
if (this.validationEventListeners != null)
for (ValidationEventListener listener : this.validationEventListeners)
errorCollector.addEventListener(listener);
errorCollector.validate();
int count = errorCollector.getErrorCount();
if (count == 0) // valid
{
ElementGraphAssembler assembler =
new ElementGraphAssembler(event.getSource());
assembler.setAssembleExternalReferences(this.assembleExternalReferences);
if (this.elementAssemblerEventListeners != null)
for (ElementAssemblerEventListener listener : this.elementAssemblerEventListeners)
assembler.addEventListener(listener);
assembler.start();
assembler.clear();
}
else // has errors
{
if (errorCollector.getErrorCount(ErrorSeverity.FATAL) > 0)
throw new FumlException("fatal validation errors encountered");
}
if (this.elementReaderEventListeners != null)
for (ElementReaderEventListener listener : this.elementReaderEventListeners)
listener.streamCompleted(new ElementReaderEvent(this));
}
}