From 1f0de49cbd279bee42be069c4bd53225faab215c Mon Sep 17 00:00:00 2001 From: antelder Date: Wed, 29 Sep 2010 07:10:57 +0000 Subject: TUSCANY-3679: Apply changes to update sdo impl to use EMF v2.5. Thanks to Elio Damaggio and Florian Pinel for the work git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1002496 13f79535-47bb-0310-9956-ffa450edef68 --- sdo-java/branches/emf-2.5/sample/pom.xml | 112 +++++ .../apache/tuscany/samples/sdo/ExecuteSamples.java | 100 +++++ .../org/apache/tuscany/samples/sdo/SampleBase.java | 192 ++++++++ .../samples/sdo/advanced/MedicalScenario.java | 424 ++++++++++++++++++ .../MedicalScenarioWithChangeMonitoring.java | 449 +++++++++++++++++++ .../sdo/advanced/ObtainingDataGraphFromXml.java | 201 +++++++++ .../samples/sdo/advanced/PrintDataGraph.java | 498 +++++++++++++++++++++ .../tuscany/samples/sdo/advanced/package.html | 31 ++ .../basic/AccessDataObjectPropertiesByName.java | 99 ++++ .../sdo/basic/AccessingTheContentsOfASequence.java | 115 +++++ .../tuscany/samples/sdo/basic/CreateCompany.java | 151 +++++++ .../samples/sdo/basic/CreatePurchaseOrder.java | 159 +++++++ .../samples/sdo/basic/ReadPurchaseOrder.java | 147 ++++++ .../apache/tuscany/samples/sdo/basic/package.html | 31 ++ .../AccessDataObjectUsingValidXPath.java | 129 ++++++ .../AccessingDataObjectsViaPropertyIndex.java | 164 +++++++ .../sdo/intermediate/CreateCompanyTuscanyAPI.java | 114 +++++ .../CreateDataObjectFromXmlString.java | 133 ++++++ .../intermediate/DynamicCustomerTypeSample.java | 193 ++++++++ .../samples/sdo/intermediate/OppositeProperty.java | 89 ++++ .../SerializingDeserializingADataObject.java | 137 ++++++ .../tuscany/samples/sdo/intermediate/package.html | 30 ++ .../samples/sdo/internal/DocumentSamples.java | 218 +++++++++ .../samples/sdo/internal/SampleInfrastructure.java | 330 ++++++++++++++ .../org/apache/tuscany/samples/sdo/overview.html | 127 ++++++ .../org/apache/tuscany/samples/sdo/package.html | 33 ++ .../tuscany/samples/sdo/sampleProgramContents.html | 243 ++++++++++ .../sample/src/main/resources/META-INF/LICENSE.txt | 207 +++++++++ .../sample/src/main/resources/META-INF/NOTICE | 8 + .../sample/src/main/resources/META-INF/README.txt | 23 + .../sample/src/main/resources/MedicalTest.xsd | 57 +++ .../sample/src/main/resources/MedicalTest_CS.xsd | 58 +++ .../emf-2.5/sample/src/main/resources/People.xsd | 70 +++ .../emf-2.5/sample/src/main/resources/company.xsd | 45 ++ .../main/resources/companyCompleteDataGraph.xml | 69 +++ .../sample/src/main/resources/companyDataGraph.xml | 31 ++ .../main/resources/companyDataGraphGenerated.xml | 30 ++ .../sample/src/main/resources/companyGenerated.xml | 27 ++ .../src/main/resources/doc-files/cmdPrompt.GIF | Bin 0 -> 9431 bytes .../emf-2.5/sample/src/main/resources/letter.xml | 21 + .../emf-2.5/sample/src/main/resources/letter.xsd | 32 ++ .../emf-2.5/sample/src/main/resources/po.xml | 57 +++ .../emf-2.5/sample/src/main/resources/po.xsd | 81 ++++ .../emf-2.5/sample/src/main/resources/sports.xml | 43 ++ .../emf-2.5/sample/src/main/resources/sports.xsd | 54 +++ 45 files changed, 5562 insertions(+) create mode 100644 sdo-java/branches/emf-2.5/sample/pom.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/ExecuteSamples.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/SampleBase.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenario.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenarioWithChangeMonitoring.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/ObtainingDataGraphFromXml.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/PrintDataGraph.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/package.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessDataObjectPropertiesByName.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessingTheContentsOfASequence.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreateCompany.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreatePurchaseOrder.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/ReadPurchaseOrder.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/package.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessDataObjectUsingValidXPath.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessingDataObjectsViaPropertyIndex.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateCompanyTuscanyAPI.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateDataObjectFromXmlString.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/DynamicCustomerTypeSample.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/OppositeProperty.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/SerializingDeserializingADataObject.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/package.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/DocumentSamples.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/SampleInfrastructure.java create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/overview.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/package.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/sampleProgramContents.html create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/LICENSE.txt create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/NOTICE create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/README.txt create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest_CS.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/People.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/company.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/companyCompleteDataGraph.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraph.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraphGenerated.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/companyGenerated.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/doc-files/cmdPrompt.GIF create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/po.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/po.xsd create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xml create mode 100644 sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xsd (limited to 'sdo-java/branches/emf-2.5/sample') diff --git a/sdo-java/branches/emf-2.5/sample/pom.xml b/sdo-java/branches/emf-2.5/sample/pom.xml new file mode 100644 index 0000000000..0f9bd24f04 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/pom.xml @@ -0,0 +1,112 @@ + + + + + + org.apache.tuscany.sdo + tuscany-sdo + 1.2-SNAPSHOT + + + 4.0.0 + sample-sdo + jar + Tuscany SDO Sample + + + org.apache.tuscany.sdo + tuscany-sdo-api-r${specVersion} + ${sdo.version} + + + + org.apache.tuscany.sdo + tuscany-sdo-impl + ${sdo.version} + compile + + + + org.apache.tuscany.sdo + tuscany-sdo-lib + ${sdo.version} + compile + + + + stax + stax-api + 1.0.1 + + + + org.codehaus.woodstox + wstx-asl + 3.2.1 + test + + + + + + src/main/java + + + src/main/java + + + src/main/resources + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.2 + + ${basedir}/src/main/java/org/apache/tuscany/samples/sdo/overview.html + *.internal + 2.0 + + + + package + + jar + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + org.apache.tuscany.samples.sdo.ExecuteSamples + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/ExecuteSamples.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/ExecuteSamples.java new file mode 100644 index 0000000000..02bce0efe6 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/ExecuteSamples.java @@ -0,0 +1,100 @@ +/** + * + * 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.samples.sdo; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + + +/** + * A program to execute a sequence of SDO sample programs. The program executes + * the sample programs listed in the {@link SampleInfrastructure#sampleClasses sample classes} + * static constant. These samples are executed in roughly increasing order of complexity. + * You can edit the {@link #pauseBetweenSamples}, {@link #runSamplesUpToLevel} and + * {@link #constructorArgs} variables to change the way this program executes the samples. + * + *

+ * Each of the samples creates text output to the console. If the commentary + * level in {@link #constructorArgs the sample program constructor arguments} + * used to construct each sample is set to + * {@link SampleInfrastructure#COMMENTARY_FOR_NOVICE COMMENTARY_FOR_NOVICE} then there + * will be much more output than if set to one of the other values. + * + */ +public class ExecuteSamples extends SampleBase { + + /** + * Edit this value to cause the program to pause between each sample program + * and wait for the user to hit the enter key. + */ + private static final boolean pauseBetweenSamples = true; + + /** + * By default run all samples from novice level right up to advanced level. + * Edit this to run fewer samples. + */ + private static final int runSamplesUpToLevel = SampleInfrastructure.SAMPLE_LEVEL_ADVANCED.intValue(); + + /** + * Edit the value of this argument to one of COMMENTARY_FOR_NOVICE, COMMENTARY_FOR_INTERMEDIATE or COMMENTARY_FOR_ADVANCED to see + * more or less commentary. Note, this value only controls the level of commentary, + * not which samples are executed. Use it to filter out the noise if you have already + * understood the more basic commentary. + */ + private static final Object[] constructorArgs = { SampleInfrastructure.COMMENTARY_FOR_NOVICE }; + + + public static void main(String [] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, IOException { + ExecuteSamples sample = new ExecuteSamples(COMMENTARY_FOR_NOVICE); + sample.run(); + } + + public ExecuteSamples(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_BASIC); + } + + public void runSample() throws Exception { + Class[] constructorArgTypes = { Integer.class }; + + + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + int sampleCount = 0; + for (int i=0; i < SampleInfrastructure.sampleClasses.length; i++) { + Constructor c = SampleInfrastructure.sampleClasses[i].getConstructor(constructorArgTypes); + SampleBase sample = (SampleBase)c.newInstance(constructorArgs); + if(sample.getSampleComplexityLevel() <= runSamplesUpToLevel) { + sample.run(); + sampleCount++; + if(pauseBetweenSamples) { + System.out.println(">>>Press Enter to continue"); + in.readLine(); + } + } + } + System.out.println("Ran " + sampleCount + " samples"); + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/SampleBase.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/SampleBase.java new file mode 100644 index 0000000000..3b4aba2b42 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/SampleBase.java @@ -0,0 +1,192 @@ +/** + * + * 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.samples.sdo; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; +import org.apache.tuscany.sdo.api.SDOUtil; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; +import commonj.sdo.helper.XSDHelper; +import commonj.sdo.impl.HelperProvider; + +/** + * the base function for samples is split into two classes. This one is intended + * to house all the interesting SDO utility methods, and the superclass houses + * all the infrastructure that the SDO user isn't interested in inspecting. + */ +public abstract class SampleBase extends SampleInfrastructure { + + + public SampleBase() + { + super(COMMENTARY_FOR_NOVICE); + } + + + public SampleBase(Integer commentaryLevel, Integer sampLevel) { + super(commentaryLevel, sampLevel); + } + + protected HelperContext createScopeForTypes() { + commentary( + COMMENTARY_FOR_NOVICE, + "All MetaData for SDO types can be viewed as being scoped within an instance of HelperContext\n" + + "The Helper Context instance provides access to a collection of other helpers\n" + + "that you will see exercised in the SDO samples\n" + + "All the Helpers related to a given helper context instance know about the same set of types\n\n" + + "The SDO specification doesn't state how an SDO implementation should create a HelperContext\n" + + "So we use a Tuscany specific API to do this ...\n\n" + + "HelperContext scope = SDOUtil.createHelperContext();", + + "Creating a new HelperContext scope for types for the next sample run as we did in previous samples" + ); + + HelperContext scope = SDOUtil.createHelperContext(); + return scope; + } + + protected HelperContext useDefaultScopeForTypes() { + commentary( + COMMENTARY_FOR_NOVICE, + "All MetaData for SDO types can be viewed as being held in an instance of HelperContext\n" + + "The Helper Context instance provides access to a collection of other helpers\n" + + "that you will see exercised in the SDO samples\n" + + "All the Helpers related to a given helper context instance know about the same set of types\n\n" + + "For most cases it's best to take control of the type scope by creating a new HelperContext,\n" + + "but a default helper context is provided and can be accessed using ...\n\n" + + "HelperContext scope = HelperProvider.getDefaultContext();\n\n" + + "A case in point where the default scope must be used is when using some of the DataGraph APIs\n" + + "which don't all support the type scoping extensions which were introduced in the SDO 2.1 specification", + + "Retrieving the default HelperContext scope for types for the next sample run as we saw in a previous sample" + ); + + HelperContext scope = HelperProvider.getDefaultContext(); + return scope; + } + + + protected void loadTypesFromXMLSchemaFile(HelperContext scope, String fileName) { + commentary(COMMENTARY_FOR_NOVICE, + "If you want to create types dynamically by loading an XML schema you\n" + + "use an instance of XSDHelper. You get that helper from a HelperContext.\n" + + "After successful loading of a schema, the new types are available to every\n" + + "other helper belonging to the HelperContext instance\n\n" + + "XSDHelper xsdHelper = scope.getXSDHelper();\n"+ + "xsdHelper.define(inputStream, null);", + + "Using an XSDHelper again to create types from an XML schema file as we saw in a previous sample" + ); + + XSDHelper xsdHelper = scope.getXSDHelper(); + + InputStream is = null; + try { + + URL url = getClass().getResource("/"+fileName); + is = url.openStream(); + xsdHelper.define(is, url.toString()); + + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } finally { + try { + is.close(); + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } + } + } + + public DataObject getDataObjectFromFile(HelperContext scope, String filename) + throws Exception { + + + XMLDocument xmlDoc = getXMLDocumentFromFile(scope, filename); + commentary(COMMENTARY_FOR_NOVICE, + "An XMLDocument instance provides a wrapper for the root DataObject of a data graph\n" + + "along with other aspects of the XML nature of the document\n\n"+ + "DataObject result = xmlDoc.getRootObject();", + + "Getting the root object from an XMLDocument as seen in previous samples" + ); + DataObject result = xmlDoc.getRootObject(); + + return result; + } + + public XMLDocument getXMLDocumentFromFile(HelperContext scope, + String filename) throws Exception { + + XMLDocument result = null; + InputStream is = null; + + try { + commentary(COMMENTARY_FOR_NOVICE, + "The XMLHelper can be used to create an SDO XMLDocument instance from a file\n\n"+ + "inputStream = ClassLoader.getSystemResourceAsStream(filename);\n"+ + "result = scope.getXMLHelper().load(is);", + + "Getting an XMLDocument instance from an XML file as seen in previous samples" + ); + is = ClassLoader.getSystemResourceAsStream(filename); + result = scope.getXMLHelper().load(is); + + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } finally { + try { + is.close(); + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } + } + + return result; + } + + protected XMLDocument getXMLDocumentFromString(HelperContext scope, String xmlDoc) throws IOException { + XMLDocument result = null; + InputStream is = null; + + + commentary(COMMENTARY_FOR_NOVICE, + "The XMLHelper can be used to create an SDO XMLDocument instance from an\n\n"+ + "inputStream = new ByteArrayInputStream(xmlDoc.getBytes());\n"+ + "result = scope.getXMLHelper().load(is);", + + "Getting an XMLDocument instance from an XML file as seen in previous samples" + ); + + is = new ByteArrayInputStream(xmlDoc.getBytes()); + result = scope.getXMLHelper().load(is); + + return result; + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenario.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenario.java new file mode 100644 index 0000000000..916fe9405c --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenario.java @@ -0,0 +1,424 @@ +/** + * 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.samples.sdo.advanced; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.sdo.api.SDOUtil; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Type; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; + +/** + * This sample is based on a 2 part article by Kelvin Goodson and Geoffrey Winn. + * See Part1 and Part 2 of the article. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class MedicalScenario extends SampleBase { + + private static final String sdoApiUri = "commonj.sdo"; + + private static final String peopleURI = "www.example.org/people"; + + private static final String medicalURI = "www.example.org/MedicalTest"; + + boolean typesViaAPI = false; + + private static final String usage = " [-api |-xsd]\n" + + " -api : define the types using the SDO API\n" + + " -xsd : define the types using an XML schema file"; + + public MedicalScenario(String[] args, Integer userLevel) { + + super(userLevel, SAMPLE_LEVEL_ADVANCED); + + if (args.length > 1) { + printUsage(args); + System.exit(-1); + } + if (args.length == 1) { + if (args[0].equals("-xsd")) { + typesViaAPI = false; + } else if (args[0].equals("-api")) { + typesViaAPI = true; + } else { + printUsage(args); + System.exit(-1); + } + } + } + + public MedicalScenario(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_ADVANCED); + } + + + private void printUsage(String[] args) { + System.out.println("Usage: " + this.getClass().getName() + usage); + } + + /** + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + + MedicalScenario s = new MedicalScenario(args, COMMENTARY_FOR_NOVICE); + s.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.CONTAINMENT, + SDOFacets.CREATE_TYPES_USING_THE_SDO_API, + SDOFacets.CREATE_TYPES_USING_XML_SCHEMA, + SDOFacets.OPEN_CONTENT, + SDOFacets.NON_CONTAINMENT + }; + + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.CREATE_DATAOBJECTS_BY_NAME, + SDOFacets.ISMANY_PROPERTIES, + SDOFacets.GENERIC_DATA_GRAPH_TRAVERSAL, + SDOFacets.SAVING_DATA_TO_XML + }; + + public void runSample() throws Exception { + + HelperContext scope = SDOUtil.createHelperContext(); + + if (typesViaAPI) { + + commentary("In this execution of the sample we use Types created\n" + + "using the SDO API"); + + createTypesViaAPI(scope); + + } else { + + commentary("In this execution of the sample we use Types created\n" + + "by loading an XMLSchema"); + + loadTypesFromXMLSchemaFile(scope, "MedicalTest.xsd"); + + } + + commentary( + COMMENTARY_FOR_NOVICE, + "The DataFactory associated with the scope that the types were created within\n" + + "can be used to create an instance of the Person Type\n\n" + + "DataFactory dataFactory = scope.getDataFactory();\n" + + "DataObject person1 = dataFactory.create(\"www.example.org/people\", \"Person\");"); + + DataFactory dataFactory = scope.getDataFactory(); + DataObject person1 = dataFactory.create("www.example.org/people", "Person"); + + commentary("The setString() of dataObject method is used to set the properties of the\n" + + "new Person DataObject, including a unique identifier reference value\n" + + "for the Person instance.\n\n" + + "person1.setString(\"id\", \"1\");\n" + + "person1.setString(\"name\", \"Joe Johnson Snr.\");\n" + + "person1.setString(\"gender\", \"male\"););"); + + person1.setString("id", "1"); + person1.setString("name", "Joe Johnson Snr."); + person1.setString("gender", "male"); + + commentary("An alternative approach to using the DataFactory directly to create\n" + + "all DataObjects is to use a top-down approach, where we create the\n" + + "root object for a data graph, and then use the createDataObject(String propertyName)\n" + + "method to create the contained DataObjects. Here we create the overall\n" + + "medical test DataObject, and then create the contained \"referrals\" DataObject\n\n" + + "DataObject test = dataFactory.create(\"www.example.org/MedicalTest\", \"Test\");\n" + + "DataObject referrals = test.createDataObject(\"referrals\");"); + + DataObject test = dataFactory.create("www.example.org/MedicalTest", "Test"); + DataObject referrals = test.createDataObject("referrals"); + + commentary("Now we can add the person we created earlier into the set of people who have\n" + + "been referred for this medical test.\n\n" + + "test.set(\"referrals\", referrals);\n" + + "referrals.getList(\"person\").add(person1);"); + + test.set("referrals", referrals); + referrals.getList("person").add(person1); + + commentary("Let's take a look at how the current state of the data" + + "graph is rendered in XML ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The scenario unfolds and the Joe Johnson Snr. becomes a patient\n\n" + + "DataObject patients = test.createDataObject(\"patients\");\n" + + "patients.getList(\"person\").add(person1);"); + + DataObject patients = test.createDataObject("patients"); + + patients.getList("person").add(person1); + + commentary("Having added Joe Johnson Snr. to the set of patients we can see\n" + + "the way that SDO preserves a single containment hierarchy within a\n" + + "datagraph. If we look at the XML rendering of the graph again, we will\n" + + "see that by adding him to the set of patients he has been removed from the\n" + + "containment property associated with the referrals set ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The 'Person' Type we are making use of here has been designed to be\n" + + "multi-purpose, in that the type has been declared to be 'Open'.\n" + + "That means that we can make use of 'Open Content' Properties\n" + + "(If the type system has been defined using an XML schema\n" + + "then these properties will derive from global elements)\n" + + "We can look up open content Properties using the TypeHelper\n\n" + + "Property conditionProperty = scope.getTypeHelper().getOpenContentProperty(\n" + + " \"www.example.org/MedicalTest\", \"condition\");"); + + Property conditionProperty = scope.getTypeHelper().getOpenContentProperty( + "www.example.org/MedicalTest", "condition"); + + commentary("We can create a value of the appropriate Type for this open\n" + + "content Property\n\n" + + "DataObject condition = dataFactory.create(conditionProperty.getType());\n" + + "condition.setString(\"name\", \"Panar Syndrome\");"); + + DataObject condition = dataFactory.create(conditionProperty.getType()); + condition.setString("name", "Panar Syndrome"); + + commentary("If you ask a DataObject that has an 'Open' Type for its list of\n" + + "values associated with an open content Property, and the DataObject\n" + + "doesn't currently have any values for the Property, it will return\n" + + "an empty list. We can use the list to add values for the Property\n\n" + + "List conditions = person1.getList(conditionProperty);\n" + + "conditions.add(condition);"); + + List conditions = person1.getList(conditionProperty); + conditions.add(condition); + + commentary("A further look at the data graph in XML form shows\n" + + "the presence of the new condition Property's value ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("Having looked at the way SDO handles Open content\n" + + "We now turn our attention to 'non-containment' relationships.\n" + + "To do this we first create the set of people in the test that\n" + + "constitute the blood relatives of patients -- 'relatives'\n" + + "and define a new person to be Joe Johnson Snr's child.\n\n" + + "DataObject relatives = test.createDataObject(\"relatives\");\n" + + "DataObject person2 = relatives.createDataObject(\"person\");\n" + + "person2.setString(\"id\", \"2\");\n" + + "person2.setString(\"name\", \"Joe Johnson Jnr.\");\n" + + "person2.setString(\"gender\", \"male\");"); + + DataObject relatives = test.createDataObject("relatives"); + DataObject person2 = relatives.createDataObject("person"); + + person2.setString("id", "2"); + person2.setString("name", "Joe Johnson Jnr."); + person2.setString("gender", "male"); + + commentary("Another quick look at the XML rendering of the graph confirms that\n" + + "the set of relatives now includes Joe Johnson Jnr, but we haven't yet\n" + + "defined who he is related to, or how."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The Person type has a Property 'relative'\n" + + "so we create a relative for Joe Johnson Snr.\n\n" + + "DataObject relation = person1.createDataObject(\"relative\");\n" + + "relation.set(\"target\", person2);\n" + + "relation.set(\"relationship\", \"child\");"); + + DataObject relation = person1.createDataObject("relative"); + relation.set("target", person2); + relation.set("relationship", "child"); + + commentary("Now when we look at the XML rendering of the data graph\n" + + "we can see that the action of setting the 'target' of the\n" + + "relationship to Joe Johnson Jnr didn't displace him from the\n" + + "set of 'relatives', because the 'target' Property is a\n" + + "non-containment Property. This non-containment relationship\n" + + "is reflected in the XML by a reference to the Person DataObject\n" + + "describing Joe Johnson Jnr, \"2\" ...\n" + + "If the Type system has been created from an XML schema then the\n" + + "unique ID of the target can be used in the serialization.\n" + + "If however the type system was defined dynamically, then the reference\n" + + "will be represented as an XPath from the root of the data graph."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("Now that the graph is complete we can use the PrintDataGraph sample utility\n" + + "to reveal the full SDO nature of the final data graph\n\n" + + ""); + + PrintDataGraph printer = new PrintDataGraph(COMMENTARY_FOR_ADVANCED); + printer.printDataObject(test); + System.out.println(printer.getBuf()); + } + + /** + * @throws Exception + * @throws FileNotFoundException + */ + private void createTypesViaAPI(HelperContext scope) throws Exception { + + List typeDeclarations = new ArrayList(); + + TypeHelper typeHelper = scope.getTypeHelper(); + + Type stringType = typeHelper.getType(sdoApiUri, "String"); + Type dateType = typeHelper.getType(sdoApiUri, "Date"); + Type booleanType = typeHelper.getType(sdoApiUri, "Boolean"); + + // + // + // + // + // + // + // + // + // + // + + DataObject personTypeDesc = createTypeDescription(scope, peopleURI, + "Person"); + typeDeclarations.add(personTypeDesc); + + addPropertyDescription(personTypeDesc, stringType, "name"); + addPropertyDescription(personTypeDesc, dateType, "dob"); + addPropertyDescription(personTypeDesc, stringType, "id"); // set to unique + // identifier? + addPropertyDescription(personTypeDesc, stringType, "gender"); // restrict? + + DataObject relativeType = createTypeDescription(scope, peopleURI, + "Relative"); // forward declare the Relative type + typeDeclarations.add(relativeType); + + DataObject rp = addPropertyDescription(personTypeDesc, relativeType, + "relative"); + rp.setBoolean("many", true); + personTypeDesc.set("open", Boolean.TRUE); + + // + // + // + // + // + + addPropertyDescription(relativeType, stringType, "relationship"); + addPropertyDescription(relativeType, booleanType, "genetic"); + DataObject targetPersonProp = addPropertyDescription(relativeType, + personTypeDesc, "target"); + targetPersonProp.setBoolean("containment", false); + + // + // + // + // + // + + DataObject pSet = createTypeDescription(scope, peopleURI, "PersonSet"); + typeDeclarations.add(pSet); + DataObject pSetProperty = addPropertyDescription(pSet, personTypeDesc, + "person"); + pSetProperty.setBoolean("many", true); + + // + // + // + // + // + // + + DataObject condition = createTypeDescription(scope, medicalURI, "Condition"); + typeDeclarations.add(condition); + addPropertyDescription(condition, booleanType, "diagnosed"); + addPropertyDescription(condition, stringType, "name"); // constrain? + + // + // + // + // + // + // + // + + DataObject testType = createTypeDescription(scope, medicalURI, "Test"); + typeDeclarations.add(testType); + addPropertyDescription(testType, pSet, "referrals"); + addPropertyDescription(testType, pSet, "patients"); + addPropertyDescription(testType, pSet, "relatives"); + + List types = typeHelper.define(typeDeclarations); + + DataObject p = scope.getDataFactory().create("commonj.sdo", "Property"); + p.set("type", typeHelper.getType(medicalURI, "Condition")); + p.set("name", "condition"); + p.setBoolean("many", true); + p.setBoolean("containment", true); // why is this not the default? + + typeHelper.defineOpenContentProperty(medicalURI, p); + + } + + /** + * @param uri + * @param name + * @return + */ + private DataObject createTypeDescription(HelperContext scope, String uri, + String name) { + DataObject typeDesc = scope.getDataFactory().create(sdoApiUri, "Type"); + typeDesc.set("name", name); + typeDesc.set("uri", uri); + return typeDesc; + } + + private DataObject addPropertyDescription( + DataObject containerTypeDescription, Object propertyType, + String propertyName) { + DataObject property = containerTypeDescription.createDataObject("property"); + property.set("type", propertyType); + property.setString("name", propertyName); + property.setBoolean("containment", true); + return property; + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenarioWithChangeMonitoring.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenarioWithChangeMonitoring.java new file mode 100644 index 0000000000..32d63f4335 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/MedicalScenarioWithChangeMonitoring.java @@ -0,0 +1,449 @@ +/** + * 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.samples.sdo.advanced; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.sdo.api.SDOUtil; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Type; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; + +/** + * This sample is based on a 2 part article by Kelvin Goodson and Geoffrey Winn. + * In this variant of the sample the model for the test includes change monitoring. + * The facility for undoing changes on the basis of the change monitoring is + * demonstrated. + * See Part1 and Part 2 of the article. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class MedicalScenarioWithChangeMonitoring extends SampleBase { + + private static final String sdoApiUri = "commonj.sdo"; + + private static final String peopleURI = "www.example.org/people"; + + private static final String medicalURI = "www.example.org/MedicalTest"; + + boolean typesViaAPI = false; + + private static final String usage = " [-api |-xsd]\n" + + " -api : define the types using the SDO API\n" + + " -xsd : define the types using an XML schema file"; + + public MedicalScenarioWithChangeMonitoring(String[] args, Integer userLevel) { + + super(userLevel, SAMPLE_LEVEL_ADVANCED); + + if (args.length > 1) { + printUsage(args); + System.exit(-1); + } + if (args.length == 1) { + if (args[0].equals("-xsd")) { + typesViaAPI = false; + } else if (args[0].equals("-api")) { + typesViaAPI = true; + } else { + printUsage(args); + System.exit(-1); + } + } + } + + public MedicalScenarioWithChangeMonitoring(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_ADVANCED); + } + + + private void printUsage(String[] args) { + System.out.println("Usage: " + this.getClass().getName() + usage); + } + + /** + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + + MedicalScenarioWithChangeMonitoring s = new MedicalScenarioWithChangeMonitoring(args, COMMENTARY_FOR_NOVICE); + s.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.CONTAINMENT, + SDOFacets.CREATE_TYPES_USING_THE_SDO_API, + SDOFacets.CREATE_TYPES_USING_XML_SCHEMA, + SDOFacets.OPEN_CONTENT, + SDOFacets.NON_CONTAINMENT, + SDOFacets.CHANGE_MONITORING_USING_A_CHANGESUMMARY_PROPERTY_ON_A_DATAOBJECT + }; + + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.CREATE_DATAOBJECTS_BY_NAME, + SDOFacets.ISMANY_PROPERTIES, + SDOFacets.GENERIC_DATA_GRAPH_TRAVERSAL, + SDOFacets.SAVING_DATA_TO_XML + }; + + public void runSample() throws Exception { + + HelperContext scope = SDOUtil.createHelperContext(); + + if (typesViaAPI) { + + commentary("In this execution of the sample we use Types created\n" + + "using the SDO API"); + + createTypesViaAPI(scope); + + } else { + + commentary("In this execution of the sample we use Types created\n" + + "by loading a variant of the XMLSchema that includes a change summary Property"); + + loadTypesFromXMLSchemaFile(scope, "MedicalTest_CS.xsd"); + + } + + commentary( + COMMENTARY_FOR_NOVICE, + "The DataFactory associated with the scope that the types were created within\n" + + "can be used to create an instance of the Person Type\n\n" + + "DataFactory dataFactory = scope.getDataFactory();\n" + + "DataObject person1 = dataFactory.create(\"www.example.org/people\", \"Person\");"); + + DataFactory dataFactory = scope.getDataFactory(); + DataObject person1 = dataFactory.create("www.example.org/people", "Person"); + + commentary("The setString() of dataObject method is used to set the properties of the\n" + + "new Person DataObject, including a unique identifier reference value\n" + + "for the Person instance.\n\n" + + "person1.setString(\"id\", \"1\");\n" + + "person1.setString(\"name\", \"Joe Johnson Snr.\");\n" + + "person1.setString(\"gender\", \"male\"););"); + + person1.setString("id", "1"); + person1.setString("name", "Joe Johnson Snr."); + person1.setString("gender", "male"); + + commentary("An alternative approach to using the DataFactory directly to create\n" + + "all DataObjects is to use a top-down approach, where we create the\n" + + "root object for a data graph, and then use the createDataObject(String propertyName)\n" + + "method to create the contained DataObjects. Here we create the overall\n" + + "medical test DataObject, and then create the contained \"referrals\" DataObject\n\n" + + "DataObject test = dataFactory.create(\"www.example.org/MedicalTest\", \"Test\");\n" + + "DataObject referrals = test.createDataObject(\"referrals\");"); + + DataObject test = dataFactory.create("www.example.org/MedicalTest", "Test"); + + DataObject referrals = test.createDataObject("referrals"); + + commentary("The default state for monitoring changes for the DataObject when created in this\n" + + "way is the monitoring is switched off, so we switch it on. (Note that if you\n" + + "get your data graphs from a data Access Service then this service may turn on\n" + + "change monitoring be default\n\n" + + "test.getChangeSummary().beginLogging();"); + test.getChangeSummary().beginLogging(); + + commentary("We'll repeat the whole of the MedicalScenario sample, but then at the \n" + + "last minute we'll decide it was all wrong and roll back the changes......"); + + commentary("Now we can add the person we created earlier into the set of people who have\n" + + "been referred for this medical test.\n\n" + + "test.set(\"referrals\", referrals);\n" + + "referrals.getList(\"person\").add(person1);"); + + test.set("referrals", referrals); + referrals.getList("person").add(person1); + + commentary("Let's take a look at how the current state of the data" + + "graph is rendered in XML ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The scenario unfolds and the Joe Johnson Snr. becomes a patient\n\n" + + "DataObject patients = test.createDataObject(\"patients\");\n" + + "patients.getList(\"person\").add(person1);"); + + DataObject patients = test.createDataObject("patients"); + + patients.getList("person").add(person1); + + commentary("Having added Joe Johnson Snr. to the set of patients we can see\n" + + "the way that SDO preserves a single containment hierarchy within a\n" + + "datagraph. If we look at the XML rendering of the graph again, we will\n" + + "see that by adding him to the set of patients he has been removed from the\n" + + "containment property associated with the referrals set ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The 'Person' Type we are making use of here has been designed to be\n" + + "multi-purpose, in that the type has been declared to be 'Open'.\n" + + "That means that we can make use of 'Open Content' Properties\n" + + "(If the type system has been defined using an XML schema\n" + + "then these properties will derive from global elements)\n" + + "We can look up open content Properties using the TypeHelper\n\n" + + "Property conditionProperty = scope.getTypeHelper().getOpenContentProperty(\n" + + " \"www.example.org/MedicalTest\", \"condition\");"); + + Property conditionProperty = scope.getTypeHelper().getOpenContentProperty( + "www.example.org/MedicalTest", "condition"); + + commentary("We can create a value of the appropriate Type for this open\n" + + "content Property\n\n" + + "DataObject condition = dataFactory.create(conditionProperty.getType());\n" + + "condition.setString(\"name\", \"Panar Syndrome\");"); + + DataObject condition = dataFactory.create(conditionProperty.getType()); + condition.setString("name", "Panar Syndrome"); + + commentary("If you ask a DataObject that has an 'Open' Type for its list of\n" + + "values associated with an open content Property, and the DataObject\n" + + "doesn't currently have any values for the Property, it will return\n" + + "an empty list. We can use the list to add values for the Property\n\n" + + "List conditions = person1.getList(conditionProperty);\n" + + "conditions.add(condition);"); + + List conditions = person1.getList(conditionProperty); + conditions.add(condition); + + commentary("A further look at the data graph in XML form shows\n" + + "the presence of the new condition Property's value ..."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("Having looked at the way SDO handles Open content\n" + + "We now turn our attention to 'non-containment' relationships.\n" + + "To do this we first create the set of people in the test that\n" + + "constitute the blood relatives of patients -- 'relatives'\n" + + "and define a new person to be Joe Johnson Snr's child.\n\n" + + "DataObject relatives = test.createDataObject(\"relatives\");\n" + + "DataObject person2 = relatives.createDataObject(\"person\");\n" + + "person2.setString(\"id\", \"2\");\n" + + "person2.setString(\"name\", \"Joe Johnson Jnr.\");\n" + + "person2.setString(\"gender\", \"male\");"); + + DataObject relatives = test.createDataObject("relatives"); + DataObject person2 = relatives.createDataObject("person"); + + person2.setString("id", "2"); + person2.setString("name", "Joe Johnson Jnr."); + person2.setString("gender", "male"); + + commentary("Another quick look at the XML rendering of the graph confirms that\n" + + "the set of relatives now includes Joe Johnson Jnr, but we haven't yet\n" + + "defined who he is related to, or how."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("The Person type has a Property 'relative'\n" + + "so we create a relative for Joe Johnson Snr.\n\n" + + "DataObject relation = person1.createDataObject(\"relative\");\n" + + "relation.set(\"target\", person2);\n" + + "relation.set(\"relationship\", \"child\");"); + + DataObject relation = person1.createDataObject("relative"); + relation.set("target", person2); + relation.set("relationship", "child"); + + commentary("Now when we look at the XML rendering of the data graph\n" + + "we can see that the action of setting the 'target' of the\n" + + "relationship to Joe Johnson Jnr didn't displace him from the\n" + + "set of 'relatives', because the 'target' Property is a\n" + + "non-containment Property. This non-containment relationship\n" + + "is reflected in the XML by a reference to the Person DataObject\n" + + "describing Joe Johnson Jnr, \"2\" ...\n" + + "If the Type system has been created from an XML schema then the\n" + + "unique ID of the target can be used in the serialization.\n" + + "If however the type system was defined dynamically, then the reference\n" + + "will be represented as an XPath from the root of the data graph."); + + System.out.println(scope.getXMLHelper().save(test, + "www.example.org/MedicalTest", "test")); + + commentary("Now that the graph is complete we can use the PrintDataGraph sample utility\n" + + "to reveal the full SDO nature of the final data graph\n\n" + + ""); + + PrintDataGraph printer = new PrintDataGraph(COMMENTARY_FOR_ADVANCED); + printer.printDataObject(test); + System.out.println(printer.getBuf()); + + commentary("But Wait! it's all wrong. Let's go back to our checkpoint where we started monitoring changes\n\n" + + "test.getChangeSummary().undoChanges();"); + + test.getChangeSummary().undoChanges(); + + printer.reset(); + printer.printDataObject(test); + System.out.println(printer.getBuf()); + + } + + /** + * @throws Exception + * @throws FileNotFoundException + */ + private void createTypesViaAPI(HelperContext scope) throws Exception { + + List typeDeclarations = new ArrayList(); + + TypeHelper typeHelper = scope.getTypeHelper(); + + Type stringType = typeHelper.getType(sdoApiUri, "String"); + Type dateType = typeHelper.getType(sdoApiUri, "Date"); + Type booleanType = typeHelper.getType(sdoApiUri, "Boolean"); + + // + // + // + // + // + // + // + // + // + // + + DataObject personTypeDesc = createTypeDescription(scope, peopleURI, + "Person"); + typeDeclarations.add(personTypeDesc); + + addPropertyDescription(personTypeDesc, stringType, "name"); + addPropertyDescription(personTypeDesc, dateType, "dob"); + addPropertyDescription(personTypeDesc, stringType, "id"); // set to unique + // identifier? + addPropertyDescription(personTypeDesc, stringType, "gender"); // restrict? + + DataObject relativeType = createTypeDescription(scope, peopleURI, + "Relative"); // forward declare the Relative type + typeDeclarations.add(relativeType); + + DataObject rp = addPropertyDescription(personTypeDesc, relativeType, + "relative"); + rp.setBoolean("many", true); + personTypeDesc.set("open", Boolean.TRUE); + + // + // + // + // + // + + addPropertyDescription(relativeType, stringType, "relationship"); + addPropertyDescription(relativeType, booleanType, "genetic"); + DataObject targetPersonProp = addPropertyDescription(relativeType, + personTypeDesc, "target"); + targetPersonProp.setBoolean("containment", false); + + // + // + // + // + // + + DataObject pSet = createTypeDescription(scope, peopleURI, "PersonSet"); + typeDeclarations.add(pSet); + DataObject pSetProperty = addPropertyDescription(pSet, personTypeDesc, + "person"); + pSetProperty.setBoolean("many", true); + + // + // + // + // + // + // + + DataObject condition = createTypeDescription(scope, medicalURI, "Condition"); + typeDeclarations.add(condition); + addPropertyDescription(condition, booleanType, "diagnosed"); + addPropertyDescription(condition, stringType, "name"); // constrain? + + // + // + // + // + // + // + // + + DataObject testType = createTypeDescription(scope, medicalURI, "Test"); + typeDeclarations.add(testType); + addPropertyDescription(testType, pSet, "referrals"); + addPropertyDescription(testType, pSet, "patients"); + addPropertyDescription(testType, pSet, "relatives"); + + List types = typeHelper.define(typeDeclarations); + + DataObject p = scope.getDataFactory().create("commonj.sdo", "Property"); + p.set("type", typeHelper.getType(medicalURI, "Condition")); + p.set("name", "condition"); + p.setBoolean("many", true); + p.setBoolean("containment", true); // why is this not the default? + + typeHelper.defineOpenContentProperty(medicalURI, p); + + } + + /** + * @param uri + * @param name + * @return + */ + private DataObject createTypeDescription(HelperContext scope, String uri, + String name) { + DataObject typeDesc = scope.getDataFactory().create(sdoApiUri, "Type"); + typeDesc.set("name", name); + typeDesc.set("uri", uri); + return typeDesc; + } + + private DataObject addPropertyDescription( + DataObject containerTypeDescription, Object propertyType, + String propertyName) { + DataObject property = containerTypeDescription.createDataObject("property"); + property.set("type", propertyType); + property.setString("name", propertyName); + property.setBoolean("containment", true); + return property; + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/ObtainingDataGraphFromXml.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/ObtainingDataGraphFromXml.java new file mode 100644 index 0000000000..6d8ac0ab31 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/ObtainingDataGraphFromXml.java @@ -0,0 +1,201 @@ +/** + * + * 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.samples.sdo.advanced; + +import java.io.InputStream; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; +import org.apache.tuscany.sdo.api.SDOUtil; + +import commonj.sdo.DataGraph; +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; + +/** + * This sample program demonstrates a variety of methods available to obtain the root DataObject + * contained within an xml representation of a DataGraph. This is currently a grey + * area of the specification and this sample demonstrates spec compliant methods, as + * well as utility methods that have been added to Tuscany to address issues within + * the specification. + * + * The following sample is from the Apache Tuscany project. It was written to help users + * understand and experiment with SDO. It is based upon example code contained + * within, and is meant for use with, and reference to the SDO Specification. This sample attempts to clarify aspects of + * the the AccessDataObjectsUsingXPath example from the Examples section of the SDO + * specification.
+ *
+ * To define the correct Types for each DataObject ( CompanyType, DepartmentType etc ) + * this sample relies upon + * {@link org.apache.tuscany.samples.sdo.internal.SampleInfrastructure#COMPANY_XSD} which is + * provided in the resources directory of these samples. The xml file + * {@link org.apache.tuscany.samples.sdo.internal.SampleInfrastructure#COMPANY_DATAGRAPH_XML} is + * used to load the DataGraph and is also located in this resources directory.
+ *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ + +public class ObtainingDataGraphFromXml extends SampleBase { + + HelperContext scope; + + + + public ObtainingDataGraphFromXml(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_ADVANCED); + } + + public static void main(String[] args) { + + /* + * Create an instance of the sample program. Edit the "commentaryLevel" argument to suit + * your experience, COMMENTARY_FOR_NOVICE, COMMENTARY_FOR_INTERMEDIATE or COMMENTARY_FOR_ADVANCED + */ + ObtainingDataGraphFromXml sample = + new ObtainingDataGraphFromXml(COMMENTARY_FOR_ADVANCED); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.WRAPPING_DATA_GRAPH_IN_A_DATAGRAPH_INSTANCE + }; + + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.USING_BUILT_IN_TYPES + }; + + + public void runSample () { + banner('*', + "SDO Sample " + this.getClass().getName() + "\n\n" + + + "This sample touches an area of the SDO API where the emphasis has changed over the various\n"+ + "version of the specification, and so it's important to be clear what's going on\n"+ + "First off lets be sure of our terminology ...\n"+ + "1) A \"data graph\" is a just collection of DataObjects, all contained within a single\n"+ + "containment hierarchy, with a single root object, and possibly having some non-containment\n"+ + "references\n"+ + "2) A \"DataGraph\" is an instance of the SDO DataGraph class, used as a container for the root\n"+ + "DataObject of a data graph, and providing a means to access a change summary for the data graph.\n\n"+ + "More recent versions of the SDO specification have provided alternative means of containment\n"+ + "of a data graph ...\n"+ + "3) The graph can be contained in a DataObject of a built-in SDO Type with namespace URI \"commonj.sdo\"\n" + + "and name \"DataGraph\": so this is a modeled version of the special DataGraph class.\n"+ + "4) The Graph can be contained in an XMLDocument instance, which provides for things such as\n"+ + "naming the root element of an XML instance document" + ); + + scope = useDefaultScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.COMPANY_XSD); + + + + try { + + + + + DataObject company = null; + + commentary( + "Here we see the specification's example for obtaining dealing with\n"+ + "loading a data graph which uses a method, XMLHelper.load(). This loads an XML instance document\n"+ + "into an instance of XMLDocument ...\n\n"+ + "XMLDocument doc = scope.getXMLHelper().load(\n"+ + "ClassLoader.getSystemResourceAsStream(SampleInfrastructure.COMPANY_DATAGRAPH_XML));" + ); + + InputStream is = ClassLoader.getSystemResourceAsStream(SampleInfrastructure.COMPANY_DATAGRAPH_XML); + int x= is.available(); + byte b[]= new byte[x]; + is.read(b); + String instanceDoc = new String(b); + + System.out.println(instanceDoc); + + XMLDocument doc = scope.getXMLHelper().load( + ClassLoader.getSystemResourceAsStream(SampleInfrastructure.COMPANY_DATAGRAPH_XML)); + + commentary( + "Now we can get the wrapper for the data graph, which in this case is the DataObject\n"+ + "of type commonj.sdo#DataGraph. Note how there's no magic here; no special class for\n"+ + "DataGraph, no special handling, this is just a standard pattern of using a built in SDO Type.\n"+ + "The wrapper is there purely because it was serialized\n"+ + "into the XML document, using the standard serialization technique.\n\n" + + "DataObject dataObjectRepresentingDataGraph = doc.getRootObject();"); + + DataObject dataObjectRepresentingDataGraph = doc.getRootObject(); + + System.out.println(dataObjectRepresentingDataGraph); + + commentary( + "If you are confused by the fact that what we really get is an instance of DataGraphTypeImpl\n"+ + "This really is a DataObject, but it is a generated class extending DataObjectImpl\n+"+ + "representing the DataGraph model."); + + company = dataObjectRepresentingDataGraph.getDataObject("company"); + + commentary( + "We've obtained a DataObject representing the data graph, and from that we have obtained\n"+ + "the true root object of the business data"); + + System.out.println(company); + System.out.println(); + + commentary( + "Using an instance of DataGraph can perhaps be seen as an older style pattern of wrapping a data graph\n"+ + "and the first approach is likely to get more emphasis and attention in future revisions of the spec.\n"+ + "The SDO API has some limitations in the area of saving and loading instances of the\n"+ + "Java DataGraph type, so Tuscany has an API for doing this ...\n\n"+ + "DataGraph datagraph = SDOUtil.loadDataGraph(\n"+ + " ClassLoader.getSystemResourceAsStream(SampleInfrastructure.COMPANY_DATAGRAPH_XML), null);" + + ); + + DataGraph datagraph = SDOUtil.loadDataGraph(ClassLoader.getSystemResourceAsStream(SampleInfrastructure.COMPANY_DATAGRAPH_XML), null); + + System.out.println(datagraph); + + commentary( + "In this case we directly receive an instance of DataGraph and can retrieve the root\n"+ + "business object from the DataGraph\n\n"+ + "DataObject company = datagraph.getRootObject();"); + + company = datagraph.getRootObject(); + System.out.println(company); + System.out.println(); + + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } + + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/PrintDataGraph.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/PrintDataGraph.java new file mode 100644 index 0000000000..7458eef76c --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/PrintDataGraph.java @@ -0,0 +1,498 @@ +/** + * + * 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.samples.sdo.advanced; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Sequence; +import commonj.sdo.Type; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; +import commonj.sdo.helper.XSDHelper; +import commonj.sdo.impl.HelperProvider; + +/** + * + * This sample program traverses data graphs and builds up a text representation of the + * data graph. As it traverses a graph it outputs commentary to the console + * about what it has encountered and how it intends to process what it finds. At + * the end of each traversal the text representation of the graph is printed to + * the console. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class PrintDataGraph extends SampleBase { + + StringBuffer buf = null; + HelperContext scope = HelperProvider.getDefaultContext(); + + private int indent; + + private int indentIncrement = 2; + + public PrintDataGraph(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_ADVANCED); + buf = new StringBuffer(); + } + + public static void main(String[] args) { + PrintDataGraph sample = new PrintDataGraph(COMMENTARY_FOR_NOVICE); + sample.run(); + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.GENERIC_DATA_GRAPH_TRAVERSAL + }; + + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.GET_SET_PROPERTIES_BY_INSTANCE_PROPERTIES, + SDOFacets.ISMANY_PROPERTIES, + SDOFacets.CREATE_TYPES_USING_THE_SDO_API, + SDOFacets.ACCESSING_VALUES_IN_A_SEQUENCE, + SDOFacets.NON_CONTAINMENT + }; + + public void runSample() throws Exception { + commentary("This sample demonstrates a common pattern of traversing a data graph\n" + + "and printing the values of its Properties. As the sample traverses a couple of\n" + + "graphs it provides commentary about what it has found and what actions it\n" + + "is taking, whilst building up a text representation of the graph. It then\n" + + "shows you the results of its labours."); + + HelperContext scope = createScopeForTypes(); + + commentary( + COMMENTARY_ALWAYS, + "First we look at a data graph of a Purchase Order which has a fairly simple XML schema\n" + + "and the graph's containment hierarchy has a couple of levels of depth"); + + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.PO_XSD_RESOURCE); + + XMLDocument purchaseOrder = getXMLDocumentFromFile(scope, + SampleInfrastructure.PO_XML_RESOURCE); + + printXMLDocument(purchaseOrder); + + commentary(COMMENTARY_ALWAYS, + "And here is the resultant view of the data graph\n\n"); + System.out.println(getBuf().toString()); + + commentary(COMMENTARY_ALWAYS, + "Next we look at a graph representing a form letter, where the Type of the\n" + + "root data object is 'Sequenced'"); + + loadTypesFromXMLSchemaFile(scope, "letter.xsd"); + DataObject letter = getDataObjectFromFile(scope, "letter.xml"); + + reset(); + print(letter); + + commentary(COMMENTARY_ALWAYS, + "And here is the resultant view of the data graph\n\n"); + + System.out.println(getBuf().toString()); + + } + + public void reset() { + indent = 0; + buf = new StringBuffer(); + } + + /* + * a convenience method allowing untyped access to the print function for + * selected SDO artifacts + */ + public void print(Object sdoObject) throws Exception { + + if (sdoObject instanceof XMLDocument) { + printXMLDocument((XMLDocument) sdoObject); + } else if (sdoObject instanceof DataObject) { + printDataObject((DataObject) sdoObject); + } + + } + + public void printXMLDocument(XMLDocument xmlDocument) { + + commentary( + COMMENTARY_FOR_NOVICE, + "We are going to traverse a data graph that has been wrapped in an instance of XMLDocument\n" + + "Amongst other things, the XMLDocument instance provides access to the root element name\n" + + "and the root DataObject of the data graph.\n\n" + + "xmlDocument.getRootElementName();\n" + + "xmlDocument.getRootObject();", + + "Accessing another graph via an XMLDocument instance as we saw previously ...\n" + + "xmlDocument.getRootElementName();\n" + + "xmlDocument.getRootObject();"); + + buf.append("XMLDocument: ").append(xmlDocument.getRootElementName()); + lineBreak(); + incrementIndent(); + printDataObject(xmlDocument.getRootObject()); + decrementIndent(); + } + + public void printDataObject(DataObject dataObject) { + + if (dataObject.getContainer() == null) { + commentary( + COMMENTARY_FOR_NOVICE, + "We begin traversing the data graph by examining the root object of the graph's containment hierarchy,\n" + + "making a record of the values of its Properties. As we inspect the values of the Properties of this object\n" + + "if we encounter contained DataObjects, then we will recurs through the containment hierarchy of the\n" + + "data graph in a depth first fashion, and create a text representation of the graph that we'll print\n" + + "out after the graph traversal has been completed.", + + "We are beginning to traverse another data graph from its root object, in the same way that we saw previously"); + } else { + commentary( + COMMENTARY_FOR_NOVICE, + "We have arrived at a contained dataObject in the graph, and will inspect its Property values,\n" + + "recursing deeper if necessary", + + "Inspecting another contained dataObject"); + } + + lineBreak(); + indent(); + buf.append("DataObject: "); + Type type = dataObject.getType(); + buf.append("Type: ").append(type.getURI()).append('#').append( + type.getName()); + lineBreak(); + + if (dataObject.getType().isSequenced()) { + + commentary( + COMMENTARY_FOR_INTERMEDIATE, + "We've encountered a DataObject in the graph for which the Type is 'Sequenced'\n" + + "That is to say that the order of addition of Property values to the DataObject instance\n" + + "is important, and is preserved by the DataObject\n\n" + + "dataObject.getType().isSequenced();", + + "We've encountered another sequenced DataObject instance, and so will traverse the Property\n" + + "values in the order preerved by the instance, as we saw before\n\n" + + "dataObject.getType().isSequenced();"); + + commentary( + "There's a subtlety here which we must deal with if this sample code is to\n" + + "handle both Type systems that derive from XML schema, and those that come from elsewhere,\n" + + "e.g. using the SDO API. If a Sequenced DataObject has a Type that comes from XML schema\n" + + "then its Properties that derive from XML attributes are not ordered, whereas those that\n" + + "derive from XML elements are ordered. The SDO specification doesn't say whether\n" + + "the attribute related Properties should appear at the start of a Sequence or not.\n" + + "Currently in Tuscany we leave them out of the Sequence; other SDO implementations may\n" + + "include the XML attributes in the Sequence. This sample code is written to deal with\n" + + "either approach\n." + + "We use the XSDHelper.isAttribute(Property) and isElement(Property) methods to distinguish\n" + + "between the two kinds of Property", + + "Examining the xml attributes and elements of a Sequenced DataObject again." + ); + + XSDHelper xsdHelper = getScope().getXSDHelper(); + incrementIndent(); + for(Iterator it=dataObject.getInstanceProperties().iterator(); it.hasNext();) { + Property property = (Property)it.next(); + if (xsdHelper.isAttribute(property)) { + indent(); + buf.append("Property (XML Attribute): ").append(property.getName()).append(" - ").append(dataObject.get(property)); + lineBreak(); + } + + } + decrementIndent(); + Sequence seq = dataObject.getSequence(); + + commentary( + "The Property/Value pairs of a Sequence can be accessed via the getProperty(int) and getValue(int)\n" + + "accessor methods of the Sequence interface. The size() method of the Sequence tells us how many there are.\n" + + "If the getProperty(int) method returns null, then the value is text. These text values may be encountered\n" + + "when the DataObject's type is 'mixed' (dataObject.getType().isMixed() == true). A typical example of this\n" + + "is when the data graph represents a form letter.", + + "Inspecting the Property/Value pairs of another Sequence"); + + incrementIndent(); + indent(); + buf.append("Sequence: {\n"); + + incrementIndent(); + for (int i = 0; i < seq.size(); i++) { + Property p = seq.getProperty(i); + if (p == null) { + indent(); + buf.append("text: ").append(seq.getValue(i)); + lineBreak(); + } else if(!xsdHelper.isAttribute(p)){ + printPropertyValuePair(p, seq.getValue(i)); + } + } + decrementIndent(); + + indent(); + buf.append("}\n"); + decrementIndent(); + + } else { + incrementIndent(); + + commentary( + COMMENTARY_FOR_INTERMEDIATE, + "We access the Property values of this DataObject by first getting the list of 'Instance Properties'\n" + + "from the DataObject. For many DataObjects, this will be the same set of Properties that are defined\n" + + "by the DataObject's Type. However, if the DataObject's type is 'Open' then an instance of that Type\n" + + "may contain more Properties than the type itself. The list of Instance Properties will always include\n" + + "the Properties defined in the Type, but will also include any Properties that the instance has values for\n" + + "by virtue of it's type being 'Open'\n\n" + + "for (int i = 0; i < dataObject.getInstanceProperties().size(); i++) {\n" + + " Property p = (Property) dataObject.getInstanceProperties().get(i);", + + "Traversing the instance Properties of this DataObject\n" + + "for (int i = 0; i < dataObject.getInstanceProperties().size(); i++) {\n" + + " Property p = (Property) dataObject.getInstanceProperties().get(i);" + + ); + + for (int i = 0; i < dataObject.getInstanceProperties().size(); i++) { + Property p = (Property) dataObject.getInstanceProperties().get(i); + indent(); + printValueOfProperty(dataObject, p); + } + + decrementIndent(); + } + + } + + + + + + private void printPropertyValuePair(Property p, Object value) { + + indent(); + buf.append("Property: ").append(p.getName()).append(": "); + if(p.getType().isDataType()) { + printSimpleValue(value); + lineBreak(); + } else { + if(p.isContainment()) { + incrementIndent(); + printDataObject((DataObject)value); + decrementIndent(); + } else { + printReferencedDataObject((DataObject)value); + } + } + + + } + + private void printValueOfProperty(DataObject dataObject, Property p) { + + commentary( + COMMENTARY_FOR_INTERMEDIATE, + "We are about to inspect the value of a Property, but we must\n" + + "consider the nature of that Property in order to deal with it appropriately.\n" + + "Firstly we see if the Property value has been set (dataObject.isSet(property))\n" + + "Then we see if the Property is simple valued (property.isDataType() == true)\n" + + "--if not then we know it's a DataObject and we must recurs deeper into the graph's\n" + + "containment hierarchy\n" + + "Whether or not the property value is a DataObject, is may be single or multi-valued\n" + + "so we must either use one of the DataObject's get*(Property) accessors for single\n" + + "valued Properties or the getList() method for multi-valued properties.\n" + + "Another thing we must deal with when the Property is a DataObject, is whether or not the\n" + + "Property is a 'containment' Property. If it isn't, then here we simply record the fact that\n" + + "we have encountered this non-containment relationship, and move on to the next Property", + + "Inspecting another property to determine how to access its value, as we saw before"); + + // TODO deal with nullable + + buf.append("Property ").append(p.getName()).append(": ").append(" - "); + + if (dataObject.isSet(p)) { + if (p.getType().isDataType()) { + if (p.isMany()) { + printSimpleValues(dataObject.getList(p)); + } else { + printSimpleValue(dataObject.get(p)); + } + } else { + if (p.isContainment()) { + incrementIndent(); + if (p.isMany()) { + printDataObjects(dataObject.getList(p)); + } else { + printDataObject(dataObject.getDataObject(p)); + } + decrementIndent(); + } else { + if (p.isMany()) { + printReferencedDataObjects(dataObject.getList(p)); + } else { + printReferencedDataObject(dataObject.getDataObject(p)); + } + } + } + } else { + buf.append(" is not set"); + } + + lineBreak(); + + } + + private void printReferencedDataObject(DataObject dataObject) { + + commentary( + COMMENTARY_FOR_INTERMEDIATE, + "We have encounted a non-containment reference to a DataObject, and so\n" + + "we know that this DataObject will be fully inspected when encountered by the\n" + + "traversal of the data graph's containment hierarchy.\n" + + "We therefore record the fact that this association has been encountered by\n" + + "establishing the path from the root object of the data graph to the referenced\n" + + "DataObject", + + "Recording the fact that we have encountered another non-containment reference"); + + List path = new ArrayList(); + DataObject current = dataObject; + while (current != null) { + Property containmentProperty = current.getContainmentProperty(); + if(containmentProperty != null) { + if(containmentProperty.isMany()) { + List pValues = current.getContainer().getList(containmentProperty); + int index = pValues.indexOf(current)+1; + path.add("["+index+"]"); + } + path.add("/"+current.getContainmentProperty().getName()); + } + current = current.getContainer(); + } + buf.append("reference to: "); + for (ListIterator i = path.listIterator(path.size()); i.hasPrevious();) { + buf.append(i.previous()); + } + } + + private void printReferencedDataObjects(List list) { + + commentary( + COMMENTARY_FOR_NOVICE, + "Traversing a list of DataObjects which represent the values of a multi-valued non-containment Property"); + + indent(); + buf.append('['); + for (Iterator i = list.iterator(); i.hasNext();) { + printReferencedDataObject((DataObject) i.next()); + } + indent(); + buf.append(']'); + } + + private void printDataObjects(List list) { + + commentary( + COMMENTARY_FOR_NOVICE, + "Traversing a list of DataObjects which represent the values of a multi-valued containment Property"); + + + lineBreak(); + indent(); + buf.append("["); + incrementIndent(); + for (Iterator i = list.iterator(); i.hasNext();) { + printDataObject((DataObject) i.next()); + } + decrementIndent(); + indent(); + buf.append(']'); + } + + private void printSimpleValue(Object object) { + buf.append(object); + } + + private void printSimpleValues(List values) { + buf.append('['); + for (Iterator i = values.iterator(); i.hasNext();) { + printSimpleValue(i.next()); + if (i.hasNext()) { + buf.append(','); + } + } + buf.append(']'); + + } + + private void decrementIndent() { + indent -= indentIncrement; + + } + + private void incrementIndent() { + indent += indentIncrement; + + } + + private void indent() { + for (int i = 0; i < indent; i++) { + buf.append(' '); + } + } + + private void lineBreak() { + buf.append('\n'); + } + + public StringBuffer getBuf() { + return buf; + } + + public void setBuf(StringBuffer b) { + buf = b; + } + + public HelperContext getScope() { + return scope; + } + + public void setScope(HelperContext scope) { + this.scope = scope; + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/package.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/package.html new file mode 100644 index 0000000000..4a375228f8 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/advanced/package.html @@ -0,0 +1,31 @@ + + + + Advanced SDO Samples + + +

Advanced Service Data Object (SDO) Sample Programs

+ +

Running the Samples

See the main overview for instructions on how to run these +samples. + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessDataObjectPropertiesByName.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessDataObjectPropertiesByName.java new file mode 100644 index 0000000000..2030f35017 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessDataObjectPropertiesByName.java @@ -0,0 +1,99 @@ +/** + * + * 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.samples.sdo.basic; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates accessing a DataObject's Property values by name. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class AccessDataObjectPropertiesByName extends SampleBase { + + public AccessDataObjectPropertiesByName(Integer commentaryLevel) { + super(commentaryLevel, SAMPLE_LEVEL_BASIC); + } + + + public static void main(String[] args) { + AccessDataObjectPropertiesByName sample = new AccessDataObjectPropertiesByName(COMMENTARY_FOR_NOVICE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.GET_PROPERTIES_OF_DATAOBJECT_BY_NAME + }; + + public void runSample () throws Exception { + + banner("This sample will access a DataObject's properties by name\n"+ + "Take a look at the sample code to see all the uses of dataObject.get(String)\n"+ + "dataObject.getList(String) and dataObject.getDataObject(String)"); + + // setting up the type system for the example, see the utility methods for details of these operations + HelperContext scope = createScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.PO_XSD_RESOURCE); + + DataObject purchaseOrder = getDataObjectFromFile(scope, SampleInfrastructure.PO_XML_RESOURCE); + + System.out.println("Accessing properties of purchaseOrder by name"); + System.out.println("Purchase Order: "); + System.out.println(" purchaseOrder.get(\"orderDate\"): " + purchaseOrder.get("orderDate")); + System.out.println(" purchaseOrder.get(\"comment\"): " + purchaseOrder.get("comment")); + + System.out.println(" DataObject shipTo = purchaseOrder.getDataObject(\"shipTo\");"); + DataObject shipTo = purchaseOrder.getDataObject("shipTo"); + System.out.println(" shipTo.get(\"name\"): " + shipTo.get("name")); + + System.out.println(" DataObject billTo = purchaseOrder.getDataObject(\"billTo\");"); + DataObject billTo = purchaseOrder.getDataObject("billTo"); + System.out.println(" billTo.get(\"name\"): " + billTo.get("name")); + + System.out.println(" DataObject items = purchaseOrder.getDataObject(\"items\");\n" + + " List itemList = items.getList(\"item\");\n" + + " DataObject item = (DataObject) itemList.get(i);"); + DataObject items = purchaseOrder.getDataObject("items"); + List itemList = items.getList("item"); + + System.out.println(" Items:"); + for (int i = 0; i < itemList.size(); i++) { + DataObject item = (DataObject) itemList.get(i); + System.out.println(" item[" + i + "]"); + System.out.println(" item.get(\"partNum\"): " + item.get("partNum")); + System.out.println(" item.get(\"productName\"): " + item.get("productName")); + } + + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessingTheContentsOfASequence.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessingTheContentsOfASequence.java new file mode 100644 index 0000000000..e24a837ccc --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/AccessingTheContentsOfASequence.java @@ -0,0 +1,115 @@ +/** + * + * 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.samples.sdo.basic; + + +import org.apache.tuscany.samples.sdo.SampleBase; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Sequence; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates accessing the sequence from a DataObject containing mixed content. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ + +public class AccessingTheContentsOfASequence extends SampleBase { + + HelperContext scope; + + public AccessingTheContentsOfASequence(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_BASIC); + } + + + /** + * previously created XSD file used + */ + public static final String LETTER_XSD = "letter.xsd"; + + /** + * previously created XML file used + */ + public static final String LETTER_XML = "letter.xml"; + + /** + * Execute this method in order to run the sample. + * + * @param args + */ + public static void main(String[] args) { + + AccessingTheContentsOfASequence sample = + new AccessingTheContentsOfASequence(COMMENTARY_FOR_NOVICE); + + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.ACCESSING_VALUES_IN_A_SEQUENCE + }; + + public void runSample () throws Exception { + + commentary("Demonstrates accessing the sequence from a DataObject containing mixed content."); + + scope = createScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, LETTER_XSD); + DataObject letter = getDataObjectFromFile(scope, LETTER_XML); + + // print letter sequence + commentary("We've loaded a document from an XML file that contains mixed content.\n" + + "Here's how the XML looks ...\n"); + System.out.println(scope.getXMLHelper().save(letter, "letter.xsd", "letter")); + + commentary("We can iterate over the sequence, getting the Property / Value pairs\n" + + "using the Sequence.getProperty(int) and Sequence.getValue(int) methods.\n" + + "The model for this document is \"mixed\", i.e.\n" + + "letter.getType().isMixed() returns \"true\".\n" + + "Let's take a look at the Properties in this sequence."); + + Sequence letterSequence = letter.getSequence(); + + for (int i = 0; i < letterSequence.size(); i++) { + Property prop = letterSequence.getProperty(i); + if (prop == null) { + String text = (String) letterSequence.getValue(i); + System.out.println("Unstructured text (" + text + ")"); + } else { + System.out.println("Property: " + prop.getName() + " Value : " + letterSequence.getValue(i)); + } + } + + commentary("The values of the modeled Properties are still accessible through the DataObject\n" + + "getter and setter methods, but only through the Sequence API can we get to the unstructured\n" + + "text and see the ordering of the instance document"); + + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreateCompany.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreateCompany.java new file mode 100644 index 0000000000..38bafca539 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreateCompany.java @@ -0,0 +1,151 @@ +/** + * + * 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.samples.sdo.basic; + +import java.io.FileOutputStream; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * This sample uses the scenario of building a description of a company to demonstrate + * primarily the setting of data using strings to name Properties. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class CreateCompany extends SampleBase { + + public CreateCompany(Integer commentaryLevel) { + this(commentaryLevel, SAMPLE_LEVEL_BASIC); + } + + public CreateCompany(Integer commentaryLevel, Integer sampleLevel) { + super(commentaryLevel, sampleLevel); + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.SET_PROPERTIES_OF_DATAOBJECT_BY_NAME + }; + + /** + * XML file generated for the company DataObject + */ + private static final String COMPANY_GENERATED_XML = "companyGenerated.xml"; + + /** + * Main method. Execute this method in order to run sample + * @param args + * @throws Exception + */ + public static void main(String[] args) { + /* + * this sample is suitable for a novice to SDO. + * Change the experience level constructor argument to one of + * COMMENTARY_FOR_NOVICE, COMMENTARY_FOR_INTERMEDIATE, COMMENTARY_FOR_ADVANCED, change + * the level of commentary output. + */ + CreateCompany sample = new CreateCompany(COMMENTARY_FOR_NOVICE); + + sample.run(); + + } + + public void runSample () throws Exception { + + banner('*', + "Demonstrates how to create a data graph using a model loaded\n"+ + "from an XML Schema contained in a file on the file system"); + + HelperContext scope = createScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.COMPANY_XSD); + + commentary( + "Now that our type system has been loaded and made available through the scope\n"+ + "DataObjects can be created by a DataFactory that has access to the required types.\n\n"+ + "DataObject company = scope.getDataFactory().create(SampleInfrastructure.COMPANY_NAMESPACE, \"CompanyType\");"); + + DataObject company = scope.getDataFactory().create(SampleInfrastructure.COMPANY_NAMESPACE, "CompanyType"); + + populateGraph(scope, company); + + FileOutputStream fos = new FileOutputStream(COMPANY_GENERATED_XML); + + commentary( + "The XMLHelper can be used to write an XML serialized version of the data graph\n\n"+ + "scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, \"company\", fos);"); + + scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, "company", fos); + + commentary( + "Similarly we can serialize the graph to an XML String using the XMLHelper\n\n"+ + "String xml = scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, \"company\");\n"); + + String xml = scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, "company"); + + System.out.println(xml); + + } + + public void populateGraph(HelperContext scope, DataObject company) + { + + System.out.println("Populating the company DataObject"); + company.setString("name", "ACME"); + company.setString("employeeOfTheMonth", "E0001"); + + System.out.println("Creating a Department"); + + DataObject depts = company.createDataObject("departments"); + + depts.setString("name", "Advanced Technologies"); + depts.setString("location", "NY"); + depts.setString("number", "123"); + + System.out.println("Creating an employee: John Jones"); + DataObject johnJones = depts.createDataObject("employees"); + johnJones.setString("name", "John Jones"); + + johnJones.setString("SN", "E0001"); + + System.out.println("Creating an employee: Jane Doe"); + DataObject janeDoe = depts.createDataObject("employees"); + janeDoe.setString("name", "Jane Doe"); + janeDoe.setString("SN", "E0003"); + + System.out.println("Creating a manager: Fred Bloggs"); + DataObject fVarone = depts.createDataObject("employees"); + fVarone.setString("name", "Fred Bloggs"); + fVarone.setString("SN", "E0004"); + fVarone.setString("manager", "true"); + System.out.println("DataObject creation completed"); + System.out.println(); + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreatePurchaseOrder.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreatePurchaseOrder.java new file mode 100644 index 0000000000..c41aa37397 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/CreatePurchaseOrder.java @@ -0,0 +1,159 @@ +/** + * + * 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.samples.sdo.basic; + +import java.io.FileOutputStream; +import java.io.OutputStream; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; + +/** + * Demonstrates creating a purchaseOrder DataObject from an existing XSD and then + * persisting to disk. This + * sample was used to generate valid XML for Fuhwei Lwo's paper + * Create and read an XML document based on XML Schema + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ + +public class CreatePurchaseOrder extends SampleBase { + + public CreatePurchaseOrder(Integer commentaryLevel) { + super(commentaryLevel, SAMPLE_LEVEL_BASIC); + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.LOADING_DATA_FROM_XML, + SDOFacets.SAVING_DATA_TO_XML + }; + + + + public static void main(String[] args) { + + CreatePurchaseOrder sample = new CreatePurchaseOrder(COMMENTARY_FOR_NOVICE); + + sample.run(); + + } + + public void runSample() throws Exception { + + commentary(COMMENTARY_ALWAYS, + "This sample is based upon Fuhwei Lwo's paper\n" + + "http://www-128.ibm.com/developerworks/webservices/library/ws-sdoxmlschema/\n" + + "and demonstrates creating a purchaseOrder DataObject from an\n" + + "existing XSD and then persisting to disk."); + + HelperContext scope = createScopeForTypes(); + + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.PO_XSD_RESOURCE); + + + commentary ( + "We are creating a DataObject using a DataFactory by specifying the URI and name of\n"+ + "the Type that we want to use for the DataObject.\n\n"+ + "DataFactory factory = scope.getDataFactory();\n"+ + "DataObject purchaseOrder = factory.create(SampleInfrastructure.PO_NAMESPACE, \"PurchaseOrderType\");"); + + DataFactory factory = scope.getDataFactory(); + DataObject purchaseOrder = factory.create(SampleInfrastructure.PO_NAMESPACE, "PurchaseOrderType"); + + + commentary( + "Now we build on the graph using the DataObject's set() and createDataObject() methods.\n"+ + "Take a look inside the program code for the full detail of these steps"); + + purchaseOrder.setString("orderDate", "1999-10-20"); + DataObject shipTo = purchaseOrder.createDataObject("shipTo"); + shipTo.set("country", "US"); + shipTo.set("name", "Alice Smith"); + shipTo.set("street", "123 Maple Street"); + shipTo.set("city", "Mill Valley"); + shipTo.set("state", "CA"); + shipTo.setString("zip", "90952"); + DataObject billTo = purchaseOrder.createDataObject("billTo"); + billTo.set("country", "US"); + billTo.set("name", "Robert Smith"); + billTo.set("street", "8 Oak Avenue"); + billTo.set("city", "Mill Valley"); + billTo.set("state", "PA"); + billTo.setString("zip", "95819"); + purchaseOrder.set("comment", "Hurry, my lawn is going wild!"); + + DataObject items = purchaseOrder.createDataObject("items"); + + DataObject item1 = items.createDataObject("item"); + item1.set("partNum", "872-AA"); + item1.set("productName", "Lawnmower"); + item1.setInt("quantity", 1); + item1.setString("price", "148.95"); + + item1.set("comment", "Confirm this is electric"); + + DataObject item2 = items.createDataObject("item"); + item2.set("partNum", "926-AA"); + item2.set("productName", "Baby Monitor"); + item2.setInt("quantity", 1); + item2.setString("price", "39.98"); + item2.setString("shipDate", "1999-05-21"); + System.out.println("Created 2 items"); + + commentary( + "Now we use the XMLHelper to write an XML document representing the data graph\n"+ + "to a file. We must supply a namespace and a name for the root element of the graph, since it is\n"+ + "not contained in the DataObject\n\n"+ + "OutputStream stream = new FileOutputStream(SampleInfrastructure.PO_XML_GENERATED);\n"+ + "scope.getXMLHelper().save(purchaseOrder, SampleInfrastructure.PO_NAMESPACE, \"purchaseOrder\", stream);" + ); + + + OutputStream stream = new FileOutputStream(SampleInfrastructure.PO_XML_GENERATED); + scope.getXMLHelper().save(purchaseOrder, SampleInfrastructure.PO_NAMESPACE, "purchaseOrder", stream); + stream.close(); + + commentary( + "We could instead have created an XMLDocument instance to wrap the DataObject\n"+ + "This has the advantage that the namespace URI and root element name are preserved in the Object\n"+ + "This interface was introduced after Fuhwei's paper, and has particular advantage\n"+ + "when loading an XML document from a file\n\n"+ + "scope.getXMLHelper().createDocument(purchaseOrder, SampleInfrastructure.PO_NAMESPACE, \"purchaseOrder\");\n"+ + "scope.getXMLHelper().save(doc, System.out, null);"); + + + XMLDocument doc = scope.getXMLHelper().createDocument(purchaseOrder, SampleInfrastructure.PO_NAMESPACE, "purchaseOrder"); + scope.getXMLHelper().save(doc, System.out, null); + System.out.println(); + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/ReadPurchaseOrder.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/ReadPurchaseOrder.java new file mode 100644 index 0000000000..e1b0dce3e6 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/ReadPurchaseOrder.java @@ -0,0 +1,147 @@ +/** + * + * 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.samples.sdo.basic; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.XMLDocument; + +/** + * Reads purchase order DataObject from XML, based upon Fuhwei Lwo's paper + * Create and read an XML document based on XML Schema. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + * + */ +public class ReadPurchaseOrder extends SampleBase { + + + public static String purchaseOrderDoc = + "\n"+ + " \n"+ + " \n"+ + " Alice Smith\n"+ + " 123 Maple Street\n"+ + " Mill Valley\n"+ + " CA\n"+ + " 90952\n"+ + " \n"+ + " \n"+ + " Robert Smith\n"+ + " 8 Oak Avenue\n"+ + " Mill Valley\n"+ + " PA\n"+ + " 95819\n"+ + " \n"+ + " Hurry, my lawn is going wild!\n"+ + " \n"+ + " \n"+ + " Lawnmower\n"+ + " 148.95\n"+ + " 1\n"+ + " Confirm this is electric\n"+ + " \n"+ + " \n"+ + " Baby Monitor\n"+ + " 39.98\n"+ + " 1\n"+ + " 1999-05-21\n"+ + " \n"+ + " \n"+ + " \n"; + + public ReadPurchaseOrder(Integer commentaryLevel) { + super(commentaryLevel, SampleInfrastructure.SAMPLE_LEVEL_BASIC); + } + + public static void main(String[] args) { + ReadPurchaseOrder sample = new ReadPurchaseOrder(COMMENTARY_FOR_NOVICE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.LOADING_DATA_FROM_XML, + SDOFacets.SAVING_DATA_TO_XML + }; + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.GET_PROPERTIES_OF_DATAOBJECT_BY_NAME + }; + + + + public void runSample () throws Exception { + commentary(COMMENTARY_ALWAYS, + "This sample is based upon Fuhwei Lwo's paper \n"+ + "http://www-128.ibm.com/developerworks/webservices/library/ws-sdoxmlschema/\n"); + + HelperContext scope = createScopeForTypes(); + + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.PO_XSD_RESOURCE); + + commentary( + "We load the purchase order document into an instance of XMLDocument\n\n"+ + "XMLDocument xmlDoc = getXMLDocumentFromString(scope, purchaseOrderDoc);\n"); + + XMLDocument xmlDoc = getXMLDocumentFromString(scope, purchaseOrderDoc); + + commentary( + "We then retrieve the root DataObject from the XMLDocument\n"+ + "then print out some of the details\n\n"+ + "DataObject purchaseOrder = xmlDoc.getRootObject();"); + + DataObject purchaseOrder = xmlDoc.getRootObject(); + + System.out.println("Order date: " + purchaseOrder.get("orderDate")); + System.out.println("Comment: " + purchaseOrder.get("comment")); + + DataObject shipTo = purchaseOrder.getDataObject("shipTo"); + System.out.println("Ship to name: " + shipTo.get("name")); + + DataObject billTo = purchaseOrder.getDataObject("billTo"); + System.out.println("Bill to name: " + billTo.get("name")); + System.out.println(); + + DataObject items = purchaseOrder.getDataObject("items"); + List itemList = items.getList("item"); + for (int i = 0; i < itemList.size(); i++) { + + DataObject item = (DataObject) itemList.get(i); + + System.out.println("Part num: " + item.get("partNum")); + System.out.println("Product name: " + item.get("productName")); + } + + } + + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/package.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/package.html new file mode 100644 index 0000000000..d926bdbf5c --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/basic/package.html @@ -0,0 +1,31 @@ + + + + Basic SDO Samples + + +

Simple Service Data Object (SDO) Sample Programs

+ +

Running the Samples

See the main overview for instructions on how to run these +samples. + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessDataObjectUsingValidXPath.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessDataObjectUsingValidXPath.java new file mode 100644 index 0000000000..56bc68340f --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessDataObjectUsingValidXPath.java @@ -0,0 +1,129 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates accessing a created DataObject's properties using the SDO XPath like syntax. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class AccessDataObjectUsingValidXPath extends SampleBase { + HelperContext scope; + + public AccessDataObjectUsingValidXPath(Integer userLevel) { + super(userLevel, SampleInfrastructure.SAMPLE_LEVEL_INTERMEDIATE); + } + + + /** + * Accesses and modifies properties of a purchase order DataObject using xPath( + * properties are defined in the xsd + * {@link org.apache.tuscany.samples.sdo.internal.SampleInfrastructure#PO_XSD_RESOURCE} and + * populated by xml + * {@link org.apache.tuscany.samples.sdo.internal.SampleInfrastructure#PO_XML_RESOURCE} ) + * + * @param args. + * No parameters required. + */ + public static void main(String[] args) { + AccessDataObjectUsingValidXPath sample = new AccessDataObjectUsingValidXPath(COMMENTARY_FOR_NOVICE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.GET_SET_PROPERTIES_OF_DATAOBJECT_BY_XPATH + }; + + + public void runSample () throws Exception { + + commentary("Demonstrates accessing a DataObject's properties using the XPath style getter/setter methods"); + + + HelperContext scope = createScopeForTypes(); + + + commentary( + "First we create the type system using an XML Schema file and then create\n"+ + "A DataObject using an XML document for convenience"); + + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.PO_XSD_RESOURCE); + DataObject purchaseOrder = getDataObjectFromFile(scope, SampleInfrastructure.PO_XML_RESOURCE); + + + + commentary( + "Accessing data from the purchase order using the DataObjects XPath style methods\n"); + + + System.out.println("First we use the simplest kind of path\n" + + "purchaseOrder.getString(\"billTo/name\")\n" + + "The purchase is to be paid for by .... " + + purchaseOrder.getString("billTo/name")); + + + System.out.println("\nThen we use indexing by integer starting from 1\n" + + "purchaseOrder.getString(\"items/item[1]/productName\")\n" + + "The first item in the order is a ... " + + purchaseOrder.getString("items/item[1]/productName")); + + + System.out.println("\nThe alternative style of indexing uses a . notation and starts from 0\n"+ + "purchaseOrder.getFloat(\"items/item.0/price\")\n" + + "The price of this item is ... " + + purchaseOrder.getFloat("items/item.0/price")); + + + System.out.println("\nDataObjects can be looked up by supplying the value of one of the contained simple valued Properties\n"+ + "DataObject babyMonitorItem = purchaseOrder.getDataObject(\"items/item[productName=\\\"Baby Monitor\\\"]"); + + DataObject babyMonitorItem = purchaseOrder.getDataObject("items/item[productName=\"Baby Monitor\"]"); + System.out.println("The price of the Baby Monitor is .... " + + babyMonitorItem.getFloat("price")); + + + System.out.println("\nA parent DataObject can be accessed with the .. notation\n"+ + "List onlyIfBuyingGrassSeed = purchaseOrder.getList(\"items/item[productName=GrassSeed]/../item\");"); + List onlyIfBuyingGrassSeed = purchaseOrder.getList("items/item[productName=GrassSeed]/../item"); + if(onlyIfBuyingGrassSeed != null) { + System.out.println("The purchase order included grass seed and " + new Integer(onlyIfBuyingGrassSeed.size()-1) + " other items"); + } else { + System.out.println("The purchase order did not include GrassSeed"); + } + + + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessingDataObjectsViaPropertyIndex.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessingDataObjectsViaPropertyIndex.java new file mode 100644 index 0000000000..98a63b5654 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/AccessingDataObjectsViaPropertyIndex.java @@ -0,0 +1,164 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.advanced.PrintDataGraph; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates accessing the properties of a DataObject using integer property indices. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ + +public class AccessingDataObjectsViaPropertyIndex extends SampleBase { + + HelperContext scope; + PrintDataGraph printer; + + public AccessingDataObjectsViaPropertyIndex(Integer userLevel) { + /* + * Classifying this sample as intermediate, not because it is complex + * but because it's a scenario not to be encouraged for use by + * people new to SDO. + */ + super(userLevel, SAMPLE_LEVEL_INTERMEDIATE); + printer = new PrintDataGraph(SAMPLE_LEVEL_ADVANCED); + } + + + /** + * Predefine the property indexes. + */ + + private static final int COMPANY_DEPARTMENT = 0; + private static final int COMPANY_NAME = 1; + private static final int COMPANY_EMPLOYEE_OF_MONTH = 2; + + private static final int DEPARTMENT_EMPLOYEES = 0; + + private static final int EMPLOYEE_NAME = 0; + private static final int EMPLOYEE_SN = 1; + private static final int EMPLOYEE_MANAGER = 2; + + + /** + * Execute this method in order to run the sample. + * + * @param args + */ + public static void main(String[] args) { + AccessingDataObjectsViaPropertyIndex sample = + new AccessingDataObjectsViaPropertyIndex(COMMENTARY_FOR_NOVICE); + + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.GET_SET_PROPERTIES_OF_DATAOBJECT_BY_INDEX + }; + + + public void runSample () throws Exception { + + + commentary( + "This sample demonstrates the use of integer index to get and set\n" + + "Property values of a DataObject. This approach is optimized for\n" + + "performance, but is fragile to changes to the Type system. It will be\n" + + "broken if someone alters the XML schema that is used to load the type system." + + "This kind of approach is well suited to a situation where the SDO code is being\n" + + "generated."); + + scope = createScopeForTypes(); + + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.COMPANY_XSD); + + DataObject company = getDataObjectFromFile(scope, SampleInfrastructure.COMPANY_DATAOBJECT_XML); + + commentary("We've loaded a data graph that looks like this ..."); + + printer.print(company); + System.out.println(printer.getBuf()); + printer.reset(); + + commentary("Here's how the data graph looks rendered in XML ..."); + System.out.println( + scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, "company")); + + commentary( + "This sample class has primitive int static constants defined for the Properties\n" + + "of the Types that the program is designed to work with, e.g.\n\n" + + "private static final int COMPANY_NAME = 2;\n\n" + + "The value of the integers is defined by the sequence the Properties\n" + + "appear in the List returned by dataObject.getType().getDeclaredProperties()\n" + + "For a type derived from an XML schema this will be the sequence they appeared in the\n" + + "schema document.\n" + + "We can use these integer values to get and set Properties on the company DataObject\n\n" + + "company.setString(COMPANY_NAME, \"MegaCorp\");\n" + + "List departments = company.getList(COMPANY_DEPARTMENT);\n" + + "List employees = department.getList(DEPARTMENT_EMPLOYEES);\n"); + + company.setString(COMPANY_NAME, "MegaCorp"); + + + + commentary("The sample continues, altering the data graph by using the getter\n" + + "and setter methods that take int arguments"); + + List departments = company.getList(COMPANY_DEPARTMENT); + DataObject department = (DataObject) departments.get(0); + List employees = department.getList(DEPARTMENT_EMPLOYEES); + DataObject employeeFromList = (DataObject) employees.get(2); + employeeFromList.detach(); + + DataObject newEmployee = department.createDataObject(DEPARTMENT_EMPLOYEES); + + newEmployee.set(EMPLOYEE_NAME, "Al Smith"); + newEmployee.set(EMPLOYEE_SN, "E0005"); + newEmployee.setBoolean(EMPLOYEE_MANAGER, true); + + company.set(COMPANY_EMPLOYEE_OF_MONTH, newEmployee.get(EMPLOYEE_SN)); + + commentary("After some more manipulation (take a look at the sample code to see the detail)\n" + + "we can examine the state of the modified graph"); + + printer.print(company); + System.out.println(printer.getBuf()); + printer.reset(); + + commentary("Or rendered in XML it now looks like this ..."); + System.out.println(scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, "company")); + + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateCompanyTuscanyAPI.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateCompanyTuscanyAPI.java new file mode 100644 index 0000000000..097814d35f --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateCompanyTuscanyAPI.java @@ -0,0 +1,114 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.io.FileOutputStream; + +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; +import org.apache.tuscany.sdo.api.SDOUtil; + +import commonj.sdo.DataGraph; +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * This sample is a variant of the CreateCompany sample where the graph of DataObjects + * is contained in an instance of DataGraph. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class CreateCompanyTuscanyAPI extends org.apache.tuscany.samples.sdo.basic.CreateCompany { + + public CreateCompanyTuscanyAPI(Integer commentaryLevel) { + super(commentaryLevel, SAMPLE_LEVEL_INTERMEDIATE); + } + + /** + * XML file generated for the company DataGraph + */ + private String COMPANY_DATAGRAPH_GENERATED_XML = "companyDataGraphGenerated.xml"; + + + /** + * Main method. Execute this method in order to run sample + * @param args + * @throws Exception + */ + public static void main(String[] args) { + /* + * this sample is best suited so someone with an intermediate level + * of understanding of SDO. Change the experience level argument to get more + * or less commentary. + */ + CreateCompanyTuscanyAPI sample = new CreateCompanyTuscanyAPI(COMMENTARY_FOR_INTERMEDIATE); + sample.run(); + + } + + public void runSample () throws Exception { + + banner('*', + " SDO Sample Create Company in a DataGraph \n\n"+ + "This is a variant of the simple CreateCompany sample, but\n"+ + "demonstrates how to create a DataGraph in the absence of a Data Access Service (DAS)\n"+ + "This is not typical of how an SDO user would code, because a DAS is usually\n"+ + "responsible for creating a DataGraph instance. This is why we must use a Tuscany API\n"+ + "to create the dataGraph in the first place\n"+ + "If you don't have a need to use a DataGraph instance then you may want to skip this\n"+ + "sample, or leave it until you have explored the DataObject interface fully\n"); + + commentary(COMMENTARY_FOR_INTERMEDIATE, + "As we are dealing with a DataGraph, the SDO API has some gray areas at the moment\n"+ + "in that the DataGraph API hasn't yet been developed to deal with scopes\n"+ + "other than the default scope. So here is an occasion where we must use "+ + "the default singleton scope"); + HelperContext scope = useDefaultScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.COMPANY_XSD); + + commentary (COMMENTARY_FOR_INTERMEDIATE, + "Here is the use of the Tuscany API for creating a DataGraph instance\n\n"+ + "DataGraph dataGraph = SDOUtil.createDataGraph();"); + + DataGraph dataGraph = SDOUtil.createDataGraph(); + + commentary(COMMENTARY_FOR_INTERMEDIATE, + "Now we create a root object of a selected type for the DataGraph wrapper to contain.\n"+ + "This is an example of a DataGraph interface that currently forces us to use the default scope.\n\n"+ + "company = dataGraph.createRootObject(SampleInfrastructure.COMPANY_NAMESPACE, \"CompanyType\");"); + + DataObject company = dataGraph.createRootObject(SampleInfrastructure.COMPANY_NAMESPACE, "CompanyType"); + + populateGraph(scope, company); + + commentary(COMMENTARY_FOR_INTERMEDIATE, + "Since the SDO API doesn't currently have a method for serializing the DataGraph instance\n"+ + "we again use a Tuscany specific API\n\n"+ + "SDOUtil.saveDataGraph(dataGraph, fos, null);"); + + FileOutputStream fos = new FileOutputStream(COMPANY_DATAGRAPH_GENERATED_XML); + SDOUtil.saveDataGraph(dataGraph, fos, null); + + SDOUtil.saveDataGraph(dataGraph, System.out, null); + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateDataObjectFromXmlString.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateDataObjectFromXmlString.java new file mode 100644 index 0000000000..1ec920146d --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/CreateDataObjectFromXmlString.java @@ -0,0 +1,133 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Sequence; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates creating a DataObject from a String of XML without an explicit model. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class CreateDataObjectFromXmlString extends SampleBase { + HelperContext scope; + + + public CreateDataObjectFromXmlString(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_INTERMEDIATE); + } + + + /** + * String representing a PurchaseOrder in XML format + */ + public static final String XML_STRING = "" + " " + " Alice Smith" + + " 123 Maple Street" + " Mill Valley" + " PA" + " 90952" + "" + + ""; + + + public static void main(String[] args) { + + CreateDataObjectFromXmlString sample = new CreateDataObjectFromXmlString(COMMENTARY_FOR_NOVICE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.USING_BUILT_IN_TYPES, + SDOFacets.LOADING_DATA_FROM_XML + }; + + public void runSample () throws Exception { + + + commentary("Demonstrates creating a DataObject from a String of XML,\n" + + "based upon section titled 'Creating DataObjects from XML documents'\n"+ + "This quite unassuming sample demonstrates the maxim of 'less is more'\n"+ + "in that it might look like other samples where the XML document was loaded\n"+ + "from a file or string, but note that we don't define any Types before loading\n"+ + "the document. Built in generic types are used to model the data graph"); + + + scope = createScopeForTypes(); + + commentary("don't define any types! Just go ahead and load from the String\n\n"+ + "DataObject purchaseOrder = scope.getXMLHelper().load(XML_STRING).getRootObject();"); + + DataObject purchaseOrder = scope.getXMLHelper().load(XML_STRING).getRootObject(); + + commentary("Note that the Type of the newly created DataObject has no Properties defined for it\n"+ + "but the type is said to be \"Open\", which means that an instance of the Type may make use of other Properties\n"+ + "defined elsewhere. The XMLHelper's load operation creates Properties on demand for the DataObject instance to use as it loads\n"+ + "the document\n\n" + + "purchaseOrder.getType().isOpen returns true\n" + + "purchaseOrder.getType().getProperty(\"shipTo\") returns null and\n" + + "purchaseOrder.getInstanceProperty(\"shipTo\") returns a Property"); + + System.out.println("DataObject's type is open?: " + purchaseOrder.getType().isOpen()); + System.out.println("Data Object's type has a property shipTo?: " + (purchaseOrder.getType().getProperty("shipTo") != null)); + System.out.println("Data Object instance has a property shipTo?: " + (purchaseOrder.getInstanceProperty("shipTo") != null)); + + commentary( + "Without a Type definition accessing a DataObject is slightly\n"+ + "different, since without a Type definition SDO does not know\n"+ + "the intended multiplicity of properties. So every Property is assumed to\n"+ + "be multi-valued, and must be accessed via a list\n\n"+ + "List shipToList = purchaseOrder.getList(\"shipTo\");\n"+ + "DataObject shipTo = (DataObject) shipToList.get(0);"); + + List shipToList = purchaseOrder.getList("shipTo"); + DataObject shipTo = (DataObject) shipToList.get(0); + + + + /* + * With no model around, this next operation is currently quite cumbersome. + * In future specifications accessing + * the name element will be simplier and the user could simply execute: + * List nameList = shipTo.getList("name"); String actualName = (String) + * nameList.get(0); + * + * Or if name is an attribute ("") simply: String actualName = shipTo.getString("name"); + * + * There are currently more elegant means to perform this task using the xPath support + */ + List nameList = shipTo.getList("name"); + DataObject name = (DataObject) nameList.get(0); + // access the contents of the name DataObject + Sequence s = name.getSequence(); + String actualName = (String) s.getValue(0); + System.out.println("Name being shipped to: " + actualName); + + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/DynamicCustomerTypeSample.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/DynamicCustomerTypeSample.java new file mode 100644 index 0000000000..abe3434fab --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/DynamicCustomerTypeSample.java @@ -0,0 +1,193 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.util.List; + +import org.apache.tuscany.samples.sdo.SampleBase; + +import commonj.sdo.DataObject; +import commonj.sdo.Type; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; + +/** + * Demonstrates creating and using Types dynamically. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class DynamicCustomerTypeSample extends SampleBase { + HelperContext scope; + + public DynamicCustomerTypeSample(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_INTERMEDIATE); + } + + + /** + * XSD file used to define the model and Types for Customer Dataobject + */ + public static final String CUSTOMER_MODEL = "customer.xsd"; + + /** + * Default file name to use when generated customer XSD files. + * + * @see org.apache.tuscany.samples.sdo.specCodeSnippets.CreateXmlAndXsdFromDataObject + */ + public static final String CUSTOMER_MODEL_GENERATED = "generatedCustomer.xsd"; + + /** + * Fake namespace used for Customer + */ + public static final String CUSTOMER_NAMESPACE = "http://www.example.com/customer"; + + /** + * XML file used to populate Customer DataObjects + */ + public static final String CUSTOMER_XML = "customer.xml"; + + /** + * Default file name to use when generated customer XML files. + * + * @see org.apache.tuscany.samples.sdo.specCodeSnippets.CreateXmlAndXsdFromDataObject + */ + public static final String CUSTOMER_XML_GENERATED = "generatedCustomer.xml"; + + /** + * Drives sample methods + * + * @param args + * no arguments required + */ + public static void main(String[] args) { + + DynamicCustomerTypeSample sample = + new DynamicCustomerTypeSample(COMMENTARY_FOR_INTERMEDIATE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.CREATE_TYPES_USING_THE_SDO_API + }; + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.SET_PROPERTIES_OF_DATAOBJECT_BY_NAME, + SDOFacets.USING_BUILT_IN_TYPES, + SDOFacets.SAVING_DATA_TO_XML + }; + + public void runSample () throws Exception { + + commentary(COMMENTARY_ALWAYS, + "Demonstrates the use of the SDO API to build types dynamically\n"+ + "by building a data graph representing the type system and\n"+ + "submitting that graph to TypeHelper.define()"); + + + scope = createScopeForTypes(); + + + commentary("A TypeHelper is used for both looking up types, and later creating them\n\n"+ + "TypeHelper typeHelper = scope.getTypeHelper();"); + + TypeHelper typeHelper = scope.getTypeHelper(); + + commentary("We can look up existing types to use in the creation of Properties\n\n"+ + "Type intType = types.getType(\"commonj.sdo\", \"Int\");\n"+ + "Type stringType = types.getType(\"commonj.sdo\", \"String\");"); + + Type intType = typeHelper.getType("commonj.sdo", "Int"); + Type stringType = typeHelper.getType("commonj.sdo", "String"); + + commentary("To begin modeling the type system we create a DataObject with\n"+ + "Type \"commonj.sdo#Type\" and set the URI and name for that type\n\n"+ + + "DataObject customerType = scope.getDataFactory().create(\"commonj.sdo\", \"Type\");\n"+ + "customerType.set(\"uri\", \"http://example.com/customer\");\n"+ + "customerType.set(\"name\", \"Customer\");"); + + DataObject customerType = scope.getDataFactory().create("commonj.sdo", "Type"); + customerType.set("uri", "http://example.com/customer"); + customerType.set("name", "Customer"); + + commentary("Now we can create a model for the Properties for the Type\n"+ + "and set the name and Types of those Properties\n\n"+ + "DataObject custNumProperty = customerType.createDataObject(\"property\");\n"+ + "custNumProperty.set(\"name\", \"custNum\");\n"+ + "custNumProperty.set(\"type\", intType);" + ); + + DataObject custNumProperty = customerType.createDataObject("property"); + custNumProperty.set("name", "custNum"); + custNumProperty.set("type", intType); + + commentary("We continue in this manner until all the Types and their Properties are modeled"); + DataObject lastNameProperty = customerType.createDataObject("property"); + lastNameProperty.set("name", "lastName"); + lastNameProperty.set("type", stringType); + + DataObject firstNameProperty = customerType.createDataObject("property"); + firstNameProperty.set("name", "firstName"); + firstNameProperty.set("type", stringType); + + commentary("Now that our type is fully modeled we submit the model to the TypeHelper\n"+ + "The new Type instance is returned to us, but is also available for lookup within\n"+ + "the scope associated with the TypeHelper\n\n"+ + "Type t = typeHelper.define(customerType);"); + Type t = typeHelper.define(customerType); + + commentary("Here we see the newly created Type being accessed via the TypeHelper\n"+ + "along with a printout of the Type's Properties\n\n"+ + "Type testType = scope.getTypeHelper().getType(\"http://example.com/customer\", \"Customer\");"); + + Type testType = scope.getTypeHelper().getType("http://example.com/customer", "Customer"); + List props = testType.getProperties(); + for (int i = 0; i < props.size(); i++) { + System.out.println(props.get(i)); + } + + commentary("Now we can create an instance of the type using the DataFactory associated with the type scope\n\n"+ + "DataFactory factory = scope.getDataFactory();\n"+ + "DataObject customer1 = factory.create(\"http://example.com/customer\", \"Customer\");"); + + DataFactory factory = scope.getDataFactory(); + DataObject customer1 = factory.create("http://example.com/customer", "Customer"); + customer1.setInt("custNum", 1); + customer1.set("firstName", "John"); + customer1.set("lastName", "Adams"); + + commentary("Here's an XML String representing a DataObject we have created with the new type"); + String xmlDocString = scope.getXMLHelper().save(customer1, CUSTOMER_NAMESPACE, "customer"); + System.out.println(xmlDocString); + + + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/OppositeProperty.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/OppositeProperty.java new file mode 100644 index 0000000000..aa77eb486c --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/OppositeProperty.java @@ -0,0 +1,89 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.tuscany.sdo.api.SDOUtil; +import org.apache.tuscany.sdo.model.ModelFactory; + +import commonj.sdo.DataObject; +import commonj.sdo.Property; +import commonj.sdo.Type; +import commonj.sdo.helper.DataFactory; +import commonj.sdo.helper.HelperContext; +import commonj.sdo.helper.TypeHelper; +import commonj.sdo.helper.XMLDocument; + +// TODO -- make this a proper integrated sample +public class OppositeProperty { + + + final HelperContext hc = SDOUtil.createHelperContext(); + static final String NSURI = "http://www.apache.org/tuscany/opposite"; + + public static void main(String[] args) throws IOException { + + OppositeProperty inst = new OppositeProperty(); + inst.run(); + + } + + private void run() throws IOException { + + + final URL url = getClass().getResource("/sports.xsd"); + final InputStream inputStream = url.openStream(); + hc.getXSDHelper().define(inputStream, url.toString()); + inputStream.close(); + + final URL url2 = getClass().getResource("/sports.xml"); + final InputStream inputStream2 = url2.openStream(); + XMLDocument unionDoc = hc.getXMLHelper().load(inputStream2, url2.toString(), null); + inputStream2.close(); + + { + StringWriter w = new StringWriter(); + hc.getXMLHelper().save(unionDoc, w, null); + System.out.println(w.toString()); + } + + DataObject union = unionDoc.getRootObject(); + DataObject p3 = union.getDataObject("member[ID=p3]"); + DataObject t0 = union.getDataObject("team[ID=t0]"); + t0.set("captain", p3); + + { + StringWriter w = new StringWriter(); + hc.getXMLHelper().save(unionDoc, w, null); + System.out.println(w.toString()); + } + + + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/SerializingDeserializingADataObject.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/SerializingDeserializingADataObject.java new file mode 100644 index 0000000000..eaecf436bf --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/SerializingDeserializingADataObject.java @@ -0,0 +1,137 @@ +/** + * + * 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.samples.sdo.intermediate; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import org.apache.tuscany.samples.sdo.SampleBase; +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure; + +import commonj.sdo.DataObject; +import commonj.sdo.helper.HelperContext; + +/** + * Demonstrates serializing and deserializing a DataObject to disk + * using java serialization. + *

+ *

Running this Sample

See the main overview for instructions on how to run this + * sample. + */ +public class SerializingDeserializingADataObject extends SampleBase { + HelperContext scope; + + public SerializingDeserializingADataObject(Integer userLevel) { + super(userLevel, SAMPLE_LEVEL_INTERMEDIATE); + } + + + public static void main(String[] args) { + + SerializingDeserializingADataObject sample = + new SerializingDeserializingADataObject(COMMENTARY_FOR_INTERMEDIATE); + sample.run(); + + } + + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] CORE_FUNCTION = { + SDOFacets.JAVA_SERIALIZATION_OF_DATA_GRAPH + }; + /* + * metadata for the sample documenting the areas of SDO that are explored + */ + public static int [] SIGNIFICANT_FUNCTION = { + SDOFacets.TESTING_FOR_GRAPH_EQUALITY + }; + + public void runSample () throws Exception { + + commentary( + "Demonstrates serializing and deserializing a DataObject\n" + + "to disk using Java serialization."); + + scope = useDefaultScopeForTypes(); + loadTypesFromXMLSchemaFile(scope, SampleInfrastructure.COMPANY_XSD); + DataObject company = getDataObjectFromFile(scope, SampleInfrastructure.COMPANY_DATAOBJECT_XML); + + + commentary("We've loaded a data graph 'company' from a file\n" + + "using XML schema for the model and XML for the graph in the usual manner\n"); + String fileName = "temporarySerializedDataObject.xml"; + commentary("We've loaded a data graph 'company' from a file\n" + + "using XML schema for the model and XML for the graph in the usual manner\n" + + "Now we are going to serialize it to, and read it from a temporary file: "+fileName); + + commentary( + "The following code, which doesn't use any SDO APIs, demonstrates the\n" + + "underlying SDO function of performing Java serialization on SDO objects\n\n" + + "FileOutputStream fos = new FileOutputStream(fileName);\n" + + "ObjectOutputStream out = new ObjectOutputStream(fos);\n" + + "out.writeObject(company);\n" + + "out.close();"); + + FileOutputStream fos = new FileOutputStream(fileName); + ObjectOutputStream out = new ObjectOutputStream(fos); + out.writeObject(company); + out.close(); + + // read in DataObject + commentary("Having written the data graph to the temporary file we\n" + + "can read it back\n\n" + + "FileInputStream fis = new FileInputStream(fileName);\n" + + "ObjectInputStream input = new ObjectInputStream(fis);\n" + + "DataObject newDataObject = (DataObject) input.readObject();\n" + + "input.close();"); + + FileInputStream fis = new FileInputStream(fileName); + ObjectInputStream input = new ObjectInputStream(fis); + DataObject newDataObject = (DataObject) input.readObject(); + input.close(); + + /** + * Compare data graphs + */ + + commentary("We can use the SDO EqualityHelper to check that we have got\n" + + "back an equivalent graph to the one we had originally\n\n" + + "boolean equal = scope.getEqualityHelper().equal(company, newDataObject);"); + + boolean equal = scope.getEqualityHelper().equal(company, newDataObject); + System.out.println("DataObjects are equal: " + equal); + + //print out xml representation + System.out.println(); + System.out.println("Original company DataObject:"); + System.out.println(scope.getXMLHelper().save(company, SampleInfrastructure.COMPANY_NAMESPACE, "company")); + + System.out.println(); + System.out.println("Deserialized company DataObject:"); + System.out.println(scope.getXMLHelper().save(newDataObject, SampleInfrastructure.COMPANY_NAMESPACE, "company")); + + + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/package.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/package.html new file mode 100644 index 0000000000..59ea1c39e6 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/intermediate/package.html @@ -0,0 +1,30 @@ + + + + Intermediate SDO Samples + + +

Intermediate Service Data Object (SDO) Sample Programs

+

Running the Samples

See the main overview for instructions on how to run these +samples. + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/DocumentSamples.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/DocumentSamples.java new file mode 100644 index 0000000000..af20cb663a --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/DocumentSamples.java @@ -0,0 +1,218 @@ +/** + * + * 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.samples.sdo.internal; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.apache.tuscany.samples.sdo.internal.SampleInfrastructure.SDOFacets; + + +/** + * Class to generate html documentation for the SDO Samples. + * The program introspects the sample programs listed in the + * {@link SampleInfrastructure#sampleClasses sample classes} + * static constant, for the values of the static CORE_FUNCTION + * and SIGNIFICANT_FUNCTION variables. + *

+ * It builds indexes from + * sample to function and from function to sample and creates + * html output that displays these indexes. + */ +public class DocumentSamples { + + private Map classToCoreFunction = new HashMap(); + private Map coreFunctionToClass = new HashMap(); + private Map classToSignificantFunction = new HashMap(); + private Map significantFunctionToClass = new HashMap(); + + public static void main(String[] args) throws SecurityException, + NoSuchMethodException, IllegalArgumentException, InstantiationException, + IllegalAccessException, InvocationTargetException, IOException { + + DocumentSamples ds = new DocumentSamples(); + ds.run(); + + } + + private static String HTML_HEADER = + "\n" + + "\n" + + " \n"+ + " \n"+ + "SDO Samples\n" + + "

SDO Samples

\n" + + "

\n" + + "The samples provided in the Tuscany SDO distribution cover many areas of\n" + + "the SDO API. Here we provide two indexes into the samples. The first lists\n" + + "each sample in sequence and details the central theme(s) of the sample.\n" + + "It also mentions if the sample significantly demonstrates other areas in passing.\n" + + "The second index lists all the themes that are covered by these samples, and\n" + + "indicates which of the samples has that subject area as a central theme or as\n" + + "demonstrates the subject area significant as an incidental part of the sample."; + + private static String CLASSES_HEADING = + "

Index by Sample Program Name

\n"; + + private static String FUNCTION_HEADING = + "

Index by function

\n"; + + private static String HTML_FOOTER = + "\n"; + + + private void run() throws IllegalAccessException { + /* + * gather the data + */ + for (int i = 0; i < SampleInfrastructure.sampleClasses.length; i++) { + Class c = SampleInfrastructure.sampleClasses[i]; + classToCoreFunction.put(c, new HashSet()); + try { + Field coreFunction = c.getField("CORE_FUNCTION"); + recordFunction(c, coreFunction, coreFunctionToClass, classToCoreFunction); + } catch (NoSuchFieldException e) { + // no problem + } + try { + Field sigFunction = c.getField("SIGNIFICANT_FUNCTION"); + recordFunction(c, sigFunction, significantFunctionToClass, classToSignificantFunction); + } catch (NoSuchFieldException e) { + // no problem + } + } + + /* + * create the documentation + */ + StringBuffer doc = new StringBuffer(); + doc.append(HTML_HEADER); + + doc.append(CLASSES_HEADING); + Class [] classes = SampleInfrastructure.sampleClasses; + for(int i=0; i < classes.length;i++) { + doc.append("

Sample Program " + getSimpleName(classes[i]) + "

\n"); + doc.append("Core function:
\n"); + int [] functions = (int[])classToCoreFunction.get(classes[i]); + for(int j=0;j") + .append(SDOFacets.subject_areas[functions[j]]) + .append("
\n"); } + doc.append("
"); + if(classToSignificantFunction.get(classes[i])!= null) { + doc.append("Also demonstrates:
\n"); + functions = (int[])classToSignificantFunction.get(classes[i]); + for(int j=0;j") + .append(SDOFacets.subject_areas[functions[j]]) + .append("
\n"); + } + } + } + + doc.append(FUNCTION_HEADING); + + String [] facets = SDOFacets.subject_areas; + for(int f = 0; f\n

") + .append(SDOFacets.subject_areas[f]) + .append("

\n"); + if(coreFunctionToClass.keySet().contains(fobj)) { + doc.append("Samples which demonstrate this as their core function
\n"); + Set classesWithFunction = (Set)coreFunctionToClass.get(fobj); + for(Iterator cwf = classesWithFunction.iterator(); cwf.hasNext();) { + Class c = (Class)cwf.next(); + doc.append(getSimpleName(c)).append("
\n"); + } + } + if(significantFunctionToClass.keySet().contains(fobj)) { + doc.append("Samples which demonstrate this in addition to their core function
\n"); + Set classesWithFunction = (Set)significantFunctionToClass.get(fobj); + for(Iterator cwf = classesWithFunction.iterator(); cwf.hasNext();) { + Class c = (Class)cwf.next(); + doc.append(getSimpleName(c)).append("
\n"); + } + } + + } + + doc.append(HTML_FOOTER); + System.out.println(doc); + } + + private int[] recordFunction(Class c, Field functionIndices, Map ftoc, Map ctof) + throws IllegalAccessException { + int[] functions = (int[]) functionIndices.get(c); + for (int j = 0; j < functions.length; j++) { + addClassesToFunction(ftoc, functions[j], c); + } + ctof.put(c, functions); + return functions; + } + + private void addClassesToFunction(Map functionToClass, int i, Class c) { + Integer iobj = new Integer(i); + if (!functionToClass.containsKey(iobj)) { + functionToClass.put(iobj, new HashSet()); + } + ((Set) (functionToClass.get(iobj))).add(c); + } + + private String getSimpleName(Class c) { + String result = c.getName(); + int lastDot = result.lastIndexOf('.'); + if(lastDot != -1) { + result = result.substring(lastDot+1); + } + return result; + } +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/SampleInfrastructure.java b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/SampleInfrastructure.java new file mode 100644 index 0000000000..aa65cbad6d --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/internal/SampleInfrastructure.java @@ -0,0 +1,330 @@ +/** + * + * 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.samples.sdo.internal; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.HashSet; +import java.util.Set; + +import org.apache.tuscany.samples.sdo.advanced.MedicalScenario; +import org.apache.tuscany.samples.sdo.advanced.MedicalScenarioWithChangeMonitoring; +import org.apache.tuscany.samples.sdo.advanced.ObtainingDataGraphFromXml; +import org.apache.tuscany.samples.sdo.advanced.PrintDataGraph; +import org.apache.tuscany.samples.sdo.basic.AccessDataObjectPropertiesByName; +import org.apache.tuscany.samples.sdo.basic.AccessingTheContentsOfASequence; +import org.apache.tuscany.samples.sdo.basic.CreateCompany; +import org.apache.tuscany.samples.sdo.basic.CreatePurchaseOrder; +import org.apache.tuscany.samples.sdo.basic.ReadPurchaseOrder; +import org.apache.tuscany.samples.sdo.intermediate.AccessDataObjectUsingValidXPath; +import org.apache.tuscany.samples.sdo.intermediate.AccessingDataObjectsViaPropertyIndex; +import org.apache.tuscany.samples.sdo.intermediate.CreateCompanyTuscanyAPI; +import org.apache.tuscany.samples.sdo.intermediate.CreateDataObjectFromXmlString; +import org.apache.tuscany.samples.sdo.intermediate.DynamicCustomerTypeSample; +import org.apache.tuscany.samples.sdo.intermediate.SerializingDeserializingADataObject; + +/** + * One of a pair of base classes for samples. This one contains all the + * infrastructure code that a person wanting to learn SDO would not want to look + * at. + */ +public abstract class SampleInfrastructure { + + protected int sampleComplexityLevel = SAMPLE_LEVEL_BASIC.intValue(); + protected int commentaryLevel = COMMENTARY_FOR_NOVICE.intValue(); + + /** + * Here's the list of sample programs + */ + public static final Class[] sampleClasses = { + CreateCompany.class, + ReadPurchaseOrder.class, + CreatePurchaseOrder.class, + AccessDataObjectPropertiesByName.class, + AccessingTheContentsOfASequence.class, + + AccessDataObjectUsingValidXPath.class, + DynamicCustomerTypeSample.class, + CreateCompanyTuscanyAPI.class, + CreateDataObjectFromXmlString.class, + SerializingDeserializingADataObject.class, + AccessingDataObjectsViaPropertyIndex.class, + + ObtainingDataGraphFromXml.class, + PrintDataGraph.class, + MedicalScenario.class, + MedicalScenarioWithChangeMonitoring.class + + }; + + public static class SDOFacets { + public static final int GET_PROPERTIES_OF_DATAOBJECT_BY_NAME = 1; + public static final int SET_PROPERTIES_OF_DATAOBJECT_BY_NAME = 2; + public static final int CREATE_DATAOBJECTS_BY_NAME = 3; + public static final int GET_SET_PROPERTIES_OF_DATAOBJECT_BY_INDEX = 4; + public static final int GET_SET_PROPERTIES_BY_INSTANCE_PROPERTIES = 5; + public static final int GET_SET_PROPERTIES_OF_DATAOBJECT_BY_XPATH = 6; + public static final int ISMANY_PROPERTIES = 7; + public static final int CONTAINMENT = 8; + public static final int CREATE_TYPES_USING_THE_SDO_API = 9; + public static final int CREATE_TYPES_USING_XML_SCHEMA = 10; + public static final int CREATE_TYPES_USING_THE_TUSCANY_API = 11; + public static final int USING_BUILT_IN_TYPES = 12; + public static final int ACCESSING_VALUES_IN_A_SEQUENCE = 13; + public static final int GENERIC_DATA_GRAPH_TRAVERSAL = 14; + public static final int LOADING_DATA_FROM_XML = 15; + public static final int SAVING_DATA_TO_XML = 16; + public static final int CHANGE_MONITORING_USING_A_DATAGRAPH = 17; + public static final int CHANGE_MONITORING_USING_A_CHANGESUMMARY_PROPERTY_ON_A_DATAOBJECT = 18; + public static final int WRAPPING_DATA_GRAPH_IN_A_DATAGRAPH_INSTANCE = 19; + public static final int OPEN_CONTENT = 20; + public static final int NON_CONTAINMENT = 21; + public static final int CREATE_XML_SCHEMA_FROM_TYPES = 22; + public static final int JAVA_SERIALIZATION_OF_DATA_GRAPH = 23; + public static final int TESTING_FOR_GRAPH_EQUALITY = 24; + + public static final String [] subject_areas = { + "", + "Get Properties of DataObject by name", + "Set Properties of DataObject by name", + "Create DataObjects by name", + "Get/Set Properties of DataObject by index", + "Get/Set Properties by Instance Properties", + "Get/Set Properties of DataObject by Xpath", + "isMany Properties","Containment", + "Create Types using the SDO API", + "Create Types using XML Schema", + "Create Types using the Tuscany API", + "Using Built-in Types", + "Accessing values in a Sequence", + "Generic data graph traversal", + "Loading data from XML", + "Saving data to XML", + "Change Monitoring using a DataGraph", + "Change Monitoring using a ChangeSummary Property on a DataObject", + "Wrapping data graph in a DataGraph instance", + "Open Content","Non-Containment", + "Create XML Schema from Types", + "Java Serialization of data graph", + "Testing for Graph Equality" + }; + } + + + /* + * keep a record of what's been said, so that if alternative terse text is + * offered, the verbose text need not be repeated for repeat actions. + */ + private static Set commentaryHistory = new HashSet(); + + public SampleInfrastructure(Integer commentaryLevel) { + this.commentaryLevel = commentaryLevel.intValue(); + } + + public SampleInfrastructure(Integer commentaryLevel, Integer sampLevel) { + this.commentaryLevel = commentaryLevel.intValue(); + this.sampleComplexityLevel = sampLevel.intValue(); + } + + private static String hrule = "********************************************"; + + /* + * Constants which allow the sample program infrastructure to understand the + * complexity of a sample program. + */ + protected static final Integer SAMPLE_LEVEL_BASIC = new Integer(0); + protected static final Integer SAMPLE_LEVEL_INTERMEDIATE = new Integer(1); + protected static final Integer SAMPLE_LEVEL_ADVANCED = new Integer(2); + + /* + * Constants which can be used to reduce the amount of information output by + * an executing sample program. + */ + protected static final Integer COMMENTARY_FOR_NOVICE = new Integer(0); + protected static final Integer COMMENTARY_FOR_INTERMEDIATE = new Integer(1); + protected static final Integer COMMENTARY_FOR_ADVANCED = new Integer(2); + protected static final Integer COMMENTARY_ALWAYS = new Integer(3); + + protected static final String[] userLevels = { "novice", "intermediate", + "advanced" }; + + /* + * Various constants that reference resources etc shared between the samples + */ + public static final String COMPANY_DATAOBJECT_XML = "companyGenerated.xml"; + public static final String COMPANY_DATAGRAPH_XML = "companyDataGraphGenerated.xml"; + public static final String COMPANY_XSD = "company.xsd"; + public static final String COMPANY_NAMESPACE = "company.xsd"; + public static final String PO_NAMESPACE = "http://www.example.com/PO"; + public static final String PO_XML_GENERATED = "temporaryPoGenerated.xml"; + public static final String PO_XML_RESOURCE = "po.xml"; + public static final String PO_XSD_RESOURCE = "po.xsd"; + + + public void banner(char borderChar, String text) { + if (text == null || text.length() == 0) { + System.out.println(hrule); + return; + } + String[] lines = text.split("\n"); + int maxlinelen = 0; + + for (int i = 0; i < lines.length; i++) { + maxlinelen = lines[i].length() > maxlinelen ? lines[i].length() + : maxlinelen; + } + + StringBuffer buf = new StringBuffer(); + for (int p = 0; p < maxlinelen + 4; p++) { + buf.append(borderChar); + } + buf.append("\n"); + for (int l = 0; l < lines.length; l++) { + buf.append(borderChar).append(" "); + buf.append(lines[l]); + for (int rem = lines[l].length() + 2; rem < maxlinelen + 3; rem++) + buf.append(" "); + buf.append(borderChar).append("\n"); + } + for (int p = 0; p < maxlinelen + 4; p++) { + buf.append(borderChar); + } + buf.append("\n"); + System.out.println(buf.toString()); + } + + public void banner(String text) { + banner('-', text); + } + + protected void commentary(String text, String repeatText) { + commentary(new Integer(sampleComplexityLevel), text, repeatText); + + } + + protected void commentary(Integer commentLevel, String text, String repeatText) { + + if (commentLevel.intValue() < commentaryLevel) + return; + + if (repeatText != null) { + boolean alreadySeen = commentaryHistory.contains(text); + if (alreadySeen) { + commentary(commentLevel, repeatText); + } else { + commentary(commentLevel, text); + commentaryHistory.add(text); + } + } else { + commentary(commentLevel, text); + } + + } + + protected void commentary(Integer commentLevel, String text) { + if (commentLevel.intValue() >= commentaryLevel) { + banner(text); + } + } + + /* + * convenience method to allow commentary level to default to that of the + * sample's complexity + */ + protected void commentary(String text) { + commentary(new Integer(getSampleComplexityLevel()), text); + } + + public void somethingUnexpectedHasHappened(Exception e) { + banner( + '!', + "Something unexpected has gone wrong with the execution of this sample program\n" + + "Please take a look at the exception and see if its something wrong with your environment\n" + + "If you can't figure it out please send a note to the tuscany-user@ws.apache.org mailing list\n" + + "including the text of the exception and any other useful information, thanks"); + + e.printStackTrace(); + } + + /** + * Utility method to obtain information from the user about whether or not + * they would like to use a DataGraph or simply use a DataObject + * + * @return whether or not a DataGraph should be used + * @throws Exception + */ + protected boolean yesOrNoFromUser(String question) throws Exception { + + System.out.print(question + " {y,n} :"); + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String answer = in.readLine(); + while ((!answer.equalsIgnoreCase("n")) && (!answer.equalsIgnoreCase("y"))) { + + System.out.println(); + System.out.print("Sorry, please enter 'y' or 'n':"); + answer = in.readLine(); + } + System.out.println(); + + if (answer.equalsIgnoreCase("y")) { + return true; + } else { + return false; + } + } + + public void run() { + + commentary( + COMMENTARY_FOR_INTERMEDIATE, + "Running with commentary level for a " + + userLevels[commentaryLevel] + + " user\n" + + "Edit the sample program's constructor argument to one from\n" + + "COMMENTARY_FOR_NOVICE\nCOMMENTARY_FOR_INTERMEDIATE or\nCOMMENTARY_FOR_ADVANCED\n" + + "in order to alter the level of commentary you are seeing", ""); + + commentary(COMMENTARY_ALWAYS, " Tuscany SDO Java Sample " + + this.getClass().getName() + " \n" + + " This sample is aimed at a " + userLevels[sampleComplexityLevel] + + " user"); + + try { + runSample(); + } catch (Exception e) { + somethingUnexpectedHasHappened(e); + } finally { + commentary(COMMENTARY_ALWAYS, " End of sample " + + this.getClass().getName() + " "); + } + } + + public abstract void runSample() throws Exception; + + public int getSampleComplexityLevel() { + return sampleComplexityLevel; + } + + public void setSampleComplexityLevel(Integer sampleComplexityLevel) { + this.sampleComplexityLevel = sampleComplexityLevel.intValue(); + } + +} diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/overview.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/overview.html new file mode 100644 index 0000000000..b4fc183800 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/overview.html @@ -0,0 +1,127 @@ + + + + SDO Sample Overview + + +

Tuscany Service Data Object (SDO) Sample Programs

Overview

+Apache Tuscany SDO samples +are provided here to help users learn SDO. +The index by SDO +subject areas lists the different samples available +to you. These samples provide a starting point for learning SDO and can be +extended and enhanced to experiment with other available SDO features. +Please help us enhance these samples by sending your feedback to Tuscany +mailing list or join us and contribute to this +project. +

+

+These samples are coded to the SDO 2.1 API defined +here +

+

+These samples provide a place to begin learning and experimenting with the SDO +API and programming model. Developers are encouraged to extend and experiment +with the current set of samples. If a sample is unclear, is missing +documentation, or does not cover a desired area, please send feedback to the +Tuscany mailing lists, or better still send us a patch or join the Tuscany team +and contribute back to the project. +

+

Running the Samples from a Binary Distribution of Apache Tuscany

+

The +SDO samples have been written to be useful in learning SDO, even without +reference to the sample source code. The samples output commentary as they +execute and key lines of source code are output too. One of the sample programs +(ExecuteSamples) executes all the other samples in sequence. The binary +distribution includes the sample source code too, so that you can investigate +further if you wish. +

+

+The binary distribution of Tuscany contains a pair of scripts to execute the +ExecuteSamples program (runsamples.bat and runsamples.sh). To execute the +samples first locate the appropriate script for your environment in the samples +directory of the binary distribution and set the value of the BINARY_BASE +variable to be the directory in your file system that contains the lib and +samples directories. Then run the script and take a look at the output. After +that, copy and modify the script to suit your own purposes in running the other +samples. +

+

Running the Samples from a Source Distribution of Apache Tuscany

+

+The +samples depend on the following libraries +

+
    +
  • + The samples themselves, the SDO 2.1 API and the Tuscany SDO + Implementation +
      +
    • + sample-sdo-{tuscany-version}.jar - SDO API +
    • +
    • + sdo-api-r2.1-{tuscany-version}.jar - SDO API +
    • +
    • + tuscany-sdo-lib-{tuscany-version}.jar - Tuscany APIs and support + function +
    • +
    • + tuscany-sdo-impl-{tuscany-version}.jar - Tuscany SDO + implementation +
    • +
    +
  • +
  • + EMF dependencies. +
      +
    • + common-{version}.jar - some common framework utility and base classes +
    • +
    • + ecore-{version}.jar - the EMF core runtime implementation classes (the Ecore + metamodel) +
    • +
    • + ecore-change-{version}.jar - the EMF change recorder and framework +
    • +
    • + ecore-xmi-{version}.jar - EMF's default XML (and XMI) serializer and loader +
    • +
    • + xsd-{version}.jar - the XML Schema model +
    • +
    +
  • +
  • And the StAX API
  • +
      +
    • stax-api-1.0.1.jar
    • +
    +
+

+If you are running these samples as a result of building Tuscany SDO for Java +from a Tuscany source distribution using maven then these dependencies will be +resolved by having followed the instructions in the BUILDING file at the root of +the source distribution. +

+ + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/package.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/package.html new file mode 100644 index 0000000000..c1335e6e5b --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/package.html @@ -0,0 +1,33 @@ + + + + package information + + +Provides common constants and a command line java interface for executing samples. +

Related Documentation

+For overviews, tutorials, examples, guides, and tool documentation, please see the + SDO Java Overview + +section of the Tuscany website. + + + \ No newline at end of file diff --git a/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/sampleProgramContents.html b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/sampleProgramContents.html new file mode 100644 index 0000000000..cc646ed3a9 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/java/org/apache/tuscany/samples/sdo/sampleProgramContents.html @@ -0,0 +1,243 @@ + + + +SDO Samples +

SDO Samples

+

+The samples provided in the Tuscany SDO distribution cover many areas of +the SDO API. Here we provide two indexes into the samples. The first lists +each sample in sequence and details the central theme(s) of the sample. +It also mentions if the sample significantly demonstrates other areas in passing. +The second index lists all the themes that are covered by these samples, and +indicates which of the samples has that subject area as a central theme or as +demonstrates the subject area significant as an incidental part of the sample.

Index by Sample Program Name

+

Sample Program CreateCompany

+Core function:
+Set Properties of DataObject by name
+

Sample Program ReadPurchaseOrder

+Core function:
+Loading data from XML
+Saving data to XML
+
Also demonstrates:
+Get Properties of DataObject by name
+

Sample Program CreatePurchaseOrder

+Core function:
+Loading data from XML
+Saving data to XML
+

Sample Program AccessDataObjectPropertiesByName

+Core function:
+Get Properties of DataObject by name
+

Sample Program AccessingTheContentsOfASequence

+Core function:
+Accessing values in a Sequence
+

Sample Program AccessDataObjectUsingValidXPath

+Core function:
+Get/Set Properties of DataObject by Xpath
+

Sample Program DynamicCustomerTypeSample

+Core function:
+Create Types using the SDO API
+
Also demonstrates:
+Set Properties of DataObject by name
+Using Built-in Types
+Saving data to XML
+

Sample Program CreateCompanyTuscanyAPI

+Core function:
+Set Properties of DataObject by name
+

Sample Program CreateDataObjectFromXmlString

+Core function:
+Using Built-in Types
+Loading data from XML
+

Sample Program SerializingDeserializingADataObject

+Core function:
+Java Serialization of data graph
+
Also demonstrates:
+Testing for Graph Equality
+

Sample Program AccessingDataObjectsViaPropertyIndex

+Core function:
+Get/Set Properties of DataObject by index
+

Sample Program ObtainingDataGraphFromXml

+Core function:
+Wrapping data graph in a DataGraph instance
+
Also demonstrates:
+Using Built-in Types
+

Sample Program PrintDataGraph

+Core function:
+Generic data graph traversal
+
Also demonstrates:
+Get/Set Properties by Instance Properties
+isMany Properties
+Create Types using the SDO API
+Accessing values in a Sequence
+Non-Containment
+

Sample Program MedicalScenario

+Core function:
+Containment
+Create Types using the SDO API
+Create Types using XML Schema
+Open Content
+Non-Containment
+
Also demonstrates:
+Create DataObjects by name
+isMany Properties
+Generic data graph traversal
+Saving data to XML
+

Sample Program MedicalScenarioWithChangeMonitoring

+Core function:
+Containment
+Create Types using the SDO API
+Create Types using XML Schema
+Open Content
+Non-Containment
+Change Monitoring using a ChangeSummary Property on a DataObject
+
Also demonstrates:
+Create DataObjects by name
+isMany Properties
+Generic data graph traversal
+Saving data to XML
+

Index by function

+ +

+
+

Get Properties of DataObject by name

+Samples which demonstrate this as their core function
+AccessDataObjectPropertiesByName
+Samples which demonstrate this in addition to their core function
+ReadPurchaseOrder
+
+

Set Properties of DataObject by name

+Samples which demonstrate this as their core function
+CreateCompany
+CreateCompanyTuscanyAPI
+Samples which demonstrate this in addition to their core function
+DynamicCustomerTypeSample
+
+

Create DataObjects by name

+Samples which demonstrate this in addition to their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Get/Set Properties of DataObject by index

+Samples which demonstrate this as their core function
+AccessingDataObjectsViaPropertyIndex
+
+

Get/Set Properties by Instance Properties

+Samples which demonstrate this in addition to their core function
+PrintDataGraph
+
+

Get/Set Properties of DataObject by Xpath

+Samples which demonstrate this as their core function
+AccessDataObjectUsingValidXPath
+
+

isMany Properties

+Samples which demonstrate this in addition to their core function
+PrintDataGraph
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Containment

+Samples which demonstrate this as their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Create Types using the SDO API

+Samples which demonstrate this as their core function
+MedicalScenario
+DynamicCustomerTypeSample
+MedicalScenarioWithChangeMonitoring
+Samples which demonstrate this in addition to their core function
+PrintDataGraph
+
+

Create Types using XML Schema

+Samples which demonstrate this as their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Create Types using the Tuscany API

+
+

Using Built-in Types

+Samples which demonstrate this as their core function
+CreateDataObjectFromXmlString
+Samples which demonstrate this in addition to their core function
+ObtainingDataGraphFromXml
+DynamicCustomerTypeSample
+
+

Accessing values in a Sequence

+Samples which demonstrate this as their core function
+AccessingTheContentsOfASequence
+Samples which demonstrate this in addition to their core function
+PrintDataGraph
+
+

Generic data graph traversal

+Samples which demonstrate this as their core function
+PrintDataGraph
+Samples which demonstrate this in addition to their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Loading data from XML

+Samples which demonstrate this as their core function
+CreateDataObjectFromXmlString
+CreatePurchaseOrder
+ReadPurchaseOrder
+
+

Saving data to XML

+Samples which demonstrate this as their core function
+CreatePurchaseOrder
+ReadPurchaseOrder
+Samples which demonstrate this in addition to their core function
+MedicalScenario
+DynamicCustomerTypeSample
+MedicalScenarioWithChangeMonitoring
+
+

Change Monitoring using a DataGraph

+
+

Change Monitoring using a ChangeSummary Property on a DataObject

+Samples which demonstrate this as their core function
+MedicalScenarioWithChangeMonitoring
+
+

Wrapping data graph in a DataGraph instance

+Samples which demonstrate this as their core function
+ObtainingDataGraphFromXml
+
+

Open Content

+Samples which demonstrate this as their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+
+

Non-Containment

+Samples which demonstrate this as their core function
+MedicalScenario
+MedicalScenarioWithChangeMonitoring
+Samples which demonstrate this in addition to their core function
+PrintDataGraph
+
+

Create XML Schema from Types

+
+

Java Serialization of data graph

+Samples which demonstrate this as their core function
+SerializingDeserializingADataObject
+
+

Testing for Graph Equality

+Samples which demonstrate this in addition to their core function
+SerializingDeserializingADataObject
+ + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/LICENSE.txt b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/LICENSE.txt new file mode 100644 index 0000000000..9a90d375bc --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/LICENSE.txt @@ -0,0 +1,207 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/NOTICE b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/NOTICE new file mode 100644 index 0000000000..3349bf7c89 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/NOTICE @@ -0,0 +1,8 @@ +Apache Tuscany +Copyright (c) 2005 - 2008 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Please see the LICENSE file present in the META-INF directory of this archive. + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/README.txt b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/README.txt new file mode 100644 index 0000000000..a3c36b7705 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/META-INF/README.txt @@ -0,0 +1,23 @@ +Apache Tuscany 1.1-incubating build (February 2008) +=============================================== + +http://incubator.apache.org/tuscany/ + +Support +------- + +Any problem with this release can be reported to the Tuscany mailing list +or in the JIRA issue tracker. + +Mailing list subscription: + tuscany-dev-subscribe@ws.apache.org + +Jira: + http://issues.apache.org/jira/browse/Tuscany + + +Thank you for using Tuscany! + + +The Tuscany Team. + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest.xsd new file mode 100644 index 0000000000..34ae528148 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest.xsd @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest_CS.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest_CS.xsd new file mode 100644 index 0000000000..668c023bc6 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/MedicalTest_CS.xsd @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/People.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/People.xsd new file mode 100644 index 0000000000..b9e59701ae --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/People.xsd @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/company.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/company.xsd new file mode 100644 index 0000000000..c699f89e31 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/company.xsd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/companyCompleteDataGraph.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyCompleteDataGraph.xml new file mode 100644 index 0000000000..f636f2131e --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyCompleteDataGraph.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraph.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraph.xml new file mode 100644 index 0000000000..7114b98fdf --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraph.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraphGenerated.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraphGenerated.xml new file mode 100644 index 0000000000..a99e71bbaa --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyDataGraphGenerated.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/companyGenerated.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyGenerated.xml new file mode 100644 index 0000000000..0108e67a4b --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/companyGenerated.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/doc-files/cmdPrompt.GIF b/sdo-java/branches/emf-2.5/sample/src/main/resources/doc-files/cmdPrompt.GIF new file mode 100644 index 0000000000..ad2fbbf46f Binary files /dev/null and b/sdo-java/branches/emf-2.5/sample/src/main/resources/doc-files/cmdPrompt.GIF differ diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xml new file mode 100644 index 0000000000..85e0bd42b8 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xml @@ -0,0 +1,21 @@ + + + +August 1, 2003Mutual of Omaha Wild Kingdom, USA DearCasyCrocodilePlease buy more shark repellent. Your premium is past due. \ No newline at end of file diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xsd new file mode 100644 index 0000000000..e6e077ff75 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/letter.xsd @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xml new file mode 100644 index 0000000000..e44cb07720 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xml @@ -0,0 +1,57 @@ + + + + + + Robbie Minshall + 123 Maple Street + Mill Valley + CA + 90952 + + + Robert Smith + 8 Oak Avenue + Mill Valley + PA + 95819 + + Hurry, my lawn is going wild! + + + Lawnmower + 148.95 + 1 + Confirm this is electric + + + Baby Monitor + 39.98 + 1 + 1999-05-21 + + + GrassSeed + 50 + 100 + For Shade + + + \ No newline at end of file diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xsd new file mode 100644 index 0000000000..8929775d49 --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/po.xsd @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xml b/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xml new file mode 100644 index 0000000000..acdcbc854d --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xml @@ -0,0 +1,43 @@ + + + + + p 0 + + + p 1 + + + p 2 + + + p 3 + + + t 0 + p0 + p3 + + + t 1 + p1 + p2 + + diff --git a/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xsd b/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xsd new file mode 100644 index 0000000000..a3096f108a --- /dev/null +++ b/sdo-java/branches/emf-2.5/sample/src/main/resources/sports.xsd @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3