diff options
Diffstat (limited to 'branches/sdo-1.1.1-incubating/lib/src/main/java')
11 files changed, 1746 insertions, 0 deletions
diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/Event.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/Event.java new file mode 100644 index 0000000000..4b4d0c4050 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/Event.java @@ -0,0 +1,63 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.api; + +import commonj.sdo.Property; + +/** + * An experimental Tuscany API interface, subject to possible change, + * to permit notification of change events on a DataObject instance + */ +public interface Event { + + Object getNotifier(); + + /** + * constants returned from getEventType() + */ + int SET = 1; + int UNSET = 2; + int ADD = 3; + int REMOVE = 4; + int ADD_MANY = 5; + int REMOVE_MANY = 6; + int MOVE = 7; + int REMOVE_LISTENER = 8; + + int getEventType(); + + /** + * get the Property for which the value changed + */ + Property getProperty(); + Object getOldValue(); + Object getNewValue(); + + /* + * returns true if the Property value was in state "set" before this change occurred. + */ + boolean wasSet(); + boolean isTouch(); + + int NO_INDEX = -1; + int getPosition(); + + } + diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/EventListener.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/EventListener.java new file mode 100644 index 0000000000..cfb534eaf0 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/EventListener.java @@ -0,0 +1,33 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.api; + +/** + * An experimental Tuscany API interface, subject to possible change. + * Can be registered with a DataObject instance to permit change + * notifications for Property values of the DataObject. + * @see SDOHelper#addChangeListener(commonj.sdo.DataObject, EventListener) + * + */ +public interface EventListener { + + public void eventNotification(Event e); + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOHelper.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOHelper.java new file mode 100644 index 0000000000..17d9a08a87 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOHelper.java @@ -0,0 +1,452 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.api; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +import commonj.sdo.helper.XSDHelper; + +import commonj.sdo.DataGraph; +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Sequence; +import commonj.sdo.Type; +import commonj.sdo.helper.CopyHelper; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; + +/** + * This interface provides helper functions which are not included in the SDO specification itself. + * Use of the functions in this interface is recommended, instead of resorting to low-level + * implementation-specific APIs. + */ +public interface SDOHelper +{ + final int UNBOUNDED = -1; //return value from getUpperBound() when maxOccurs="unbounded" + final int UNSPECIFIED = -2; //return value from getUpperBound() for global property + + /** + * Create a non-extensible HelperContext to provide access to a consistent set of Helpers which make use + * of a new TypeHelper instance to provide scope for type definitions. + * @return the new HelperContext + * @see #createHelperContext(boolean) + */ + public HelperContext createHelperContext(); + + /** + * Create a non-extensible HelperContext to provide access to a consistent set of Helpers which make use + * of a new TypeHelper instance to provide scope for type definitions. + * @param options Map of default XMLOptions + * @return the new HelperContext + * @see #createHelperContext(boolean) + */ + public HelperContext createHelperContext(boolean extensibleNamespaces, Map options); + + /** + * Create a HelperContext to provide access to a consistent set of Helpers which make use of a new + * TypeHelper instance to provide scope for type definitions. + * @param extensibleNamespaces true if the contents of a namespaces should be incrementally modifiable over time + * @return the new HelperContext + */ + public HelperContext createHelperContext(boolean extensibleNamespaces); + + /** + * create a non-extensible HelperContext with default load/save options + * @param options default load/save options from XMLOptions + * @return the new HelperContext + */ + public HelperContext createHelperContext(Map options); + + /** + * Creates an instance of a data type from the specified string. + * @param dataType a Type, for which isDataType() returns true, to instantiate. + * @param literal the string value of the dataType. + * @return an instance of the dataType. + * @see #convertToString(Type, Object) + */ + public Object createFromString(Type dataType, String literal); + + /** + * Converts an instance of a data type to a string literal representation. + * @param dataType the Type, for which isDataType() returns true, of the value to convert. + * @param value a value of the dataType. + * @return the string literal representation of the value. + * @see #createFromString(Type, String) + */ + public String convertToString(Type dataType, Object value); + + /** + * Create a DataObject wrapper for an instance of the specified dataType. + * This method is typically used to create a root object that can be passed to the XMLHelper.save() + * method when the root element to be serialized is an XMLSchema simpleType. + * @param dataType a Type for which isDataType() returns true. + * @param value the instance value. + * @return a DataObject wrapper for the specified value. + */ + public DataObject createDataTypeWrapper(Type dataType, Object value); + + /** + * Get the SDO built-in type corresponding to the specified XSD type in the XML Schema + * namespace ("http://www.w3.org/2001/XMLSchema"). + * @param xsdType a type name in the XML Schema namespace. + * @return the SDO built-in Type corresponding to the specified XSD type. + */ + public Type getXSDSDOType(String xsdType); + + /** + * Gets the Sequence corresponding to the specified substitutable Property of the specified DataObject. + * @param dataObject the data object. + * @param head a substitution group head property. + * @return the Sequence corresponding to the specified substitutable Property of the specified DataObject or + * null if the specified Property isn't a substitution head. + */ + public Sequence getSubstitutionValues(DataObject dataObject, Property head); + + /** + * Get the SDO built-in type corresponding to the specified Java instanceClass. + * @param javaClass the Java instanceClass of the type. + * @return the SDO built-in Type corresponding to the specified instanceClass. + */ + public Type getJavaSDOType(Class javaClass); + + /** + * Return whether at least one value is required for a valid instance of the specified property. + * @param the property in question. + * @return true if the property is required. + */ + public boolean isRequired(Property property); + + /** + * Return the upper bound of the specified property or -1 if unbounded. + * @param the property in question. + * @return the upper bound. + */ + public int getUpperBound(Property property); + + /** + * Return the lower bound of the specified property or 1 by default + * @param the property in question. + * @return the lower bound. + */ + public int getLowerBound(Property property); + + /** + * Return Enumeration facet + * @param type + * @return List of enum facets in a Type + *///Amita + public List getEnumerationFacet(Type type); + + /** + * Return Pattern facet + * @param type + * @return List of pattern facets in a Type + *///Amita + public List getPatternFacet(Type type); + + /** + * Returns whether the Property is many-valued given the specified context. + * @param property The Property in question + * @param context The context to check whether the specified Property is many-valued + * @return true if the Property is many-valued given the specified context. + */ + public boolean isMany(Property property, DataObject context); + + /** + * Create an empty data graph. + * @return the new data graph instance. + */ + public DataGraph createDataGraph(); + + /** + * Set the root object of a data graph. + * @param dataGraph the data graph in which to set the root object. + * @param rootObject the root object. + */ + public void setRootObject(DataGraph dataGraph, DataObject rootObject); + + /** + * Load a serialized data graph from the specified insputStream. + * + * @param inputStream the inputStream of the data graph. + * @param options loader control options, or null. + * @param hc the HelperContext in which to register deserialized Types and to find Types when + * creating DataObject instances, or null for default HelperContext. + * @return the de-serialized data graph. + * @throws IOException + */ + public DataGraph loadDataGraph(InputStream inputStream, Map options, HelperContext hc) throws IOException; + + /** + * Serialize the specified data graph to the specified outputStream. + * @param dataGraph the data graph to save. + * @param outputStream the outputStream for the data graph. + * @param options serializer control options, or null. + * @throws IOException + */ + public void saveDataGraph(DataGraph dataGraph, OutputStream outputStream, Map options) throws IOException; + + /** + * Registers the specified {@link Type type}(s) to be serialized along with + * the {@link DataObject data object}(s) in the graph. For example, the list of types returned from + * {@link TypeHelper#define} can be registered with this method, allowing deserialization of + * instances of a dynamically defined model. + * @param dataGraph the DataGraph in which to register the specified type(s). + * @param types a list containing the type(s) to be registered (TBD or null to automatically register all + * types used by the objects in the DataGraph). + */ + public void registerDataGraphTypes(DataGraph dataGraph, List/*Type*/types); + + /** + * Create a new cross scope CopyHelper. + * @param hc the HelperContext containing the Types to use to create the copy objects. + * @return the new CopyHelper. + */ + public CopyHelper createCrossScopeCopyHelper(HelperContext targetScope); + + + /** + * Create a new XMLStreamHelper, with visibility to types in the specified HelperContext scope. + * @param hc the HelperContext to use for locating types. + * @return the new XMLStreamHelper. + */ + public XMLStreamHelper createXMLStreamHelper(HelperContext hc); + + /** + * Create a new ObjectInputStream in the specifice HelperContext scope. + * @param inputStream the inputStream with which to create the ObjectInputStream. + * @param helperContext the HelperContext scope. + * @return the new ObjectInputStream. + */ + public ObjectInputStream createObjectInputStream(InputStream inputStream, HelperContext helperContext) throws IOException; + + /** + * Create a new ObjectOutputStream in the specifice HelperContext scope. + * @param outputStream the outputStream with which to create the ObjectOutputStream. + * @param helperContext the HelperContext scope. + * @return the new ObjectOutputStream. + */ + public ObjectOutputStream createObjectOutputStream(OutputStream outputStream, HelperContext helperContext) throws IOException; + + /** + * Gets all of the types associated with a uri. + * @param hc the HelperContext to use for locating types. + * @param uri the URI of the Types + * @return a List containing instances of Type, null if uri is not found. + */ + public List getTypes(HelperContext hc, String uri); + + /** + * Gets the open content subset of the specified DataObject's instance properties. + * @param dataObject the DataObject instance + * @return a List containing any open content properties of the DataObject + */ + public List getOpenContentProperties(DataObject dataObject); + + /** + * Return true if the specified type is a special DocumentRoot Type. + * @param type the Type in question + * @return true if type is a DocumentRoot + */ + public boolean isDocumentRoot(Type type); + + /** + * Return an XPath from the containment root to the specified DataObject. + * @param dataObject a DataObject + * @return the XPath from the containment root. + */ + public String getXPath(DataObject dataObject); + + /** + * Gets a MetaDataBuilder which can be used to programatically create SDO Types and Properties. + * @return a MetaDataBuilder instance + */ + public MetaDataBuilder getMetaDataBuilder(); + + /** + * An experimental interface, subject to possible change that permits + * registration of an event listener with a DataObject instance + * @param dob DataObject + * @param listener EventListener + */ + public void addChangeListener(DataObject dob, EventListener listener); + + /** + * An experimental interface, subject to possible change that permits + * deregistration of an event listener with a DataObject instance + * @param dob DataObject + * @param listener EventListener + */ + public void removeChangeListener(DataObject dob, EventListener listener); + + /** + * This interface provides methods which can be used to programatically create SDO Types and Properties. + * It provides a lower level and more efficient API then the DataObject-based one of TypeHelper.define(). + */ + + public interface MetaDataBuilder + { + + /** + * Create a Type in the specified TypeHelper scope. + * @return the new Type. + */ + public Type createType(HelperContext hc, String uri, String name, boolean isDataType); + + /** + * Add a baseType to the specified type. + */ + public void addBaseType(Type type, Type baseType); + + /** + * Add an aliasName to the specified type. + */ + public void addAliasName(Type type, String aliasName); + + /** + * Set the isOpen value of the specified type. + */ + public void setOpen(Type type, boolean isOpen); + + /** + * Set the isSequenced value of the specified type. + */ + public void setSequenced(Type type, boolean isSequenced); + + /** + * Set the isAbstract value of the specified type. + */ + public void setAbstract(Type type, boolean isAbstract); + + /** + * Set the isAbstract value of the specified type. + */ + public void setJavaClassName(Type type, String javaClassName); + + /** + * Create a new property in the specified containingType. + */ + public Property createProperty(Type containingType, String name, Type propertyType); + + /** + * Set a SDO property to become an XSD element or attribute + */ + public void setPropertyXMLKind(Property property, boolean isXmlElement); + + /** + * Create a new open content property in the specified TypeHelper scope. + */ + public Property createOpenContentProperty(HelperContext hc, String uri, String name, Type type); + + /** + * Add an aliasName to the specified property. + */ + public void addAliasName(Property property, String aliasName); + + /** + * Set the isMany value of the specified property. + */ + public void setMany(Property property, boolean isMany); + + /** + * Set the isContainment value of the specified property. + */ + public void setContainment(Property property, boolean isContainment); + + /** + * Set the default value of the specified property. + */ + public void setDefault(Property property, String defaultValue); + + /** + * Set the isReadOnly value of the specified property. + */ + public void setReadOnly(Property property, boolean isReadOnly); + + /** + * Set the opposite value of the specified property. + */ + public void setOpposite(Property property, Property opposite); + + /** + * Add an instance property to the specified type. + */ + public void addTypeInstanceProperty(Type definedType, Property instanceProperty, Object value); + + /** + * Add anf instance property to the specified property. + */ + public void addPropertyInstanceProperty(Property definedProperty, Property instanceProperty, Object value); + } + + /** + * This interface contains options that can be passed to the XMLHelper load() and save() methods. + */ + public interface XMLOptions + { + /** + * Line Break String such as "\n", "\r\n", "\r" and "", absence/null is the default (line.separator System Property) + */ + final String XML_SAVE_LINE_BREAK = "LineBreak"; + + /** + * Indent String such as "\t", "", etc. absence/null is the default (" ") + */ + final String XML_SAVE_INDENT = "indent"; + + /** + * Margin String such as " ", "\t\t", etc. Absence/null/"" is the default (no margin) + */ + final String XML_SAVE_MARGIN = "margin"; + + /** + * Attribute formatting that exceeds the specified width as Integer will cause a line break so that formatting will continue indented on the next line + */ + final String XML_SAVE_LINE_WIDTH = "LINE_WIDTH"; + + /** + * Boolean to save a doctype declaration + */ + final String XML_SAVE_DOCTYPE = "SAVE_DOCTYPE"; + + /** + * Boolean to process the schemaLocation/noNamespaceSchemaLocation attributes occurring in the instance document to {@link XSDHelper#define convert XSD(s) to Types} + */ + final String XML_LOAD_SCHEMA = "ProcessSchemaLocations"; + + /** + * To tolerate malformed elements and attributes (default unless set by System property XML.load.form.lax). 0 not to. + */ + final String XML_LOAD_LAX_FORM = "load malform"; + + /** + * Allows you to record unknown features during deserialization/loading. + * The default is Boolean.FALSE unless set to Boolean.TRUE explicitly. + */ + final String XML_LOAD_UNKNOWN_PROPERTIES = "load unknown properties"; + } + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOUtil.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOUtil.java new file mode 100644 index 0000000000..54f86aafbd --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/SDOUtil.java @@ -0,0 +1,445 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.api; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sdo.api.EventListener; +import org.apache.tuscany.sdo.spi.HelperProviderBase; + +import commonj.sdo.DataGraph; +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Sequence; +import commonj.sdo.Type; +import commonj.sdo.helper.CopyHelper; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.impl.HelperProvider; + +/** + * This class provides convenient static utility functions for calling the default SDOHelper. + */ +public final class SDOUtil +{ + protected static SDOHelper defaultSDOHelper = ((HelperProviderBase)HelperProvider.INSTANCE).sdoHelper(); + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createDataTypeWrapper(Type, Object)}. + */ + public static DataObject createDataTypeWrapper(Type dataType, Object value) + { + return defaultSDOHelper.createDataTypeWrapper(dataType, value); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createFromString(Type, String)}. + */ + public static Object createFromString(Type dataType, String literal) + { + return defaultSDOHelper.createFromString(dataType, literal); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#convertToString(Type, Object)}. + */ + public static String convertToString(Type dataType, Object value) + { + return defaultSDOHelper.convertToString(dataType, value); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getXSDSDOType(String)}. + */ + public static Type getXSDSDOType(String xsdType) + { + return defaultSDOHelper.getXSDSDOType(xsdType); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getSubstitutionValues(DataObject, Property)}. + */ + public static Sequence getSubstitutionValues(DataObject dataObject, Property head) + { + return defaultSDOHelper.getSubstitutionValues(dataObject, head); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getJavaSDOType(Class)}. + */ + public static Type getJavaSDOType(Class javaClass) + { + return defaultSDOHelper.getJavaSDOType(javaClass); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#isRequired(Property)}. + */ + public static boolean isRequired(Property property) + { + return defaultSDOHelper.isRequired(property); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getUpperBound(Property)}. + */ + public static int getUpperBound(Property property) + { + return defaultSDOHelper.getUpperBound(property); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getLowerBound(Property)}. + */ + public static int getLowerBound(Property property) + { + return defaultSDOHelper.getLowerBound(property); + } + + public static List getEnumerationFacet(Type type) { + return defaultSDOHelper.getEnumerationFacet(type); + } + + public static List getPatternFacet(Type type) { + return defaultSDOHelper.getPatternFacet(type); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#isMany(Property, DataObject)}. + */ + public static boolean isMany(Property property, DataObject context) + { + return defaultSDOHelper.isMany(property, context); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createDataGraph}. + */ + public static DataGraph createDataGraph() + { + return defaultSDOHelper.createDataGraph(); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#setRootObject(DataGraph, DataObject)}. + */ + public static void setRootObject(DataGraph dataGraph, DataObject rootObject) + { + defaultSDOHelper.setRootObject(dataGraph, rootObject); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#loadDataGraph(InputStream, Map, TypeHelper)}. + */ + public static DataGraph loadDataGraph(InputStream inputStream, Map options) throws IOException + { + return defaultSDOHelper.loadDataGraph(inputStream, options, (HelperContext)null); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#loadDataGraph(InputStream, Map, HelperContext)}. + */ + public static DataGraph loadDataGraph(InputStream inputStream, Map options, HelperContext hc) throws IOException + { + return defaultSDOHelper.loadDataGraph(inputStream, options, hc); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#saveDataGraph(DataGraph, OutputStream, Map)}. + */ + public static void saveDataGraph(DataGraph dataGraph, OutputStream outputStream, Map options) throws IOException + { + defaultSDOHelper.saveDataGraph(dataGraph, outputStream, options); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#registerDataGraphTypes(DataGraph, List)}. + */ + public static void registerDataGraphTypes(DataGraph dataGraph, List/*Type*/ types) + { + defaultSDOHelper.registerDataGraphTypes(dataGraph, types); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createHelperContext(boolean,Map)}. + */ + public static HelperContext createHelperContext(boolean extensibleNamespaces,Map options){ + return defaultSDOHelper.createHelperContext(extensibleNamespaces, options); + } + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createHelperContext(boolean)}. + */ + public static HelperContext createHelperContext(boolean extensibleNamespaces) + { + return defaultSDOHelper.createHelperContext(extensibleNamespaces); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createHelperContext}. + */ + public static HelperContext createHelperContext(Map options) + { + return defaultSDOHelper.createHelperContext(options); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createHelperContext}. + */ + public static HelperContext createHelperContext() + { + return defaultSDOHelper.createHelperContext(); + } + + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createCrossScopeCopyHelper(HelperContext)}. + */ + public static CopyHelper createCrossScopeCopyHelper(HelperContext hc) + { + return defaultSDOHelper.createCrossScopeCopyHelper(hc); + } + + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createXMLStreamHelper(HelperContext)}. + */ + public static XMLStreamHelper createXMLStreamHelper(HelperContext hc) + { + return defaultSDOHelper.createXMLStreamHelper(hc); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createObjectInputStream(InputStream, HelperContext)}. + */ + public static ObjectInputStream createObjectInputStream(InputStream inputStream, HelperContext helperContext) throws IOException + { + return defaultSDOHelper.createObjectInputStream(inputStream, helperContext); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#createObjectOutputStream(OutputStream, HelperContext)}. + */ + public static ObjectOutputStream createObjectOutputStream(OutputStream outputStream, HelperContext helperContext) throws IOException + { + return defaultSDOHelper.createObjectOutputStream(outputStream, helperContext); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getTypes(HelperContext, String)}. + */ + public static List getTypes(HelperContext hc, String uri) { + + return defaultSDOHelper.getTypes(hc, uri); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getOpenContentProperties(DataObject)}. + */ + public static List getOpenContentProperties(DataObject dataObject) + { + return defaultSDOHelper.getOpenContentProperties(dataObject); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#isDocumentRoot(Type)}. + */ + public static boolean isDocumentRoot(Type type) + { + return defaultSDOHelper.isDocumentRoot(type); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper#getXPath(DataObject)}. + */ + public static String getXPath(DataObject dataObject) + { + return defaultSDOHelper.getXPath(dataObject); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#createType(HelperContext, String, String, boolean)}. + */ + public static Type createType(HelperContext hc, String uri, String name, boolean isDataType) + { + return defaultSDOHelper.getMetaDataBuilder().createType(hc, uri, name, isDataType); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#addBaseType(Type, Type)}. + */ + public static void addBaseType(Type type, Type baseType) + { + defaultSDOHelper.getMetaDataBuilder().addBaseType(type, baseType); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#addAliasName(Type, String)}. + */ + public static void addAliasName(Type type, String aliasName) + { + defaultSDOHelper.getMetaDataBuilder().addAliasName(type, aliasName); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setOpen(Type, boolean)}. + */ + public static void setOpen(Type type, boolean isOpen) + { + defaultSDOHelper.getMetaDataBuilder().setOpen(type, isOpen); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setSequenced(Type, boolean)}. + */ + public static void setSequenced(Type type, boolean isSequenced) + { + defaultSDOHelper.getMetaDataBuilder().setSequenced(type, isSequenced); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setAbstract(Type, boolean)}. + */ + public static void setAbstract(Type type, boolean isAbstract) + { + defaultSDOHelper.getMetaDataBuilder().setAbstract(type, isAbstract); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setJavaClassName(Type, String)}. + */ + public static void setJavaClassName(Type type, String javaClassName) + { + defaultSDOHelper.getMetaDataBuilder().setJavaClassName(type, javaClassName); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#createProperty(Type, String, Type)}. + */ + public static Property createProperty(Type containingType, String name, Type propertyType) + { + return defaultSDOHelper.getMetaDataBuilder().createProperty(containingType, name, propertyType); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setPropertyXMLKind(Property, boolean)}. + */ + public static void setPropertyXMLKind(Property property, boolean isXmlElement) { + defaultSDOHelper.getMetaDataBuilder().setPropertyXMLKind(property, isXmlElement); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#createOpenContentProperty(TypeHelper, String, String, Type)}. + */ + public static Property createOpenContentProperty(HelperContext hc, String uri, String name, Type type) + { + return defaultSDOHelper.getMetaDataBuilder().createOpenContentProperty(hc, uri, name, type); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#addAliasName(Property, String)}. + */ + public static void addAliasName(Property property, String aliasName) + { + defaultSDOHelper.getMetaDataBuilder().addAliasName(property, aliasName); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setMany(Property, boolean)}. + */ + public static void setMany(Property property, boolean isMany) + { + defaultSDOHelper.getMetaDataBuilder().setMany(property, isMany); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setContainment(Property, boolean)}. + */ + public static void setContainment(Property property, boolean isContainment) + { + defaultSDOHelper.getMetaDataBuilder().setContainment(property, isContainment); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setDefault(Property, String)}. + */ + public static void setDefault(Property property, String defaultValue) + { + defaultSDOHelper.getMetaDataBuilder().setDefault(property, defaultValue); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setReadOnly(Property, boolean)}. + */ + public static void setReadOnly(Property property, boolean isReadOnly) + { + defaultSDOHelper.getMetaDataBuilder().setReadOnly(property, isReadOnly); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#setOpposite(Property, Property)}. + */ + public static void setOpposite(Property property, Property opposite) + { + defaultSDOHelper.getMetaDataBuilder().setOpposite(property, opposite); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#addTypeInstanceProperty(Type, Property, Object)}. + */ + public static void addTypeInstanceProperty(Type definedType, Property property, Object value) + { + defaultSDOHelper.getMetaDataBuilder().addTypeInstanceProperty(definedType, property, value); + } + + /** + * @see {@link org.apache.tuscany.sdo.api.SDOHelper.MetaDataBuilder#addPropertyInstanceProperty(Property, Property, Object)}. + */ + public static void addPropertyInstanceProperty(Property definedProperty, Property property, Object value) + { + defaultSDOHelper.getMetaDataBuilder().addPropertyInstanceProperty(definedProperty, property, value); + } + + + /** + * @see SDOHelper#addChangeListener(DataObject, EventListener) + * @param dob + * @param l + */ + public static void addChangeListener(DataObject dob, EventListener l) { + defaultSDOHelper.addChangeListener(dob, l); + } + + /** + * @see SDOHelper#addChangeListener(DataObject, EventListener) + * @param dob + * @param l + */ + public static void removeChangeListener(DataObject dob, EventListener l) { + defaultSDOHelper.removeChangeListener(dob, l); + } + + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/XMLStreamHelper.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/XMLStreamHelper.java new file mode 100644 index 0000000000..bf283256fe --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/XMLStreamHelper.java @@ -0,0 +1,125 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.api; + +import java.util.Map; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; + +/** + * Helper interface for reading and writing SDO DataObjects from XML streams + * (StAX). + * + * @version $Rev: 503913 $ $Date: 2007-02-05 17:53:34 -0500 (Mon, 05 Feb 2007) $ + */ +public interface XMLStreamHelper { + /** + * Creates and returns an XMLDocument from an XML input stream. The reader + * must be positioned on a START_DOCUMENT event. + * + * @param reader the stream to read + * @return an XMLDocument created from the stream + * @throws XMLStreamException if there was a problem reading the stream + * @throws IllegalStateException if the reader is not positioned on a + * START_DOCUMENT event + */ + XMLDocument load(XMLStreamReader reader) throws XMLStreamException, IllegalStateException; + + /** + * Save a XMLDocument to an XML stream. + * + * @param document the document to be written + * @param writer the stream to write to + * @throws XMLStreamException if there was a problem writing to the stream + */ + void save(XMLDocument document, XMLStreamWriter writer) throws XMLStreamException; + + void save(XMLDocument document, XMLStreamWriter writer, Map options) throws XMLStreamException; + + /** + * Creates and returns a XMLStreamReader that can be used to read an + * XMLDocument as a XML event stream. The reader will be positioned on a + * START_DOCUMENT event. + * + * @param document the XMLDocument to be read + * @return an XMLStreamReader that can be used to read the document + */ + XMLStreamReader createXMLStreamReader(XMLDocument document) throws XMLStreamException; + + /** + * Create a DataObject from an element in a XML stream. The reader must be + * positioned on a START_ELEMENT event. + * + * @param reader the stream to read + * @return a DataObject created from the element in the stream + * @throws XMLStreamException if there was a problem reading the stream + * @throws IllegalStateException if the reader is not positioned on a + * START_ELEMENT event + */ + DataObject loadObject(XMLStreamReader reader) throws XMLStreamException, IllegalStateException; + + /** + * Default Type to load DataObject if the element is unqualified/local + * without xsi:type or the qualified/global element or xsi:type fail to + * resolve. Can be null. + */ + String OPTION_DEFAULT_ROOT_TYPE = "default root type"; + + /** + * Create a DataObject from an element in a XML stream. The reader must be + * positioned on a START_ELEMENT event. + * + * @param reader the stream to read + * @param options {@link OPTION_DEFAULT_ROOT_TYPE}; can be null or empty + * @return a DataObject created from the element in the stream + * @throws XMLStreamException if there was a problem reading the stream + * @throws IllegalStateException if the reader is not positioned on a + * START_ELEMENT event + */ + DataObject loadObject(XMLStreamReader reader, Map options) throws XMLStreamException, IllegalStateException; + + /** + * Save a DataObject to an XML stream. + * + * @param sdo the DataObject to be written + * @param writer the stream to write to + * @throws XMLStreamException if there was a problem writing to the stream + */ + void saveObject(DataObject sdo, XMLStreamWriter writer) throws XMLStreamException; + + void saveObject(DataObject sdo, XMLStreamWriter writer, Map options) throws XMLStreamException; + + /** + * Creates and returns a XMLStreamReader that can be used to read a + * DataObject as a XML event stream. The reader will be positioned on a + * START_ELEMENT event. + * + * @param sdo the DataObject to be read + * @return an XMLStreamReader that can be used to read the DataObject + */ + XMLStreamReader createXMLStreamReader(DataObject sdo); + + HelperContext getHelperContext(); +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/overview.html b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/overview.html new file mode 100644 index 0000000000..c6bd255b8f --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/api/overview.html @@ -0,0 +1,38 @@ +<html>
+<!--
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ * -->
+<head>
+ <title>Tuscany API extensions to Service Data Objects (SDO)</title>
+</head>
+<BODY>
+<h1>Tuscany API extensions to Service Data Objects (SDO)</h1>
+ <h2>Overview</h2>
+<p>
+The "org.apache.tuscany.sdo.api" package represents Tuscany API for SDO Java
+above and beyond what is offered by the SDO API itself. The contents of this
+project provide a means to achieve operations that are not currently addressed
+by the SDO API.
+</p>
+<p>
+The SDOUtil class simply provides a set of static convenince methods for
+exercising the methods of a default instance of the SDOHelper interface.
+</p>
+</BODY>
+</html>
diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectInputStream.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectInputStream.java new file mode 100644 index 0000000000..606b4c8fc3 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectInputStream.java @@ -0,0 +1,49 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.lib; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; + +import commonj.sdo.helper.HelperContext; + +/** + * This subclass of ObjectInputStream provides a place to store the scope in which + * it was created. + */ +public class SDOObjectInputStream extends ObjectInputStream { + + private HelperContext helperContext; + + public SDOObjectInputStream(InputStream in, HelperContext helperContext) throws IOException{ + super(in); + this.helperContext = helperContext; + } + + public HelperContext getHelperContext() { + return helperContext; + } + + public void setHelperContext(HelperContext helperContext) { + this.helperContext = helperContext; + } + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectOutputStream.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectOutputStream.java new file mode 100644 index 0000000000..05f2105b97 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/SDOObjectOutputStream.java @@ -0,0 +1,49 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.lib; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; + +import commonj.sdo.helper.HelperContext; + +/** + * This subclass of ObjectOutputStream provides a place to store the scope in which + * it was created. + */ +public class SDOObjectOutputStream extends ObjectOutputStream { + + private HelperContext helperContext; + + public SDOObjectOutputStream(OutputStream os, HelperContext helperContext) throws IOException{ + super(os); + this.helperContext = helperContext; + } + + public HelperContext getHelperContext() { + return helperContext; + } + + public void setHelperContext(HelperContext helperContext) { + this.helperContext = helperContext; + } + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/UnknownPropertyList.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/UnknownPropertyList.java new file mode 100644 index 0000000000..95eabd4b82 --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/lib/UnknownPropertyList.java @@ -0,0 +1,70 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.lib; + +import java.util.AbstractList; +import java.util.Collections; +import java.util.List; + +import commonj.sdo.DataObject; + +public class UnknownPropertyList extends AbstractList { + protected List delegateList = Collections.EMPTY_LIST; + protected DataObject dataObject; + protected String path; + + public UnknownPropertyList(DataObject dataObject, String path) { + this.dataObject = dataObject; + this.path = path; + } + + public Object get(int index) { + return getDelegateList().get(index); + } + + public int size() { + return getDelegateList().size(); + } + + public Object remove(int index) { + return getDelegateList().remove(index); + } + public Object set(int index, Object element) { + return getDelegateList().set(index, element); + } + + public void add(int index, Object element) { + if (getDelegateList() == Collections.EMPTY_LIST && index == 0) { + dataObject.set(path, Collections.singletonList(element)); + delegateList = (List)dataObject.get(path); + } + else { + delegateList.add(index, element); + } + } + + protected List getDelegateList() { + if (delegateList == Collections.EMPTY_LIST) { + List propertyList = (List)dataObject.get(path); + if (propertyList != null) delegateList = propertyList; + } + return delegateList; + } +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/HelperProviderBase.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/HelperProviderBase.java new file mode 100644 index 0000000000..375552497b --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/HelperProviderBase.java @@ -0,0 +1,246 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.spi; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.NotSerializableException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.ObjectStreamException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import org.apache.tuscany.sdo.api.SDOHelper; +import org.apache.tuscany.sdo.api.SDOUtil; +import org.apache.tuscany.sdo.api.XMLStreamHelper; +import org.apache.tuscany.sdo.lib.SDOObjectInputStream; +import org.apache.tuscany.sdo.lib.SDOObjectOutputStream; + +import commonj.sdo.DataGraph; +import commonj.sdo.DataObject; +import commonj.sdo.helper.CopyHelper; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.DataHelper; +import commonj.sdo.helper.EqualityHelper; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XMLDocument; +import commonj.sdo.helper.XMLHelper; +import commonj.sdo.helper.XSDHelper; +import commonj.sdo.impl.HelperProvider; +import commonj.sdo.impl.ExternalizableDelegator.Resolvable; + + +/** + * Create and manage all the default helpers + */ +public abstract class HelperProviderBase extends HelperProvider +{ + protected CopyHelper copyHelper; + + protected DataFactory dataFactory; + + protected DataHelper dataHelper; + + protected EqualityHelper equalityHelper; + + protected TypeHelper typeHelper; + + protected XMLHelper xmlHelper; + + protected XSDHelper xsdHelper; + + protected SDOHelper sdoHelper; // Tuscany extension APIs + + protected XMLStreamHelper xmlStreamHelper; + /** + * Subclasses must implement this method to initialize the above Helper instance variables + */ + protected abstract HelperContext createDefaultHelpers(); + + public HelperProviderBase() + { + defaultContext = createDefaultHelpers(); + } + + public SDOHelper sdoHelper() + { + return sdoHelper; + } + + public CopyHelper copyHelper() + { + return copyHelper; + } + + public DataFactory dataFactory() + { + return dataFactory; + } + + public DataHelper dataHelper() + { + return dataHelper; + } + + public EqualityHelper equalityHelper() + { + return equalityHelper; + } + + public TypeHelper typeHelper() + { + return typeHelper; + } + + public XMLHelper xmlHelper() + { + return xmlHelper; + } + + public XMLStreamHelper xmlStreamHelper() + { + return xmlStreamHelper; + } + public XSDHelper xsdHelper() + { + return xsdHelper; + } + + public Resolvable resolvable() + { + return new ResolvableImpl(); + } + + public Resolvable resolvable(Object target) + { + return new ResolvableImpl(target); + } + + protected class ResolvableImpl implements Resolvable + { + protected Object target; + + public ResolvableImpl(Object target) { this.target = target; } + + public ResolvableImpl() { this.target = null; } + + public void writeExternal(ObjectOutput out) throws IOException + { + if (target instanceof DataObject) + { + writeDataObject((DataObject)target, out); + } + else + { + throw new NotSerializableException(); // should never happen + } + } + + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException + { + target = readDataObject(in); + } + + public Object readResolve() throws ObjectStreamException + { + return target; + } + + protected void writeDataObject(DataObject dataObject, ObjectOutput objectOutput) throws IOException + { + DataGraph dataGraph = dataObject.getDataGraph(); + if (dataGraph != null) + { + objectOutput.writeByte(0); + objectOutput.writeUTF(SDOUtil.getXPath(dataObject)); + objectOutput.writeObject(dataGraph); + } + else if (dataObject.getContainer() != null) + { + objectOutput.writeByte(0); + objectOutput.writeUTF(SDOUtil.getXPath(dataObject)); + objectOutput.writeObject(dataObject.getRootObject()); + } + else + { + // Root object + objectOutput.writeByte(1); + + ByteArrayOutputStream compressedByteArrayOutputStream = new ByteArrayOutputStream(); + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressedByteArrayOutputStream); + XMLHelper xmlHelperLocal = xmlHelper; + if(objectOutput instanceof SDOObjectOutputStream) + { + xmlHelperLocal = ((SDOObjectOutputStream)objectOutput).getHelperContext().getXMLHelper(); + } + xmlHelperLocal.save(dataObject, "commonj.sdo", "dataObject", gzipOutputStream); + gzipOutputStream.close(); // Flush the contents + + byte[] byteArray = compressedByteArrayOutputStream.toByteArray(); + objectOutput.writeInt(byteArray.length); + objectOutput.write(byteArray); + } + } + + protected DataObject readDataObject(ObjectInput objectInput) throws IOException, ClassNotFoundException + { + boolean isRoot = objectInput.readByte() == 1; + if (isRoot) + { + // Root object: [rootXML] = length + XML contents + int length = objectInput.readInt(); + byte[] compressedBytes = new byte [length]; + + int index = 0; + int bytesRead; + while (index < length) { + if ((bytesRead = objectInput.read(compressedBytes, index, length-index)) == -1) { + break; + } + index += bytesRead; + } + + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(compressedBytes)); + XMLHelper xmlHelperLocal = xmlHelper; + if (objectInput instanceof SDOObjectInputStream) + { + xmlHelperLocal = ((SDOObjectInputStream)objectInput).getHelperContext().getXMLHelper(); + } + XMLDocument doc = xmlHelperLocal.load(gzipInputStream); + gzipInputStream.close(); + + return doc.getRootObject(); + } + else + { + // Non root object: [path] [root] + String xpath = objectInput.readUTF(); + Object object = objectInput.readObject(); + + DataObject root = object instanceof DataGraph ? ((DataGraph)object).getRootObject() : (DataObject)object; + return xpath.equals("") ? root : root.getDataObject(xpath); + } + } + } + +} diff --git a/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/SDOHelperBase.java b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/SDOHelperBase.java new file mode 100644 index 0000000000..ce3678d81f --- /dev/null +++ b/branches/sdo-1.1.1-incubating/lib/src/main/java/org/apache/tuscany/sdo/spi/SDOHelperBase.java @@ -0,0 +1,176 @@ +/** + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.spi; + +/** + * Base class for an implementation of the SDOHelper and SDOHelper.MetaDataBuilder interfaces. + */ +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sdo.api.SDOHelper; +import org.apache.tuscany.sdo.api.SDOUtil; +import org.apache.tuscany.sdo.lib.SDOObjectInputStream; +import org.apache.tuscany.sdo.lib.SDOObjectOutputStream; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.helper.HelperContext; + +public abstract class SDOHelperBase implements SDOHelper, SDOHelper.MetaDataBuilder +{ + public HelperContext createHelperContext() + { + return createHelperContext(false); + } + + public ObjectInputStream createObjectInputStream(InputStream inputStream, HelperContext helperContext) throws IOException + { + return new SDOObjectInputStream(inputStream, helperContext); + } + + public ObjectOutputStream createObjectOutputStream(OutputStream outputStream, HelperContext helperContext) throws IOException + { + return new SDOObjectOutputStream(outputStream, helperContext); + } + + public String getXPath(DataObject dataObject) + { + StringBuffer path = getXPath(dataObject, new StringBuffer(), dataObject); + return path.toString(); + } + + protected StringBuffer getXPath(DataObject dataObject, StringBuffer path, DataObject root) + { + DataObject container = dataObject.getContainer(); + if (container == null) + return path; + + if (container == root) + throw new IllegalStateException("There is a cycle in the containment hierarchy of " + root); + + boolean first = path.length() == 0; + Property property = dataObject.getContainmentProperty(); + if (SDOUtil.isMany(property, dataObject)) + { + List list = container.getList(property); + int pos = list.indexOf(dataObject); + path.insert(0, property.getName() + "." + pos + (first ? "" : "/")); + } + else + { + path.insert(0, property.getName() + (first ? "" : "/")); + } + + return getXPath(container, path, root); + } + + public MetaDataBuilder getMetaDataBuilder() + { + return this; + } + + //Java instance class to SDO mappings (section 8.1 of the SDO spec) + protected static Map javaToSdoMappings = new HashMap(); + static { + javaToSdoMappings.put(boolean.class, "Boolean"); + javaToSdoMappings.put(byte.class, "Byte"); + javaToSdoMappings.put(char.class, "Character"); + javaToSdoMappings.put(Date.class, "Date"); + javaToSdoMappings.put(BigDecimal.class, "Decimal"); + javaToSdoMappings.put(double.class, "Double"); + javaToSdoMappings.put(float.class, "Float"); + javaToSdoMappings.put(int.class, "Int"); + javaToSdoMappings.put(BigInteger.class, "Integer"); + javaToSdoMappings.put(long.class, "Long"); + javaToSdoMappings.put(Object.class, "Object"); + javaToSdoMappings.put(short.class, "Short"); + javaToSdoMappings.put(String.class, "String"); + javaToSdoMappings.put(Boolean.class, "BooleanObject"); + javaToSdoMappings.put(Byte.class, "ByteObject"); + javaToSdoMappings.put(Character.class, "CharacterObject"); + javaToSdoMappings.put(Double.class, "DoubleObject"); + javaToSdoMappings.put(Float.class, "FloatObject"); + javaToSdoMappings.put(Integer.class, "IntObject"); + javaToSdoMappings.put(Long.class, "LongObject"); + javaToSdoMappings.put(Short.class, "ShortObject"); + } + + //XSD to SDO mappings (section 9.4 of the SDO spec) + protected static Map xsdToSdoMappings = new HashMap(); + static { + xsdToSdoMappings.put("anySimpleType", "Object"); + xsdToSdoMappings.put("anyType", "DataObject"); + xsdToSdoMappings.put("anyURI", "URI"); + xsdToSdoMappings.put("base64Binary", "Bytes"); + xsdToSdoMappings.put("boolean", "Boolean"); + xsdToSdoMappings.put("byte", "Byte"); + xsdToSdoMappings.put("date", "YearMonthDay"); + xsdToSdoMappings.put("dateTime", "DateTime"); + xsdToSdoMappings.put("decimal", "Decimal"); + xsdToSdoMappings.put("double", "Double"); + xsdToSdoMappings.put("duration", "Duration"); + xsdToSdoMappings.put("ENTITIES", "Strings"); + xsdToSdoMappings.put("ENTITY", "String"); + xsdToSdoMappings.put("float", "Float"); + xsdToSdoMappings.put("gDay", "Day"); + xsdToSdoMappings.put("gMonth", "Month"); + xsdToSdoMappings.put("gMonthDay", "MonthDay"); + xsdToSdoMappings.put("gYear", "Year"); + xsdToSdoMappings.put("gYearMonth", "YearMonth"); + xsdToSdoMappings.put("hexBinary", "Bytes"); + xsdToSdoMappings.put("ID","String"); + xsdToSdoMappings.put("IDREF","String"); + xsdToSdoMappings.put("IDREFS","Strings"); + xsdToSdoMappings.put("int","Int"); + xsdToSdoMappings.put("integer","Integer"); + xsdToSdoMappings.put("language","String"); + xsdToSdoMappings.put("long","Long"); + xsdToSdoMappings.put("Name","String"); + xsdToSdoMappings.put("NCName","String"); + xsdToSdoMappings.put("negativeInteger","Integer"); + xsdToSdoMappings.put("NMTOKEN","String"); + xsdToSdoMappings.put("NMTOKENS","Strings"); + xsdToSdoMappings.put("nonNegativeInteger","Integer"); + xsdToSdoMappings.put("nonPositiveInteger","Integer"); + xsdToSdoMappings.put("normalizedString","String"); + xsdToSdoMappings.put("NOTATION","String"); + xsdToSdoMappings.put("positiveInteger","Integer"); + xsdToSdoMappings.put("QName","URI"); + xsdToSdoMappings.put("short","Short"); + xsdToSdoMappings.put("string","String"); + xsdToSdoMappings.put("time","Time"); + xsdToSdoMappings.put("token","String"); + xsdToSdoMappings.put("unsignedByte","Short"); + xsdToSdoMappings.put("unsignedInt","Long"); + xsdToSdoMappings.put("unsignedLong","Integer"); + xsdToSdoMappings.put("unsignedShort","Int"); + } + +} |