You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by de...@apache.org on 2006/12/22 09:09:30 UTC
svn commit: r489578 [2/3] - in /webservices/axis2/branches/java/1_1/modules:
adb-codegen/src/org/apache/axis2/schema/
kernel/src/org/apache/axis2/description/
kernel/src/org/apache/axis2/transport/http/
Modified: webservices/axis2/branches/java/1_1/modules/adb-codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/1_1/modules/adb-codegen/src/org/apache/axis2/schema/SchemaCompiler.java?view=diff&rev=489578&r1=489577&r2=489578
==============================================================================
--- webservices/axis2/branches/java/1_1/modules/adb-codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/branches/java/1_1/modules/adb-codegen/src/org/apache/axis2/schema/SchemaCompiler.java Fri Dec 22 00:09:29 2006
@@ -1,1845 +1,1801 @@
-package org.apache.axis2.schema;
-
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMElement;
-import org.apache.axis2.namespace.Constants;
-import org.apache.axis2.schema.i18n.SchemaCompilerMessages;
-import org.apache.axis2.schema.util.SchemaPropertyLoader;
-import org.apache.axis2.schema.writer.BeanWriter;
-import org.apache.axis2.util.URLProcessor;
-import org.apache.axis2.util.SchemaUtil;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.ws.commons.schema.XmlSchema;
-import org.apache.ws.commons.schema.XmlSchemaAll;
-import org.apache.ws.commons.schema.XmlSchemaAny;
-import org.apache.ws.commons.schema.XmlSchemaAnyAttribute;
-import org.apache.ws.commons.schema.XmlSchemaAttribute;
-import org.apache.ws.commons.schema.XmlSchemaChoice;
-import org.apache.ws.commons.schema.XmlSchemaComplexContent;
-import org.apache.ws.commons.schema.XmlSchemaComplexContentExtension;
-import org.apache.ws.commons.schema.XmlSchemaComplexContentRestriction;
-import org.apache.ws.commons.schema.XmlSchemaComplexType;
-import org.apache.ws.commons.schema.XmlSchemaContent;
-import org.apache.ws.commons.schema.XmlSchemaContentModel;
-import org.apache.ws.commons.schema.XmlSchemaElement;
-import org.apache.ws.commons.schema.XmlSchemaEnumerationFacet;
-import org.apache.ws.commons.schema.XmlSchemaImport;
-import org.apache.ws.commons.schema.XmlSchemaInclude;
-import org.apache.ws.commons.schema.XmlSchemaLengthFacet;
-import org.apache.ws.commons.schema.XmlSchemaMaxExclusiveFacet;
-import org.apache.ws.commons.schema.XmlSchemaMaxInclusiveFacet;
-import org.apache.ws.commons.schema.XmlSchemaMaxLengthFacet;
-import org.apache.ws.commons.schema.XmlSchemaMinExclusiveFacet;
-import org.apache.ws.commons.schema.XmlSchemaMinInclusiveFacet;
-import org.apache.ws.commons.schema.XmlSchemaMinLengthFacet;
-import org.apache.ws.commons.schema.XmlSchemaObject;
-import org.apache.ws.commons.schema.XmlSchemaObjectCollection;
-import org.apache.ws.commons.schema.XmlSchemaObjectTable;
-import org.apache.ws.commons.schema.XmlSchemaParticle;
-import org.apache.ws.commons.schema.XmlSchemaPatternFacet;
-import org.apache.ws.commons.schema.XmlSchemaSequence;
-import org.apache.ws.commons.schema.XmlSchemaSimpleContent;
-import org.apache.ws.commons.schema.XmlSchemaSimpleContentExtension;
-import org.apache.ws.commons.schema.XmlSchemaSimpleContentRestriction;
-import org.apache.ws.commons.schema.XmlSchemaSimpleType;
-import org.apache.ws.commons.schema.XmlSchemaSimpleTypeContent;
-import org.apache.ws.commons.schema.XmlSchemaSimpleTypeList;
-import org.apache.ws.commons.schema.XmlSchemaSimpleTypeRestriction;
-import org.apache.ws.commons.schema.XmlSchemaSimpleTypeUnion;
-import org.apache.ws.commons.schema.XmlSchemaType;
-
-import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-/*
- * Copyright 2004,2005 The Apache Software Foundation.
- *
- * 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.
- */
-
-/**
- * Schema compiler for ADB. Based on WS-Commons schema object model.
- */
-public class SchemaCompiler {
-
- private static final Log log = LogFactory.getLog(SchemaCompiler .class);
-
- private CompilerOptions options;
- private HashMap processedTypemap;
-
- //the list of processedElements for the outer elements
- private HashMap processedElementMap;
-
- private HashMap processedAnonymousComplexTypesMap;
-
- //we need this map to keep the referenced elements. these elements need to be kept seperate
- //to avoid conflicts
- private HashMap processedElementRefMap;
- private HashMap simpleTypesMap;
- private HashMap changedTypeMap;
-
- // this map is necessary to retain the metainformation of types. The reason why these
- // meta info 'bags' would be useful later is to cater for the extensions and restrictions
- // of types
- private HashMap processedTypeMetaInfoMap;
-
- //
- private ArrayList processedElementList;
-
- //a list of nillable elements - used to generate code
- //for nillable elements
- private List nillableElementList;
- // writee reference
- private BeanWriter writer = null;
- private Map baseSchemaTypeMap = null;
-
- //a map for keeping the already loaded schemas
- //the key is the targetnamespace and the value is the schema object
- private Map loadedSchemaMap = new HashMap();
-
- // A map keeping the available schemas
- //the key is the targetnamespace and the value is the schema object
- //this map will be populated when multiple schemas
- //are fed to the schema compiler!
- private Map availableSchemaMap = new HashMap();
-
- private Map loadedSourceURI = new HashMap();
-
- // a list of externally identified QNames to be processed. This becomes
- // useful when only a list of external elements need to be processed
-
- public static final String ANY_ELEMENT_FIELD_NAME = "extraElement";
- public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
-
- public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
- public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.axiom.om.OMElement[]";
-
- public static final String DEFAULT_ATTRIB_CLASS_NAME = OMAttribute.class.getName();
- public static final String DEFAULT_ATTRIB_ARRAY_CLASS_NAME = "org.apache.axiom.om.OMAttribute[]";
-
-
- private static int typeCounter = 0;
-
-
-
-
- /**
- * @return the processes element map
- * includes the Qname of the element as the key and a
- * String representing the fully qualified class name
- */
- public HashMap getProcessedElementMap() {
- return processedElementMap;
- }
-
-
- /**
- * @return a map of Qname vs models. A model can be anything,
- * ranging from a DOM document to a stream. This is taken from the
- * writer and the schema compiler has no control over it
- */
- public Map getProcessedModelMap() {
- return writer.getModelMap();
- }
-
- /**
- * Constructor - Accepts a options bean
- *
- * @param options
- */
- public SchemaCompiler(CompilerOptions options) throws SchemaCompilationException {
-
- if (options == null) {
- //create an empty options object
- this.options = new CompilerOptions();
- } else {
- this.options = options;
- }
-
- //instantiate the maps
- processedTypemap = new HashMap();
- processedElementMap = new HashMap();
- simpleTypesMap = new HashMap();
- processedElementList = new ArrayList();
- processedAnonymousComplexTypesMap = new HashMap();
- changedTypeMap = new HashMap();
- processedTypeMetaInfoMap = new HashMap();
- processedElementRefMap = new HashMap();
- nillableElementList = new ArrayList();
-
- //load the writer and initiliaze the base types
- writer = SchemaPropertyLoader.getBeanWriterInstance();
- writer.init(this.options);
-
- //load the base types
- baseSchemaTypeMap = SchemaPropertyLoader.getTypeMapperInstance().getTypeMap();
-
-
- }
-
- /**
- * Compile a list of schemas
- * This actually calls the compile (XmlSchema s) method repeatedly
- *
- * @param schemalist
- * @throws SchemaCompilationException
- * @see #compile(org.apache.ws.commons.schema.XmlSchema)
- */
- public void compile(List schemalist) throws SchemaCompilationException {
- try {
-
- if (schemalist.isEmpty()){
- return;
- }
-
- //clear the loaded and available maps
- loadedSchemaMap.clear();
- availableSchemaMap.clear();
-
- XmlSchema schema;
- // first round - populate the avaialble map
- for (int i = 0; i < schemalist.size(); i++) {
- schema = (XmlSchema) schemalist.get(i);
- availableSchemaMap.put(
- schema.getTargetNamespace(),
- schema
- );
- }
-
- //set a mapper package if not avaialable
- if (writer.getExtensionMapperPackageName()==null){
- String nsp = null;
- //get the first schema from the list and take that namespace as the
- //mapper namespace
- for (int i = 0; nsp == null && i < schemalist.size(); i++) {
- nsp = ((XmlSchema) schemalist.get(i)).getTargetNamespace();
- if (nsp != null)
- break;
- XmlSchema[] schemas = SchemaUtil.getAllSchemas((XmlSchema) schemalist.get(i));
- for (int j = 0; schemas != null && j < schemas.length; j++) {
- nsp = schemas[j].getTargetNamespace();
- if (nsp != null)
- break;
- }
- }
- if(nsp == null) {
- nsp = URLProcessor.DEFAULT_PACKAGE;
- }
- // if this name space exists in the ns2p list then we use it.
- if ((options.getNs2PackageMap() != null)
- && (options.getNs2PackageMap().containsKey(nsp))){
- writer.registerExtensionMapperPackageName((String) options.getNs2PackageMap().get(nsp));
- } else {
- writer.registerExtensionMapperPackageName(URLProcessor.makePackageName(nsp));
- }
- }
- // second round - call the schema compiler one by one
- for (int i = 0; i < schemalist.size(); i++) {
- compile((XmlSchema) schemalist.get(i),true);
- }
-
- //finish up
- finalizeSchemaCompilation();
-
- } catch (SchemaCompilationException e) {
- throw e;
- } catch (Exception e) {
- throw new SchemaCompilationException(e);
- }
- }
-
- /**
- * Compile (rather codegen) a single schema element
- * @param schema
- * @throws SchemaCompilationException
- */
- public void compile(XmlSchema schema) throws SchemaCompilationException {
- compile(schema,false);
- }
-
- /**
- * Compile (rather codegen) a single schema element
- * @param schema
- * @param isPartofGroup
- * @throws SchemaCompilationException
- */
- private void compile(XmlSchema schema,boolean isPartofGroup) throws SchemaCompilationException {
-
- // some documents explicitly imports the schema of built in types. We don't actually need to compile
- // the built-in types. So check the target namespace here and ignore it.
- if (Constants.URI_2001_SCHEMA_XSD.equals(schema.getTargetNamespace())) {
- return;
- }
-
- //register the package from this namespace as the mapper classes package
- if (!isPartofGroup){
- //set a mapper package if not avaialable
- if (writer.getExtensionMapperPackageName()==null){
- writer.registerExtensionMapperPackageName(
- URLProcessor.makePackageName(schema.getTargetNamespace()));
- }
- }
-
- //First look for the schemas that are imported and process them
- //Note that these are processed recursively!
-
- //add the schema to the loaded schema list
- if (!loadedSchemaMap.containsKey(schema.getTargetNamespace())) {
- loadedSchemaMap.put(schema.getTargetNamespace(), schema);
- }
-
- // If we have/are loading a schema with a specific targetnamespace from a certain URI,
- // then just return back to the caller to avoid recursion.
- if (schema.getSourceURI() != null){
- String key = schema.getTargetNamespace() + ":" + schema.getSourceURI();
- if(loadedSourceURI.containsKey(key)){
- return;
- }
- loadedSourceURI.put(key, key);
- }
-
- XmlSchemaObjectCollection includes = schema.getIncludes();
- if (includes != null) {
- Iterator tempIterator = includes.getIterator();
- while (tempIterator.hasNext()) {
- Object o = tempIterator.next();
- if (o instanceof XmlSchemaImport) {
- XmlSchema schema1 = ((XmlSchemaImport) o).getSchema();
- if (schema1 != null) compile(schema1,isPartofGroup);
- }
- if (o instanceof XmlSchemaInclude) {
- XmlSchema schema1 = ((XmlSchemaInclude) o).getSchema();
- if (schema1 != null) compile(schema1,isPartofGroup);
- }
- }
- }
-
- //select all the elements. We generate the code for types
- //only if the elements refer them!!! regardless of the fact that
- //we have a list of elementnames, we'll need to process all the elements
- XmlSchemaObjectTable elements = schema.getElements();
- Iterator xmlSchemaElement1Iterator = elements.getValues();
- while (xmlSchemaElement1Iterator.hasNext()) {
- //this is the set of outer elements so we need to generate classes
- //The outermost elements do not contain occurence counts (!) so we do not need
- //to check for arraytypes
- processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), schema);
- }
-
- Iterator xmlSchemaElement2Iterator = elements.getValues();
-
- // re-iterate through the elements and write them one by one
- // if the mode is unpack this process will not really write the
- // classes but will accumilate the models for a final single shot
- // write
- while (xmlSchemaElement2Iterator.hasNext()) {
- //this is the set of outer elements so we need to generate classes
- writeElement((XmlSchemaElement) xmlSchemaElement2Iterator.next());
- }
-
- if(options.isGenerateAll()) {
- Iterator xmlSchemaTypes2Iterator = schema.getSchemaTypes().getValues();
- while (xmlSchemaTypes2Iterator.hasNext()) {
- XmlSchemaType schemaType = (XmlSchemaType) xmlSchemaTypes2Iterator.next();
- if(this.isAlreadyProcessed(schemaType.getQName())) {
- continue;
- }
- if (schemaType instanceof XmlSchemaComplexType) {
- //write classes for complex types
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) schemaType;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType, schema);
- }
- } else if (schemaType instanceof XmlSchemaSimpleType) {
- //process simple type
- processSimpleSchemaType((XmlSchemaSimpleType) schemaType,
- null,
- schema);
- }
- }
- }
-
- if (!isPartofGroup){
- //complete the compilation
- finalizeSchemaCompilation();
- }
- }
-
- /**
- * Completes the schema compilation process by writing the
- * mappers and the classes in a batch if needed
- * @throws SchemaCompilationException
- */
- private void finalizeSchemaCompilation() throws SchemaCompilationException {
- //write the extension mapping class
- writer.writeExtensionMapper(
- (BeanWriterMetaInfoHolder[])
- processedTypeMetaInfoMap.values().toArray(
- new BeanWriterMetaInfoHolder[processedTypeMetaInfoMap.size()]));
-
-
- if (options.isWrapClasses()) {
- writer.writeBatch();
- }
- }
-
- /**
- * @return the property map of the schemacompiler.
- * In this case it would be the property map loaded from
- * the configuration file
- */
- public Properties getCompilerProperties(){
- return SchemaPropertyLoader.getPropertyMap() ;
- }
-
-
- /**
- * Writes the element
- *
- * @param xsElt
- * @throws SchemaCompilationException
- */
- private void writeElement(XmlSchemaElement xsElt) throws SchemaCompilationException {
-
- if (this.processedElementMap.containsKey(xsElt.getQName())) {
- return;
- }
-
- XmlSchemaType schemaType = xsElt.getSchemaType();
-
-
- BeanWriterMetaInfoHolder metainf = new BeanWriterMetaInfoHolder();
- if (schemaType != null && schemaType.getName() != null) {
- //this is a named type
- QName qName = schemaType.getQName();
- //find the class name
- String className = findClassName(qName, isArray(xsElt));
-
- //this means the schema type actually returns a different QName
- if (changedTypeMap.containsKey(qName)) {
- metainf.registerMapping(xsElt.getQName(),
- (QName) changedTypeMap.get(qName),
- className);
- } else {
- metainf.registerMapping(xsElt.getQName(),
- qName,
- className);
- }
-
-
- }else if (xsElt.getRefName()!= null){
- // Since top level elements would not have references
- // and we only write toplevel elements, this should
- // not be a problem , atleast should not occur in a legal schema
- }else if (xsElt.getSchemaTypeName()!= null) {
- QName qName = xsElt.getSchemaTypeName();
- String className = findClassName(qName, isArray(xsElt));
- metainf.registerMapping(xsElt.getQName(),
- qName,
- className);
-
-
- }else if (schemaType != null){ //the named type should have been handled already
-
- //we are going to special case the anonymous complex type. Our algorithm for dealing
- //with it is to generate a single object that has the complex content inside. Really the
- //intent of the user when he declares the complexType anonymously is to use it privately
- //First copy the schema types content into the metainf holder
- metainf = (BeanWriterMetaInfoHolder) this.processedAnonymousComplexTypesMap.get(xsElt);
- metainf.setAnonymous(true);
- }else{
- //this means we did not find any schema type associated with the particular element.
- log.warn(SchemaCompilerMessages.getMessage("schema.elementWithNoType", xsElt.getQName().toString()));
- metainf.registerMapping(xsElt.getQName(),
- null,
- DEFAULT_CLASS_NAME,
- SchemaConstants.ANY_TYPE);
- }
-
- if (nillableElementList.contains(xsElt.getQName())){
- metainf.registerNillableQName(xsElt.getQName());
- }
-
-
- String writtenClassName = writer.write(xsElt, processedTypemap, metainf);
- //register the class name
- xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- writtenClassName);
- processedElementMap.put(xsElt.getQName(), writtenClassName);
- }
-
- /**
- * For inner elements
- * @param xsElt
- * @param innerElementMap
- * @param parentSchema
- * @throws SchemaCompilationException
- */
- private void processElement(XmlSchemaElement xsElt,Map innerElementMap,List localNillableList,XmlSchema parentSchema) throws SchemaCompilationException {
- processElement(xsElt,false,innerElementMap,localNillableList,parentSchema);
- }
-
- /**
- * For outer elements
- * @param xsElt
- * @param parentSchema
- * @throws SchemaCompilationException
- */
- private void processElement(XmlSchemaElement xsElt,XmlSchema parentSchema) throws SchemaCompilationException {
- processElement(xsElt,true,null,null,parentSchema);
- }
- /**
- * Process and Element
- *
- * @param xsElt
- * @param isOuter We need to know this since the treatment of outer elements is different that
- * inner elements
- * @throws SchemaCompilationException
- */
- private void processElement(XmlSchemaElement xsElt, boolean isOuter,Map innerElementMap,List localNillableList, XmlSchema parentSchema) throws SchemaCompilationException {
-
- //if the element is null, which usually happens when the qname is not
- //proper, throw an exceptions
- if (xsElt==null){
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.elementNull"));
- }
-
- //The processing element logic seems to be quite simple. Look at the relevant schema type
- //for each and every element and process that accordingly.
- //this means that any unused type definitions would not be generated!
- if (isOuter && processedElementList.contains(xsElt.getQName())) {
- return;
- }
-
- XmlSchemaType schemaType = xsElt.getSchemaType();
- if (schemaType != null) {
- processSchema(xsElt, schemaType,parentSchema);
- //at this time it is not wise to directly write the class for the element
- //so we push the complete element to an arraylist and let the process
- //pass through. We'll be iterating through the elements writing them
- //later
-
- if (!isOuter) {
- if (schemaType.getName()!=null){
- // this element already has a name. Which means we can directly
- // register it
- String className = findClassName(schemaType.getQName(),
- isArray(xsElt));
-
- innerElementMap.put(xsElt.getQName(), className);
-
- //store in the schema map
- schemaType.addMetaInfo(
- SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- className);
-
- if (baseSchemaTypeMap.containsValue(className)){
- schemaType.addMetaInfo(
- SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_PRIMITVE_KEY,
- Boolean.TRUE);
- }
- //since this is a inner element we should add it to the inner element map
- }else{
- //this is an anon type. This should have been already processed and registered at
- //the anon map. we've to write it just like we treat a referenced type(giving due
- //care that this is meant to be an attribute in some class)
-
- QName generatedTypeName = generateTypeQName(xsElt.getQName(), parentSchema);
-
- if (schemaType instanceof XmlSchemaComplexType){
- //set a name
- schemaType.setName(generatedTypeName.getLocalPart());
- // Must do this up front to support recursive types
- String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(schemaType.getQName());
- processedTypemap.put(schemaType.getQName(), fullyQualifiedClassName);
-
- BeanWriterMetaInfoHolder metaInfHolder = (BeanWriterMetaInfoHolder) processedAnonymousComplexTypesMap.get(xsElt);
- metaInfHolder.setOwnQname(schemaType.getQName());
- metaInfHolder.setOwnClassName(fullyQualifiedClassName);
-
- writeComplexType((XmlSchemaComplexType)schemaType,
- metaInfHolder);
- //remove the reference from the anon list since we named the type
- processedAnonymousComplexTypesMap.remove(xsElt);
- String className = findClassName(schemaType.getQName(), isArray(xsElt));
- innerElementMap.put(
- xsElt.getQName(),
- className);
-
- //store in the schema map
- xsElt.addMetaInfo(
- SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- className);
- } else if (schemaType instanceof XmlSchemaSimpleType){
- //set a name
- schemaType.setName(generatedTypeName.getLocalPart());
- // Must do this up front to support recursive types
- String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(schemaType.getQName());
- processedTypemap.put(schemaType.getQName(), fullyQualifiedClassName);
-
- BeanWriterMetaInfoHolder metaInfHolder = (BeanWriterMetaInfoHolder) processedAnonymousComplexTypesMap.get(xsElt);
- metaInfHolder.setOwnQname(schemaType.getQName());
- metaInfHolder.setOwnClassName(fullyQualifiedClassName);
-
- writeSimpleType((XmlSchemaSimpleType)schemaType,
- metaInfHolder);
- //remove the reference from the anon list since we named the type
- processedAnonymousComplexTypesMap.remove(xsElt);
- String className = findClassName(schemaType.getQName(), isArray(xsElt));
- innerElementMap.put(
- xsElt.getQName(),
- className);
-
- //store in the schema map
- xsElt.addMetaInfo(
- SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- className);
-
- }
- }
- }else{
- this.processedElementList.add(xsElt.getQName());
- }
- //referenced name
- }else if (xsElt.getRefName()!=null){
-
- if(xsElt.getRefName().equals(SchemaConstants.XSD_SCHEMA)){
- innerElementMap.put(xsElt.getQName(), SchemaCompiler.DEFAULT_CLASS_NAME);
- return;
- }
- //process the referenced type. It could be thought that the referenced element replaces this
- //element
- XmlSchemaElement referencedElement = getReferencedElement(parentSchema, xsElt.getRefName());
- if (referencedElement==null){
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.referencedElementNotFound", xsElt.getRefName().toString()));
- }
-
- //if the element is referenced, then it should be one of the outer (global) ones
- processElement(referencedElement, parentSchema);
-
- //no outer check required here. If the element is having a ref, then it is definitely
- //not an outer element since the top level elements are not supposed to have refs
- //Also we are sure that it should have a type reference
- QName referenceEltQName = referencedElement.getQName();
- if (referencedElement.getSchemaTypeName()!=null){
- String className = findClassName(referencedElement.getSchemaTypeName(), isArray(xsElt));
- //if this element is referenced, there's no QName for this element
- this.processedElementRefMap.put(referenceEltQName, className);
-
- referencedElement.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- className);
- }else{
- //this referenced element has an anon type and that anon type has been already
- //processed. But in this case we need it to be a seperate class since this
- //complextype has to be added as an attribute in a class.
- //generate a name for this type
- QName generatedTypeName = generateTypeQName(referenceEltQName, parentSchema);
- XmlSchemaType referenceSchemaType = referencedElement.getSchemaType();
-
- if (referenceSchemaType instanceof XmlSchemaComplexType){
- //set a name
- referenceSchemaType.setName(generatedTypeName.getLocalPart());
-
- writeComplexType((XmlSchemaComplexType)referenceSchemaType,
- (BeanWriterMetaInfoHolder)processedAnonymousComplexTypesMap.get(referencedElement)
- );
- //remove the reference from the anon list since we named the type
- // DEEPAL :- We can not remove the entry from the hashtable ,
- // this will fail if there are two reference for the same type
-
- //processedAnonymousComplexTypesMap.remove(referencedElement);
-
- //add this to the processed ref type map
- String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(generatedTypeName);
- processedTypemap.put(generatedTypeName, fullyQualifiedClassName);
- this.processedElementRefMap.put(referenceEltQName, fullyQualifiedClassName);
- }
- }
- // schema type name is present but not the schema type object
- }else if (xsElt.getSchemaTypeName()!=null){
- //There can be instances where the SchemaType is null but the schemaTypeName is not!
- //this specifically happens with xsd:anyType.
- QName schemaTypeName = xsElt.getSchemaTypeName();
-
- XmlSchema currentParentSchema = resolveParentSchema(schemaTypeName,parentSchema);
- XmlSchemaType typeByName = getType(currentParentSchema, schemaTypeName);
-
- if (typeByName!=null){
- //this type is found in the schema so we can process it
- processSchema(xsElt, typeByName,currentParentSchema);
- if (!isOuter) {
- String className = findClassName(schemaTypeName, isArray(xsElt));
- //since this is a inner element we should add it to the inner element map
- innerElementMap.put(xsElt.getQName(), className);
- }else{
- this.processedElementList.add(xsElt.getQName());
- }
- }else{
- //this type is not found at all. we'll just register it with whatever the class name we can comeup with
- if (!isOuter) {
- String className = findClassName(schemaTypeName, isArray(xsElt));
- innerElementMap.put(xsElt.getQName(), className);
- }else{
- this.processedElementList.add(xsElt.getQName());
- }
- }
- }
-
- //add this elements QName to the nillable group if it has the nillable attribute
- if (xsElt.isNillable()){
- if (isOuter){
- this.nillableElementList.add(xsElt.getQName());
- }else{
- localNillableList.add(xsElt.getQName());
- }
- }
-
- }
-
- /**
- * resolve the parent schema for the given schema type name
- *
- * @param schemaTypeName
- * @param currentSchema
- */
- private XmlSchema resolveParentSchema(QName schemaTypeName,XmlSchema currentSchema)
- throws SchemaCompilationException{
- String targetNamespace = schemaTypeName.getNamespaceURI();
- Object loadedSchema = loadedSchemaMap.get(targetNamespace);
- if (loadedSchema!=null){
- return (XmlSchema)loadedSchema;
- }else if (availableSchemaMap.containsKey(targetNamespace)) {
- //compile the referenced Schema first and then pass it
- XmlSchema schema = (XmlSchema) availableSchemaMap.get(targetNamespace);
- compile(schema);
- return schema;
- }else{
- return currentSchema;
- }
- }
-
- /**
- * Generate a unique type Qname using an element name
- * @param referenceEltQName
- * @param parentSchema
- */
- private QName generateTypeQName(QName referenceEltQName, XmlSchema parentSchema) {
- QName generatedTypeName = new QName(referenceEltQName.getNamespaceURI(),
- referenceEltQName.getLocalPart() + getNextTypeSuffix());
- while (parentSchema.getTypeByName(generatedTypeName)!= null){
- generatedTypeName = new QName(referenceEltQName.getNamespaceURI(),
- referenceEltQName.getLocalPart() + getNextTypeSuffix());
- }
- return generatedTypeName;
- }
-
- /**
- * Generate a unique attribute Qname using the ref name
- * @param attrRefName
- * @param parentSchema
- * @return Returns the generated attribute name
- */
- private QName generateAttributeQName(QName attrRefName, XmlSchema parentSchema) {
-
- if (typeCounter==Integer.MAX_VALUE){
- typeCounter = 0;
- }
- QName generatedAttrName = new QName(attrRefName.getNamespaceURI(),
- attrRefName.getLocalPart() + typeCounter++);
-
- while (parentSchema.getTypeByName(generatedAttrName)!= null){
- generatedAttrName = new QName(attrRefName.getNamespaceURI(),
- attrRefName.getLocalPart() + typeCounter++);
- }
- return generatedAttrName;
- }
-
- /**
- * Finds whether a given class is already made
- * @param qName
- */
- private boolean isAlreadyProcessed(QName qName){
- return processedTypemap.containsKey(qName)||
- simpleTypesMap.containsKey(qName) ||
- baseSchemaTypeMap.containsKey(qName);
- }
-
-
- /**
- * A method to pick the ref class name
- * @param name
- * @param isArray
- */
- private String findRefClassName(QName name,boolean isArray){
- String className = null;
- if (processedElementRefMap.get(name)!=null){
- className =(String)processedElementRefMap.get(name);
-
- //if (isArray) {
- //append the square braces that say this is an array
- //hope this works for all cases!!!!!!!
- //todo this however is a thing that needs to be
- //todo fixed to get complete language support
- // className = className + "[]";
- //}
- }
- return className;
-
- }
- /**
- * Finds a class name from the given Qname
- *
- * @param qName
- * @param isArray
- * @return FQCN
- */
- private String findClassName(QName qName, boolean isArray) throws SchemaCompilationException {
-
- //find the class name
- String className;
- if (processedTypemap.containsKey(qName)) {
- className = (String) processedTypemap.get(qName);
- } else if (simpleTypesMap.containsKey(qName)) {
- className = (String) simpleTypesMap.get(qName);
- } else if (baseSchemaTypeMap.containsKey(qName)) {
- className = (String) baseSchemaTypeMap.get(qName);
- } else {
- if(isSOAP_ENC(qName.getNamespaceURI())) {
- throw new SchemaCompilationException(SchemaCompilerMessages.getMessage("schema.soapencoding.error", qName.toString()));
-
- }
- // We seem to have failed in finding a class name for the
- //contained schema type. We better set the default then
- //however it's better if the default can be set through the
- //property file
- className = DEFAULT_CLASS_NAME;
- log.warn(SchemaCompilerMessages
- .getMessage("schema.typeMissing", qName.toString()));
- }
-
- if (isArray) {
- //append the square braces that say this is an array
- //hope this works for all cases!!!!!!!
- //todo this however is a thing that needs to be
- //todo fixed to get complete language support
- className = className + "[]";
- }
- return className;
- }
- /**
- * Returns true if SOAP_ENC Namespace.
- *
- * @param s a string representing the URI to check
- * @return true if <code>s</code> matches a SOAP ENCODING namespace URI,
- * false otherwise
- */
- public static boolean isSOAP_ENC(String s) {
- if (s.equals(Constants.URI_SOAP11_ENC))
- return true;
- return s.equals(Constants.URI_SOAP12_ENC);
- }
-
- /**
- * Process a schema element which has been refered to by an element
- * @param schemaType
- * @throws SchemaCompilationException
- */
- private void processSchema(XmlSchemaElement xsElt, XmlSchemaType schemaType,XmlSchema parentSchema) throws SchemaCompilationException {
- if (schemaType instanceof XmlSchemaComplexType) {
- //write classes for complex types
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) schemaType;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType,parentSchema);
- } else {
- processAnonymousComplexSchemaType(xsElt, complexType,parentSchema);
- }
- } else if (schemaType instanceof XmlSchemaSimpleType) {
- //process simple type
- processSimpleSchemaType((XmlSchemaSimpleType) schemaType,
- xsElt,
- parentSchema);
- }
- }
-
-
- /**
- * @param complexType
- * @throws SchemaCompilationException
- */
- private void processAnonymousComplexSchemaType(XmlSchemaElement elt, XmlSchemaComplexType complexType,XmlSchema parentSchema)
- throws SchemaCompilationException {
- BeanWriterMetaInfoHolder metaInfHolder = processComplexType(complexType,parentSchema);
-
- //since this is a special case (an unnamed complex type) we'll put the already processed
- //metainf holder in a special map to be used later
- this.processedAnonymousComplexTypesMap.put(elt, metaInfHolder);
- }
-
- /**
- * handle the complex types which are named
- * @param complexType
- */
- private void processNamedComplexSchemaType(XmlSchemaComplexType complexType,XmlSchema parentSchema) throws SchemaCompilationException {
-
- if (processedTypemap.containsKey(complexType.getQName())
- || baseSchemaTypeMap.containsKey(complexType.getQName())) {
- return;
- }
-
- // Must do this up front to support recursive types
- String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(complexType.getQName());
- processedTypemap.put(complexType.getQName(), fullyQualifiedClassName);
-
- //register that in the schema metainfo bag
- complexType.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- fullyQualifiedClassName);
-
- BeanWriterMetaInfoHolder metaInfHolder = processComplexType(complexType,parentSchema);
- //add this information to the metainfo holder
- metaInfHolder.setOwnQname(complexType.getQName());
- metaInfHolder.setOwnClassName(fullyQualifiedClassName);
- //write the class. This type mapping would have been populated right now
- //Note - We always write classes for named complex types
- writeComplexType(complexType, metaInfHolder);
-
-
- }
-
- /**
- * Writes a complex type
- * @param complexType
- * @param metaInfHolder
- * @param fullyQualifiedClassName the name returned by makeFullyQualifiedClassName() or null if it wasn't called
- * @throws SchemaCompilationException
- */
- private void writeComplexType(XmlSchemaComplexType complexType, BeanWriterMetaInfoHolder metaInfHolder)
- throws SchemaCompilationException {
- writer.write(complexType, processedTypemap, metaInfHolder);
- processedTypeMetaInfoMap.put(complexType.getQName(),metaInfHolder);
- }
-
- /**
- * Writes a complex type
- * @param simpleType
- * @param metaInfHolder
- * @throws SchemaCompilationException
- */
- private void writeSimpleType(XmlSchemaSimpleType simpleType, BeanWriterMetaInfoHolder metaInfHolder)
- throws SchemaCompilationException {
- writer.write(simpleType, processedTypemap, metaInfHolder);
- processedTypeMetaInfoMap.put(simpleType.getQName(),metaInfHolder);
- }
-
- private BeanWriterMetaInfoHolder processComplexType(XmlSchemaComplexType complexType,XmlSchema parentSchema) throws SchemaCompilationException {
- XmlSchemaParticle particle = complexType.getParticle();
- BeanWriterMetaInfoHolder metaInfHolder = new BeanWriterMetaInfoHolder();
- if (particle != null) {
- //Process the particle
- processParticle(particle, metaInfHolder,parentSchema);
- }
-
- //process attributes - first look for the explicit attributes
- XmlSchemaObjectCollection attribs = complexType.getAttributes();
- Iterator attribIterator = attribs.getIterator();
- while (attribIterator.hasNext()) {
- Object o = attribIterator.next();
- if (o instanceof XmlSchemaAttribute) {
- processAttribute((XmlSchemaAttribute) o, metaInfHolder,parentSchema);
-
- }
- }
-
- //process any attribute
- //somehow the xml schema parser does not seem to pickup the any attribute!!
- XmlSchemaAnyAttribute anyAtt = complexType.getAnyAttribute();
- if (anyAtt != null) {
- processAnyAttribute(metaInfHolder,anyAtt);
- }
-
- //process content ,either complex or simple
- if (complexType.getContentModel()!=null){
- processContentModel(complexType.getContentModel(),
- metaInfHolder,
- parentSchema);
- }
- return metaInfHolder;
- }
-
- /**
- * Process the content models. A content model is either simple type or a complex type
- * and included inside a complex content
- */
- private void processContentModel(XmlSchemaContentModel content,
- BeanWriterMetaInfoHolder metaInfHolder,
- XmlSchema parentSchema)
- throws SchemaCompilationException{
- if (content instanceof XmlSchemaComplexContent){
- processComplexContent((XmlSchemaComplexContent)content,metaInfHolder,parentSchema);
- }else if (content instanceof XmlSchemaSimpleContent){
- processSimpleContent((XmlSchemaSimpleContent)content,metaInfHolder,parentSchema);
- metaInfHolder.setSimple(true);
- }
- }
-
- /**
- * Prcess the complex content
- */
- private void processComplexContent(XmlSchemaComplexContent complexContent,
- BeanWriterMetaInfoHolder metaInfHolder,
- XmlSchema parentSchema)
- throws SchemaCompilationException{
- XmlSchemaContent content = complexContent.getContent();
-
- if (content instanceof XmlSchemaComplexContentExtension ){
-
- // to handle extension we need to attach the extended items to the base type
- // and create a new type
- XmlSchemaComplexContentExtension extension = (XmlSchemaComplexContentExtension)
- content;
-
- //process the base type if it has not been processed yet
- if (!isAlreadyProcessed(extension.getBaseTypeName())){
- //pick the relevant basetype from the schema and process it
- XmlSchemaType type = getType(parentSchema, extension.getBaseTypeName());
- if (type instanceof XmlSchemaComplexType) {
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType,parentSchema);
- } else {
- //this is not possible. The extension should always
- //have a name
- throw new SchemaCompilationException("Unnamed complex type used in extension");//Internationlize this
- }
- } else if (type instanceof XmlSchemaSimpleType) {
- //process simple type
- processSimpleSchemaType((XmlSchemaSimpleType)type,null,parentSchema);
- }
- }
-
- // before actually processing this node, we need to recurse through the base types and add their
- // children (sometimes even preserving the order) to the metainfo holder of this type
- // the reason is that for extensions, the prefered way is to have the sequences of the base class
- //* before * the sequence of the child element.
- copyMetaInfoHierarchy(metaInfHolder,extension.getBaseTypeName(),parentSchema);
-
-
- //process the particle of this node
- processParticle(extension.getParticle(),metaInfHolder,parentSchema);
- String className = findClassName(extension.getBaseTypeName(), false);
-
- if (!SchemaCompiler.DEFAULT_CLASS_NAME.equals(className)) {
- //the particle has been processed, However since this is an extension we need to
- //add the basetype as an extension to the complex type class.
- // The basetype has been processed already
- metaInfHolder.setExtension(true);
- metaInfHolder.setExtensionClassName(className);
- //Note - this is no array! so the array boolean is false
- }
- }else if (content instanceof XmlSchemaComplexContentRestriction){
- XmlSchemaComplexContentRestriction restriction = (XmlSchemaComplexContentRestriction) content;
-
- //process the base type if it has not been processed yet
- if (!isAlreadyProcessed(restriction.getBaseTypeName())){
- //pick the relevant basetype from the schema and process it
- XmlSchemaType type = getType(parentSchema, restriction.getBaseTypeName());
- if (type instanceof XmlSchemaComplexType) {
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType,parentSchema);
- } else {
- //this is not possible. The restriction should always
- //have a name
- throw new SchemaCompilationException("Unnamed complex type used in restriction");//Internationlize this
- }
- } else if (type instanceof XmlSchemaSimpleType) {
-
- throw new SchemaCompilationException("Not a valid restriction, complex content restriction base type cannot be a simple type.");
- }
- }
-
- copyMetaInfoHierarchy(metaInfHolder,restriction.getBaseTypeName(),parentSchema);
-
- //process the particle of this node
- processParticle(restriction.getParticle(),metaInfHolder,parentSchema);
- String className = findClassName(restriction.getBaseTypeName(), false);
-
- if (!SchemaCompiler.DEFAULT_CLASS_NAME.equals(className)) {
- metaInfHolder.setRestriction(true);
- metaInfHolder.setRestrictionClassName(findClassName(restriction.getBaseTypeName(), false));
- //Note - this is no array! so the array boolean is false
- }
- }
- }
-
- /**
- * Recursive method to populate the metainfo holders with info from the base types
- * @param metaInfHolder
- * @param baseTypeName
- * @param parentSchema
- */
- private void copyMetaInfoHierarchy(BeanWriterMetaInfoHolder metaInfHolder,
- QName baseTypeName,
- XmlSchema parentSchema)
- throws SchemaCompilationException {
-
- XmlSchemaType type = parentSchema.getTypeByName(baseTypeName);
-
- BeanWriterMetaInfoHolder baseMetaInfoHolder = (BeanWriterMetaInfoHolder)
- processedTypeMetaInfoMap.get(baseTypeName);
-
-
- if (baseMetaInfoHolder!= null){
-
- // see whether this type is also extended from some other type first
- // if so proceed to set their parents as well.
- if (type instanceof XmlSchemaComplexType){
- XmlSchemaComplexType complexType = (XmlSchemaComplexType)type;
- if (complexType.getContentModel()!= null){
- XmlSchemaContentModel content = complexType.getContentModel();
- if (content instanceof XmlSchemaComplexContent){
- XmlSchemaComplexContent complexContent =
- (XmlSchemaComplexContent)content;
- if (complexContent.getContent() instanceof XmlSchemaComplexContentExtension){
- XmlSchemaComplexContentExtension extension =
- (XmlSchemaComplexContentExtension)complexContent.getContent();
- //recursively call the copyMetaInfoHierarchy method
- copyMetaInfoHierarchy(baseMetaInfoHolder,
- extension.getBaseTypeName(),
- parentSchema);
-
- }else if (complexContent.getContent() instanceof XmlSchemaComplexContentRestriction){
-
- XmlSchemaComplexContentRestriction restriction =
- (XmlSchemaComplexContentRestriction)complexContent.getContent();
- //recursively call the copyMetaInfoHierarchy method
- copyMetaInfoHierarchy(baseMetaInfoHolder,
- restriction.getBaseTypeName(),
- parentSchema);
-
- }else{
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.unknowncontenterror"));
- }
-
- }else if (content instanceof XmlSchemaSimpleContent){
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.unsupportedcontenterror","Simple Content"));
- }else{
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.unknowncontenterror"));
- }
- }
-
- //Do the actual parent setting
- metaInfHolder.setAsParent(baseMetaInfoHolder);
- }
- }
- }
-
- /**
- *
- * @param simpleContent
- * @param metaInfHolder
- * @throws SchemaCompilationException
- */
- private void processSimpleContent(XmlSchemaSimpleContent simpleContent,BeanWriterMetaInfoHolder metaInfHolder,XmlSchema parentSchema)
- throws SchemaCompilationException{
- XmlSchemaContent content;
- content = simpleContent.getContent();
- if (content instanceof XmlSchemaSimpleContentExtension){
- XmlSchemaSimpleContentExtension extension = (XmlSchemaSimpleContentExtension)content;
-
- //process the base type if it has not been processed yet
- if (!isAlreadyProcessed(extension.getBaseTypeName())){
- //pick the relevant basetype from the schema and process it
- XmlSchemaType type = getType(parentSchema,extension.getBaseTypeName());
- if (type instanceof XmlSchemaComplexType) {
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType,parentSchema);
- } else {
- //this is not possible. The extension should always
- //have a name
- throw new SchemaCompilationException("Unnamed complex type used in extension");//Internationlize this
- }
- } else if (type instanceof XmlSchemaSimpleType) {
- //process simple type
- processSimpleSchemaType((XmlSchemaSimpleType)type,null, parentSchema);
- }
- }
-
- //process extension base type
- processSimpleExtensionBaseType(extension.getBaseTypeName(),metaInfHolder);
-
- //process attributes
- XmlSchemaObjectCollection attribs = extension.getAttributes();
- Iterator attribIterator = attribs.getIterator();
- while (attribIterator.hasNext()) {
- Object attr = attribIterator.next();
- if (attr instanceof XmlSchemaAttribute) {
- processAttribute((XmlSchemaAttribute) attr, metaInfHolder,parentSchema);
-
- }
- }
-
- //process any attribute
- XmlSchemaAnyAttribute anyAtt = extension.getAnyAttribute();
- if (anyAtt != null) {
- processAnyAttribute(metaInfHolder,anyAtt);
- }
-
- }else if (content instanceof XmlSchemaSimpleContentRestriction){
- XmlSchemaSimpleContentRestriction restriction = (XmlSchemaSimpleContentRestriction) content;
-
- //process the base type if it has not been processed yet
- if (!isAlreadyProcessed(restriction.getBaseTypeName())){
- //pick the relevant basetype from the schema and process it
- XmlSchemaType type = getType(parentSchema,restriction.getBaseTypeName());
- if (type instanceof XmlSchemaComplexType) {
- XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
- if (complexType.getName() != null) {
- processNamedComplexSchemaType(complexType,parentSchema);
- } else {
- //this is not possible. The extension should always
- //have a name
- throw new SchemaCompilationException("Unnamed complex type used in restriction");//Internationlize this
- }
- } else if (type instanceof XmlSchemaSimpleType) {
- //process simple type
- processSimpleSchemaType((XmlSchemaSimpleType)type,null, parentSchema);
- }
- }
- //process restriction base type
- processSimpleRestrictionBaseType(restriction.getBaseTypeName(), restriction.getBaseTypeName(),metaInfHolder);
- }
- }
-
- /**
- * Process Simple Extension Base Type.
- *
- * @param extBaseType
- * @param metaInfHolder
- */
- public void processSimpleExtensionBaseType(QName extBaseType,BeanWriterMetaInfoHolder metaInfHolder) throws SchemaCompilationException {
-
- //find the class name
- String className = findClassName(extBaseType, false);
-
- //this means the schema type actually returns a different QName
- if (changedTypeMap.containsKey(extBaseType)) {
- metaInfHolder.registerMapping(extBaseType,
- (QName) changedTypeMap.get(extBaseType),
- className,SchemaConstants.ELEMENT_TYPE);
- } else {
- metaInfHolder.registerMapping(extBaseType,
- extBaseType,
- className,SchemaConstants.ELEMENT_TYPE);
- }
-
- //get the binary state and add that to the status map
- if (isBinary(extBaseType)){
- metaInfHolder.addtStatus(extBaseType,
- SchemaConstants.BINARY_TYPE);
- }
- }
-
- /**
- * Process Simple Restriction Base Type.
- *
- * @param resBaseType
- * @param metaInfHolder
- */
- public void processSimpleRestrictionBaseType(QName qName, QName resBaseType,BeanWriterMetaInfoHolder metaInfHolder) throws SchemaCompilationException {
-
- //find the class name
- String className = findClassName(resBaseType, false);
-
- //this means the schema type actually returns a different QName
- if (changedTypeMap.containsKey(resBaseType)) {
- metaInfHolder.registerMapping(qName,
- (QName) changedTypeMap.get(resBaseType),
- className,SchemaConstants.ELEMENT_TYPE);
- } else {
- metaInfHolder.registerMapping(qName,
- resBaseType,
- className,SchemaConstants.ELEMENT_TYPE);
- }
-
- metaInfHolder.setRestrictionBaseType(resBaseType);
- }
-
- /**
- * Process Facets.
- *
- * @param facets
- * @param metaInfHolder
- */
- private void processFacets(XmlSchemaObjectCollection facets,BeanWriterMetaInfoHolder metaInfHolder) {
-
- Iterator facetIterator = facets.getIterator();
-
- while (facetIterator.hasNext()) {
- Object obj = facetIterator.next();
-
- if ( obj instanceof XmlSchemaPatternFacet ) {
- XmlSchemaPatternFacet pattern = (XmlSchemaPatternFacet) obj;
- metaInfHolder.setPatternFacet(pattern.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaEnumerationFacet ) {
- XmlSchemaEnumerationFacet enumeration = (XmlSchemaEnumerationFacet) obj;
- metaInfHolder.addEnumFacet(enumeration.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaLengthFacet ) {
- XmlSchemaLengthFacet length = (XmlSchemaLengthFacet) obj;
- metaInfHolder.setLengthFacet(Integer.parseInt(length.getValue().toString()));
- }
-
- else if ( obj instanceof XmlSchemaMaxExclusiveFacet ) {
- XmlSchemaMaxExclusiveFacet maxEx = (XmlSchemaMaxExclusiveFacet) obj;
- metaInfHolder.setMaxExclusiveFacet(maxEx.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaMinExclusiveFacet ) {
- XmlSchemaMinExclusiveFacet minEx = (XmlSchemaMinExclusiveFacet) obj;
- metaInfHolder.setMinExclusiveFacet(minEx.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaMaxInclusiveFacet ) {
- XmlSchemaMaxInclusiveFacet maxIn = (XmlSchemaMaxInclusiveFacet) obj;
- metaInfHolder.setMaxInclusiveFacet(maxIn.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaMinInclusiveFacet ) {
- XmlSchemaMinInclusiveFacet minIn = (XmlSchemaMinInclusiveFacet) obj;
- metaInfHolder.setMinInclusiveFacet(minIn.getValue().toString());
- }
-
- else if ( obj instanceof XmlSchemaMaxLengthFacet ) {
- XmlSchemaMaxLengthFacet maxLen = (XmlSchemaMaxLengthFacet) obj;
- metaInfHolder.setMaxLengthFacet(Integer.parseInt(maxLen.getValue().toString()));
- }
-
- else if ( obj instanceof XmlSchemaMinLengthFacet ) {
- XmlSchemaMinLengthFacet minLen = (XmlSchemaMinLengthFacet) obj;
- metaInfHolder.setMinLengthFacet(Integer.parseInt(minLen.getValue().toString()));
- }
- }
- }
- /**
- * Handle any attribute
- * @param metainf
- */
- private void processAnyAttribute(BeanWriterMetaInfoHolder metainf,XmlSchemaAnyAttribute anyAtt) {
-
- //The best thing we can do here is to add a set of OMAttributes
- //since attributes do not have the notion of minoccurs/maxoccurs the
- //safest option here is to have an OMAttribute array
- QName qName = new QName(EXTRA_ATTRIBUTE_FIELD_NAME);
- metainf.registerMapping(qName,
- null,
- DEFAULT_ATTRIB_ARRAY_CLASS_NAME,//always generate an array of
- //OMAttributes
- SchemaConstants.ANY_TYPE);
- metainf.addtStatus(qName, SchemaConstants.ATTRIBUTE_TYPE);
- metainf.addtStatus(qName, SchemaConstants.ARRAY_TYPE);
-
- }
-
-
-
- /**
- * Process the attribute
- *
- * @param att
- * @param metainf
- */
- public void processAttribute(XmlSchemaAttribute att, BeanWriterMetaInfoHolder metainf, XmlSchema parentSchema)
- throws SchemaCompilationException {
-
- //for now we assume (!!!) that attributes refer to standard types only
- QName schemaTypeName = att.getSchemaTypeName();
- if (schemaTypeName != null) {
- if (baseSchemaTypeMap.containsKey(schemaTypeName)) {
- if (att.getQName() != null) {
- metainf.registerMapping(att.getQName(),schemaTypeName,
- baseSchemaTypeMap.get(schemaTypeName).toString(), SchemaConstants.ATTRIBUTE_TYPE);
-
- // add optional attribute status if set
- String use = att.getUse().getValue();
- if (use.indexOf("optional") != -1) {
- metainf.addtStatus(att.getQName(), SchemaConstants.OPTIONAL_TYPE);
- }
- }
- }
- } else if (att.getRefName() != null) {
- XmlSchema currentParentSchema = resolveParentSchema(att.getRefName(),parentSchema);
- QName attrQname = generateAttributeQName(att.getRefName(),parentSchema);
-
- XmlSchemaObjectCollection items = currentParentSchema.getItems();
- Iterator itemIterator = items.getIterator();
-
- while (itemIterator.hasNext()) {
- Object attr = itemIterator.next();
-
- if (attr instanceof XmlSchemaAttribute) {
- XmlSchemaAttribute attribute = (XmlSchemaAttribute) attr;
-
- if (attribute.getName().equals(att.getRefName().getLocalPart())) {
- QName attrTypeName = attribute.getSchemaTypeName();
-
- Object type = baseSchemaTypeMap.get(attrTypeName);
- if (type == null) {
- XmlSchemaSimpleType simpleType = attribute.getSchemaType();
- if(simpleType != null && simpleType.getContent() instanceof XmlSchemaSimpleTypeRestriction) {
- XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction) simpleType.getContent();
- QName baseTypeName = restriction.getBaseTypeName();
- type = baseSchemaTypeMap.get(baseTypeName);
- attrQname = att.getRefName();
- }
- //TODO: Handle XmlSchemaSimpleTypeUnion and XmlSchemaSimpleTypeList
- }
-
- if (type != null) {
- metainf.registerMapping(attrQname,attrQname,
- type.toString(), SchemaConstants.ATTRIBUTE_TYPE);
- // add optional attribute status if set
- String use = att.getUse().getValue();
- if (use.indexOf("optional") != -1) {
- metainf.addtStatus(att.getQName(), SchemaConstants.OPTIONAL_TYPE);
- }
- }
- }
- }
- }
-
- } else {
- //todo his attribute refers to a custom type, probably one of the extended simple types.
- //todo handle it here
- }
- }
-
- /**
- * Process a particle- A particle may be a sequence,all or a choice
- *
- * @param particle
- * @param metainfHolder
- * @throws SchemaCompilationException
- */
- private void processParticle(XmlSchemaParticle particle, //particle being processed
- BeanWriterMetaInfoHolder metainfHolder // metainf holder
- ,XmlSchema parentSchema) throws SchemaCompilationException {
- if (particle instanceof XmlSchemaSequence) {
- XmlSchemaObjectCollection items = ((XmlSchemaSequence) particle).getItems();
- if (options.isBackwordCompatibilityMode()) {
- process(items, metainfHolder, false, parentSchema);
- } else {
- process(items, metainfHolder, true, parentSchema);
- }
- } else if (particle instanceof XmlSchemaAll) {
- XmlSchemaObjectCollection items = ((XmlSchemaAll) particle).getItems();
- process(items, metainfHolder, false,parentSchema);
- } else if (particle instanceof XmlSchemaChoice) {
- XmlSchemaObjectCollection items = ((XmlSchemaChoice) particle).getItems();
- metainfHolder.setChoice(true);
- process(items, metainfHolder, false,parentSchema);
-
- }
- }
-
- /**
- * @param items
- * @param metainfHolder
- * @param order
- * @throws SchemaCompilationException
- */
- private void process(XmlSchemaObjectCollection items,
- BeanWriterMetaInfoHolder metainfHolder,
- boolean order,
- XmlSchema parentSchema) throws SchemaCompilationException {
- int count = items.getCount();
- Map processedElementArrayStatusMap = new LinkedHashMap();
- Map processedElementTypeMap = new LinkedHashMap();
- List localNillableList = new ArrayList();
-
- Map elementOrderMap = new HashMap();
-
- for (int i = 0; i < count; i++) {
- XmlSchemaObject item = items.getItem(i);
-
- if (item instanceof XmlSchemaElement) {
- //recursively process the element
- XmlSchemaElement xsElt = (XmlSchemaElement) item;
-
- boolean isArray = isArray(xsElt);
- processElement(xsElt, processedElementTypeMap,localNillableList,parentSchema); //we know for sure this is not an outer type
- processedElementArrayStatusMap.put(xsElt, (isArray) ? Boolean.TRUE : Boolean.FALSE);
- if (order) {
- //we need to keep the order of the elements. So push the elements to another
- //hashmap with the order number
- elementOrderMap.put(xsElt, new Integer(i));
- }
-
- //handle xsd:any ! We place an OMElement (or an array of OMElements) in the generated class
- } else if (item instanceof XmlSchemaAny) {
- XmlSchemaAny any = (XmlSchemaAny) item;
- processedElementTypeMap.put(new QName(ANY_ELEMENT_FIELD_NAME),any);
- //any can also be inside a sequence
- if (order) {
- elementOrderMap.put(any, new Integer(i));
- }
- //we do not register the array status for the any type
- processedElementArrayStatusMap.put(any,isArray(any) ? Boolean.TRUE : Boolean.FALSE);
- } else {
- //there may be other types to be handled here. Add them
- //when we are ready
- }
-
-
- }
-
- // loop through the processed items and add them to the matainf object
- Iterator processedElementsIterator = processedElementArrayStatusMap.keySet().iterator();
- int startingItemNumberOrder = metainfHolder.getOrderStartPoint();
- while (processedElementsIterator.hasNext()) {
- Object child = processedElementsIterator.next();
-
- // process the XmlSchemaElement
- if (child instanceof XmlSchemaElement){
- XmlSchemaElement elt = (XmlSchemaElement) child;
- QName referencedQName = null;
-
-
- if (elt.getQName()!=null){
- referencedQName = elt.getQName();
- QName schemaTypeQName = elt.getSchemaType()!=null?elt.getSchemaType().getQName():elt.getSchemaTypeName();
- if(schemaTypeQName != null) {
- String clazzName = (String) processedElementTypeMap.get(elt.getQName());
- metainfHolder.registerMapping(referencedQName,
- schemaTypeQName,
- clazzName,
- ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
- SchemaConstants.ARRAY_TYPE :
- SchemaConstants.ELEMENT_TYPE);
- }
- }
-
- if (elt.getRefName()!=null) { //probably this is referenced
- referencedQName = elt.getRefName();
- boolean arrayStatus = ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue();
- String clazzName = findRefClassName(referencedQName,arrayStatus);
- if(clazzName == null) {
- clazzName = findClassName(referencedQName,arrayStatus);
- }
- XmlSchemaElement refElement = getReferencedElement(parentSchema, referencedQName);
-
- // register the mapping if we found the referenced element
- // else throw an exception
- if (refElement != null) {
- metainfHolder.registerMapping(referencedQName,
- refElement.getSchemaTypeName()
- , clazzName,
- arrayStatus ?
- SchemaConstants.ARRAY_TYPE :
- SchemaConstants.ELEMENT_TYPE);
- } else {
- if(referencedQName.equals(SchemaConstants.XSD_SCHEMA)) {
- metainfHolder.registerMapping(referencedQName,
- null,
- DEFAULT_CLASS_NAME,
- SchemaConstants.ANY_TYPE);
- } else {
- throw new SchemaCompilationException(SchemaCompilerMessages.getMessage("schema.referencedElementNotFound",referencedQName.toString()));
- }
- }
- }
-
- if(referencedQName == null) {
- throw new SchemaCompilationException(SchemaCompilerMessages.getMessage("schema.emptyName"));
- }
-
- //register the occurence counts
- metainfHolder.addMaxOccurs(referencedQName, elt.getMaxOccurs());
- metainfHolder.addMinOccurs(referencedQName, elt.getMinOccurs());
- //we need the order to be preserved. So record the order also
- if (order) {
- //record the order in the metainf holder
- Integer integer = (Integer) elementOrderMap.get(elt);
- metainfHolder.registerQNameIndex(referencedQName,
- startingItemNumberOrder + integer.intValue());
- }
-
- //get the nillable state and register that on the metainf holder
- if (localNillableList.contains(elt.getQName())){
- metainfHolder.registerNillableQName(elt.getQName());
- }
-
- //get the binary state and add that to the status map
- if (isBinary(elt)){
- metainfHolder.addtStatus(elt.getQName(),
- SchemaConstants.BINARY_TYPE);
- }
- // process the XMLSchemaAny
- }else if (child instanceof XmlSchemaAny){
- XmlSchemaAny any = (XmlSchemaAny)child;
-
- //since there is only one element here it does not matter
- //for the constant. However the problem occurs if the users
- //uses the same name for an element decalration
- QName anyElementFieldName = new QName(ANY_ELEMENT_FIELD_NAME);
-
- //this can be an array or a single element
- boolean isArray = ((Boolean) processedElementArrayStatusMap.get(any)).booleanValue();
- metainfHolder.registerMapping(anyElementFieldName,
- null,
- isArray?DEFAULT_CLASS_ARRAY_NAME:DEFAULT_CLASS_NAME,
- SchemaConstants.ANY_TYPE);
- //if it's an array register an extra status flag with the system
- if (isArray){
- metainfHolder.addtStatus(anyElementFieldName,
- SchemaConstants.ARRAY_TYPE);
- }
- metainfHolder.addMaxOccurs(anyElementFieldName,any.getMaxOccurs());
- metainfHolder.addMinOccurs(anyElementFieldName,any.getMinOccurs());
-
- if (order) {
- //record the order in the metainf holder for the any
- Integer integer = (Integer) elementOrderMap.get(any);
- metainfHolder.registerQNameIndex(anyElementFieldName,
- startingItemNumberOrder + integer.intValue());
- }
- }
- }
-
- //set the ordered flag in the metainf holder
- metainfHolder.setOrdered(order);
- }
-
- private XmlSchemaType getType(XmlSchema schema, QName schemaTypeName) throws SchemaCompilationException {
- schema = resolveParentSchema(schemaTypeName, schema);
- XmlSchemaType typeByName = schema.getTypeByName(schemaTypeName);
- if (typeByName == null) {
- // The referenced element seems to come from an imported
- // schema.
- XmlSchemaObjectCollection includes = schema.getIncludes();
- if (includes != null) {
- Iterator tempIterator = includes.getIterator();
- while (tempIterator.hasNext()) {
- Object o = tempIterator.next();
- XmlSchema inclSchema = null;
- if (o instanceof XmlSchemaImport) {
- inclSchema = ((XmlSchemaImport) o).getSchema();
- if(inclSchema == null) {
- inclSchema = (XmlSchema) loadedSchemaMap.get(((XmlSchemaImport) o).getNamespace());
- }
- }
- if (o instanceof XmlSchemaInclude) {
- inclSchema = ((XmlSchemaInclude) o).getSchema();
- }
- // get the element from the included schema
- if (inclSchema != null) {
- typeByName = inclSchema.getTypeByName(schemaTypeName);
- }
- if (typeByName != null) {
- // we found the referenced element an can break the loop
- break;
- }
- }
- }
- }
- return typeByName;
- }
-
- private XmlSchemaElement getReferencedElement(XmlSchema parentSchema, QName referencedQName) {
- XmlSchemaElement refElement = parentSchema.getElementByName(referencedQName);
- if (refElement == null) {
- // The referenced element seems to come from an imported
- // schema.
- XmlSchemaObjectCollection includes = parentSchema.getIncludes();
- if (includes != null) {
- Iterator tempIterator = includes.getIterator();
- while (tempIterator.hasNext()) {
- Object o = tempIterator.next();
- XmlSchema inclSchema = null;
- if (o instanceof XmlSchemaImport) {
- inclSchema = ((XmlSchemaImport) o).getSchema();
- if(inclSchema == null) {
- inclSchema = (XmlSchema) loadedSchemaMap.get(((XmlSchemaImport) o).getNamespace());
- }
- }
- if (o instanceof XmlSchemaInclude) {
- inclSchema = ((XmlSchemaInclude) o).getSchema();
- }
- // get the element from the included schema
- if (inclSchema != null) {
- refElement = inclSchema.getElementByName(referencedQName);
- }
- if (refElement != null) {
- // we found the referenced element an can break the loop
- break;
- }
- }
- }
- }
- return refElement;
- }
- /**
- * Checks whether a given element is a binary element
- * @param elt
- */
- private boolean isBinary(XmlSchemaElement elt) {
- return elt.getSchemaType()!=null &&
- SchemaConstants.XSD_BASE64.equals(elt.getSchemaType().getQName());
- }
-
- /**
- * Checks whether a given qname is a binary
- * @param qName
- */
- private boolean isBinary(QName qName) {
- return qName!=null &&
- SchemaConstants.XSD_BASE64.equals(qName);
- }
-
- /**
- * Handle the simple content
- *
- * @param simpleType
- */
- private void processSimpleSchemaType(XmlSchemaSimpleType simpleType,
- XmlSchemaElement xsElt,
- XmlSchema parentSchema) throws SchemaCompilationException{
-
- if (processedTypemap.containsKey(simpleType.getQName())
- || baseSchemaTypeMap.containsKey(simpleType.getQName())) {
- return;
- }
-
- String fullyQualifiedClassName = null;
- if(simpleType.getQName() != null) {
- // Must do this up front to support recursive types
- fullyQualifiedClassName = writer.makeFullyQualifiedClassName(simpleType.getQName());
- // we put the qname to processed type map it is only named type
- // otherwise we have to any way process that element.
- processedTypemap.put(simpleType.getQName(), fullyQualifiedClassName);
- } else {
- fullyQualifiedClassName = writer.makeFullyQualifiedClassName(xsElt.getQName());
- simpleType.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.FAKE_QNAME,
- new QName(xsElt.getQName().getNamespaceURI(), xsElt.getQName().getLocalPart()));
- }
-
-
-
- //register that in the schema metainfo bag
- simpleType.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
- fullyQualifiedClassName);
-
- BeanWriterMetaInfoHolder metaInfHolder = processSimpleType(simpleType, parentSchema);
- metaInfHolder.setSimple(true);
-
- if(simpleType.getQName() == null) {
- this.processedAnonymousComplexTypesMap.put(xsElt, metaInfHolder);
- simpleTypesMap.put(new QName(xsElt.getQName().getNamespaceURI(), xsElt.getQName().getLocalPart()), fullyQualifiedClassName);
- }
- //add this information to the metainfo holder
- metaInfHolder.setOwnQname(simpleType.getQName());
- if(fullyQualifiedClassName != null) {
- metaInfHolder.setOwnClassName(fullyQualifiedClassName);
- }
- //write the class. This type mapping would have been populated right now
- //Note - We always write classes for named complex types
- writeSimpleType(simpleType, metaInfHolder);
- }
-
- private BeanWriterMetaInfoHolder processSimpleType(XmlSchemaSimpleType simpleType,XmlSchema parentSchema) throws SchemaCompilationException {
- BeanWriterMetaInfoHolder metaInfHolder = new BeanWriterMetaInfoHolder();
-
- // handle the restriction
- XmlSchemaSimpleTypeContent content = simpleType.getContent();
- if (content != null) {
- if (content instanceof XmlSchemaSimpleTypeRestriction) {
- XmlSchemaSimpleTypeRestriction restriction = (XmlSchemaSimpleTypeRestriction) content;
-
- QName baseTypeName = restriction.getBaseTypeName();
- //check whether the base type is one of the base schema types
- if (baseSchemaTypeMap.containsKey(baseTypeName)) {
- //process restriction base type
- QName qName = simpleType.getQName();
- if(qName == null) {
- qName = (QName) simpleType.getMetaInfoMap().get(SchemaConstants.SchemaCompilerInfoHolder.FAKE_QNAME);
- }
- processSimpleRestrictionBaseType(qName, restriction.getBaseTypeName(),metaInfHolder);
-
- //process facets
- XmlSchemaObjectCollection facets = restriction.getFacets();
- processFacets(facets,metaInfHolder);
- } else {
- //recurse
- if (restriction.getBaseType() != null) {
- processSimpleSchemaType(restriction.getBaseType(), null, parentSchema);
- }
- }
- }else if (content instanceof XmlSchemaSimpleTypeUnion) {
- //Todo - Handle unions here
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.unsupportedcontenterror","Simple Type Union in " + simpleType.getQName()));
-
- }else if (content instanceof XmlSchemaSimpleTypeList){
- //todo - Handle lists here
- throw new SchemaCompilationException(
- SchemaCompilerMessages.getMessage("schema.unsupportedcontenterror","Simple Type List in " + simpleType.getQName()));
- }
- }
- return metaInfHolder;
- }
-
-
- /**
- * Find whether a given particle is an array. The logic for deciding
- * whether a given particle is an array is depending on their minOccurs
- * and maxOccurs counts. If Maxoccurs is greater than one (1) then the
- * content is an array.
- * Also no higher level element will have the maxOccurs greater than one
- *
- * @param particle
- * @throws SchemaCompilationException
- */
- private boolean isArray(XmlSchemaParticle particle) throws SchemaCompilationException {
- long minOccurs = particle.getMinOccurs();
- long maxOccurs = particle.getMaxOccurs();
-
- if (maxOccurs < minOccurs) {
- throw new SchemaCompilationException();
- } else {
- return (maxOccurs > 1);
- }
-
- }
-
- private String getNextTypeSuffix(){
- if (typeCounter==Integer.MAX_VALUE){
- typeCounter = 0;
- }
- return ("_type" +typeCounter++);
- }
-
-}
+package org.apache.axis2.schema;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.namespace.Constants;
+import org.apache.axis2.schema.i18n.SchemaCompilerMessages;
+import org.apache.axis2.schema.util.SchemaPropertyLoader;
+import org.apache.axis2.schema.writer.BeanWriter;
+import org.apache.axis2.util.SchemaUtil;
+import org.apache.axis2.util.URLProcessor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ws.commons.schema.*;
+
+import javax.xml.namespace.QName;
+import java.util.*;
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+/**
+ * Schema compiler for ADB. Based on WS-Commons schema object model.
+ */
+public class SchemaCompiler {
+
+ private static final Log log = LogFactory.getLog(SchemaCompiler .class);
+
+ private CompilerOptions options;
+ private HashMap processedTypemap;
+
+ //the list of processedElements for the outer elements
+ private HashMap processedElementMap;
+
+ private HashMap processedAnonymousComplexTypesMap;
+
+ //we need this map to keep the referenced elements. these elements need to be kept seperate
+ //to avoid conflicts
+ private HashMap processedElementRefMap;
+ private HashMap simpleTypesMap;
+ private HashMap changedTypeMap;
+
+ // this map is necessary to retain the metainformation of types. The reason why these
+ // meta info 'bags' would be useful later is to cater for the extensions and restrictions
+ // of types
+ private HashMap processedTypeMetaInfoMap;
+
+ //
+ private ArrayList processedElementList;
+
+ //a list of nillable elements - used to generate code
+ //for nillable elements
+ private List nillableElementList;
+ // writee reference
+ private BeanWriter writer = null;
+ private Map baseSchemaTypeMap = null;
+
+ //a map for keeping the already loaded schemas
+ //the key is the targetnamespace and the value is the schema object
+ private Map loadedSchemaMap = new HashMap();
+
+ // A map keeping the available schemas
+ //the key is the targetnamespace and the value is the schema object
+ //this map will be populated when multiple schemas
+ //are fed to the schema compiler!
+ private Map availableSchemaMap = new HashMap();
+
+ private Map loadedSourceURI = new HashMap();
+
+ // a list of externally identified QNames to be processed. This becomes
+ // useful when only a list of external elements need to be processed
+
+ public static final String ANY_ELEMENT_FIELD_NAME = "extraElement";
+ public static final String EXTRA_ATTRIBUTE_FIELD_NAME = "extraAttributes";
+
+ public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
+ public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.axiom.om.OMElement[]";
+
+ public static final String DEFAULT_ATTRIB_CLASS_NAME = OMAttribute.class.getName();
+ public static final String DEFAULT_ATTRIB_ARRAY_CLASS_NAME = "org.apache.axiom.om.OMAttribute[]";
+
+
+ private static int typeCounter = 0;
+
+
+
+
+ /**
+ * @return the processes element map
+ * includes the Qname of the element as the key and a
+ * String representing the fully qualified class name
+ */
+ public HashMap getProcessedElementMap() {
+ return processedElementMap;
+ }
+
+
+ /**
+ * @return a map of Qname vs models. A model can be anything,
+ * ranging from a DOM document to a stream. This is taken from the
+ * writer and the schema compiler has no control over it
+ */
+ public Map getProcessedModelMap() {
+ return writer.getModelMap();
+ }
+
+ /**
+ * Constructor - Accepts a options bean
+ *
+ * @param options
+ */
+ public SchemaCompiler(CompilerOptions options) throws SchemaCompilationException {
+
+ if (options == null) {
+ //create an empty options object
+ this.options = new CompilerOptions();
+ } else {
+ this.options = options;
+ }
+
+ //instantiate the maps
+ processedTypemap = new HashMap();
+ processedElementMap = new HashMap();
+ simpleTypesMap = new HashMap();
+ processedElementList = new ArrayList();
+ processedAnonymousComplexTypesMap = new HashMap();
+ changedTypeMap = new HashMap();
+ processedTypeMetaInfoMap = new HashMap();
+ processedElementRefMap = new HashMap();
+ nillableElementList = new ArrayList();
[... 1662 lines stripped ...]
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org