org.wso2.carbon.mediation.templates.services.EndpointTemplateEditorAdmin.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.mediation.templates.services.EndpointTemplateEditorAdmin.java

Source

/*
*  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. 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.wso2.carbon.mediation.templates.services;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
import org.apache.axis2.AxisFault;
import org.apache.axis2.util.XMLPrettyPrinter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.config.xml.SynapseXMLConfigurationFactory;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.config.xml.endpoints.TemplateFactory;
import org.apache.synapse.config.xml.endpoints.TemplateSerializer;
import org.apache.synapse.endpoints.Template;
import org.apache.synapse.registry.Registry;
import org.wso2.carbon.mediation.initializer.AbstractServiceBusAdmin;
import org.wso2.carbon.mediation.initializer.ServiceBusConstants;
import org.wso2.carbon.mediation.initializer.ServiceBusUtils;
import org.wso2.carbon.mediation.initializer.persistence.MediationPersistenceManager;
import org.wso2.carbon.mediation.templates.common.EndpointTemplateInfo;
import org.wso2.carbon.mediation.templates.common.factory.TemplateInfoFactory;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;

public class EndpointTemplateEditorAdmin extends AbstractServiceBusAdmin {
    private static final Log log = LogFactory.getLog(TemplateEditorAdmin.class);

    //TODO: Move WSO2_TEMPLATE_MEDIA_TYPE to registry
    public static final String WSO2_ENDPOINT_TEMPLATE_MEDIA_TYPE = "application/vnd.wso2.template.endpoint";

    public int getEndpointTemplatesCount() throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            return getSynapseConfiguration().getEndpointTemplates().values().size();
        } catch (Exception e) {
            handleException("Couldn't get the Synapse Configuration to get Sequence count", e);
        } finally {
            lock.unlock();
        }
        return 0;
    }

    public int getDynamicEndpointTemplatesCount() throws AxisFault {
        try {
            String[] govList = getGovernanceRegistry() != null ? getMimeTypeResult(getGovernanceRegistry())
                    : new String[0];
            String[] confList = getConfigSystemRegistry() != null ? getMimeTypeResult(getConfigSystemRegistry())
                    : new String[0];
            return confList.length + govList.length;
        } catch (Exception e) {
            return 0;
        }
    }

    @SuppressWarnings({ "unchecked" })
    private String[] getMimeTypeResult(org.wso2.carbon.registry.core.Registry targetRegistry) throws Exception {
        String sql = "SELECT REG_PATH_ID, REG_NAME FROM REG_RESOURCE WHERE REG_MEDIA_TYPE = ?";
        Map parameters = new HashMap();
        parameters.put("query", sql);
        parameters.put("1", WSO2_ENDPOINT_TEMPLATE_MEDIA_TYPE);
        Resource result = targetRegistry.executeQuery(null, parameters);
        return (String[]) result.getContent();
    }

    public EndpointTemplateInfo[] getEndpointTemplates(int pageNumber, int endpointTemplatesPerPage)
            throws AxisFault {
        final Lock lock = getLock();
        Collection<Template> templates = null;
        try {
            lock.lock();
            templates = getSynapseConfiguration().getEndpointTemplates().values();

            EndpointTemplateInfo[] info = TemplateInfoFactory.getSortedTemplateInfoArrayByTemplate(templates);
            EndpointTemplateInfo[] ret;

            if (info != null && info.length > 0) {
                for (EndpointTemplateInfo tempplateInfo : info) {
                    Template template = getSynapseConfiguration().getEndpointTemplates()
                            .get(tempplateInfo.getTemplateName());
                    if (template.getArtifactContainerName() != null) {
                        tempplateInfo.setArtifactContainerName(template.getArtifactContainerName());
                    }
                    if (template.isEdited()) {
                        tempplateInfo.setIsEdited(true);
                    }
                }
            }
            if (info.length >= (endpointTemplatesPerPage * pageNumber + endpointTemplatesPerPage)) {
                ret = new EndpointTemplateInfo[endpointTemplatesPerPage];
            } else {
                ret = new EndpointTemplateInfo[info.length - (endpointTemplatesPerPage * pageNumber)];
            }
            for (int i = 0; i < endpointTemplatesPerPage; ++i) {
                if (ret.length > i) {
                    ret[i] = info[endpointTemplatesPerPage * pageNumber + i];
                }
            }
            return ret;
        } catch (Exception fault) {
            handleException("Couldn't get the Synapse Configuration to " + "get the available templates", fault);
        } finally {
            lock.unlock();
        }
        return new EndpointTemplateInfo[0];
    }

    public EndpointTemplateInfo[] getDynamicEndpointTemplates(int pageNumber, int endpointTemplatesPerPage)
            throws AxisFault {
        org.wso2.carbon.registry.core.Registry registry;
        EndpointTemplateInfo[] ret;
        final Lock lock = getLock();
        try {
            lock.lock();
            String[] configInfo = getConfigSystemRegistry() != null ? getMimeTypeResult(getConfigSystemRegistry())
                    : new String[0];
            String[] govInfo = getGovernanceRegistry() != null ? getMimeTypeResult(getGovernanceRegistry())
                    : new String[0];
            String[] info = new String[configInfo.length + govInfo.length];

            int ptr = 0;
            for (String aConfigInfo : configInfo) {
                info[ptr] = "conf:" + aConfigInfo;
                ++ptr;
            }
            for (String aGovInfo : govInfo) {
                info[ptr] = "gov:" + aGovInfo;
                ++ptr;
            }
            Arrays.sort(info);
            if (info.length >= (endpointTemplatesPerPage * pageNumber + endpointTemplatesPerPage)) {
                ret = new EndpointTemplateInfo[endpointTemplatesPerPage];
            } else {
                ret = new EndpointTemplateInfo[info.length - (endpointTemplatesPerPage * pageNumber)];
            }
            for (int i = 0; i < endpointTemplatesPerPage; ++i) {
                if (ret.length > i) {
                    EndpointTemplateInfo seq = new EndpointTemplateInfo();
                    seq.setTemplateName(info[endpointTemplatesPerPage * pageNumber + i]);
                    ret[i] = seq;
                }
            }
        } catch (Exception e) {
            handleException("Unable to get Dynamic Template Info", e);
            return null;
        } finally {
            lock.unlock();
        }
        return ret;

        //        return new EndpointTemplateInfo[0];
    }

    public OMElement getTemplate(String templateName) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            SynapseConfiguration synapseConfiguration = getSynapseConfiguration();
            Template template = synapseConfiguration.getEndpointTemplate(templateName);
            if (template != null) {
                OMElement parentElement = null;
                //                String dummyParentEl = "<" + "parent xmlns=\"" + SynapseConstants.SYNAPSE_NAMESPACE + "\"" + "/" + ">";
                //                parentElement = AXIOMUtil.stringToOM(dummyParentEl);
                //                return new TemplateSerializer().serializeEndpointTemplate(template, parentElement).getFirstElement();
                return new TemplateSerializer().serializeEndpointTemplate(template, parentElement);
            } else {
                handleException("Template with the name " + templateName + " does not exist");
            }
        } catch (SynapseException syne) {
            handleException("Unable to get the endpoint template : " + templateName, syne);
        } catch (Exception fault) {
            handleException("Couldn't get the Synapse Configuration to get the Endpoint Template", fault);
        } finally {
            lock.unlock();
        }
        return null;
    }

    public void deleteEndpointTemplate(String templateName) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            SynapseConfiguration synCfg = getSynapseConfiguration();
            Template sequence = synCfg.getEndpointTemplates().get(templateName);
            if (sequence != null) {
                synCfg.removeEndpointTemplate(templateName);
                MediationPersistenceManager pm = getMediationPersistenceManager();
                pm.deleteItem(templateName, sequence.getFileName(),
                        ServiceBusConstants.ITEM_TYPE_TEMPLATE_ENDPOINTS);
            } else {
                handleException("No defined endpoint template with name " + templateName
                        + " found to delete in the Synapse configuration");
            }
        } catch (Exception fault) {
            handleException("Couldn't get the Synapse Configuration to delete the sequence", fault);
        } finally {
            lock.unlock();
        }
    }

    public void deleteDynamicEndpointTemplate(String key) throws AxisFault {
        SynapseConfiguration synConfig = getSynapseConfiguration();
        Registry registry = synConfig.getRegistry();
        if (registry != null) {
            if (registry.getRegistryEntry(key).getType() == null) {
                handleException("The key '" + key + "' cannot be found within the configuration");
            } else {
                registry.delete(key);
            }
        } else {
            handleException("Unable to access the registry instance for the ESB");
        }
    }

    public void saveEndpointTemplate(String templateConfig) throws AxisFault {
        try {
            saveEndpointTemplate(AXIOMUtil.stringToOM(templateConfig));
        } catch (XMLStreamException e) {
            handleException("unable to save Endpoint template ...invalid configuration element", e);
        }
    }

    private void saveEndpointTemplate(OMElement templateElement) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            if (templateElement != null
                    && templateElement.getLocalName().equals(XMLConfigConstants.TEMPLATE_ELT.getLocalPart())) {
                String templateName = templateElement.getAttributeValue(new QName("name"));
                SynapseConfiguration config = getSynapseConfiguration();
                log.debug("Saving template : " + templateName);
                Template preSeq = config.getEndpointTemplates().get(templateName);
                if (preSeq == null) {
                    handleException("Unable to save template " + templateName + ". Does not exist");
                } else {
                    // we should first try to build the new sequence. if exception we return
                    Template endpointTemplate = new TemplateFactory().createEndpointTemplate(templateElement,
                            getSynapseConfiguration().getProperties());

                    // if everything went successfully we remove the sequence
                    config.removeEndpointTemplate(templateName);
                    if (endpointTemplate instanceof Template) {
                        ((Template) endpointTemplate).setFileName(preSeq.getFileName());
                        config.addEndpointTemplate(templateName, endpointTemplate);
                    }

                    log.debug("Saved template : " + templateName + " to the configuration");

                    Template templ = config.getEndpointTemplates().get(templateName);
                    if (templ != null) {
                        //                        templ.init(getSynapseEnvironment());
                        if (preSeq.getArtifactContainerName() != null) {
                            templ.setArtifactContainerName(preSeq.getArtifactContainerName());
                            templ.setIsEdited(true);
                        } else {
                            persistTemplate(templ);
                        }
                    }
                }
            } else {
                handleException("Unable to save template. Invalid definition");
            }
        } catch (Exception fault) {
            handleException("Unable to save the Template : " + fault.getMessage(), fault);
        } finally {
            lock.unlock();
        }
    }

    public void saveDynamicEndpointTemplate(String key, String sequenceConfig) throws AxisFault {
        try {
            saveDynamicEndpointTemplate(key, AXIOMUtil.stringToOM(sequenceConfig));
        } catch (XMLStreamException e) {
            handleException("unable to save dynamic template Endpoint...invalid configuration element", e);
        }
    }

    private void saveDynamicEndpointTemplate(String key, OMElement endpointTempalteEl) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            SynapseConfiguration synConfig = getSynapseConfiguration();
            Registry registry = synConfig.getRegistry();
            if (registry != null) {
                if (registry.getRegistryEntry(key).getType() == null) {
                    handleException(
                            "Unable to save the template. No resource is available " + "by the key '" + key + "'");
                }
                registry.updateResource(key, endpointTempalteEl);
            } else {
                handleException("Unable to access the registry instance for the ESB");
            }
        } finally {
            lock.unlock();
        }
    }

    public void addEndpointTemplate(String templateElementConfig) throws AxisFault {
        try {
            addEndpointTemplate(AXIOMUtil.stringToOM(templateElementConfig));
        } catch (XMLStreamException e) {
            handleException("unable to save template Endpoint...invalid configuration element", e);
        }
    }

    private void addEndpointTemplate(OMElement templateElement) throws AxisFault {
        final Lock lock = getLock();
        try {
            lock.lock();
            if (templateElement.getLocalName().equals(XMLConfigConstants.TEMPLATE_ELT.getLocalPart())) {
                String templateName = templateElement.getAttributeValue(new QName("name"));
                SynapseConfiguration config = getSynapseConfiguration();
                if (log.isDebugEnabled()) {
                    log.debug("Adding template : " + templateName + " to the configuration");
                }
                if (config.getLocalRegistry().get(templateName) != null) {
                    handleException("The name '" + templateName + "' is already used within the configuration");
                } else {
                    SynapseXMLConfigurationFactory.defineEndpointTemplate(config, templateElement,
                            getSynapseConfiguration().getProperties());
                    if (log.isDebugEnabled()) {
                        log.debug("Added template : " + templateName + " to the configuration");
                    }

                    Template templ = config.getEndpointTemplates().get(templateName);
                    templ.setFileName(ServiceBusUtils.generateFileName(templateName));
                    //                    templ.init(getSynapseEnvironment());

                    //noinspection ConstantConditions
                    persistTemplate(templ);
                }
            } else {
                handleException("Invalid template definition");
            }
        } catch (Exception fault) {
            handleException("Error adding template : " + fault.getMessage(), fault);
        } catch (Error error) {
            throw new AxisFault("Unexpected error occured while " + "adding the template : " + error.getMessage(),
                    error);
        } finally {
            lock.unlock();
        }
    }

    public void addDynamicEndpointTemplate(String key, String sequenceConfig) throws AxisFault {
        try {
            addDynamicEndpointTemplate(key, AXIOMUtil.stringToOM(sequenceConfig));
        } catch (XMLStreamException e) {
            handleException("unable to save template Endpoint...invalid configuration element", e);
        }
    }

    private void addDynamicEndpointTemplate(String key, OMElement endpointTemplateEl) throws AxisFault {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        stream.reset();
        try {
            XMLPrettyPrinter.prettify(endpointTemplateEl, stream);
        } catch (Exception e) {
            handleException("Unable to pretty print configuration", e);
        }
        try {
            org.wso2.carbon.registry.core.Registry registry;
            if (key.startsWith("conf:")) {
                registry = getConfigSystemRegistry();
                key = key.replace("conf:", "");
            } else {
                registry = getGovernanceRegistry();
                key = key.replace("gov:", "");
            }
            if (registry.resourceExists(key)) {
                handleException("Resource is already exists");
            }
            Resource resource = registry.newResource();
            resource.setMediaType(WSO2_ENDPOINT_TEMPLATE_MEDIA_TYPE);
            resource.setContent(new String(stream.toByteArray()).trim());
            registry.put(key, resource);
        } catch (RegistryException e) {
            handleException("WSO2 Registry Exception", e);
        }
    }

    private void persistTemplate(Template template) throws AxisFault {
        if (template instanceof Template) {
            MediationPersistenceManager pm = getMediationPersistenceManager();
            pm.saveItem(((Template) template).getName(), ServiceBusConstants.ITEM_TYPE_TEMPLATE_ENDPOINTS);
        }
    }

    private void handleException(String message, Throwable cause) throws AxisFault {
        log.error(message, cause);
        throw new AxisFault(message, cause);
    }

    private void handleException(String message) throws AxisFault {
        log.error(message);
        throw new AxisFault(message);
    }

    public boolean hasDuplicateTempleteEndpoint(String templateElementConfig) throws AxisFault {
        OMElement templateElement = null;
        try {
            templateElement = AXIOMUtil.stringToOM(templateElementConfig);
        } catch (XMLStreamException e) {
            handleException("unable to Checking template Endpoint...invalid configuration element", e);
        }
        if (templateElement != null) {
            final Lock lock = getLock();
            try {
                lock.lock();
                if (templateElement.getLocalName().equals(XMLConfigConstants.TEMPLATE_ELT.getLocalPart())) {
                    String templateName = templateElement.getAttributeValue(new QName("name"));
                    SynapseConfiguration config = getSynapseConfiguration();
                    if (log.isDebugEnabled()) {
                        log.debug("Checking template : " + templateName + " with existing configuration");
                    }
                    if (config.getLocalRegistry().get(templateName) != null) {
                        return true;
                    }
                }
            } catch (Exception fault) {
                handleException("Error Checking template : " + fault.getMessage(), fault);
            } catch (Error error) {
                throw new AxisFault(
                        "Unexpected error occured while " + "Checking the template : " + error.getMessage(), error);
            } finally {
                lock.unlock();
            }
        }
        return false;
    }
}