/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* 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.
*/
package org.wso2.carbon.mediation.initializer;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.config.SynapseConfigUtils;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.util.resolver.ResourceMap;
import org.apache.synapse.util.resolver.UserDefinedWSDLLocator;
import org.xml.sax.InputSource;
/**
* If imports present in wsdl , instead of providing
* ResourceMap(relativeloaction, registrylocation of the resources) from the
* client side this class will resolve the imported rsources against the wsdl
* key
*/
public class RegistryWSDLLocator implements UserDefinedWSDLLocator {
private InputSource baseInputSource;
private String baseURI;
private ResourceMap resourceMap;
private String wsdlKey;
private String latestImportURI;
private SynapseConfiguration synCfg;
private static final Log log = LogFactory.getLog(RegistryWSDLLocator.class);
public void init(InputSource baseInputSource, String baseURI, ResourceMap resourceMap,
SynapseConfiguration synCfg, String wsdlKey) {
this.baseInputSource = baseInputSource;
this.baseURI = baseURI;
this.resourceMap = resourceMap;
this.synCfg = synCfg;
this.wsdlKey = wsdlKey;
}
/**
* Resolve a schema or WSDL import.
* This method will first attempt to resolve the location using the
* configured {@link ResourceMap} object. If this fails (because no
* {@link ResourceMap} is
* configured or because
* {@link ResourceMap#resolve(SynapseConfiguration, String)} returns null,
* it will resolve the location using
* {@link SynapseConfigUtils#resolveRelativeURI(String, String)}.
*/
public InputSource getImportInputSource(String parentLocation, String relativeLocation) {
InputSource result = null;
String key = null;
if (resourceMap != null) {
result = resourceMap.resolve(synCfg, relativeLocation);
}
// get the associations related to the parent loaction(using wsdlkey)
if (wsdlKey != null && result == null) {
if (log.isDebugEnabled()) {
log.info("Starting to resolve imported resources " + relativeLocation +
" using the dependencies got from wsdlKey " + wsdlKey);
}
RegistryDependency regWSDLDep = new RegistryDependency(wsdlKey);
Map<String, String> dependencyMap = regWSDLDep.getDependencies();
if (dependencyMap != null) {
Set<String> keys = dependencyMap.keySet();
for (Iterator<String> i = keys.iterator(); i.hasNext();) {
key = (String) i.next();
String value = dependencyMap.get(key);
String constructedPath =
regWSDLDep.constructRegistryPathToRelativePath(relativeLocation);
if (value.endsWith(constructedPath)) {
if (resourceMap == null) {
resourceMap = new ResourceMap();
}
resourceMap.addResource(relativeLocation, value);
latestImportURI = relativeLocation;
break;
}
}
result = resourceMap.resolve(synCfg, relativeLocation);
}
} else if (result == null) {
String location =
SynapseConfigUtils.resolveRelativeURI(parentLocation,
relativeLocation);
result = new InputSource(location);
latestImportURI = location;
} else {
latestImportURI = relativeLocation;
}
return result;
}
public String getLatestImportURI() {
return latestImportURI;
}
public InputSource getBaseInputSource() {
return baseInputSource;
}
public String getBaseURI() {
return baseURI;
}
public void close() {
}
}