Parsing Schema with Java
The Membrane SOA Model makes it easy to parse a schema. Listing 1 is an example of parsing a schema with almost all the information of it. Over and above that, you can get much more details using many other methods and features of SOA Model. For more information see the java api doc or discuss in SOA Model Forum.
package samples.schema; import com.predic8.schema.Appinfo; import com.predic8.schema.Attribute; import com.predic8.schema.ComplexContent; import com.predic8.schema.ComplexType; import com.predic8.schema.Derivation; import com.predic8.schema.Documentation; import com.predic8.schema.Element; import com.predic8.schema.Import; import com.predic8.schema.Include; import com.predic8.schema.ModelGroup; import com.predic8.schema.Schema; import com.predic8.schema.SchemaComponent; import com.predic8.schema.SchemaParser; import com.predic8.schema.SimpleType; public class FullSchemaParser { public static void main(String[] args) { SchemaParser parser = new SchemaParser(); Schema schema = parser.parse("samples/xsd/human-resources.xsd"); out("-------------- Schema Information --------------"); out(" Schema TargetNamespace: " + schema.getTargetNamespace()); out(" AttributeFormDefault: " + schema.getAttributeFormDefault()); out(" ElementFormDefault: " + schema.getElementFormDefault()); out(""); if (schema.getImports().size() > 0) { out(" Schema Imports: "); for (Import imp : schema.getImports()) { out(" Import Namespace: " + imp.getNamespace()); out(" Import Location: " + imp.getSchemaLocation()); } out(""); } if (schema.getIncludes().size() > 0) { out(" Schema Includes: "); for (Include inc : schema.getIncludes()) { out(" Include Location: " + inc.getSchemaLocation()); } out(""); } out(" Schema Elements: "); for (Element e : schema.getAllElements()) { out(" Element Name: " + e.getName()); if (e.getType() != null) { /* * schema.getType() delivers a TypeDefinition (SimpleType orComplexType) * object. */ out(" Element Type Name: " + schema.getType(e.getType()).getName()); out(" Element minoccurs: " + e.getMinOccurs()); out(" Element maxoccurs: " + e.getMaxOccurs()); if (e.getAnnotation() != null) annotationOut(e); } } out(""); out(" Schema ComplexTypes: "); for (ComplexType ct : schema.getComplexTypes()) { out(" ComplexType Name: " + ct.getName()); if (ct.getAnnotation() != null) annotationOut(ct); if (ct.getAttributes().size() > 0) { out(" ComplexType Attributes: "); /* * If available, attributeGroup could be read as same as attribute in * the following. */ for (Attribute attr : ct.getAttributes()) { out(" Attribute Name: " + attr.getName()); out(" Attribute Form: " + attr.getForm()); out(" Attribute ID: " + attr.getId()); out(" Attribute Use: " + attr.getUse()); out(" Attribute FixedValue: " + attr.getFixedValue()); out(" Attribute DefaultValue: " + attr.getDefaultValue()); } } /* * ct.getModel() delivers the child element used in complexType. In case * of 'sequence' you can also use the getSequence() method. */ out(" ComplexType Model: " + ct.getModel().getClass().getSimpleName()); if (ct.getModel() instanceof ModelGroup) { out(" Model Particles: "); for (SchemaComponent sc : ((ModelGroup) ct.getModel()).getParticles()) { out(" Particle Kind: " + sc.getClass().getSimpleName()); out(" Particle Name: " + sc.getName() + "\n"); } } if (ct.getModel() instanceof ComplexContent) { Derivation der = ((ComplexContent) ct.getModel()).getDerivation(); out(" ComplexConten Derivation: " + der.getClass().getSimpleName()); out(" Derivation Base: " + der.getBase()); } if (ct.getAbstractAttr() != null) out(" ComplexType AbstractAttribute: " + ct.getAbstractAttr()); if (ct.getAnyAttribute() != null) out(" ComplexType AnyAttribute: " + ct.getAnyAttribute()); out(""); } if (schema.getSimpleTypes().size() > 0) { out(" Schema SimpleTypes: "); for (SimpleType st : schema.getSimpleTypes()) { out(" SimpleType Name: " + st.getName()); out(" SimpleType Restriction: " + st.getRestriction()); out(" SimpleType Union: " + st.getUnion()); out(" SimpleType List: " + st.getList()); } } } private static void annotationOut(SchemaComponent sc) { if (sc.getAnnotation().getAppinfos().size() > 0) { System.out .print(" Annotation (appinfos) available with the content: "); for (Appinfo appinfo : sc.getAnnotation().getAppinfos()) { out(appinfo.getContent()); } } else { System.out .print(" Annotation (documentation) available with the content: "); for (Documentation doc : sc.getAnnotation().getDocumentations()) { out(doc.getContent()); } } } private static void out(String str) { System.out.println(str); } }
Listing 1: FullSchemaParser.java
In listing 2 you can see the output.
-------------- Schema Information -------------- Schema TargetNamespace: http://predic8.com/human-resources/ AttributeFormDefault: unqualified ElementFormDefault: unqualified Schema Imports: Import Namespace: http://predic8.com/common-types/ Import Location: common-types.xsd Schema Elements: Schema ComplexTypes: ComplexType Name: PersonType ComplexType Model: Sequence Model Particles: Particle Kind: Element Particle Name: id Particle Kind: Element Particle Name: firstName Particle Kind: Element Particle Name: lastName Particle Kind: Element Particle Name: address ComplexType Name: AddressType ComplexType Model: Sequence Model Particles: Particle Kind: Element Particle Name: street Particle Kind: Element Particle Name: city Particle Kind: Element Particle Name: postCode Particle Kind: Element Particle Name: country ComplexType Name: EmployeeType ComplexType Model: ComplexContent ComplexConten Derivation: Extension Derivation Base: {http://predic8.com/human-resources/}PersonType ComplexType Name: EmployeeListType ComplexType Model: Sequence Model Particles: Particle Kind: Element Particle Name: employee
Listing 2: The List of the operation in the WSDL Document