org.jbpm.bpel.xml.DeploymentDescriptorWriter.java Source code

Java tutorial

Introduction

Here is the source code for org.jbpm.bpel.xml.DeploymentDescriptorWriter.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the JBPM BPEL PUBLIC LICENSE AGREEMENT as
 * published by JBoss Inc.; either version 1.0 of the License, or
 * (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
package org.jbpm.bpel.xml;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import org.jbpm.JbpmConfiguration;
import org.jbpm.bpel.deploy.DeploymentDescriptor;
import org.jbpm.bpel.deploy.MyRoleDescriptor;
import org.jbpm.bpel.deploy.PartnerLinkDescriptor;
import org.jbpm.bpel.deploy.PartnerRoleDescriptor;
import org.jbpm.bpel.deploy.ScopeDescriptor;
import org.jbpm.bpel.deploy.PartnerRoleDescriptor.InitiateMode;
import org.jbpm.bpel.endpointref.EndpointReference;
import org.jbpm.bpel.integration.catalog.CompositeCatalog;
import org.jbpm.bpel.integration.catalog.ServiceCatalog;
import org.jbpm.bpel.xml.util.XmlUtil;
import org.jbpm.util.ClassLoaderUtil;

/**
 * Converts a deployment descriptor {@linkplain DeploymentDescriptor object} to XML format.
 * @author Alejandro Guizar
 * @version $Revision$ $Date: 2007/10/13 02:53:27 $
 */
public class DeploymentDescriptorWriter {

    public static final String RESOURCE_CATALOG_WRITERS = "resource.catalog.writers";

    private static final Log log = LogFactory.getLog(DeploymentDescriptorWriter.class);
    private static final Map catalogWriters = readCatalogWriters();

    private static final DeploymentDescriptorWriter instance = new DeploymentDescriptorWriter();

    protected DeploymentDescriptorWriter() {
    }

    public void write(DeploymentDescriptor deploymentDescriptor, Element descriptorElem) {
        // global scope attributes
        writeScope(deploymentDescriptor, descriptorElem);

        // target namespace
        descriptorElem.setAttribute(BpelConstants.ATTR_TARGET_NAMESPACE, deploymentDescriptor.getTargetNamespace());

        // version
        Integer version = deploymentDescriptor.getVersion();
        if (version != null)
            descriptorElem.setAttribute(BpelConstants.ATTR_VERSION, version.toString());

        // service catalogs
        ServiceCatalog serviceCatalog = deploymentDescriptor.getServiceCatalog();
        if (serviceCatalog != null)
            writeServiceCatalogs(serviceCatalog, descriptorElem);
    }

    protected void writeScope(ScopeDescriptor scope, Element scopeElem) {
        // name - there can be unnamed scope descriptors
        String name = scope.getName();
        if (name != null)
            scopeElem.setAttribute(BpelConstants.ATTR_NAME, name);

        // partner links
        Map partnerLinks = scope.getPartnerLinks();
        if (!partnerLinks.isEmpty())
            writePartnerLinks(partnerLinks, scopeElem);

        // inner scopes
        List scopes = scope.getScopes();
        if (!scopes.isEmpty())
            writeScopes(scopes, scopeElem);
    }

    protected void writePartnerLinks(Map partnerLinks, Element scopeElem) {
        Element partnerLinksElem = scopeElem.getOwnerDocument()
                .createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR, BpelConstants.ELEM_PARTNER_LINKS);
        scopeElem.appendChild(partnerLinksElem);

        for (Iterator i = partnerLinks.values().iterator(); i.hasNext();)
            writePartnerLink((PartnerLinkDescriptor) i.next(), partnerLinksElem);
    }

    protected void writePartnerLink(PartnerLinkDescriptor partnerLink, Element partnerLinksElem) {
        Element partnerLinkElem = partnerLinksElem.getOwnerDocument()
                .createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR, BpelConstants.ELEM_PARTNER_LINK);
        partnerLinksElem.appendChild(partnerLinkElem);

        // name
        partnerLinkElem.setAttribute(BpelConstants.ATTR_NAME, partnerLink.getName());

        // partner role
        PartnerRoleDescriptor partnerRole = partnerLink.getPartnerRole();
        if (partnerRole != null)
            writePartnerRole(partnerRole, partnerLinkElem);

        // my role
        MyRoleDescriptor myRole = partnerLink.getMyRole();
        if (myRole != null)
            writeMyRole(myRole, partnerLinkElem);
    }

    protected void writePartnerRole(PartnerRoleDescriptor partnerRole, Element partnerLinkElem) {
        Element partnerRoleElem = partnerLinkElem.getOwnerDocument()
                .createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR, BpelConstants.ELEM_PARTNER_ROLE);
        partnerLinkElem.appendChild(partnerRoleElem);

        // initiate
        InitiateMode initiateMode = partnerRole.getInitiateMode();
        if (initiateMode != null)
            partnerRoleElem.setAttribute(BpelConstants.ATTR_INITIATE, initiateMode.getName());

        // service reference
        EndpointReference serviceRef = partnerRole.getEndpointReference();
        if (serviceRef != null) {
            Element referenceElem = partnerRoleElem.getOwnerDocument().createElementNS(BpelConstants.NS_SERVICE_REF,
                    BpelConstants.ELEM_SERVICE_REF);
            partnerRoleElem.appendChild(referenceElem);

            serviceRef.writeServiceRef(referenceElem);
        }
    }

    protected void writeMyRole(MyRoleDescriptor myRole, Element partnerLinkElem) {
        Element myRoleElem = partnerLinkElem.getOwnerDocument()
                .createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR, BpelConstants.ELEM_MY_ROLE);
        partnerLinkElem.appendChild(myRoleElem);

        // partner link handle
        String handle = myRole.getHandle();
        if (handle != null)
            myRoleElem.setAttribute(BpelConstants.ATTR_HANDLE, handle);

        // service
        QName service = myRole.getService();
        if (service != null) {
            Attr serviceAttr = myRoleElem.getOwnerDocument().createAttribute(BpelConstants.ATTR_SERVICE);
            myRoleElem.setAttributeNode(serviceAttr);
            XmlUtil.setQNameValue(serviceAttr, service);
        }

        // port
        String port = myRole.getPort();
        if (port != null)
            myRoleElem.setAttribute(BpelConstants.ATTR_PORT, port);
    }

    protected void writeScopes(List scopes, Element scopeElem) {
        Document descriptorDoc = scopeElem.getOwnerDocument();
        Element scopesElem = descriptorDoc.createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR,
                BpelConstants.ELEM_SCOPES);
        scopeElem.appendChild(scopesElem);

        for (int i = 0, n = scopes.size(); i < n; i++) {
            scopeElem = descriptorDoc.createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR,
                    BpelConstants.ELEM_SCOPE);
            scopesElem.appendChild(scopeElem);

            writeScope((ScopeDescriptor) scopes.get(i), scopeElem);
        }
    }

    protected void writeServiceCatalogs(ServiceCatalog catalog, Element descriptorElem) {
        Element catalogsElem = descriptorElem.getOwnerDocument()
                .createElementNS(BpelConstants.NS_DEPLOYMENT_DESCRIPTOR, BpelConstants.ELEM_SERVICE_CATALOGS);
        descriptorElem.appendChild(catalogsElem);

        if (catalog instanceof CompositeCatalog) {
            List catalogs = ((CompositeCatalog) catalog).getCatalogs();

            for (int i = 0, n = catalogs.size(); i < n; i++) {
                ServiceCatalog leafCatalog = (ServiceCatalog) catalogs.get(i);
                writeCatalog(leafCatalog, catalogsElem);
            }
        } else
            writeCatalog(catalog, catalogsElem);
    }

    private void writeCatalog(ServiceCatalog catalog, Element catalogsElem) {
        ServiceCatalogWriter catalogWriter = getCatalogWriter(catalog.getClass());
        if (catalogWriter != null)
            catalogWriter.write(catalog, catalogsElem);
        else
            log.warn("unrecognized service catalog: " + catalog);
    }

    public static DeploymentDescriptorWriter getInstance() {
        return instance;
    }

    protected static ServiceCatalogWriter getCatalogWriter(Class catalogClass) {
        return (ServiceCatalogWriter) catalogWriters.get(catalogClass);
    }

    private static Map readCatalogWriters() {
        // get catalog writers resource
        String resource = JbpmConfiguration.Configs.getString(RESOURCE_CATALOG_WRITERS);

        // parse catalog writers document
        Element writersElem;
        try {
            // parse xml document
            writersElem = XmlUtil.parseResource(resource);
        } catch (SAXException e) {
            log.error("catalog writers document contains invalid xml: " + resource, e);
            return Collections.EMPTY_MAP;
        } catch (IOException e) {
            log.error("could not read catalog writers document: " + resource, e);
            return Collections.EMPTY_MAP;
        }

        // walk through catalogWriter elements
        HashMap catalogWriters = new HashMap();
        for (Iterator i = XmlUtil.getElements(writersElem, null, "catalogWriter"); i.hasNext();) {
            Element writerElem = (Element) i.next();

            // load catalog class
            String catalogClassName = writerElem.getAttribute("catalog");
            Class catalogClass = ClassLoaderUtil.loadClass(catalogClassName);

            // load writer class
            String writerClassName = writerElem.getAttribute("class");
            Class writerClass = ClassLoaderUtil.loadClass(writerClassName);

            // validate writer class
            if (!ServiceCatalogWriter.class.isAssignableFrom(writerClass)) {
                log.warn("not a catalog writer: " + writerClassName);
                continue;
            }

            try {
                // instantiate writer
                ServiceCatalogWriter writer = (ServiceCatalogWriter) writerClass.newInstance();

                // register writer instance
                catalogWriters.put(catalogClass, writer);
                log.debug("registered catalog writer: catalog=" + catalogClassName + ", class=" + writerClassName);
            } catch (InstantiationException e) {
                log.warn("writer class not instantiable: " + writerClassName, e);
            } catch (IllegalAccessException e) {
                log.warn("writer class or constructor not public: " + writerClassName, e);
            }
        }
        return catalogWriters;

    }
}