diff options
Diffstat (limited to 'branches/java-M1/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XMLDocumentImpl.java')
-rw-r--r-- | branches/java-M1/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XMLDocumentImpl.java | 553 |
1 files changed, 0 insertions, 553 deletions
diff --git a/branches/java-M1/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XMLDocumentImpl.java b/branches/java-M1/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XMLDocumentImpl.java deleted file mode 100644 index 72fdc93f60..0000000000 --- a/branches/java-M1/java/sdo/impl/src/main/java/org/apache/tuscany/sdo/helper/XMLDocumentImpl.java +++ /dev/null @@ -1,553 +0,0 @@ -/** - * - * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.tuscany.sdo.helper; - - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.tuscany.sdo.SDOFactory; -import org.apache.tuscany.sdo.SDOPackage; -import org.apache.tuscany.sdo.SimpleAnyTypeDataObject; -import org.apache.tuscany.sdo.util.DataObjectUtil; -import org.apache.tuscany.sdo.util.SDOUtil; -import org.eclipse.emf.common.util.EMap; -import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.EAttribute; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EDataType; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EReference; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.emf.ecore.util.EcoreUtil; -import org.eclipse.emf.ecore.util.ExtendedMetaData; -import org.eclipse.emf.ecore.util.FeatureMap; -import org.eclipse.emf.ecore.xmi.XMLOptions; -import org.eclipse.emf.ecore.xmi.XMLParserPool; -import org.eclipse.emf.ecore.xmi.XMLResource; -import org.eclipse.emf.ecore.xmi.impl.XMLOptionsImpl; -import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; -import org.eclipse.emf.ecore.xml.type.XMLTypePackage; -import org.xml.sax.InputSource; - -import commonj.sdo.DataObject; -import commonj.sdo.Type; -import commonj.sdo.helper.XMLDocument; - - -/** - * Represents an XML Document containing a tree of DataObjects. - * - * An example XMLDocument fragment is: - * <?xml version="1.0"?> - * <purchaseOrder orderDate="1999-10-20"> - * - * created from this XML Schema fragment: - * <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - * <xsd:element name="purchaseOrder" type="PurchaseOrderType"/> - * <xsd:complexType name="PurchaseOrderType"> - * - * Upon loading this XMLDocument: - * DataObject is an instance of Type PurchaseOrderType. - * RootElementURI is null because the XSD has no targetNamespace URI. - * RootElementName is purchaseOrder. - * Encoding is null because the document did not specify an encoding. - * XMLDeclaration is true because the document contained an XML declaration. - * XMLVersion is 1.0 - * SchemaLocation and noNamespaceSchemaLocation are null because they are - * not specified in the document. - * - * When saving the root element, if the type of the root dataObject is not the - * type of global element specified by rootElementURI and rootElementName, - * or if a global element does not exist for rootElementURI and rootElementName, - * then an xsi:type declaration is written to record the root DataObject's Type. - * - * When loading the root element and an xsi:type declaration is found - * it is used as the type of the root DataObject. In this case, - * if validation is not being performed, it is not an error if the - * rootElementName is not a global element. - */ -public class XMLDocumentImpl implements XMLDocument -{ - protected ExtendedMetaData extendedMetaData; - - protected EObject rootObject; - - protected XMLResource resource; - - protected EStructuralFeature rootElement; - - protected EObject documentRoot; - - protected final static String WHITESPACE_REGEX = "\\s"; - - protected static XMLParserPool globalXMLParserPool = new XMLParserPoolImpl(); - - //TODO clean up the options thing - protected XMLDocumentImpl(ExtendedMetaData extendedMetaData, Object options) - { - this.extendedMetaData = extendedMetaData; - ResourceSet resourceSet = DataObjectUtil.createResourceSet(); - - if (options instanceof Map) - { - Class resourceFactoryClass = (Class)((Map)options).get("GENERATED_LOADER"); - if (resourceFactoryClass != null) - { - try - { - Object resourceFactory = resourceFactoryClass.newInstance(); - resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", resourceFactory); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - } - - resource = (XMLResource)resourceSet.createResource(URI.createURI("http:///temp.xml")); - - XMLOptions xmlOptions = new XMLOptionsImpl(); - xmlOptions.setProcessAnyXML(true); - resource.getDefaultLoadOptions().put(XMLResource.OPTION_XML_OPTIONS, xmlOptions); - - resource.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData); - resource.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData); - - resource.getDefaultLoadOptions().put(XMLResource.OPTION_USE_PARSER_POOL, globalXMLParserPool); - - resource.getDefaultLoadOptions().put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.FALSE); - - resource.getDefaultSaveOptions().put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE); - resource.getDefaultLoadOptions().put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE); - - resource.getDefaultLoadOptions().put(XMLResource.OPTION_ANY_TYPE, SDOPackage.eINSTANCE.getAnyTypeDataObject()); - resource.getDefaultSaveOptions().put(XMLResource.OPTION_ANY_TYPE, SDOPackage.eINSTANCE.getAnyTypeDataObject()); - - resource.getDefaultLoadOptions().put(XMLResource.OPTION_ANY_SIMPLE_TYPE, SDOPackage.eINSTANCE.getSimpleAnyTypeDataObject()); - resource.getDefaultSaveOptions().put(XMLResource.OPTION_ANY_SIMPLE_TYPE, SDOPackage.eINSTANCE.getSimpleAnyTypeDataObject()); - - //resource.getDefaultLoadOptions().put(XMLResource.OPTION_USE_XML_NAME_TO_FEATURE_MAP, globalHashMap); - - //resource.getDefaultSaveOptions().put(XMLResource.OPTION_FORMATTED, Boolean.FALSE); - } - - protected XMLDocumentImpl(ExtendedMetaData extendedMetaData) - { - this(extendedMetaData, null); - } - - protected XMLDocumentImpl(ExtendedMetaData extendedMetaData, DataObject dataObject, String rootElementURI, String rootElementName) - { - this(extendedMetaData); - - rootObject = (EObject)dataObject; - - rootElement = extendedMetaData.getElement(rootElementURI, rootElementName); - if (rootElement == null) - { - rootElement = ExtendedMetaData.INSTANCE.demandFeature(rootElementURI, rootElementName, true); - } - - EClass documentRootClass = rootElement.getEContainingClass(); - documentRoot = EcoreUtil.create(documentRootClass); - resource.getContents().add(documentRoot); - } - - protected void save(OutputStream outputStream, Object options) throws IOException - { - EObject oldContainer = null; - EReference oldContainmentReference = null; - int oldContainmentIndex = -1; - - if (documentRoot != null) - { - //TODO also check if rootObject is directly contained in a resource - oldContainer = rootObject.eContainer(); - if (oldContainer != null) - { - oldContainmentReference = rootObject.eContainmentFeature(); - } - if (oldContainer != documentRoot || oldContainmentReference != rootElement) - { - if (oldContainmentReference != null && oldContainmentReference.isMany()) - { - oldContainmentIndex = ((List)oldContainer.eGet(oldContainmentReference)).indexOf(rootObject); - } - - Object rootValue = - rootElement instanceof EAttribute && rootObject instanceof SimpleAnyTypeDataObject ? - ((SimpleAnyTypeDataObject)rootObject).getValue() : rootObject; - - documentRoot.eSet(rootElement, rootValue); - } - } - - resource.save(outputStream, (Map)options); - - if (oldContainer != null) - { - if (oldContainer != documentRoot || oldContainmentReference != rootElement) - { - if (oldContainmentReference.isMany()) - { - ((List)oldContainer.eGet(oldContainmentReference)).add(oldContainmentIndex, rootObject); - } - else - { - oldContainer.eSet(oldContainmentReference, rootObject); - } - } - } - else if (documentRoot != null) - { - documentRoot.eSet(rootElement, null); - } - } - - protected void save(Writer outputWriter, Object options) throws IOException - { - // TODO temporary brute-force implementation ... to be replaced - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - save(outputStream, options); - outputWriter.write(new String(outputStream.toByteArray())); - } - - protected void load(InputStream inputStream, String locationURI, Object options) throws IOException - { - InputSource inputSource = new InputSource(inputStream); - load(inputSource, locationURI, options); - } - - protected void load(Reader inputReader, String locationURI, Object options) throws IOException - { - InputSource inputSource = new InputSource(inputReader); - load(inputSource, locationURI, options); - } - - protected void load(InputSource inputSource, String locationURI, Object options) throws IOException - { - rootObject = null; - rootElement = null; - documentRoot = null; - - if (locationURI != null) - { - inputSource.setSystemId(locationURI); - resource.setURI(URI.createURI(locationURI)); - } - - resource.load(inputSource, (Map)options); - - if (!resource.getContents().isEmpty()) - { - documentRoot = (EObject)resource.getContents().get(0); - EClass documentRootClass = documentRoot.eClass(); - if ("".equals(extendedMetaData.getName(documentRootClass))) //TODO efficient way to check this? Maybe DataObject.getContainer should also check this? - { - FeatureMap featureMap = (FeatureMap)documentRoot.eGet(documentRootClass.getEStructuralFeature(0)); // get mixed feature - int size = featureMap.size(); - for (int index = 0; index < size; index++) - { - EStructuralFeature feature = featureMap.getEStructuralFeature(index); - boolean isText = - feature == XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__TEXT || - feature == XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__CDATA || - feature == XMLTypePackage.Literals.XML_TYPE_DOCUMENT_ROOT__COMMENT; - if (!isText) - { - if (feature instanceof EReference) - { - rootObject = (EObject)featureMap.getValue(index); - documentRoot.eUnset(feature); - } - else //EAttribute - { - rootObject = (EObject)SDOUtil.createDataTypeWrapper((Type)feature.getEType(), featureMap.getValue(index)); - } - rootElement = feature; - break; - } - } //for - } - else - { - rootObject = documentRoot; - documentRoot = null; - } - } - } - - public DataObject getRootObject() - { - return (DataObject)rootObject; - } - - public String getRootElementURI() - { - if (rootElement != null) - { - return extendedMetaData.getNamespace(rootElement); - } - else if (rootObject != null) - { - return extendedMetaData.getNamespace(rootObject.eClass()); - } - return null; - } - - public String getRootElementName() - { - if (rootElement != null) - { - return extendedMetaData.getName(rootElement); - } - else if (rootObject != null) - { - return extendedMetaData.getName(rootObject.eClass()); - } - return null; - } - - public String getEncoding() - { - return resource.getEncoding(); - } - - public void setEncoding(String encoding) - { - resource.setEncoding(encoding); - } - - public boolean isXMLDeclaration() - { - return Boolean.FALSE.equals(resource.getDefaultSaveOptions().get(XMLResource.OPTION_DECLARE_XML)); - } - - public void setXMLDeclaration(boolean xmlDeclaration) - { - resource.getDefaultSaveOptions().put(XMLResource.OPTION_DECLARE_XML, xmlDeclaration ? Boolean.TRUE : Boolean.FALSE); - } - - public String getXMLVersion() - { - return resource.getXMLVersion(); - } - - public void setXMLVersion(String xmlVersion) - { - resource.setXMLVersion(xmlVersion); - } - - /** - * @return an EMap containing the schema locations or null when no map - */ - protected EMap getSchemaLocationMap() - { - EMap result = null; - if ((documentRoot != null) && (extendedMetaData != null)) - { - EReference xsiSchemaLocationMapFeature = extendedMetaData - .getXSISchemaLocationMapFeature(documentRoot.eClass()); - if (xsiSchemaLocationMapFeature != null) - { - result = (EMap) documentRoot.eGet(xsiSchemaLocationMapFeature); - } - } - return result; - } - - /** - * @param value - * from schema location map. - * @return string form of URI from provided value, deresolved if appropriate. - */ - protected String deresolve(String value) - { - URI location = URI.createURI(value); - URI resourceURI = resource.getURI(); - boolean shouldDeresolve = resourceURI != null && !resourceURI.isRelative() - && resourceURI.isHierarchical(); - if (shouldDeresolve && !location.isRelative()) - { - URI deresolvedURI = location.deresolve(resourceURI, true, true, false); - if (deresolvedURI.hasRelativePath()) - { - location = deresolvedURI; - } - } - return location.toString(); - } - - /** - * @param value - * for schema location from input parameter. - * @return string form of URI from provided value, resolved if appropriate. - */ - protected String resolve(String value) - { - URI location = URI.createURI(value); - URI resourceURI = resource.getURI(); - boolean shouldResolve = resourceURI != null && resourceURI.isHierarchical() - && !resourceURI.isRelative(); - if (shouldResolve && location.isRelative() && location.hasRelativePath()) - { - location = location.resolve(resourceURI, false); - } - return location.toString(); - } - - public String getSchemaLocation() - { - EMap xsiSchemaLocationMap = getSchemaLocationMap(); - if (xsiSchemaLocationMap != null) - { - if (!xsiSchemaLocationMap.isEmpty()) - { - StringBuffer xsiSchemaLocation = new StringBuffer(); - for (Iterator i = xsiSchemaLocationMap.entrySet().iterator(); i - .hasNext();) - { - Map.Entry entry = (Map.Entry) i.next(); - String namespace = (String) entry.getKey(); - if (namespace != null) - { - if (xsiSchemaLocation.length() > 0) - { - xsiSchemaLocation.append(' '); - } - xsiSchemaLocation.append(namespace); - xsiSchemaLocation.append(' '); - String value = entry.getValue().toString(); - xsiSchemaLocation.append(deresolve(value)); - } - } - return xsiSchemaLocation.toString().equals("") ? null - : xsiSchemaLocation.toString(); - } - } - return null; - } - - public void setSchemaLocation(String schemaLocation) - { - EMap xsiSchemaLocationMap = getSchemaLocationMap(); - if (xsiSchemaLocationMap != null) - { - // only remove the entries from xsiSchemaLocationMap that contain a - // non-null key - for (Iterator i = xsiSchemaLocationMap.entrySet().iterator(); i.hasNext();) - { - Map.Entry entry = (Map.Entry) i.next(); - if (entry.getKey() != null) - { - i.remove(); - } - } - if (xsiSchemaLocationMap.size() == 0) - { - resource.getDefaultSaveOptions().put( - XMLResource.OPTION_SCHEMA_LOCATION, Boolean.FALSE); - } - if (schemaLocation != null) - { - String[] values = schemaLocation.split(WHITESPACE_REGEX); - for (int i = 0; i < values.length; i++) // note: also incremented in - // loop - { - String key = values[i++]; - if (i < values.length) - { - xsiSchemaLocationMap.put(key, resolve(values[i])); - } - } - if (xsiSchemaLocationMap.size() != 0) - { - resource.getDefaultSaveOptions().put( - XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); - } - } - } - } - - public String getNoNamespaceSchemaLocation() - { - EMap xsiSchemaLocationMap = getSchemaLocationMap(); - if (xsiSchemaLocationMap != null) - { - StringBuffer xsiSchemaLocation = new StringBuffer(); - if (!xsiSchemaLocationMap.isEmpty()) - { - Object valueObject = xsiSchemaLocationMap.get(null); - if (valueObject != null) - { - String valueString = (String) valueObject; - String[] values = valueString.split(WHITESPACE_REGEX); - for (int i = 0; i < values.length; i++) - { - if (xsiSchemaLocation.length() > 0) - { - xsiSchemaLocation.append(' '); - } - xsiSchemaLocation.append(deresolve(values[i])); - } - } - String result = xsiSchemaLocation.toString(); - return result.equals("") ? null : result; - } - } - return null; - } - - public void setNoNamespaceSchemaLocation(String schemaLocation) - { - EMap xsiSchemaLocationMap = getSchemaLocationMap(); - if (xsiSchemaLocationMap != null) - { - // only remove the entries from xsiSchemaLocationMap that contain a null - // key - xsiSchemaLocationMap.removeKey(null); - if (xsiSchemaLocationMap.size() == 0) - { - resource.getDefaultSaveOptions().put( - XMLResource.OPTION_SCHEMA_LOCATION, Boolean.FALSE); - } - if (schemaLocation != null) - { - String[] values = schemaLocation.split(WHITESPACE_REGEX); - for (int i = 0; i < values.length; i++) - { - xsiSchemaLocationMap.put(null, resolve(values[i])); - } - if (xsiSchemaLocationMap.size() != 0) - { - resource.getDefaultSaveOptions().put( - XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE); - } - } - } - } -} |