/** * * 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.specExampleSection; import commonj.sdo.helper.XMLHelper; import commonj.sdo.helper.XSDHelper; import commonj.sdo.DataObject; import commonj.sdo.Sequence; import commonj.sdo.Property; /** * Demonstrates accessing the sequence from a DataObject containing mixed content. * * The following sample is from the Apache Tuscany project. It was written to help users * understand and experiement with SDO. It is based upon example code contained * within, and is meant for use with, and reference to the SDO Specification. In general this sample attempts to use the * code and comments contained within the specification, exceptions to this are noted * in comments.
* * Specifically the following sample is based upon the 'Accessing the contents of a Sequence' example from the Examples section of the SDO specification.
*
* The following code uses the Sequence interface to analyze the contents of a DataObject that conforms to teh Letter model defined in * {@link #LETTER_XSD}. This code first goes through the Sequence looking for unformatted text entrires and prints them out. Then the code checks to * verify that the contents of teh "lastName" property of the DataObject matches the contents of the same property of the Sequence.
*
* This sample reads an xml file (@link #LETTER_XML} representing a DataObject of a letter. In order to create a DataObject or DataGraph this sample * relies upon XMLHelper class which is an example of a XML DAS. The code shown here would work just as well against an equivalent DataObject that was * provided by any DAS.
* * The XSD for {@link #LETTER_XSD} defines the FormLetter complex type as mixed. Mixed content and sequences are often used for semi structured business data. *

* Usage:
* This sample can easily be run from within Eclipse as a Java Application if tuscany or * the sample-sdo project is imported into Eclipse as an existing project. *

* If executing as a standalone application please do the following: *
* * * @author Robbie Minshall */ public class AccessingTheContentsOfASequence { /** * 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) { System.out.println("***************************************"); System.out.println("SDO Sample AccessingTheContentsOfASequence"); System.out.println("***************************************"); System.out.println("Demonstrates accessing the sequence from a DataObject containing mixed content."); System.out.println("***************************************"); try { // define model System.out.println("Defining Types using XSD"); XSDHelper.INSTANCE.define(ClassLoader.getSystemResourceAsStream(LETTER_XSD), null); // define letter data object System.out.println("Loading Letter DataObject from XML"); DataObject letter = XMLHelper.INSTANCE.load(ClassLoader.getSystemResourceAsStream(LETTER_XML)).getRootObject(); // print letter sequence System.out.println("Printing sequence for " + letter); System.out.println(XMLHelper.INSTANCE.save(letter, "letter.xsd", "letter")); printSequence(letter); } catch (Exception e) { System.out.println("Sorry there was an error encountered " + e.toString()); e.printStackTrace(); } System.out.println("GoodBye"); } /** * Uses the Sequence interface to analyze the contents of a DataObject that conforms to teh Letter model defined in * {@link #LETTER_XSD}. This code first goes through the Sequence looking for unformatted text entrires and prints them out. Then the code checks * to verify that the contents of the "lastName" property of the DataObject matches the contents of the same property of the Sequence.
* * @param letter. Letter DataObject conforming to {@link #LETTER_XSD} */ public static void printSequence(DataObject letter) { // Access the Sequence of the FormLetter System.out.println("The type is for letter dataObject is mixed " + XSDHelper.INSTANCE.isMixed(letter.getType())); Sequence letterSequence = letter.getSequence(); // Print out all the settings that contain unstructured text System.out.println("Unstructured text:"); for (int i = 0; i < letterSequence.size(); i++) { /* * Please note that the following line is a correction to the 2.0 specification which incorrectly calls: * * String propertyName = ((Property) letterSequence.getProperty(i)).getName(); * * According to the SDO API sequence.getProperty will return null if the content is mixed, in this case * we want to print it out as unstructured text */ Property prop = letterSequence.getProperty(i); if (prop == null) { String text = (String) letterSequence.getValue(i); System.out.println("\t(" + text + ")"); } } /* * Please note that the following line is a correction to the 2.0 Specification which incorrectly uses letterDataObject variable rather than * simply letter */ // Verify that the lastName property of the DataObject has the same // value as the lastName property for the Sequence. String dataObjectLastName = letter.getString("lastName"); for (int i = 0; i < letterSequence.size(); i++) { /* * The following line has been corrected from the 2.0 specification * According to the SDO API sequence.getProperty will return null if the content is mixed. * We want to check that the content is not mixed, and then check that it it is the property which * we are looking for */ Property property = letterSequence.getProperty(i); if ( (property != null) && ("lastName".equals(property.getName()))) { String sequenceLastName = (String) letterSequence.getValue(i); if (dataObjectLastName == sequenceLastName) System.out.println("Last Name property matches"); break; } } } }