blob: 0488b9793c572f3e7e4d9b41c5b151d2a8ebf8fa [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.axis2.wsdl.codegen.schema;
import org.apache.axis2.description.AxisMessage;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.namespace.Constants;
import org.apache.axis2.wsdl.SOAPHeaderMessage;
import org.apache.axis2.wsdl.codegen.schema.exception.DummySchemaGenerationException;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.apache.ws.commons.schema.XmlSchemaImport;
import org.apache.ws.commons.schema.XmlSchemaInclude;
import org.apache.ws.commons.schema.XmlSchemaObjectCollection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* this class is used to generate dummy schema with only top level
* elements to support xmlbeans
*/
public class AxisServiceTopElementSchemaGenerator {
private AxisService axisService;
public AxisServiceTopElementSchemaGenerator(AxisService service) {
this.axisService = service;
}
public List getDummySchemaList() throws DummySchemaGenerationException {
Set topElements = getTopElements();
Map schemaMap = getSchemaMap(topElements);
return getXmlSchemaList(schemaMap);
}
public List getXmlSchemaList(Map schemaMap) throws DummySchemaGenerationException {
List xmlSchemaList = new ArrayList();
// creates the builder factory
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
try {
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
XmlSchema xmlSchema;
Element element;
for (Iterator iter = schemaMap.values().iterator(); iter.hasNext();) {
xmlSchema = (XmlSchema) iter.next();
element = xmlSchema.getSchemaElement(document);
XmlSchemaCollection xmlSchemaCollection = new XmlSchemaCollection();
xmlSchemaList.add(xmlSchemaCollection.read(element));
}
} catch (ParserConfigurationException e) {
throw new DummySchemaGenerationException("Can not build the dom tree", e);
}
return xmlSchemaList;
}
public Map getSchemaMap(Set topElements) {
Map schemaMap = new HashMap();
TopElement topElement;
XmlSchema xmlSchema;
XmlElement xmlElement;
NamespacePrefix namespacePrefix = new NamespacePrefix();
for (Iterator iter = topElements.iterator(); iter.hasNext();) {
topElement = (TopElement) iter.next();
xmlSchema = getXmlSchemaForNamespace(topElement.getElementQName().getNamespaceURI(), schemaMap);
if (!xmlSchema.isElementExists(topElement.getElementQName().getLocalPart())) {
if (topElement.getTypeQName() == null) {
//i.e this element is an annonymous complex element
// then we can add this element with out any problem
xmlSchema.addElement(getXmlElement(topElement));
} else if (topElement.getTypeQName().getNamespaceURI().equals(Constants.URI_2001_SCHEMA_XSD)) {
// this element has a standard schema type then we do not have to warry about the type
xmlSchema.addElement(getXmlElement(topElement));
} else {
// then we have an element with a complex type.
// first creates the complex type if it is note exists
XmlSchema complexElementSchema =
getXmlSchemaForNamespace(topElement.getTypeQName().getNamespaceURI(), schemaMap);
if (!complexElementSchema.isComplexTypeExists(topElement.getTypeQName().getLocalPart())) {
XmlComplexType xmlComplexType = new XmlComplexType();
xmlComplexType.setName(topElement.getTypeQName().getLocalPart());
xmlComplexType.setNamespace(topElement.getTypeQName().getNamespaceURI());
complexElementSchema.addComplexType(xmlComplexType);
}
// adding the namesapce if not exists.
if (!xmlSchema.getNamespacesPrefixMap()
.containsKey(topElement.getTypeQName().getNamespaceURI())) {
xmlSchema.getNamespacesPrefixMap().put(
topElement.getTypeQName().getNamespaceURI(),
namespacePrefix.getNextNamespacePrefix());
XmlImport xmlImport = new XmlImport();
xmlImport.setTargetNamespace(topElement.getTypeQName().getNamespaceURI());
xmlSchema.addImport(xmlImport);
}
// finally add the namespace
xmlSchema.addElement(getXmlElement(topElement));
}
}
}
return schemaMap;
}
private XmlElement getXmlElement(TopElement topElement) {
XmlElement xmlElement = new XmlElement();
xmlElement.setName(topElement.getElementQName().getLocalPart());
xmlElement.setNamespace(topElement.getElementQName().getNamespaceURI());
xmlElement.setType(topElement.getTypeQName());
return xmlElement;
}
private XmlSchema getXmlSchemaForNamespace(String targetNamespace, Map schemaMap) {
if (!schemaMap.containsKey(targetNamespace)) {
XmlSchema xmlSchema = new XmlSchema(targetNamespace);
schemaMap.put(targetNamespace, xmlSchema);
}
return (XmlSchema) schemaMap.get(targetNamespace);
}
public Set getTopElements() {
Set topSchemaElements = new HashSet();
AxisOperation axisOperation;
AxisMessage axisMessage;
TopElement topElement;
XmlSchemaElement xmlSchemaElement;
SOAPHeaderMessage soapHeaderMessage;
for (Iterator operationIter = axisService.getOperations(); operationIter.hasNext();) {
axisOperation = (AxisOperation) operationIter.next();
for (Iterator messageIter = axisOperation.getMessages(); messageIter.hasNext();) {
axisMessage = (AxisMessage) messageIter.next();
if (axisMessage.getElementQName() != null) {
topElement = new TopElement(axisMessage.getElementQName());
xmlSchemaElement = axisMessage.getSchemaElement();
topElement.setTypeQName(xmlSchemaElement.getSchemaTypeName());
topSchemaElements.add(topElement);
// adding header messages
for (Iterator soapHeaderIter = axisMessage.getSoapHeaders().iterator(); soapHeaderIter.hasNext();) {
soapHeaderMessage = (SOAPHeaderMessage) soapHeaderIter.next();
topElement = new TopElement(soapHeaderMessage.getElement());
topSchemaElements.add(topElement);
xmlSchemaElement = getSchemaElement(soapHeaderMessage.getElement());
topElement.setTypeQName(xmlSchemaElement.getSchemaTypeName());
topSchemaElements.add(topElement);
}
}
}
for (Iterator faultMessagesIter = axisOperation.getFaultMessages().iterator();
faultMessagesIter.hasNext();) {
axisMessage = (AxisMessage) faultMessagesIter.next();
topElement = new TopElement(axisMessage.getElementQName());
xmlSchemaElement = axisMessage.getSchemaElement();
topElement.setTypeQName(xmlSchemaElement.getSchemaTypeName());
topSchemaElements.add(topElement);
}
}
return topSchemaElements;
}
public XmlSchemaElement getSchemaElement(QName elementQName) {
XmlSchemaElement xmlSchemaElement = null;
ArrayList schemas = this.axisService.getSchema();
for (Iterator schemaIter = schemas.iterator(); schemaIter.hasNext();){
xmlSchemaElement = getSchemaElement(
(org.apache.ws.commons.schema.XmlSchema)schemaIter.next(),elementQName);
if (xmlSchemaElement != null){
break;
}
}
return xmlSchemaElement;
}
private XmlSchemaElement getSchemaElement(org.apache.ws.commons.schema.XmlSchema schema,
QName elementQName) {
XmlSchemaElement xmlSchemaElement = null;
if (schema != null) {
xmlSchemaElement = schema.getElementByName(elementQName);
if (xmlSchemaElement == null) {
// try to find in an import or an include
XmlSchemaObjectCollection includes = schema.getIncludes();
if (includes != null) {
Iterator includesIter = includes.getIterator();
Object object;
while (includesIter.hasNext()) {
object = includesIter.next();
if (object instanceof XmlSchemaImport) {
org.apache.ws.commons.schema.XmlSchema schema1 =
((XmlSchemaImport) object).getSchema();
xmlSchemaElement = getSchemaElement(schema1,elementQName);
}
if (object instanceof XmlSchemaInclude) {
org.apache.ws.commons.schema.XmlSchema schema1 =
((XmlSchemaInclude) object).getSchema();
xmlSchemaElement = getSchemaElement(schema1,elementQName);
}
if (xmlSchemaElement != null){
break;
}
}
}
}
}
return xmlSchemaElement;
}
}