blob: 026c1fe9beaae73790a9cf3eb73f75e968b31ac9 [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.util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.wsdl.Definition;
import javax.wsdl.Import;
import javax.wsdl.Types;
import javax.wsdl.extensions.ExtensibilityElement;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
/**
* This class provides support for processing a WSDL4J defintion which includes imports.
* It allows the imports to be processed into a single WSDL4J Definition object
*/
public class WSDL4JImportedWSDLHelper {
protected static final Log log = LogFactory.getLog(WSDL4JImportedWSDLHelper.class);
private static final boolean isTraceEnabled = log.isTraceEnabled();
/**
* The intention of this procedure is to process the imports. When
* processing the imports the imported documents will be populating the
* items in the main document recursivley
*
* @param wsdl4JDefinition
*/
public static void processImports(Definition wsdl4JDefinition,
List processedDocuments) {
Map wsdlImports = wsdl4JDefinition.getImports();
if (null != wsdlImports && !wsdlImports.isEmpty()) {
Collection importsCollection = wsdlImports.values();
for (Iterator iterator = importsCollection.iterator(); iterator
.hasNext();) {
Vector values = (Vector) iterator.next();
for (int i = 0; i < values.size(); i++) {
Import wsdlImport = (Import) values.elementAt(i);
if (wsdlImport.getDefinition() != null) {
Definition importedDef = wsdlImport.getDefinition();
if (importedDef != null) {
String key = importedDef.getDocumentBaseURI();
if (key == null) {
key = importedDef.getTargetNamespace();
}
// stop recursive imports!
if (processedDocuments.contains(key)) {
return;
}
processedDocuments.add(key);
processImports(importedDef,
processedDocuments);
// copy ns
Map namespaces = importedDef.getNamespaces();
Iterator keys = namespaces.keySet().iterator();
while (keys.hasNext()) {
Object key2 = keys.next();
if (!wsdl4JDefinition.getNamespaces()
.containsValue(namespaces.get(key2))) {
wsdl4JDefinition.getNamespaces().put(key2,
namespaces.get(key2));
}
}
wsdl4JDefinition.getNamespaces().putAll(namespaces);
// copy types
Types t = importedDef.getTypes();
if (t != null) {
List typesList = t.getExtensibilityElements();
for (int j = 0; j < typesList.size(); j++) {
Types types = wsdl4JDefinition.getTypes();
if (types == null) {
types = wsdl4JDefinition.createTypes();
wsdl4JDefinition.setTypes(types);
}
types.addExtensibilityElement((ExtensibilityElement) typesList
.get(j));
}
}
// add messages
Map messagesMap = importedDef.getMessages();
wsdl4JDefinition.getMessages().putAll(messagesMap);
// add portypes
Map porttypeMap = importedDef.getPortTypes();
wsdl4JDefinition.getPortTypes().putAll(porttypeMap);
// add bindings
Map bindingMap = importedDef.getBindings();
wsdl4JDefinition.getBindings().putAll(bindingMap);
// add services
Map serviceMap = importedDef.getServices();
wsdl4JDefinition.getServices().putAll(serviceMap);
List extElementList = importedDef
.getExtensibilityElements();
wsdl4JDefinition.getExtensibilityElements().addAll(
extElementList);
}
}
}
}
}
}
}