blob: b2b54a6034d772f06a1a330b20a6fcc94e390b8d [file] [log] [blame]
/**
* 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.ws.commons.schema.walker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaAttribute;
import org.apache.ws.commons.schema.XmlSchemaAttributeGroup;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.apache.ws.commons.schema.XmlSchemaGroup;
import org.apache.ws.commons.schema.XmlSchemaType;
/**
* A class that allows XmlSchemas to be stored, indexed by a String which is the schema's target namespace.
* Multiple schemas are allowed for each namespace.
* It provides methods that allow all schemas for a given namespace to be searched, for example when the caller
* wishes to find an xsd type defined for a particular namespace.
**/
class SchemasByNamespace {
/**
* the map of namespaces to a list of XmlSchemas
*/
private final Map<String, List<XmlSchema>> mData = new HashMap<String, List<XmlSchema>>();
/**
* Associates an XmlSchema with a namespace
* @param aNamespace the namespace in question
* @param aSchema a schema with aNamespace as its target
*/
public void addSchema(String aNamespace, XmlSchema aSchema) {
if (aNamespace == null) {
aNamespace = "";
}
List<XmlSchema> value = mData.get(aNamespace);
if (value == null) {
value = new ArrayList<XmlSchema>();
mData.put(aNamespace, value);
}
value.add(aSchema);
}
/**
* Returns a List of XmlSchemas that have been associated with the given namespace using addSchema(...).
* @param aNamespace the namespace in question
* @return a List of XmlSchemas which target aNamespace
*/
public XmlSchema[] getSchemas(String aNamespace) {
if (aNamespace == null) {
aNamespace = "";
}
List<XmlSchema> l = mData.get(aNamespace);
return l == null ? new XmlSchema[0] : l.toArray(new XmlSchema[l.size()]);
}
/**
* Returns an XmlSchemaType with the given QName.
* The namespace defined by the name is used to find the schema in which the type is defined, and thus the type itself.
* @param aTypeName the name of the type, which must return the correct value for aTypeName.getNamespaceURI().
* @return the XmlSchemaType with name aTypeName or null if no such type is found
*/
public XmlSchemaType getTypeByName(QName aTypeName) {
XmlSchema[] schemas = getSchemas(aTypeName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaType t = s.getTypeByName(aTypeName);
if (t != null) {
return t;
}
}
return null;
}
/**
* Returns an XmlSchemaGroup with the given QName.
* The namespace defined by the name is used to find the schema in which the group is defined, and thus the group itself.
* @param aGroupName the name of the group, which must return the correct value for aGroupName.getNamespaceURI().
* @return the XmlSchemaGroup with name aGroupName or null if no such group is found
*/
public XmlSchemaGroup getGroupByName(QName aGroupName) {
XmlSchema[] schemas = getSchemas(aGroupName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaGroup g = s.getGroupByName(aGroupName);
if (g != null) {
return g;
}
}
return null;
}
/**
* Returns an XmlSchemaAttribute with the given QName.
* The namespace defined by the name is used to find the schema in which the attribute is defined, and thus the attribute itself.
* @param aAttName the name of the attribute, which must return the correct value for aAttName.getNamespaceURI().
* @return the XmlSchemaAttribute with name aAttName or null if no such attribute is found
*/
public XmlSchemaAttribute getAttributeByName(QName aAttName) {
XmlSchema[] schemas = getSchemas(aAttName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaAttribute a = s.getAttributeByName(aAttName);
if (a != null) {
return a;
}
}
return null;
}
/**
* Returns an XmlSchemaAttributeGroup with the given QName.
* The namespace defined by the name is used to find the schema in which the attribute group is defined, and thus the attribute group itself.
* @param aAGName the name of the attribute group, which must return the correct value for aAGName.getNamespaceURI().
* @return the XmlSchemaAttributeGroup with name aAGName or null if no such attribute group is found
*/
public XmlSchemaAttributeGroup getAttributeGroupByName(QName aAGName) {
XmlSchema[] schemas = getSchemas(aAGName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaAttributeGroup ag = s.getAttributeGroupByName(aAGName);
if (ag != null) {
return ag;
}
}
return null;
}
/**
* Returns an XmlSchemaElement with the given QName.
* The namespace defined by the name is used to find the schema in which the element is defined, and thus the element itself.
* @param aElementName the name of the element, which must return the correct value for aElementName.getNamespaceURI().
* @return the XmlSchemaElement with name aElementName or null if no such element is found
*/
public XmlSchemaElement getElementByName(QName aElementName) {
XmlSchema[] schemas = getSchemas(aElementName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaElement e = s.getElementByName(aElementName);
if (e != null) {
return e;
}
}
return null;
}
/**
* Returns an XmlSchema which includes an element with the given QName.
* The namespace defined by the name is used to find the schema in which the element is defined.
* @param aElementName the name of the element, which must return the correct value for aElementName.getNamespaceURI().
* @return the XmlSchema which includes the element with name aElementName or null if no such schema is found
*/
public XmlSchema getSchemaDefiningElement(QName aElementName) {
XmlSchema[] schemas = getSchemas(aElementName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaElement e = s.getElementByName(aElementName);
if (e != null) {
return s;
}
}
return null;
}
/**
* Returns an XmlSchema which includes an attribute with the given QName.
* The namespace defined by the name is used to find the schema in which the attribute is defined.
* @param aAttName the name of the attribute, which must return the correct value for aAttName.getNamespaceURI().
* @return the XmlSchema which includes the attribute with name aAttName or null if no such schema is found
*/
public XmlSchema getSchemaDefiningAttribute(QName aAttName) {
XmlSchema[] schemas = getSchemas(aAttName.getNamespaceURI());
for (XmlSchema s : schemas) {
XmlSchemaAttribute a = s.getAttributeByName(aAttName);
if (a != null) {
return s;
}
}
return null;
}
/**
* Returns the first XmlSchema added with the given namespace, using addSchema(...)
* @param aNamespace the namespace in question
* @return the XmlSchema first added with aNamespace
*/
public XmlSchema getFirstSchema(String aNamespace) {
XmlSchema[] schemas = getSchemas(aNamespace);
if (schemas.length > 0) {
return schemas[0];
} else {
return null;
}
}
}