All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.easywsdl.extensions.wsdl4bpel.impl.WSDL4BPELElementImpl Maven / Gradle / Ivy

/**
 * easyWSDL - easyWSDL toolbox Platform.
 * Copyright (c) 2008,  eBM Websourcing
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the University of California, Berkeley nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.ow2.easywsdl.extensions.wsdl4bpel.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import org.apache.commons.lang.NotImplementedException;
import org.ow2.easywsdl.extensions.wsdl4bpel.api.PartnerLinkType;
import org.ow2.easywsdl.extensions.wsdl4bpel.api.Property;
import org.ow2.easywsdl.extensions.wsdl4bpel.api.PropertyAlias;
import org.ow2.easywsdl.extensions.wsdl4bpel.api.WSDL4BPELElement;
import org.ow2.easywsdl.extensions.wsdl4bpel.api.WSDL4BPELException;
import org.ow2.easywsdl.extensions.wsdl4bpel.impl.inout.WSDL4BPELReaderImpl;
import org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.plnktype.ObjectFactory;
import org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.plnktype.TPartnerLinkType;
import org.ow2.easywsdl.wsdl.api.Description;
import org.ow2.easywsdl.wsdl.api.WSDLElement;
import org.ow2.easywsdl.wsdl.api.WSDLException;
import org.ow2.easywsdl.wsdl.api.abstractElmt.AbstractWSDLElementImpl;
import org.ow2.easywsdl.wsdl.org.w3.ns.wsdl.DescriptionType;
import org.ow2.easywsdl.wsdl.org.xmlsoap.schemas.wsdl.TDefinitions;
import org.ow2.easywsdl.wsdl.org.xmlsoap.schemas.wsdl.TExtensibleDocumented;
import org.w3c.dom.Element;

/**
 * Abstract super class for all WSDL Elements, providing some basic
 * common functionality.
 */

/**
 * @author Nicolas Salatge - eBM WebSourcing
 */
public class WSDL4BPELElementImpl implements WSDL4BPELElement {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected T tag;

	private List partnerLinkTypes = new ArrayList();

	private List properties = new ArrayList();

	private List propertyAliases = new ArrayList();
	
	private ObjectFactory factory = new ObjectFactory();

	public WSDL4BPELElementImpl(final T t) throws WSDL4BPELException {
		this.tag = t;
		try {
			getBPELDataInAnyDescription();
		} catch (WSDLException e) {
			throw new WSDL4BPELException(e);
		}
	}


	private void getBPELDataInAnyDescription() throws WSDL4BPELException,
	WSDLException {
		// get partner link in description
		List jaxbs = new ArrayList();
		JAXBElement jaxb = null;
		if(this.tag instanceof Description) {
			if(((AbstractWSDLElementImpl)this.tag).getModel() instanceof DescriptionType) {
				// wsdl 2.0
				Iterator it = ((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().iterator();
				Object part = null;
				while (it.hasNext()) {
					part = it.next();
					// get partner link type
					jaxb = extractPartnerLinkInWSDL(part, DescriptionType.class);
					if(jaxb != null) {
						it = ((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().iterator();
						jaxbs.add(jaxb);
					}

					// get property
					jaxb = extractPropertyInWSDL(part, DescriptionType.class);
					if(jaxb != null) {
						it = ((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().iterator();
						jaxbs.add(jaxb);
					}

					// get property alias
					jaxb = extractPropertyAliasInWSDL(part, DescriptionType.class);
					if(jaxb != null) {
						it = ((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().iterator();
						jaxbs.add(jaxb);
					}
				}
				
				for(JAXBElement jb: jaxbs) {
					((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().add(jb);
				}
				
			} else if(((AbstractWSDLElementImpl)this.tag).getModel() instanceof TDefinitions) {
				// wsdl 1.1
				Iterator it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
				Object part = null;
				while (it.hasNext()) {
					part = it.next();
					// get partner link type
					jaxb = extractPartnerLinkInWSDL(part, TExtensibleDocumented.class);
					if(jaxb != null) {
						it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
						jaxbs.add(jaxb);
					}

					// get property
					jaxb = extractPropertyInWSDL(part, TExtensibleDocumented.class);
					if(jaxb != null) {
						it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
						jaxbs.add(jaxb);
					}

					// get property alias
					jaxb = extractPropertyAliasInWSDL(part, TExtensibleDocumented.class);
					if(jaxb != null) {
						it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
						jaxbs.add(jaxb);
					}
				}
				
				for(JAXBElement jb: jaxbs) {
					((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().add(jb);
				}
			} 
			
			
		}
	}


	private JAXBElement extractPartnerLinkInWSDL(Object part, Class type)
	throws WSDL4BPELException, WSDLException {
		JAXBElement res = null;
		if (part instanceof Element) {
			if((((Element)part).getLocalName().equals("partnerLinkType"))&&(((Element)part).getNamespaceURI().equals("http://docs.oasis-open.org/wsbpel/2.0/plnktype"))) {
				WSDL4BPELReaderImpl reader = new WSDL4BPELReaderImpl();
				JAXBElement jaxbPlt = reader.convertElement2PartnerLinkType((Element)part);

				// change element by jaxb element
				if(type.getSimpleName().equals("TExtensibleDocumented")) {
					((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
					
					res = jaxbPlt;
				} else if(type.getSimpleName().equals("DescriptionType")) {
					((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().remove(part);
					
					res = jaxbPlt;
				}
				
				// create partnerLinkType
				this.partnerLinkTypes.add(new PartnerLinkTypeImpl(jaxbPlt.getValue(), (Description) this.tag));
			}
		} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof TPartnerLinkType)) {
			// create partnerLinkType
			this.partnerLinkTypes.add(new PartnerLinkTypeImpl((TPartnerLinkType)((JAXBElement)part).getValue(), (Description) this.tag));
		} else if(part instanceof TPartnerLinkType) {
			// create partnerLinkType
			this.partnerLinkTypes.add(new PartnerLinkTypeImpl((TPartnerLinkType)part, (Description) this.tag));
		}
		return res;
	}

	private JAXBElement extractPropertyInWSDL(Object part, Class type)
	throws WSDL4BPELException, WSDLException {
		JAXBElement res = null;
		if (part instanceof Element) {
			if((((Element)part).getLocalName().equals("property"))&&(((Element)part).getNamespaceURI().equals("http://docs.oasis-open.org/wsbpel/2.0/varprop"))) {
				WSDL4BPELReaderImpl reader = new WSDL4BPELReaderImpl();
				JAXBElement jaxbPlt = reader.convertElement2Property((Element)part);

				// change element by jaxb element
				if(type.getSimpleName().equals("TExtensibleDocumented")) {
					((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
					res = jaxbPlt;
				} else if(type.getSimpleName().equals("DescriptionType")) {
					((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().remove(part);
					res = jaxbPlt;
				}
				
				// create partnerLinkType
				this.properties.add(new PropertyImpl(jaxbPlt.getValue(), (Description) this.tag));
			}
		} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.Property)) {
			// create partnerLinkType
			this.properties.add(new PropertyImpl((org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.Property)((JAXBElement)part).getValue(), (Description) this.tag));
		} else if(part instanceof org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.Property) {
			// create partnerLinkType
			this.properties.add(new PropertyImpl((org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.Property)part, (Description) this.tag));
		}
		return res;
	}


	private JAXBElement extractPropertyAliasInWSDL(Object part, Class type)
	throws WSDL4BPELException, WSDLException {
		JAXBElement res = null;
		if (part instanceof Element) {
			if((((Element)part).getLocalName().equals("propertyAlias"))&&(((Element)part).getNamespaceURI().equals("http://docs.oasis-open.org/wsbpel/2.0/varprop"))) {
				WSDL4BPELReaderImpl reader = new WSDL4BPELReaderImpl();
				JAXBElement jaxbPlt = reader.convertElement2PropertyAlias((Element)part);

				// change element by jaxb element
				if(type.getSimpleName().equals("TExtensibleDocumented")) {
					((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
					res = jaxbPlt;
				} else if(type.getSimpleName().equals("DescriptionType")) {
					((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().remove(part);
					res = jaxbPlt;
				}
				
				// create partnerLinkType
				this.propertyAliases.add(new PropertyAliasImpl(jaxbPlt.getValue(), (Description) this.tag));
			}
		} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.PropertyAlias)) {
			// create partnerLinkType
			this.propertyAliases.add(new PropertyAliasImpl((org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.PropertyAlias)((JAXBElement)part).getValue(), (Description) this.tag));
		} else if(part instanceof org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.PropertyAlias) {
			// create partnerLinkType
			this.propertyAliases.add(new PropertyAliasImpl((org.ow2.easywsdl.extensions.wsdl4bpel.org.oasis_open.docs.wsbpel._2_0.varprop.PropertyAlias)part, (Description) this.tag));
		}
		return res;
	}




	public List getPartnerLinkTypes() throws WSDL4BPELException {
		return this.partnerLinkTypes;
	}

	public void addPartnerLinkType(PartnerLinkType plt) throws WSDL4BPELException {
		this.partnerLinkTypes.add(plt);
		JAXBElement pltModel = factory.createPartnerLinkType((TPartnerLinkType) ((AbstractWSDLElementImpl)plt).getModel());
		if(((AbstractWSDLElementImpl)this.tag).getModel() instanceof TDefinitions) {
			((TDefinitions)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().add(pltModel);
		} else if(((AbstractWSDLElementImpl)this.tag).getModel() instanceof DescriptionType) {
			((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().add(pltModel);
		} 
		
	}

	public PartnerLinkType removePartnerLinkType(PartnerLinkType plt) throws WSDL4BPELException {
		throw new NotImplementedException();
	}

	public List removeAllPartnerLinkTypes() throws WSDL4BPELException {
		throw new NotImplementedException();
	}


	public List getProperties() throws WSDL4BPELException {
		return this.properties;
	}


	public List getAllPropertyAliases() throws WSDL4BPELException {
		return this.propertyAliases;
	}


	public Property getProperty(QName property) throws WSDL4BPELException {
		Property res = null; 
		for(Property prop: this.properties) {
			
			if(prop.getQName().equals(property)) {
				res = prop;
				break;
			}
		}
		return res;
	}


	public List getPropertyAliases4ThisProperty(QName property)
			throws WSDL4BPELException {
		List res = new ArrayList(); 
		for(PropertyAlias prop: this.propertyAliases) {
			
			if(prop.getPropertyName().equals(property)) {
				res.add(prop);
			}
		}
		return res;
	}

	public PartnerLinkType getPartnerLinkType(QName plt) throws WSDL4BPELException {
		PartnerLinkType res = null;
		for(PartnerLinkType partner: this.partnerLinkTypes) {
			if(partner.getQName().equals(plt)) {
				res = partner;
				break;
			}
		}
		return res;
	}

}