Package org.wso2.carbon.mediation.initializer

Source Code of org.wso2.carbon.mediation.initializer.RegistryXmlSchemaURIResolver

/*
* 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.ArrayList;
import java.util.Iterator;
import java.util.List;
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.mediators.Value;
import org.apache.synapse.util.jaxp.SchemaResourceLSInput;
import org.apache.synapse.util.resolver.ResourceMap;
import org.apache.synapse.util.resolver.UserDefinedXmlSchemaURIResolver;
import org.w3c.dom.ls.LSInput;
import org.xml.sax.InputSource;

/**
* Adapting the schemas' Relativepath to the registry actual path
**/

public class RegistryXmlSchemaURIResolver implements UserDefinedXmlSchemaURIResolver {
  private String wsdlKey;
  private ResourceMap resourceMap;
  private SynapseConfiguration synCfg;
  private List<Value> schemaRegKeys = new ArrayList<Value>();
 
  private static final Log log = LogFactory.getLog(RegistryXmlSchemaURIResolver.class);

  public void init(ResourceMap resourceMap, SynapseConfiguration synCfg, String wsdlKey) {
    this.resourceMap = resourceMap;
    this.synCfg = synCfg;
    this.wsdlKey = wsdlKey;

  }
 
  public void init(ResourceMap resourceMap, SynapseConfiguration synCfg, List<Value> schemaRegKeys) {
    this.resourceMap = resourceMap;
    this.synCfg = synCfg;
    this.schemaRegKeys = schemaRegKeys;

  }
  /**
   * Resolve a schema 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 resolveEntity(String targetNamespace, String schemaLocation, String baseUri) {

    InputSource result = null;

    if (resourceMap != null) {
      result = resourceMap.resolve(synCfg, schemaLocation);
    }

    if (result == null && wsdlKey != null) {
      if (log.isDebugEnabled()) {
        log.info("Starting to resolve schema " + schemaLocation +
                 " 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();) {
          String key = (String) i.next();
          String value = dependencyMap.get(key);
          String constructedPath =
                                   regWSDLDep.constructRegistryPathToRelativePath(schemaLocation);

          if (value.endsWith(constructedPath)) {
            if (resourceMap == null) {
              resourceMap = new ResourceMap();
            }
            resourceMap.addResource(schemaLocation, value);
            break;
          }
        }
        result = resourceMap.resolve(synCfg, schemaLocation);
      }
    } else if (result == null) {
      result =
               new InputSource(SynapseConfigUtils.resolveRelativeURI(baseUri, schemaLocation));
    }
    return result;

  }

  /**
   * Used in validate mediator to validate the schemas
   *
   * @param type
   *            The type of the resource being resolved. For XML [XML 1.0]
   *            resources (i.e. entities), applications must use the value
   *            "http://www.w3.org/TR/REC-xml". For XML Schema [XML Schema
   *            Part 1] , applications must use the value
   *            "http://www.w3.org/2001/XMLSchema". Other types of resources
   *            are outside the scope of this specification and therefore
   *            should recommend an absolute URI in order to use this method.
   * @param namespaceURI
   *            The namespace of the resource being resolved, e.g. the
   *            target namespace of the XML Schema [XML Schema Part 1] when
   *            resolving XML Schema resources.
   * @param publicId
   *            The public identifier of the external entity being
   *            referenced, or null if no public identifier was supplied or if
   *            the resource is not an entity.
   * @param systemId
   *            The system identifier, a URI reference [IETF RFC 2396], of
   *            the external resource being referenced, or null if no system
   *            identifier was supplied.
   * @param baseURI
   *            The absolute base URI of the resource being parsed, or null
   *            if there is no base URI.
   *
   * @return A LSInput,
   *         object describing the new input source, or null to
   *         request that the parser open a regular URI connection to the
   *         resource.
   *
   */
  public LSInput resolveResource(String type, String namespaceURI, String publicId,
                                 String systemId, String baseURI) {
 
    InputSource inputSource = null;
    if (log.isDebugEnabled()) {
      log.debug("Resolving Schema resource " + systemId);
    }

    // check with the registry schema resolver
    if (resourceMap == null) {
      for (int i = 0; i < schemaRegKeys.size(); i++) {
        RegistryDependency regWSDLDep =
                                        new RegistryDependency(schemaRegKeys.get(i)
                                                                            .getKeyValue());
        Map<String, String> dependencyMap = regWSDLDep.getDependencies();
        if (dependencyMap.size()>0) {
          Set<String> keys = dependencyMap.keySet();
          for (Iterator<String> itr = keys.iterator(); itr.hasNext();) {
            String key = (String) itr.next();
            String value = dependencyMap.get(key);
            String constructedPath =
                                     regWSDLDep.constructRegistryPathToRelativePath(systemId);

            if (value.endsWith(constructedPath)) {
              if (resourceMap == null) {
                resourceMap = new ResourceMap();
              }
              resourceMap.addResource(systemId, value);
              break;
            }
          }
          inputSource = resourceMap.resolve(synCfg, systemId);
        } else {
          // It comes here since there is no any other 'include'
          // schemas.
          // We need to resolve this schema(base schema without any
          // includes) also.
          resourceMap.addResource(systemId, schemaRegKeys.get(i).getKeyValue());
        }
      }

    } else {
      inputSource = resourceMap.resolve(synCfg, systemId);
    }
    if (inputSource == null) {
      log.warn("Unable to resolve schema resource " + systemId);
      return null;
    }
    SchemaResourceLSInput schemaResourceLSInput = new SchemaResourceLSInput();
    schemaResourceLSInput.setByteStream(inputSource.getByteStream());
    return schemaResourceLSInput;
  }
}
TOP

Related Classes of org.wso2.carbon.mediation.initializer.RegistryXmlSchemaURIResolver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.