in impl/src/main/java/org/apache/tuscany/sdo/util/DataGraphResourceFactoryImpl.java [470:703]
protected DefaultHandler makeDefaultHandler()
{
return new SAXXMLHandler(resource, helper, options)
{
protected DataGraphImpl eDataGraph;
protected boolean isInModels;
protected List ePackages = new ArrayList();
protected EObject createDocumentRoot(String prefix, String uri, String name, EFactory eFactory, boolean top)
{
return null;
}
protected void setAttribValue(EObject object, String name, String value)
{
if ("logging".equals(name) && object instanceof ChangeSummaryImpl)
{
resumeLogging = Boolean.valueOf(value).booleanValue();
}
else
{
super.setAttribValue(object, name, value);
}
}
protected EMap recordNamespacesSchemaLocations(EObject root)
{
EObject dgroot = eDataGraph.getERootObject();
if (dgroot == null)
{
return null;
}
EMap prefixToNamespaceMap = super.recordNamespacesSchemaLocations(dgroot);
if (prefixToNamespaceMap != null)
{
for (Iterator i = prefixToNamespaceMap.iterator(); i.hasNext();)
{
Map.Entry entry = (Map.Entry)i.next();
String prefix = (String)entry.getKey();
String namespace = (String)entry.getValue();
if (namespace.equals("commonj.sdo"))
{
prefixToNamespaceMap.removeKey(prefix);
break;
}
}
}
return prefixToNamespaceMap;
}
protected void handleFeature(String prefix, String name)
{
if (isInModels && objects.size() == 2)
{
EObject modelObject = createObjectByType(prefix, name, false);
processObject(modelObject);
ePackages.add(modelObject);
}
else if (objects.size() == 1)
{
eDataGraph = (DataGraphImpl)objects.peek();
eDataGraph.getResourceSet();
if ("".equals(prefix) && "changeSummary".equals(name))
{
ChangeSummary eChangeSummary = (ChangeSummary)createObjectFromFactory(SDOFactory.eINSTANCE, "ChangeSummary");
eDataGraph.setEChangeSummary(eChangeSummary);
processObject((EObject)eChangeSummary);
}
else if ("".equals(prefix) && "models".equals(name))
{
isInModels = true;
types.push(OBJECT_TYPE);
objects.push(eDataGraph);
mixedTargets.push(null);
}
else if (eDataGraph.getERootObject() == null)
{
if (useNewMethods)
{
handleSchemaLocation();
}
processSchemaLocations(prefix, name);
if (processAnyXML)
{
// Ensure that anything can be handled, even if it's not recognized.
//
String namespaceURI = helper.getURI(prefix);
if (extendedMetaData.getPackage(namespaceURI) == null)
{
EStructuralFeature rootFeature = extendedMetaData.demandFeature(namespaceURI, name, true);
rootFeature.getEContainingClass().getEPackage().setEFactoryInstance(new DynamicDataObjectImpl.FactoryImpl());
}
}
//FB TEMPORARY allow loading proper serialization (global element instead of type name)
//FB Proper fix is to reimplement DataGraph as proper DataObject, and remove this entire class
EStructuralFeature rootFeature = extendedMetaData.getElement(helper.getURI(prefix), name);
if (rootFeature != null) name = rootFeature.getEType().getName();
EObject rootObject = createObjectByType(prefix, name, false);
eDataGraph.setERootObject(rootObject);
processObject(rootObject);
if (rootObject != null
&& rootObject.eClass() == ExtendedMetaData.INSTANCE.getDocumentRoot(rootObject.eClass().getEPackage()))
{
super.handleFeature(prefix, name);
// Remove the document root from the stack.
//
Object mixedTarget = mixedTargets.pop();
Object object = objects.pop();
mixedTargets.pop();
objects.pop();
mixedTargets.push(mixedTarget);
objects.push(object);
}
}
}
else
{
super.handleFeature(prefix, name);
}
}
public void endElement(String uri, String localName, String name)
{
if (isInModels && objects.size() == 2)
{
if (!ePackages.isEmpty())
{
for (Iterator i = ePackages.iterator(); i.hasNext();)
{
EPackage ePackage = (EPackage)i.next();
ePackage.setEFactoryInstance(new DynamicDataObjectImpl.FactoryImpl());
Resource resource = resourceSet.createResource(URI.createURI("*.ecore"));
resource.getContents().add(ePackage);
if (ePackage.getNsURI() != null)
{
resource.setURI(URI.createURI(ePackage.getNsURI()));
}
if (extendedMetaData != null)
{
extendedMetaData.putPackage(extendedMetaData.getNamespace(ePackage), ePackage);
}
else
{
packageRegistry.put(ePackage.getNsURI(), ePackage);
}
}
handleForwardReferences();
}
isInModels = false;
}
// TODO The following 3 lines of code are a temporary work-around for JIRA issue TUSCANY-1862.
// These lines of code should be removed when TUSCANY-1862 is resolved.
if ("".equals(uri) && "objectsToAttach".equals(name) && text != null && text.length() == 0)
{
text = null;
}
super.endElement(uri, localName, name);
}
protected EPackage getPackageForURI(String uriString)
{
if ("commonj.sdo".equals(uriString))
{
return SDOPackage.eINSTANCE;
}
else
{
return super.getPackageForURI(uriString);
}
}
protected EObject createObjectFromFactory(EFactory factory, String typeName)
{
if (factory == SDOFactory.eINSTANCE)
{
if ("datagraph".equals(typeName))
{
return super.createObjectFromFactory(factory, "DataGraph");
}
}
return super.createObjectFromFactory(factory, typeName);
}
protected EcoreBuilder createEcoreBuilder(Map options, ExtendedMetaData extendedMetaData)
{
return new DefaultEcoreBuilder(extendedMetaData)
{
public Collection generate(Map urisToLocations) throws Exception
{
Collection result = super.generate(urisToLocations);
return updateDynamicFactory(result);
}
public Collection generate(Collection urisToLocations) throws Exception
{
Collection result = super.generate(urisToLocations);
return updateDynamicFactory(result);
}
protected Collection updateDynamicFactory(Collection result)
{
for (Iterator i = result.iterator(); i.hasNext();)
{
Resource resource = (Resource)i.next();
for (Iterator j = EcoreUtil.getObjectsByType(resource.getContents(), EcorePackage.eINSTANCE.getEPackage()).iterator(); j.hasNext();)
{
EPackage ePackage = (EPackage)j.next();
ePackage.setEFactoryInstance(new DynamicDataObjectImpl.FactoryImpl());
}
}
return result;
}
};
}
protected EPackage handleMissingPackage(String uriString)
{
EPackage result = super.handleMissingPackage(uriString);
if (processAnyXML && objects.size() == 1)
{
result = extendedMetaData.demandPackage(uriString);
}
return result;
}
};
}