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

org.ow2.easywsdl.extensions.wsdl4complexwsdl.impl.WSDL4ComplexWsdlElementImpl Maven / Gradle / Ivy

There is a newer version: 2.8.0
Show newest version
/**
 * Copyright (c) 2008-2012 EBM WebSourcing, 2012-2016 Linagora
 * 
 * This program/library is free software: you can redistribute it and/or modify
 * it under the terms of the New BSD License (3-clause license).
 *
 * This program/library 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. See the New BSD License (3-clause license)
 * for more details.
 *
 * You should have received a copy of the New BSD License (3-clause license)
 * along with this program/library; If not, see http://directory.fsf.org/wiki/License:BSD_3Clause/
 * for the New BSD License (3-clause license).
 */
 
package org.ow2.easywsdl.extensions.wsdl4complexwsdl.impl;

import java.util.Iterator;

import javax.xml.bind.JAXBElement;

import org.ow2.easywsdl.extensions.complexwsdl.ImportedDocuments;
import org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.WSDL4ComplexWsdlElement;
import org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.WSDL4ComplexWsdlException;
import org.ow2.easywsdl.extensions.wsdl4complexwsdl.impl.inout.WSDL4ComplexWsdlReaderImpl;
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 WSDL4ComplexWsdlElementImpl implements WSDL4ComplexWsdlElement {

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

	protected T tag;

	private org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.ImportedDocuments imptDocs;
	
	private static WSDL4ComplexWsdlReaderImpl reader = null;
	private static WSDL4ComplexWsdlException readerException = null;
	
	static {
		try {
			reader = new WSDL4ComplexWsdlReaderImpl();
		} catch (WSDL4ComplexWsdlException e) {
			readerException = e;
		}
	}
	
	public static WSDL4ComplexWsdlReaderImpl getWSDLReader() throws WSDL4ComplexWsdlException {
		if(readerException != null) {
			throw readerException;
		}
		return reader;
	}
	
	public WSDL4ComplexWsdlElementImpl(final T t) throws WSDL4ComplexWsdlException {
		this.tag = t;
		try {
			getImportedDocumentsInAnyDescription();
		} catch (WSDLException e) {
			throw new WSDL4ComplexWsdlException(e);
		}
	}


	private void getImportedDocumentsInAnyDescription() throws WSDL4ComplexWsdlException,
	WSDLException {
		// get partner link in description
		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
					if (part instanceof Element) {
						if((((Element)part).getLocalName().equals("importedDocuments"))&&(((Element)part).getNamespaceURI().equals("http://petals.ow2.org/wsdlExtensions"))) {
							WSDL4ComplexWsdlReaderImpl reader = getWSDLReader();
							JAXBElement jaxbPlt = reader.convertElement2ImportedDocuments((Element)part);

							// change element by jaxb element
							((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().remove(part);
							((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().add(jaxbPlt);

							// create partnerLinkType
							this.imptDocs  = new ImportedDocumentsImpl(jaxbPlt.getValue(), (Description) this.tag);
						}
					}
				}
			} 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
					if (part instanceof Element) {
						if((((Element)part).getLocalName().equals("importedDocuments"))&&(((Element)part).getNamespaceURI().equals("http://petals.ow2.org/wsdlExtensions"))) {
							WSDL4ComplexWsdlReaderImpl reader = getWSDLReader();
							JAXBElement jaxbPlt = reader.convertElement2ImportedDocuments((Element)part);

							// change element by jaxb element
							((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
							((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().add(jaxbPlt);

							// create importedDocuments
							this.imptDocs = new ImportedDocumentsImpl(jaxbPlt.getValue(), (Description) this.tag);
						}
					} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof ImportedDocuments)) {
						this.imptDocs = new ImportedDocumentsImpl((ImportedDocuments) ((JAXBElement)part).getValue(), (Description) this.tag);
					}
				}
			} 
		}
	}

	private void setImportedDocumentsInAnyDescription(ImportedDocuments imptDocument) throws WSDL4ComplexWsdlException {
		try {
			// get partner link in description
			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
						if (part instanceof Element) {
							if((((Element)part).getLocalName().equals("importedDocuments"))&&(((Element)part).getNamespaceURI().equals("http://petals.ow2.org/wsdlExtensions"))) {
								
								// change element by jaxb element
								((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().remove(part);
								if(imptDocument != null) {
									((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().add(imptDocument);
								}
								it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
							}
						} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof ImportedDocuments)) {
							if(imptDocument != null) {
								((JAXBElement)part).setValue(imptDocument);
							} else {
								((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
								it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
							}
						}
					}
				} 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
						if (part instanceof Element) {
							if((((Element)part).getLocalName().equals("importedDocuments"))&&(((Element)part).getNamespaceURI().equals("http://petals.ow2.org/wsdlExtensions"))) {
								WSDL4ComplexWsdlReaderImpl reader = getWSDLReader();

								reader.convertElement2ImportedDocuments((Element)part);

								// change element by jaxb element
								((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
								if(imptDocument != null) {
									((DescriptionType)((AbstractWSDLElementImpl)this.tag).getModel()).getImportOrIncludeOrTypes().add(imptDocument);
								}
								it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
							}
						} else if((part instanceof JAXBElement)&&(((JAXBElement)part).getValue() instanceof ImportedDocuments)) {
							if(imptDocument != null) {
								((JAXBElement)part).setValue(imptDocument);
							} else {
								((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().remove(part);
								it = ((TExtensibleDocumented)((AbstractWSDLElementImpl)this.tag).getModel()).getAny().iterator();
							}
						}
					}
				} 
			}
		} catch (WSDLException e) {
			throw new WSDL4ComplexWsdlException(e);
		}

	}


	public org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.ImportedDocuments getImportedDocuments() {
		return this.imptDocs;
	}


	public void setImportedDocuments(
			org.ow2.easywsdl.extensions.wsdl4complexwsdl.api.ImportedDocuments docs) throws WSDL4ComplexWsdlException {
		this.imptDocs = docs;
		if(this.imptDocs != null) {
			this.setImportedDocumentsInAnyDescription((ImportedDocuments) ((AbstractWSDLElementImpl)this.imptDocs).getModel());
		} else {
			this.setImportedDocumentsInAnyDescription(null);
		}
	}



}