org.wso2.carbon.registry.extensions.handlers.utils.WSDLProcessor.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.registry.extensions.handlers.utils.WSDLProcessor.java

Source

/*
 * Copyright (c) 2008, 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.registry.extensions.handlers.utils;

import com.ibm.wsdl.util.xml.DOM2Writer;
import com.ibm.wsdl.xml.WSDLReaderImpl;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.wso2.carbon.registry.core.*;
import org.wso2.carbon.registry.core.config.RegistryContext;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.jdbc.handlers.RequestContext;
import org.wso2.carbon.registry.core.session.CurrentSession;
import org.wso2.carbon.registry.core.utils.RegistryUtils;
import org.wso2.carbon.registry.extensions.services.Utils;
import org.wso2.carbon.registry.extensions.utils.CommonConstants;
import org.wso2.carbon.registry.extensions.utils.CommonUtil;
import org.wso2.carbon.registry.extensions.utils.WSDLUtil;
import org.wso2.carbon.registry.extensions.utils.WSDLValidationInfo;
import org.xml.sax.InputSource;

import javax.wsdl.*;
import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.wsdl.xml.WSDLWriter;
import javax.xml.namespace.QName;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;

public class WSDLProcessor {
    private Registry registry;
    private Registry systemRegistry;
    private Definition originalDefinition;
    private List<Association> associations;
    private SchemaProcessor schemaProcessor;
    private int i;

    private String resourceName;

    public static final String IMPORT_TAG = "import";
    public static final String INCLUDE_TAG = "include";
    private static final String SAMPLE_BASE_URL = "http://this.wsdl.needs/a/valid/url/to/proceed.wsdl";

    private static String commonWSDLLocation;
    private static String commonSchemaLocation;
    private static String commonPolicyLocation;

    private List<String> visitedWSDLs;
    private List<String> processedWSDLs;
    private Map<String, WSDLInfo> wsdls;

    private WSDLValidationInfo wsdlValidationInfo = null;
    private WSDLValidationInfo wsiValidationInfo = null;

    private boolean hasWSDLImports = false;

    private static Log log = LogFactory.getLog(WSDLProcessor.class);

    private static InheritableThreadLocal<Set<String>> importedWSDLs = new InheritableThreadLocal<Set<String>>() {
        protected Set<String> initialValue() {
            return new ConcurrentSkipListSet<String>();
        }
    };

    public static void loadImportedWSDLMap() {
        importedWSDLs.get();
    }

    public static void clearImportedWSDLMap() {
        importedWSDLs.remove();
    }

    public boolean getCreateService() {
        return createService;
    }

    public void setCreateService(boolean createService) {
        this.createService = createService;
    }

    private boolean createService = true;

    private boolean createSOAPService = true;

    public boolean isCreateSOAPService() {
        return createSOAPService;
    }

    public void setCreateSOAPService(boolean createSOAPService) {
        this.createSOAPService = createSOAPService;
    }

    public WSDLProcessor(RequestContext requestContext) {
        this.registry = requestContext.getRegistry();
        try {
            this.systemRegistry = CommonUtil.getUnchrootedSystemRegistry(requestContext);
            if (!systemRegistry.resourceExists(getChrootedSchemaLocation(requestContext.getRegistryContext()))) {
                systemRegistry.put(getChrootedSchemaLocation(requestContext.getRegistryContext()),
                        systemRegistry.newCollection());
            }
            if (!systemRegistry.resourceExists(getChrootedWSDLLocation(requestContext.getRegistryContext()))) {
                systemRegistry.put(getChrootedWSDLLocation(requestContext.getRegistryContext()),
                        systemRegistry.newCollection());
            }
        } catch (RegistryException ignore) {
            this.systemRegistry = null;
        }
        i = 0;
        associations = new ArrayList<Association>();
        visitedWSDLs = new ArrayList<String>();
        processedWSDLs = new ArrayList<String>();
        schemaProcessor = buildSchemaProcessor(requestContext, null);
        wsdls = new LinkedHashMap<String, WSDLInfo>();
        resourceName = "";
    }

    public WSDLProcessor(RequestContext requestContext, boolean useOriginalSchema) {
        this(requestContext);
        schemaProcessor = buildSchemaProcessor(requestContext, null, useOriginalSchema);
    }

    public static void setCommonWSDLLocation(String commonWSDLLocation) {
        WSDLProcessor.commonWSDLLocation = commonWSDLLocation;
    }

    public static void setCommonSchemaLocation(String commonSchemaLocation) {
        WSDLProcessor.commonSchemaLocation = commonSchemaLocation;
    }

    public static void setCommonPolicyLocation(String commonPolicyLocation) {
        WSDLProcessor.commonPolicyLocation = commonPolicyLocation;
    }

    public static String getChrootedWSDLLocation(RegistryContext registryContext) {
        return RegistryUtils.getAbsolutePath(registryContext,
                RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH + WSDLProcessor.commonWSDLLocation);
    }

    private String getChrootedSchemaLocation(RegistryContext registryContext) {
        return RegistryUtils.getAbsolutePath(registryContext,
                RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH + commonSchemaLocation);
    }

    private String getChrootedPolicyLocation(RegistryContext registryContext) {
        return RegistryUtils.getAbsolutePath(registryContext,
                RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH + commonPolicyLocation);
    }

    private String getChrootedServiceLocation(Registry registry, RegistryContext registryContext) {
        return RegistryUtils.getAbsolutePath(registryContext, registry.getRegistryContext().getServicePath()); // service path contains the base 
    }

    public String addWSDLToRegistry(RequestContext context, String wsdlURL, Resource metadata, boolean isPut,
            boolean addService, boolean skipValidation, boolean disableSymLinkCreation) throws RegistryException {
        boolean evaluateExports = true;
        boolean isDefaultEnvironment = true;
        String currentWsdlLocation = null;
        String currentSchemaLocation = null;
        String currentPolicyLocation = null;
        String currentEndpointLocation = null;
        String currentEnvironment = null;
        String masterVersion = null;

        List<String> listOfDependencies = new ArrayList<String>();
        String version = context.getResource().getProperty("version");

        if (version == null) {
            version = CommonConstants.WSDL_VERSION_DEFAULT_VALUE;
            context.getResource().setProperty("version", version);
        }

        String resourcePath = context.getResourcePath().getPath();
        resourceName = resourcePath.substring(resourcePath.lastIndexOf(RegistryConstants.PATH_SEPARATOR) + 1);
        RegistryContext registryContext = context.getRegistryContext();
        // 3rd parameter is false, for importing WSDLs.
        evaluateWSDLsToDefinitions(wsdlURL, context, evaluateExports, false, isPut, skipValidation);
        String wsdlPath = "";
        for (WSDLInfo wsdlInfo : wsdls.values()) {
            Definition wsdlDefinition = wsdlInfo.getWSDLDefinition();
            if (wsdlDefinition != null) {
                Types types = wsdlDefinition.getTypes();
                schemaProcessor.evaluateSchemas(types, wsdlDefinition.getDocumentBaseURI(), evaluateExports,
                        wsdlInfo.getSchemaDependencies());
                String wsdlName = wsdlInfo.getProposedRegistryURL();
                int index = wsdlName.lastIndexOf("/");
                String wsdlResourceName = wsdlName.substring(index + 1);

                wsdlPath = getWsdlLocation(context, wsdlDefinition, wsdlResourceName, version);

                /*wsdlPath = (getChrootedWSDLLocation(registryContext) + CommonUtil.
                    derivePathFragmentFromNamespace(wsdlDefinition.getTargetNamespace())).
                    replace("//", "/");
                wsdlPath += version + "/" + wsdlResourceName;*/
                if (!resourcePath.contains(wsdlResourceName)) {
                    wsdlInfo.setProposedRegistryURL(wsdlPath);
                    continue;
                }
                if (!resourcePath.equals(RegistryConstants.PATH_SEPARATOR + wsdlName)
                        & !resourcePath.contains(commonWSDLLocation) & (registry.resourceExists(resourcePath))) {
                    if (currentWsdlLocation == null) {
                        currentEnvironment = resourcePath.substring(0,
                                resourcePath.indexOf(CommonUtil
                                        .derivePathFragmentFromNamespace(wsdlDefinition.getTargetNamespace())
                                        .replace("//", "/")));
                        String[] pathFragments = commonWSDLLocation.split(RegistryConstants.PATH_SEPARATOR);
                        String wsdlLocation = commonWSDLLocation;
                        String schemaLocation = commonSchemaLocation;
                        String policyLocation = commonPolicyLocation;
                        String endpointLocation = EndpointUtils.getEndpointLocation();
                        for (String pathFragment : pathFragments) {
                            wsdlLocation = wsdlLocation.replace(pathFragment, "");
                            if (wsdlLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                                wsdlLocation = wsdlLocation.replaceFirst(RegistryConstants.PATH_SEPARATOR, "");
                            }
                            schemaLocation = schemaLocation.replace(pathFragment, "");
                            if (schemaLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                                schemaLocation = schemaLocation.replaceFirst(RegistryConstants.PATH_SEPARATOR, "");
                            }
                            policyLocation = policyLocation.replace(pathFragment, "");
                            if (policyLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                                policyLocation = policyLocation.replaceFirst(RegistryConstants.PATH_SEPARATOR, "");
                            }
                            endpointLocation = endpointLocation.replace(pathFragment, "");
                            if (endpointLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                                endpointLocation = endpointLocation.replaceFirst(RegistryConstants.PATH_SEPARATOR,
                                        "");
                            }
                            currentEnvironment = currentEnvironment.replace(pathFragment, "");
                        }
                        if (wsdlLocation.endsWith(RegistryConstants.PATH_SEPARATOR)) {
                            wsdlLocation = wsdlLocation.substring(0, wsdlLocation.length() - 1);
                        }
                        if (schemaLocation.endsWith(RegistryConstants.PATH_SEPARATOR)) {
                            schemaLocation = schemaLocation.substring(0, schemaLocation.length() - 1);
                        }
                        if (policyLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                            policyLocation = policyLocation.substring(0, policyLocation.length() - 1);
                        }
                        if (endpointLocation.startsWith(RegistryConstants.PATH_SEPARATOR)) {
                            endpointLocation = endpointLocation.substring(0, endpointLocation.length() - 1);
                        }
                        currentWsdlLocation = currentEnvironment + wsdlLocation;
                        currentSchemaLocation = currentEnvironment + schemaLocation;
                        currentPolicyLocation = currentEnvironment + policyLocation;
                        currentEndpointLocation = currentEnvironment + endpointLocation;

                    }
                    if (masterVersion == null) {
                        String namespaceSegment = CommonUtil
                                .derivePathFragmentFromNamespace(wsdlDefinition.getTargetNamespace())
                                .replace("//", "/");
                        String suffix = resourcePath
                                .substring(resourcePath.indexOf(namespaceSegment) + namespaceSegment.length());
                        masterVersion = suffix.substring(0, suffix.indexOf(RegistryConstants.PATH_SEPARATOR));
                    }
                    wsdlPath = resourcePath;
                    isDefaultEnvironment = false;

                    Association[] associations = registry.getAssociations(wsdlPath, CommonConstants.DEPENDS);
                    for (Association association : associations) {
                        if (association.getSourcePath().equals(wsdlPath)) {
                            listOfDependencies.add(association.getDestinationPath());
                        }
                    }
                }
                wsdlInfo.setProposedRegistryURL(wsdlPath);
            }

        }
        String symlinkLocation = RegistryUtils.getAbsolutePath(context.getRegistryContext(),
                context.getResource().getProperty(RegistryConstants.SYMLINK_PROPERTY_NAME));
        if (symlinkLocation == null
                && !(resourcePath.equals("/") || resourcePath.equals(wsdlPath) || resourcePath.equals(""))) {
            symlinkLocation = RegistryUtils.getParentPath(resourcePath);
        }

        String masterWSDLPath;
        if (!isDefaultEnvironment) {
            schemaProcessor.saveSchemasToRegistry(context, currentSchemaLocation, null, null, masterVersion,
                    listOfDependencies, disableSymLinkCreation);
            updateWSDLSchemaLocations();
            masterWSDLPath = saveWSDLsToRepositoryNew(context, symlinkLocation, metadata, currentEndpointLocation,
                    listOfDependencies, masterVersion, disableSymLinkCreation);// 3rd parameter is false, for importing WSDLs.

            addPolicyImportys(context, version);

            saveAssociations();
        } else {
            schemaProcessor.saveSchemasToRegistry(context, getChrootedSchemaLocation(registryContext), null, null,
                    version, listOfDependencies, disableSymLinkCreation);
            updateWSDLSchemaLocations();

            masterWSDLPath = saveWSDLsToRepositoryNew(context, symlinkLocation, metadata, disableSymLinkCreation);// 3rd parameter is false, for importing WSDLs.

            addPolicyImportys(context, version);

            saveAssociations();
            if (addService && getCreateService()) {
                List<OMElement> serviceContentBeans = createServiceContent(masterWSDLPath, metadata);
                for (OMElement serviceContentBean : serviceContentBeans) {
                    if (isCreateSOAPService()) {
                        CommonUtil.addSoapService(serviceContentBean, context);
                    } else {
                        CommonUtil.addService(serviceContentBean, context);
                    }
                }
            }
        }
        return masterWSDLPath;
    }

    private String getWsdlLocation(RequestContext context, Definition wsdlDefinition, String wsdlResourceName,
            String version) {
        if (Utils.getRxtService() != null) {
            String pathExpression = Utils.getRxtService().getStoragePath(RegistryConstants.WSDL_MEDIA_TYPE);
            pathExpression = CommonUtil.replaceExpressionOfPath(pathExpression, "name", wsdlResourceName);
            String namespace = CommonUtil.derivePathFragmentFromNamespace(wsdlDefinition.getTargetNamespace())
                    .replace("//", "/");
            namespace = namespace.replace(".", "/");
            pathExpression = CommonUtil.replaceExpressionOfPath(pathExpression, "namespace", namespace);
            pathExpression = CommonUtil.getPathFromPathExpression(pathExpression,
                    context.getResource().getProperties(), null);
            pathExpression = pathExpression.replace("//", "/");
            pathExpression = CommonUtil.replaceExpressionOfPath(pathExpression, "version", version);
            String wsdlPath = RegistryUtils.getAbsolutePath(context.getRegistryContext(),
                    pathExpression.replace("//", "/"));
            /**
             * Fix for the REGISTRY-3052 : validation is to check the whether this invoked by ZIPWSDLMediaTypeHandler
             * Setting the registry and absolute paths to current session to avoid incorrect resource path entry in REG_LOG table
             */
            if (CurrentSession.getLocalPathMap() != null
                    && !Boolean.valueOf(CurrentSession.getLocalPathMap().get(CommonConstants.ARCHIEVE_UPLOAD))) {
                wsdlPath = CommonUtil.getRegistryPath(context.getRegistry().getRegistryContext(), wsdlPath);
                CurrentSession.getLocalPathMap().remove(context.getResourcePath().getCompletePath());
                if (log.isDebugEnabled()) {
                    log.debug(
                            "Saving current session local paths, key: " + wsdlPath + " | value: " + pathExpression);
                }
                CurrentSession.getLocalPathMap().put(wsdlPath, pathExpression);
            }
            return wsdlPath;
        } else {
            String wsdlPath = (getChrootedWSDLLocation(context.getRegistryContext())
                    + CommonUtil.derivePathFragmentFromNamespace(wsdlDefinition.getTargetNamespace())).replace("//",
                            "/");
            wsdlPath += version + "/" + wsdlResourceName;
            return wsdlPath;
        }

    }

    private void addPolicyImportys(RequestContext context, String version) throws RegistryException {
        /* storing policyReferences in to Registry if available in the WSDL */
        for (WSDLInfo wsdlInfo : wsdls.values()) {
            if (wsdlInfo.isExistPolicyReferences()) {
                Iterator iter = wsdlInfo.getPolicyDependencies().iterator();
                while (iter.hasNext()) {
                    String policyURL = (String) iter.next();
                    boolean lockAlreadyAcquired = !CommonUtil.isUpdateLockAvailable();
                    CommonUtil.releaseUpdateLock();
                    try {
                        Resource policyResource = registry.newResource();
                        policyResource.setMediaType("application/policy+xml");
                        String path = policyURL
                                .substring(policyURL.lastIndexOf(RegistryConstants.PATH_SEPARATOR) + 1);
                        if (policyURL.lastIndexOf(RegistryConstants.PATH_SEPARATOR) > 0) {
                            policyResource.setProperty("version", version);
                            policyResource.setProperties(copyProperties(context));
                            String policyPath = registry.importResource(path, policyURL, policyResource);
                            registry.addAssociation(policyPath, wsdlInfo.getProposedRegistryURL(),
                                    CommonConstants.USED_BY);
                            registry.addAssociation(wsdlInfo.getProposedRegistryURL(), policyPath,
                                    CommonConstants.DEPENDS);
                        }
                    } finally {
                        if (lockAlreadyAcquired) {
                            CommonUtil.acquireUpdateLock();
                        }
                    }
                }
            }
        }
    }

    /**
     * Get Master WSDL
     * @return  WSDLinfo object of the Master WSDL
     */
    public WSDLInfo getMasterWSDLInfo() {
        for (WSDLInfo wsdlInfo : wsdls.values()) {
            if (wsdlInfo.isMasterWSDL()) {
                return wsdlInfo;
            }
        }
        return null;
    }

    /**
     * Save associations to the registry if they do not exist.
     * Execution time could be improved if registry provides a better way to check existing associations.
     *
     * @throws RegistryException Thrown in case a association cannot be saved
     */
    private void saveAssociations() throws RegistryException {
        // until registry provides a functionality to check existing associations, this method will consume a LOT of time
        for (Association association : associations) {
            boolean isAssociationExist = false;
            Association[] existingAssociations = registry.getAllAssociations(association.getSourcePath());
            if (existingAssociations != null) {
                for (Association currentAssociation : existingAssociations) {
                    if (currentAssociation.getDestinationPath().equals(association.getDestinationPath())
                            && currentAssociation.getAssociationType().equals(association.getAssociationType())) {
                        isAssociationExist = true;
                        break;
                    }
                }
            }
            if (!isAssociationExist) {
                registry.addAssociation(association.getSourcePath(), association.getDestinationPath(),
                        association.getAssociationType());
            }
        }
    }

    /**
     * Extract an appropriate name for the resource from the given URL
     *
     * @param wsdlURL, the URL
     * @param suffix,  the suffix introduced
     * @return resource name
     */
    private String extractResourceFromURL(String wsdlURL, String suffix) {
        String resourceName = wsdlURL;
        if (wsdlURL.indexOf("?") > 0) {
            resourceName = wsdlURL.substring(0, wsdlURL.indexOf("?")) + suffix;
        } else if (wsdlURL.indexOf(".") > 0) {
            resourceName = wsdlURL.substring(0, wsdlURL.lastIndexOf(".")) + suffix;
        } else if (!wsdlURL.endsWith(".wsdl")) {
            resourceName = wsdlURL + suffix;
        }
        return resourceName;
    }

    private void evaluateWSDLsToDefinitions(String wsdlLocation, RequestContext context, boolean evaluateImports,
            boolean isServiceImport, boolean isPut, boolean skipValidation) throws RegistryException {
        WSDLReader wsdlReader;
        Definition wsdlDefinition = null;
        originalDefinition = null;

        try {
            wsdlReader = new ExWSDLReaderImpl((WSDLReaderImpl) WSDLFactory.newInstance().newWSDLReader());
        } catch (WSDLException e) {
            String msg = "Could not initiate the wsdl reader. Caused by: " + e.getMessage();
            throw new RegistryException(msg);
        }

        wsdlReader.setFeature("javax.wsdl.importDocuments", true);
        wsdlReader.setFeature("javax.wsdl.verbose", log.isDebugEnabled());

        try {
            if (isPut) {
                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                        (byte[]) context.getResource().getContent());
                InputSource inputSource = new InputSource(byteArrayInputStream);
                wsdlDefinition = wsdlReader.readWSDL(null, inputSource);
            } else {
                wsdlDefinition = wsdlReader.readWSDL(wsdlLocation);
            }
            originalDefinition = wsdlDefinition;
        } catch (WSDLException e) {
            String msg = "Could not evaluate WSDL Definition.";
            if (e.getCause() instanceof ConnectException || e.getCause() instanceof UnknownHostException) {
                msg += " Unable to resolve imported document at '" + wsdlLocation + "'. Connection refused.";
                log.error(msg, e);
            } else if (e.getCause() instanceof IOException) {
                msg += " This WSDL file or one of its imports was not found.";
                log.error(msg, e);
            }
        }

        if (!isServiceImport) {
            processedWSDLs.add(resourceName);
        }

        Map map = null;
        if (wsdlDefinition != null) {
            map = wsdlDefinition.getImports();
        }
        // We perform validation only if there are no wsdl imports
        if (!skipValidation) {
            if (map != null && map.size() == 0) {
                log.trace("Starting WSDL Validation");
                wsdlValidationInfo = WSDLUtils.validateWSDL(context);
                log.trace("Ending WSDL Validation");
                log.trace("Starting WSI Validation");
                wsiValidationInfo = WSDLUtils.validateWSI(context);
                log.trace("Ending WSI Validation");

            } else {
                hasWSDLImports = true;
            }
        }

        if (wsdlDefinition == null) {
            log.trace("Invalid WSDL definition found.");
            throw new RegistryException("Invalid WSDL definition found.");
        }
        evaluateWSDLsToDefinitionsRecursively(wsdlDefinition, evaluateImports, isServiceImport, null, true);
    }

    private void evaluateWSDLsToDefinitionsRecursively(Definition wsdlDefinition, boolean evaluateImports,
            boolean isServiceImport, WSDLInfo parent, boolean masterWSDL) throws RegistryException {
        WSDLInfo wsdlInfo = new WSDLInfo();
        wsdlInfo.setMasterWSDL(masterWSDL);
        wsdlInfo.setParent(parent);
        if (evaluateImports) {
            Iterator iter = wsdlDefinition.getImports().values().iterator();
            Vector values;
            Import wsdlImport;
            visitedWSDLs.add(wsdlDefinition.getDocumentBaseURI());
            CommonUtil.addImportedArtifact(new File(wsdlDefinition.getDocumentBaseURI()).toString());
            for (; iter.hasNext();) {
                values = (Vector) iter.next();
                for (Object value : values) {
                    wsdlImport = (Import) value;
                    Definition innerDefinition = wsdlImport.getDefinition();
                    if (innerDefinition == null) {
                        continue;
                    }
                    if (innerDefinition.getTargetNamespace() == null) {
                        // if this import was a schema, WSDL4J will not extract the target
                        // namespace.
                        continue;
                    }
                    wsdlInfo.getWSDLDependencies().add(innerDefinition.getDocumentBaseURI());
                    if (!visitedWSDLs.contains(innerDefinition.getDocumentBaseURI())) {
                        evaluateWSDLsToDefinitionsRecursively(innerDefinition, evaluateImports, isServiceImport,
                                wsdlInfo, false);
                    }
                }
            }
        }

        Iterator iter = wsdlDefinition.getBindings().values().iterator();
        while (iter.hasNext()) {
            Binding binding = (Binding) iter.next();
            if (binding.getBindingPolicyReference() != null) {
                wsdlInfo.setExistPolicyReferences(true);
                wsdlInfo.getPolicyDependencies().add(binding.getBindingPolicyReference().getURI());
            }
        }

        String baseURI = wsdlDefinition.getDocumentBaseURI();
        String fileNameToSave;
        if (baseURI != null) {
            String wsdlFileName = baseURI.substring(baseURI.lastIndexOf(RegistryConstants.PATH_SEPARATOR) + 1);
            if ((baseURI.equals(originalDefinition.getDocumentBaseURI())) && (!isServiceImport)) {
                fileNameToSave = extractResourceFromURL(resourceName, ".wsdl");
            } else {
                fileNameToSave = extractResourceFromURL(wsdlFileName, ".wsdl");
                while (processedWSDLs.contains(fileNameToSave)) {
                    fileNameToSave = extractResourceFromURL(wsdlFileName, (++i) + ".wsdl");
                }
            }
            wsdlInfo.setOriginalURL(baseURI);
        } else {
            // This is taken from the file system. So, no base URI is available for the wsdl. 
            fileNameToSave = extractResourceFromURL(resourceName, ".wsdl");
            wsdlInfo.setOriginalURL(SAMPLE_BASE_URL);
            wsdlDefinition.setDocumentBaseURI(SAMPLE_BASE_URL);
        }

        wsdlInfo.setWSDLDefinition(wsdlDefinition);
        wsdlInfo.setProposedRegistryURL(fileNameToSave);
        wsdls.put(baseURI, wsdlInfo);
        processedWSDLs.add(fileNameToSave);
    }

    /**
     * Change all schema path locations to registry locations in each WSDL definitions
     * @throws org.wso2.carbon.registry.core.exceptions.RegistryException Thrown in case the schema
     * locations cannot be updated
     */
    private void updateWSDLSchemaLocations() throws RegistryException {
        updateWSDLocations();
        for (WSDLInfo wsdlInfo : wsdls.values()) {
            Definition definition = wsdlInfo.getWSDLDefinition();
            Types types = definition.getTypes();
            if (types != null) {
                List extensibleElements = types.getExtensibilityElements();
                Schema schemaExtension;
                Object extensionObject;
                for (Object extensibleElement : extensibleElements) {
                    extensionObject = extensibleElement;
                    if (extensionObject instanceof Schema) {
                        // first get the schema object
                        schemaExtension = (Schema) extensionObject;
                        NodeList nodeList = schemaExtension.getElement().getChildNodes();
                        String tagName;
                        for (int i = 0; i < nodeList.getLength(); i++) {
                            tagName = nodeList.item(i).getLocalName();
                            if (IMPORT_TAG.equals(tagName) || INCLUDE_TAG.equals(tagName)) {
                                NamedNodeMap nodeMap = nodeList.item(i).getAttributes();
                                Node attribute;
                                String attributeValue;
                                for (int j = 0; j < nodeMap.getLength(); j++) {
                                    attribute = nodeMap.item(j);
                                    if (attribute.getNodeName().equals("schemaLocation")) {
                                        attributeValue = attribute.getNodeValue();
                                        String schemaPath = schemaProcessor.getSchemaRegistryPath(
                                                wsdlInfo.getProposedRegistryURL(), attributeValue);
                                        if (schemaPath != null) {
                                            attribute.setNodeValue(schemaPath);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private void updateWSDLocations() {
        for (WSDLInfo wsdlInfo : wsdls.values()) {
            Definition definition = wsdlInfo.getWSDLDefinition();
            ArrayList<String> wsdlDependancies = wsdlInfo.getWSDLDependencies();
            Vector[] importVector = (Vector[]) definition.getImports().values()
                    .toArray(new Vector[definition.getImports().values().size()]);
            int count = 0;
            for (String wsdlDependancy : wsdlDependancies) {
                Vector values = importVector[count];
                WSDLInfo dependantWSDLInfo = wsdls.get(wsdlDependancy);
                dependantWSDLInfo.getProposedRegistryURL();
                for (Object value : values) {
                    Import importedWSDL = (Import) value;
                    String relativeSchemaPath = WSDLUtil.computeRelativePathWithVersion(
                            wsdlInfo.getProposedRegistryURL(), dependantWSDLInfo.getProposedRegistryURL(),
                            registry);
                    importedWSDL.setLocationURI(relativeSchemaPath);
                }
                count++;
            }
        }
    }

    private void identifyAssociationsNew(WSDLInfo wsdlInfo) {
        String wsdlPath = wsdlInfo.getProposedRegistryURL();
        for (String association : wsdlInfo.getSchemaDependencies()) {
            String associatedTo = schemaProcessor.getSchemaAssociationPath(association);
            if (associatedTo != null) {
                associations.add(new Association(wsdlPath, associatedTo, CommonConstants.DEPENDS));
                associations.add(new Association(associatedTo, wsdlPath, CommonConstants.USED_BY));
            }
        }
        for (String association : wsdlInfo.getWSDLDependencies()) {
            WSDLInfo info = wsdls.get(association);
            if (info != null) {
                String associatedTo = info.getProposedRegistryURL();
                if (associatedTo != null) {
                    associations.add(new Association(wsdlPath, associatedTo, CommonConstants.DEPENDS));
                    associations.add(new Association(associatedTo, wsdlPath, CommonConstants.USED_BY));
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    private String saveWSDLsToRepositoryNew(RequestContext context, String symlinkLocation,
            Resource metaDataResource, boolean disableSymLinkCreation) throws RegistryException {
        String masterWSDLPath = null;
        try {
            for (WSDLInfo wsdlInfo : wsdls.values()) {
                Definition wsdlDefinition = wsdlInfo.getWSDLDefinition();
                WSDLWriter wsdlWriter = WSDLFactory.newInstance().newWSDLWriter();
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                wsdlWriter.writeWSDL(wsdlDefinition, byteArrayOutputStream);
                byte[] wsdlResourceContent = byteArrayOutputStream.toByteArray();

                // create a resource this wsdlResourceContent and put it to the registry with the name
                // importedResourceName (in some path)
                String wsdlPath = wsdlInfo.getProposedRegistryURL();
                Resource wsdlResource;
                if (metaDataResource != null && registry.resourceExists(wsdlPath)) {
                    wsdlResource = registry.get(wsdlPath);
                } else {
                    wsdlResource = new ResourceImpl();
                    if (metaDataResource != null) {
                        Properties properties = metaDataResource.getProperties();
                        if (properties != null) {
                            List<String> linkProperties = Arrays.asList(RegistryConstants.REGISTRY_LINK,
                                    RegistryConstants.REGISTRY_USER, RegistryConstants.REGISTRY_MOUNT,
                                    RegistryConstants.REGISTRY_AUTHOR, RegistryConstants.REGISTRY_MOUNT_POINT,
                                    RegistryConstants.REGISTRY_TARGET_POINT, RegistryConstants.REGISTRY_ACTUAL_PATH,
                                    RegistryConstants.REGISTRY_REAL_PATH);
                            for (Map.Entry<Object, Object> e : properties.entrySet()) {
                                String key = (String) e.getKey();
                                if (!linkProperties.contains(key)) {
                                    wsdlResource.setProperty(key, (List<String>) e.getValue());
                                }
                            }
                        }
                    }
                }

                copyAllParameters(wsdlPath, wsdlResource);
                // getting the parameters
                masterWSDLPath = addProperties(masterWSDLPath, wsdlInfo, wsdlDefinition, wsdlResourceContent,
                        wsdlPath, wsdlResource);
                if (metaDataResource != null) {
                    wsdlResource.setDescription(metaDataResource.getDescription());
                }
                boolean newWSDLUpload = !registry.resourceExists(wsdlPath);
                if (metaDataResource != null
                        && metaDataResource.getProperty(CommonConstants.SOURCE_PROPERTY) != null) {
                    wsdlResource.setProperty(CommonConstants.SOURCE_PROPERTY,
                            metaDataResource.getProperty(CommonConstants.SOURCE_PROPERTY));
                } else {
                    if (context.getResource().getProperty(CommonConstants.SOURCE_PROPERTY) != null) {
                        if (context.getResource().getMediaType() != null
                                && context.getResource().getMediaType().equals(wsdlResource.getMediaType())) {
                            wsdlResource.setProperty(CommonConstants.SOURCE_PROPERTY,
                                    context.getResource().getProperty(CommonConstants.SOURCE_PROPERTY));
                        } else {
                            wsdlResource.setProperty(CommonConstants.SOURCE_PROPERTY, CommonConstants.SOURCE_AUTO);
                        }
                    }
                }

                deleteOldResource(context, metaDataResource, wsdlInfo, wsdlPath, wsdlResource);
                saveResource(context, wsdlInfo.getOriginalURL(), wsdlPath, wsdlResource, true);
                if (systemRegistry != null) {
                    EndpointUtils.saveEndpointsFromWSDL(context, wsdlPath, wsdlResource, registry, systemRegistry);
                }

                //                TODO symlink
                if (!disableSymLinkCreation) {
                    symlinkLocation = createLinks(symlinkLocation, wsdlInfo, wsdlPath, newWSDLUpload);
                }

                identifyAssociationsNew(wsdlInfo);
            }
        } catch (WSDLException e) {
            throw new RegistryException("Invalid WSDL file");
        }
        return masterWSDLPath;
    }

    //    TODO symlink
    private String createLinks(String symlinkLocation, WSDLInfo wsdlInfo, String wsdlPath, boolean newWSDLUpload)
            throws RegistryException {
        if (wsdlInfo.isMasterWSDL() && symlinkLocation != null) {
            if (!symlinkLocation.endsWith(RegistryConstants.PATH_SEPARATOR)) {
                symlinkLocation = symlinkLocation + RegistryConstants.PATH_SEPARATOR;
            }
            if (registry.resourceExists(symlinkLocation)) {
                Resource resource = registry.get(symlinkLocation);
                if (resource != null) {
                    String isLink = resource.getProperty("registry.link");
                    String mountPoint = resource.getProperty("registry.mountpoint");
                    String targetPoint = resource.getProperty("registry.targetpoint");
                    String actualPath = resource.getProperty("registry.actualpath");
                    if (isLink != null && mountPoint != null && targetPoint != null) {
                        //                            symlinkLocation = symlinkLocation.replace(mountPoint, targetPoint);
                        symlinkLocation = actualPath + RegistryConstants.PATH_SEPARATOR;
                    }
                }
            }
            // 1. New resource: resourcePath = /foo, wsdlPath = /ns/name.wsdl, symlinkPath = /foo, resourceExist = false, resourceIsSymLink = false, createSymlink = true. DoWork = true
            // 2. New resource, existing symlink: resourcePath = /foo, wsdlPath = /ns/name.wsdl, symlinkPath = /foo, resourceExist = false, resourceIsSymLink = true, createSymlink = false
            // 3. Edit from symlink: resourcePath = /foo, wsdlPath = /ns/name.wsdl, symlinkPath = /foo, resourceExist = true, resourceIsSymLink = true,  createSymlink = false,
            // 4. Edit from resource: resourcePath = /ns/name.wsdl, wsdlPath = /ns/name.wsdl, symlinkPath = /ns/name.wsdl, resourceExist = true, resourceIsSymLink = false, createSymlink = false,
            // 5. Edit from resource, change ns: resourcePath = /ns/name.wsdl, wsdlPath = /ns2/name.wsdl, symlinkPath = /ns/name.wsdl, resourceExist = true, resourceIsSymLink = false, createSymlink = false, deleteResource = true. DoWork = true
            // 6. Edit from symlink, change ns: resourcePath = /ns/name.wsdl, wsdlPath = /ns2/name.wsdl, symlinkPath = /ns/name.wsdl, resourceExist = true, resourceIsSymLink = true, createSymlink = delete and add, deleteResource = true. DoWork = true
            if (!symlinkLocation.endsWith(RegistryConstants.PATH_SEPARATOR)) {
                symlinkLocation = symlinkLocation + RegistryConstants.PATH_SEPARATOR;
            }
            String symlinkPath = symlinkLocation + resourceName;
            if (!registry.resourceExists(symlinkPath)) {
                if (CommonUtil.isSymbolicLinkMapExisting()) {
                    CommonUtil.addToSymbolicLinkMap(symlinkPath, wsdlPath);
                } else {
                    systemRegistry.createLink(symlinkPath, wsdlPath);
                }
            } else if (newWSDLUpload) {
                if (registry.get(symlinkPath).getProperty(RegistryConstants.REGISTRY_LINK) != null) {
                    String actualPath = registry.get(symlinkPath)
                            .getProperty(RegistryConstants.REGISTRY_ACTUAL_PATH);
                    if (!wsdlPath.equals(actualPath)) {
                        if (actualPath != null) {
                            registry.delete(actualPath);
                        }
                        if (CommonUtil.isSymbolicLinkMapExisting()) {
                            CommonUtil.addToSymbolicLinkMap(symlinkPath, wsdlPath);
                        } else {
                            systemRegistry.removeLink(symlinkPath);
                            systemRegistry.createLink(symlinkPath, wsdlPath);
                        }
                    }
                } else {
                    registry.delete(symlinkPath);
                }
            }
        }
        return symlinkLocation;
    }

    private String addProperties(String masterWSDLPath, WSDLInfo wsdlInfo, Definition wsdlDefinition,
            byte[] wsdlResourceContent, String wsdlPath, Resource wsdlResource) throws RegistryException {

        //Commented to fix REGISTRY-2329
        /*if (wsdlDefinition.getQName() != null) {
        String name = wsdlDefinition.getQName().getLocalPart();
        if (name != null) {
            wsdlResource.addProperty("registry.wsdl.Name", name);
        }
        }
        if (wsdlDefinition.getDocumentationElement() != null) {
        String document = wsdlDefinition.getDocumentationElement().getTextContent();
        if (document != null) {
            wsdlResource.addProperty("registry.wsdl.documentation", document);
        }
        }*/

        //Commented to fix REGISTRY-2329
        //String targetNamespace = wsdlDefinition.getTargetNamespace();
        //wsdlResource.addProperty("registry.wsdl.TargetNamespace", targetNamespace);
        wsdlResource.setMediaType(RegistryConstants.WSDL_MEDIA_TYPE);
        wsdlResource.setContent(wsdlResourceContent);

        if (wsdlInfo.isMasterWSDL()) {
            masterWSDLPath = wsdlPath;
            log.trace("Setting WSDL Validation properties");
            if (wsdlValidationInfo != null) {
                wsdlResource.setProperty(WSDLUtils.WSDL_STATUS, wsdlValidationInfo.getStatus());
                ArrayList<String> validationMessages = wsdlValidationInfo.getValidationMessages();
                if (validationMessages.size() > 0) {
                    int i = 1;
                    for (String message : validationMessages) {
                        if (message == null) {
                            continue;
                        }
                        if (message.length() > 1000) {
                            message = message.substring(0, 997) + "...";
                        }
                        wsdlResource.setProperty(WSDLUtils.WSDL_VALIDATION_MESSAGE + i, message);
                        i++;
                    }

                }
            } else if (hasWSDLImports) {
                wsdlResource.setProperty(WSDLUtils.WSDL_STATUS,
                        "Validation is not supported for WSDLs containing WSDL imports.");
            }
            log.trace("Finished setting WSDL Validation properties");
            log.trace("Setting WSI Validation properties");
            if (wsiValidationInfo != null) {
                wsdlResource.setProperty(WSDLUtils.WSI_STATUS, wsiValidationInfo.getStatus());
                ArrayList<String> validationMessages = wsiValidationInfo.getValidationMessages();
                if (validationMessages.size() > 0) {
                    int i = 1;
                    for (String message : validationMessages) {
                        if (message == null) {
                            continue;
                        }
                        if (message.length() > 1000) {
                            message = message.substring(0, 997) + "...";
                        }
                        wsdlResource.setProperty(WSDLUtils.WSI_VALIDATION_MESSAGE + i, message);
                        i++;
                    }

                }
            } else if (hasWSDLImports) {
                wsdlResource.setProperty(WSDLUtils.WSI_STATUS,
                        "Validation is not supported for WSDLs containing WSDL imports.");
            }
            log.trace("Finished setting WSI Validation properties");
        }
        return masterWSDLPath;
    }

    private void copyAllParameters(String wsdlPath, Resource wsdlResource) throws RegistryException {
        if (registry.resourceExists(wsdlPath)) {
            // we are copying all the properties, rather than using the exisint pointer
            Resource oldWsdlResource = registry.get(wsdlPath);
            Properties properties = oldWsdlResource.getProperties();
            for (Map.Entry<Object, Object> e : properties.entrySet()) {
                if (e.getValue() instanceof String) {
                    wsdlResource.setProperty((String) e.getKey(), (String) e.getValue());
                } else {
                    wsdlResource.setProperty((String) e.getKey(), (List<String>) e.getValue());
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    private String saveWSDLsToRepositoryNew(RequestContext context, String symlinkLocation,
            Resource metaDataResource, String endpointEnvironment, List<String> dependenciesList, String version,
            boolean disableSymLinkCreation) throws RegistryException {
        String masterWSDLPath = null;
        try {
            for (WSDLInfo wsdlInfo : wsdls.values()) {
                Definition wsdlDefinition = wsdlInfo.getWSDLDefinition();
                WSDLWriter wsdlWriter = WSDLFactory.newInstance().newWSDLWriter();
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                wsdlWriter.writeWSDL(wsdlDefinition, byteArrayOutputStream);
                byte[] wsdlResourceContent = byteArrayOutputStream.toByteArray();

                // create a resource this wsdlResourceContent and put it to the registry with the name
                // importedResourceName (in some path)
                String wsdlPath = wsdlInfo.getProposedRegistryURL();
                Resource wsdlResource;
                if (metaDataResource != null && registry.resourceExists(wsdlPath)) {
                    wsdlResource = registry.get(wsdlPath);
                } else {
                    wsdlResource = new ResourceImpl();
                    if (metaDataResource != null) {
                        Properties properties = metaDataResource.getProperties();
                        if (properties != null) {
                            List<String> linkProperties = Arrays.asList(RegistryConstants.REGISTRY_LINK,
                                    RegistryConstants.REGISTRY_USER, RegistryConstants.REGISTRY_MOUNT,
                                    RegistryConstants.REGISTRY_AUTHOR, RegistryConstants.REGISTRY_MOUNT_POINT,
                                    RegistryConstants.REGISTRY_TARGET_POINT, RegistryConstants.REGISTRY_ACTUAL_PATH,
                                    RegistryConstants.REGISTRY_REAL_PATH);
                            for (Map.Entry<Object, Object> e : properties.entrySet()) {
                                String key = (String) e.getKey();
                                if (!linkProperties.contains(key)) {
                                    wsdlResource.setProperty(key, (List<String>) e.getValue());
                                }
                            }
                        }
                    }
                }
                if (context.getResource().getProperty(CommonConstants.SOURCE_PROPERTY) != null) {
                    wsdlResource.setProperty(CommonConstants.SOURCE_PROPERTY, CommonConstants.SOURCE_AUTO);
                } else {
                    wsdlResource.setProperty(CommonConstants.SOURCE_PROPERTY, "undefined");
                }

                if (registry.resourceExists(wsdlPath)) {
                    // we are copying all the properties, rather than using the existing pointer
                    Resource oldWsdlResource = registry.get(wsdlPath);
                    Properties properties = oldWsdlResource.getProperties();
                    for (Map.Entry<Object, Object> e : properties.entrySet()) {
                        if (e.getValue() instanceof String) {
                            wsdlResource.setProperty((String) e.getKey(), (String) e.getValue());
                        } else {
                            wsdlResource.setProperty((String) e.getKey(), (List<String>) e.getValue());
                        }
                    }
                }
                // getting the parameters
                masterWSDLPath = addProperties(masterWSDLPath, wsdlInfo, wsdlDefinition, wsdlResourceContent,
                        wsdlPath, wsdlResource);
                if (metaDataResource != null) {
                    wsdlResource.setDescription(metaDataResource.getDescription());
                }
                boolean newWSDLUpload = !registry.resourceExists(wsdlPath);

                deleteOldResource(context, metaDataResource, wsdlInfo, wsdlPath, wsdlResource);

                saveResource(context, wsdlInfo.getOriginalURL(), wsdlPath, wsdlResource, true);
                if (systemRegistry != null) {
                    EndpointUtils.saveEndpointsFromWSDL(context, wsdlPath, wsdlResource, registry, systemRegistry,
                            endpointEnvironment, dependenciesList, version);
                }

                if (!disableSymLinkCreation) {
                    symlinkLocation = createLinks(symlinkLocation, wsdlInfo, wsdlPath, newWSDLUpload);
                }

                identifyAssociationsNew(wsdlInfo);
            }
        } catch (WSDLException e) {
            throw new RegistryException("Invalid WSDL file");
        }
        return masterWSDLPath;
    }

    private void deleteOldResource(RequestContext context, Resource metaDataResource, WSDLInfo wsdlInfo,
            String wsdlPath, Resource wsdlResource) throws RegistryException {
        if (wsdlInfo.isMasterWSDL()) {
            if (metaDataResource != null) {
                wsdlResource.setUUID(metaDataResource.getUUID());
            }
            if (!wsdlPath.equals(context.getResourcePath().getPath())
                    && registry.resourceExists(context.getResourcePath().getPath())) {
                registry.delete(context.getResourcePath().getPath());
            }
        }
    }

    private List<OMElement> createServiceContent(String wsdlURL, Resource metadata) throws RegistryException {
        List<OMElement> serviceContentomelements = new ArrayList<OMElement>();
        if (originalDefinition != null) {
            Map servicesMap = originalDefinition.getServices();
            for (Object serviceObject : servicesMap.values()) {
                Service service = (Service) serviceObject;
                QName qname = service.getQName();
                OMFactory fac = OMAbstractFactory.getOMFactory();
                OMNamespace namespace = fac.createOMNamespace(CommonConstants.SERVICE_ELEMENT_NAMESPACE, "");

                OMElement data = fac.createOMElement(CommonConstants.SERVICE_ELEMENT_ROOT, namespace);
                OMElement definitionURL = fac.createOMElement("wsdlURL", namespace);
                OMElement overview = fac.createOMElement("overview", namespace);
                OMElement interfaceelement = fac.createOMElement("interface", namespace);
                OMElement name = fac.createOMElement("name", namespace);
                OMElement version = fac.createOMElement("version", namespace);
                name.setText(qname.getLocalPart());
                version.setText(metadata.getProperty("version"));
                definitionURL.setText(RegistryUtils.getRelativePath(registry.getRegistryContext(), wsdlURL));
                OMElement namespaceElement = fac.createOMElement("namespace", namespace);
                OMElement descriptionelement = fac.createOMElement("description", namespace);

                namespaceElement.setText(qname.getNamespaceURI());
                String description = metadata.getDescription();
                if (description == null) {
                    Element documentationElement = originalDefinition.getDocumentationElement();
                    if ((documentationElement != null) && (documentationElement.getFirstChild() != null)) {
                        Node firstChild = documentationElement.getFirstChild();
                        description = DOM2Writer.nodeToString(firstChild);
                    }
                }
                descriptionelement.setText(description);

                // the endpoints will not be added right here, as it will be added by the
                // service.

                //                OMElement endpointlist = fac.createOMElement("endpoints", namespace);
                //                OMElement count = fac.createOMElement("count", namespace);
                //                Map ports = service.getPorts();
                //                count.setText(Integer.toString(ports.size()));
                //                endpointlist.addChild(count);
                //                for (Object portObject : ports.values()) {
                //                        Port port = (Port) portObject;
                //                        List elements = port.getExtensibilityElements();
                //                        for (Object element : elements) {
                //                            eprcount++;
                //                            OMElement endpoint = fac.createOMElement("text_EndPoint" + eprcount,null);
                //                            OMElement endpointoption = fac.createOMElement("EndPoint" + eprcount,null);
                //                            if (element instanceof SOAP12Address) {
                //                                SOAP12Address soapAddress = (SOAP12Address) element;
                //                                endpoint.setText(soapAddress.getLocationURI());
                //                            } else if (element instanceof SOAPAddress) {
                //                                SOAPAddress soapAddress = (SOAPAddress) element;
                //                                endpoint.setText(soapAddress.getLocationURI());
                //                            } else if (element instanceof HTTPAddress) {
                //                                HTTPAddress httpAddress = (HTTPAddress) element;
                //                                endpoint.setText(httpAddress.getLocationURI());
                //                            }
                //                            endpointoption.setText("0");
                //                            endpointlist.addChild(endpointoption);
                //                            endpointlist.addChild(endpoint);
                //                        }
                //                }
                overview.addChild(name);
                overview.addChild(version);
                overview.addChild(namespaceElement);
                overview.addChild(descriptionelement);
                interfaceelement.addChild(definitionURL);
                data.addChild(overview);
                data.addChild(interfaceelement);
                serviceContentomelements.add(data);
            }

        }
        return serviceContentomelements;
    }

    private void saveResource(RequestContext context, String url, String path, Resource resource, boolean isWSDL)
            throws RegistryException {
        log.trace("Started saving resource");

        String artifactId = resource.getUUID();

        if (artifactId == null) {
            // generate a service id
            artifactId = UUID.randomUUID().toString();
            resource.setUUID(artifactId);
        }
        //        if (systemRegistry != null) {
        //            CommonUtil.addGovernanceArtifactEntryWithAbsoluteValues(systemRegistry, artifactId, path);
        //        }

        String relativeArtifactPath = RegistryUtils.getRelativePath(registry.getRegistryContext(), path);
        // adn then get the relative path to the GOVERNANCE_BASE_PATH
        relativeArtifactPath = RegistryUtils.getRelativePathToOriginal(relativeArtifactPath,
                RegistryConstants.GOVERNANCE_REGISTRY_BASE_PATH);
        /* This property will be used in ServiceMediatype handler to recognize that particular service addition is
        initialized due to wsdl addition
         */
        resource.setProperty("registry.DefinitionImport", "true");
        if (!isWSDL) {
            registry.put(path, resource);
        } else {
            addWSDLToRegistry(context, path, url, resource, registry);
        }

        //        if (!(resource instanceof Collection) &&
        //           ((ResourceImpl) resource).isVersionableChange()) {
        //            registry.createVersion(path);
        //        }
        ((ResourceImpl) resource).setPath(relativeArtifactPath);
        log.trace("Finished saving resource");
    }

    /**
     * Method that gets called instructing a WSDL to be added the registry.
     *
     * @param context  the request context for this request.
     * @param path     the path to add the resource to.
     * @param url      the path from which the resource was imported from.
     * @param resource the resource to be added.
     * @param registry the registry instance to use.
     *
     * @throws RegistryException if the operation failed.
     */
    protected void addWSDLToRegistry(RequestContext context, String path, String url, Resource resource,
            Registry registry) throws RegistryException {
        registry.put(path, resource);
    }

    /**
     * Method to customize the Schema Processor.
     * @param requestContext the request context for the import/put operation.
     * @param validationInfo the WSDL validation information.
     * @return the Schema Processor instance.
     */
    @SuppressWarnings("unused")
    protected SchemaProcessor buildSchemaProcessor(RequestContext requestContext,
            WSDLValidationInfo validationInfo) {
        return new SchemaProcessor(requestContext, validationInfo);
    }

    /**
     * Method to customize the Schema Processor.
     * @param requestContext the request context for the import/put operation.
     * @param validationInfo the WSDL validation information.
     * @param useOriginalSchema whether the schema to be original
     * @return the Schema Processor instance.
     */
    @SuppressWarnings("unused")
    protected SchemaProcessor buildSchemaProcessor(RequestContext requestContext, WSDLValidationInfo validationInfo,
            boolean useOriginalSchema) {
        return new SchemaProcessor(requestContext, validationInfo, useOriginalSchema);
    }

    private static Properties copyProperties(RequestContext requestContext) {
        Properties properties = requestContext.getResource().getProperties();
        Properties copiedProperties = new Properties();
        if (properties != null) {
            List<String> linkProperties = Arrays.asList(RegistryConstants.REGISTRY_LINK,
                    RegistryConstants.REGISTRY_USER, RegistryConstants.REGISTRY_MOUNT,
                    RegistryConstants.REGISTRY_AUTHOR, RegistryConstants.REGISTRY_MOUNT_POINT,
                    RegistryConstants.REGISTRY_TARGET_POINT, RegistryConstants.REGISTRY_ACTUAL_PATH,
                    RegistryConstants.REGISTRY_REAL_PATH);
            for (Map.Entry<Object, Object> e : properties.entrySet()) {
                String key = (String) e.getKey();
                if (!linkProperties.contains(key) && !(key.startsWith("resource") || key.startsWith("registry"))) {
                    copiedProperties.put(key, (List<String>) e.getValue());
                }
            }
        }
        return copiedProperties;
    }

}