WSDLUtilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.wsdl;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.wsdl.Binding;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.Types;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.schema.Schema;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.openspcoop2.utils.xml.AbstractXMLUtils;
import org.openspcoop2.utils.xml.DynamicNamespaceContext;
import org.openspcoop2.utils.xml.PrettyPrintXMLUtils;
import org.openspcoop2.utils.xml.XMLException;
import org.openspcoop2.utils.xml.XPathExpressionEngine;
import org.openspcoop2.utils.xml.XPathNotFoundException;
import org.openspcoop2.utils.xml.XPathReturnType;
import org.openspcoop2.utils.xml.XSDUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import com.ibm.wsdl.xml.WSDLReaderImpl;
import com.ibm.wsdl.xml.WSDLWriterImpl;
/**
* Utilities per i WSDL
*
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class WSDLUtilities {
// public static WSDLUtilities getInstance(){
// return new WSDLUtilities(null); // senza xmlUtils
// }
public static WSDLUtilities getInstance(AbstractXMLUtils xmlUtils){
return new WSDLUtilities(xmlUtils);
}
private AbstractXMLUtils xmlUtils = null;
public WSDLUtilities(AbstractXMLUtils xmlUtils){
this.xmlUtils = xmlUtils;
}
/* ---------------- METODI STATICI PUBBLICI ------------------------- */
/** WSDLReader */
public WSDLReaderImpl getWSDLReader(boolean verbose,boolean importDocuments){
WSDLReaderImpl wsdlReader = new WSDLReaderImpl();
wsdlReader.setFeature("javax.wsdl.verbose", verbose);
wsdlReader.setFeature("javax.wsdl.importDocuments", importDocuments);
return wsdlReader;
}
// IS WSDL
public boolean isWSDL(byte[]wsdl) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(!this.xmlUtils.isDocument(wsdl)){
return false;
}
Document docXML = this.xmlUtils.newDocument(wsdl);
Element elemXML = docXML.getDocumentElement();
return isWSDL(elemXML);
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public boolean isWSDL(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException {
Element elemXML = wsdl.getDocumentElement();
return isWSDL(elemXML);
}
public boolean isWSDL(Element wsdl) throws org.openspcoop2.utils.wsdl.WSDLException {
return isWSDL((Node)wsdl);
}
public boolean isWSDL(Node wsdl) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(wsdl == null){
throw new Exception("Documento wsdl da verificare non definito");
}
//System.out.println("LOCAL["+wsdl.getLocalName()+"] NAMESPACE["+wsdl.getNamespaceURI()+"]");
if(!"definitions".equals(wsdl.getLocalName())){
return false;
}
if(!"http://schemas.xmlsoap.org/wsdl/".equals(wsdl.getNamespaceURI())){
return false;
}
return true;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
// TARGET NAMESPACE
public String getTargetNamespace(byte[]xsd) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(!this.xmlUtils.isDocument(xsd)){
throw new Exception("Wsdl non e' un documento valido");
}
Document docXML = this.xmlUtils.newDocument(xsd);
Element elemXML = docXML.getDocumentElement();
return getTargetNamespace(elemXML);
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public String getTargetNamespace(Document xsd) throws org.openspcoop2.utils.wsdl.WSDLException {
Element elemXML = xsd.getDocumentElement();
return getTargetNamespace(elemXML);
}
public String getTargetNamespace(Element elemXML) throws org.openspcoop2.utils.wsdl.WSDLException {
return getTargetNamespace((Node)elemXML);
}
public String getTargetNamespace(Node elemXML) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(elemXML == null){
throw new Exception("Wsdl non e' un documento valido");
}
//System.out.println("LOCAL["+elemXML.getLocalName()+"] NAMESPACE["+elemXML.getNamespaceURI()+"]");
if(!"definitions".equals(elemXML.getLocalName())){
throw new Exception("Root element non e' un definition wsdl ("+elemXML.getLocalName()+")");
}
String targetNamespace = this.xmlUtils.getAttributeValue(elemXML, "targetNamespace");
//System.out.println("TARGET["+targetNamespace+"]");
return targetNamespace;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public String getTargetNamespace(Schema schema){
NamedNodeMap attributi = schema.getElement().getAttributes();
if(attributi!=null){
for(int i=0; i<attributi.getLength(); i++){
Node a = attributi.item(i);
//System.out.println("aaa ["+a.getLocalName()+"] ["+a.getPrefix()+"] ["+a.getNodeValue()+"]");
if("targetNamespace".equals(a.getLocalName())){
return a.getNodeValue();
}
}
}
return null;
}
// IMPORT
public String getImportNamespace(Node elemXML) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(elemXML == null){
throw new Exception("Non e' un import valido");
}
//System.out.println("LOCAL["+elemXML.getLocalName()+"] NAMESPACE["+elemXML.getNamespaceURI()+"]");
if(!"import".equals(elemXML.getLocalName())){
throw new Exception("Root element non e' un import wsdl ("+elemXML.getLocalName()+")");
}
String targetNamespace = this.xmlUtils.getAttributeValue(elemXML, "namespace");
//System.out.println("TARGET["+targetNamespace+"]");
return targetNamespace;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public String getImportLocation(Node elemXML) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(elemXML == null){
throw new Exception("Non e' un import valido");
}
//System.out.println("LOCAL["+elemXML.getLocalName()+"] NAMESPACE["+elemXML.getNamespaceURI()+"]");
if(!"import".equals(elemXML.getLocalName())){
throw new Exception("Root element non e' un import wsdl ("+elemXML.getLocalName()+")");
}
String targetNamespace = this.xmlUtils.getAttributeValue(elemXML, "location");
//System.out.println("TARGET["+targetNamespace+"]");
return targetNamespace;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
// SCHEMA LOCATION
public void updateLocation(Node elemXML, String newLocation) throws org.openspcoop2.utils.wsdl.WSDLException {
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if(elemXML == null){
throw new Exception("Non e' un import valido");
}
//System.out.println("LOCAL["+elemXML.getLocalName()+"] NAMESPACE["+elemXML.getNamespaceURI()+"]");
if(!"import".equals(elemXML.getLocalName())){
throw new Exception("Root element non e' un import wsdl ("+elemXML.getLocalName()+")");
}
if(elemXML!=null && elemXML.getAttributes()!=null && elemXML.getAttributes().getLength()>0){
// try{
// System.out.println(" PRIMA: "+this.xmlUtils.toString(schemaImportInclude));
// }catch(Exception e){System.out.println("ERRORE PRIMA");}
Attr oldLocation = (Attr) elemXML.getAttributes().getNamedItem("location");
this.xmlUtils.removeAttribute(oldLocation, (Element)elemXML);
// try{
// System.out.println(" REMOVE: "+this.xmlUtils.toString(schemaImportInclude));
// }catch(Exception e){System.out.println("ERRORE REMOVE");}
oldLocation.setValue(newLocation);
this.xmlUtils.addAttribute(oldLocation, (Element)elemXML);
// try{
// System.out.println(" DOPO: "+this.xmlUtils.toString(schemaImportInclude));
// }catch(Exception e){System.out.println("ERRORE DOPO");}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
/* ---------------- WRITE TO ------------------------- */
public void writeWsdlTo(Definition wsdl, String absoluteFilename) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
writeWsdlTo(wsdl,absoluteFilename,false);
}
public void writeWsdlTo(Definition wsdl, String absoluteFilename,boolean prettyPrint) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
if(wsdl == null) return;
WSDLWriterImpl writer = new WSDLWriterImpl();
if(prettyPrint){
writeWsdlTo(wsdl, new File(absoluteFilename), prettyPrint);
}else{
writer.writeWSDL(wsdl, new FileWriter(absoluteFilename));
}
}
public void writeWsdlTo(Definition wsdl, File file) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
writeWsdlTo(wsdl,file,false);
}
public void writeWsdlTo(Definition wsdl, File file,boolean prettyPrint) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
if(wsdl == null) return;
WSDLWriterImpl writer = new WSDLWriterImpl();
if(prettyPrint){
FileOutputStream fout = null;
try{
fout = new FileOutputStream(file);
writeWsdlTo(wsdl, fout, prettyPrint);
}finally{
try{
if(fout!=null) {
fout.flush();
}
}catch(Exception eClose){}
try{
if(fout!=null) {
fout.close();
}
}catch(Exception eClose){
// close
}
}
}else{
writer.writeWSDL(wsdl, new FileWriter(file));
}
}
public void writeWsdlTo(Definition wsdl, OutputStream out) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
writeWsdlTo(wsdl,out,false);
}
public void writeWsdlTo(Definition wsdl, OutputStream out,boolean prettyPrint) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
if(wsdl == null) return;
WSDLWriterImpl writer = new WSDLWriterImpl();
if(prettyPrint){
out.write(prettyPrintWsdl(wsdl).getBytes());
}else{
writer.writeWSDL(wsdl, out);
}
}
public void writeWsdlTo(Definition wsdl, Writer writer)throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
writeWsdlTo(wsdl,writer,false);
}
public void writeWsdlTo(Definition wsdl, Writer writer,boolean prettyPrint)throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
if(wsdl == null) return;
WSDLWriterImpl writerWsdl = new WSDLWriterImpl();
if(prettyPrint){
writer.append(prettyPrintWsdl(wsdl));
}else{
writerWsdl.writeWSDL(wsdl, writer);
}
}
private String prettyPrintWsdl(Definition wsdl) throws WSDLException, IOException, org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
writeWsdlTo(wsdl, bout, false);
bout.flush();
bout.close();
Document wsdlDocument = this.xmlUtils.newDocument(bout.toByteArray());
return PrettyPrintXMLUtils.prettyPrintWithTrAX(wsdlDocument);
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
/* ------------------ GENERAZIONE DEFINITION ---------------------------- */
/** NOTA: le importsDocument riguardano i WSDL Imports e non gli xsd imports!!!!!!! */
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param file Il file da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromFile(File file) throws WSDLException{
return readWSDLFromFile(file, false, true);
}
public Definition readWSDLFromFile(File file,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if (file == null) throw new Exception("Path non definito");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
Definition def = reader.readWSDL(file.getAbsolutePath());
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromLocation(String path)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param path Il path da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromLocation(String path) throws WSDLException{
return readWSDLFromLocation(path, false, true);
}
public Definition readWSDLFromLocation(String path,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if (path == null) throw new Exception("Path non definito");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
Definition def = reader.readWSDL(path);
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromLocation(String path)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param wsdl I bytes da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromBytes(byte[] wsdl) throws WSDLException{
return readWSDLFromBytes(wsdl, false, true);
}
public Definition readWSDLFromBytes(byte[] wsdl,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
if (wsdl == null) throw new Exception("Bytes non definiti");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
Document document = this.xmlUtils.newDocument(wsdl);
Definition def = reader.readWSDL(null,document);
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromBytes(byte[] wsdl)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param doc Document da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromDocument(Document doc) throws WSDLException{
return readWSDLFromDocument(doc, false, true);
}
public Definition readWSDLFromDocument(Document doc,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if (doc == null) throw new Exception("Document non definito");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
Definition def = reader.readWSDL(null,doc);
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromDocument(Document doc)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param elem Element da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromElement(Element elem) throws WSDLException{
return readWSDLFromElement(elem, false, true);
}
public Definition readWSDLFromElement(Element elem,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if (elem == null) throw new Exception("Element non definito");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
String param = null;
Definition def = reader.readWSDL(param,elem);
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromElement(Element elem)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/**
* Legge un WSDL dal path in parametro e ne ritorna la Definition.
* @param uri La URI da cui leggere il WSDL.
* @return La definition corretta o null in caso di path mancante o errori.
*/
public Definition readWSDLFromURI(URI uri) throws WSDLException{
return readWSDLFromURI(uri, false, true);
}
public Definition readWSDLFromURI(URI uri,boolean verbose,boolean importsDocument) throws WSDLException{
try{
if (uri == null) throw new Exception("URI non definita");
WSDLReaderImpl reader = getWSDLReader(verbose, importsDocument);
try {
Definition def = reader.readWSDL(null,uri.getPath());
return def;
} catch (WSDLException e) {
throw e;
}
}catch(Exception e){
throw new WSDLException("WSDLDefinitorio.readWSDLFromURI(URI uri)","Lettura del wsdl non riuscita: "+e.getMessage());
}
}
/* ------------------ READ URL ---------------------------- */
public String getServiceEndpoint(byte [] wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return this.getServiceEndpoint(wsdl, null);
}
public String getServiceEndpoint(byte [] wsdl, String portType) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
Document d = this.xmlUtils.newDocument(wsdl);
this.removeImports(d);
this.removeSchemiIntoTypes(d);
return this.getServiceEndpoint(new DefinitionWrapper(d, this.xmlUtils, false, false),portType);
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public String getServiceEndpoint(Definition wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return this.getServiceEndpoint(wsdl, null);
}
public String getServiceEndpoint(Definition wsdl, String portType) throws org.openspcoop2.utils.wsdl.WSDLException{
try {
return this.getServiceEndpoint(new DefinitionWrapper(wsdl, this.xmlUtils),portType);
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public String getServiceEndpoint(DefinitionWrapper wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return this.getServiceEndpoint(wsdl, null);
}
public String getServiceEndpoint(DefinitionWrapper wsdl, String portType) throws org.openspcoop2.utils.wsdl.WSDLException{
try {
if(wsdl==null || wsdl.getServices()==null || wsdl.getServices().isEmpty()) {
return null;
}
if(portType==null) {
if(wsdl.getServices().size()>1) {
throw new Exception("Found more than one service, select port type");
}
Service service = (Service) wsdl.getServices().values().iterator().next();
if(service.getPorts()==null || service.getPorts().isEmpty()) {
return null;
}
if(service.getPorts().size()>1) {
throw new Exception("Found more than one port, select port type");
}
List<?> list = ((Port) service.getPorts().values().iterator().next()).getExtensibilityElements();
if(list==null || list.isEmpty()) {
return null;
}
for (Object object : list) {
if(object instanceof javax.wsdl.extensions.soap.SOAPAddress) {
javax.wsdl.extensions.soap.SOAPAddress addr = (javax.wsdl.extensions.soap.SOAPAddress) object;
return addr.getLocationURI();
}
else if(object instanceof javax.wsdl.extensions.soap12.SOAP12Address) {
javax.wsdl.extensions.soap12.SOAP12Address addr = (javax.wsdl.extensions.soap12.SOAP12Address) object;
return addr.getLocationURI();
}
}
return null;
}
else {
if(wsdl.getPortTypes()==null || wsdl.getPortTypes().isEmpty()) {
return null;
}
QName qNamePT = null;
for (Object o : wsdl.getPortTypes().keySet()) {
if(o instanceof QName) {
QName qName = (QName) o;
if(portType.equals(qName.getLocalPart())) {
qNamePT = qName;
break;
}
}
}
if(qNamePT==null) {
return null;
}
if(wsdl.getBindings()==null || wsdl.getBindings().isEmpty()) {
return null;
}
QName qNameBinding = null;
for (Object o : wsdl.getBindings().values()) {
if(o instanceof Binding) {
Binding bindingCheck = (Binding) o;
if(bindingCheck.getPortType()!=null) {
if(qNamePT.equals(bindingCheck.getPortType().getQName())) {
qNameBinding = bindingCheck.getQName();
break;
}
}
}
}
if(qNameBinding==null) {
return null;
}
for (Object o : wsdl.getServices().values()) {
if(o instanceof Service) {
Service serviceCheck = (Service) o;
if(serviceCheck.getPorts()!=null && !serviceCheck.getPorts().isEmpty()) {
for (Object oP : serviceCheck.getPorts().values()) {
if(oP instanceof Port) {
Port portCheck = (Port) oP;
if(portCheck.getBinding()!=null ) {
if(qNameBinding.equals(portCheck.getBinding().getQName())) {
List<?> list = portCheck.getExtensibilityElements();
if(list==null || list.isEmpty()) {
return null;
}
for (Object object : list) {
if(object instanceof javax.wsdl.extensions.soap.SOAPAddress) {
javax.wsdl.extensions.soap.SOAPAddress addr = (javax.wsdl.extensions.soap.SOAPAddress) object;
return addr.getLocationURI();
}
else if(object instanceof javax.wsdl.extensions.soap12.SOAP12Address) {
javax.wsdl.extensions.soap12.SOAP12Address addr = (javax.wsdl.extensions.soap12.SOAP12Address) object;
return addr.getLocationURI();
}
}
}
}
}
}
}
}
}
return null;
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
/* ---------------- METODI ADD ------------------------- */
public void addSchemaIntoTypes(Document wsdl, Node schema) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
childDefinition.appendChild(wsdl.createTextNode("\n\t\t"));
childDefinition.appendChild(schema);
childDefinition.appendChild(wsdl.createTextNode("\n"));
}
}
}
}
}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante l'aggiunto di uno schema nell'elemento Types: "+e.getMessage(),e);
}
}
public void addImportSchemaIntoTypes(Document wsdl, String targetNamespace, String location) throws org.openspcoop2.utils.wsdl.WSDLException{
// NOTA: types deve esistere
try{
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
Element importSchemaElement = wsdl.createElementNS("http://www.w3.org/2001/XMLSchema", "schema");
importSchemaElement.setAttribute("targetNamespace", targetNamespace);
Element importElement = wsdl.createElementNS("http://www.w3.org/2001/XMLSchema", "import");
importElement.setAttribute("namespace", targetNamespace);
importElement.setAttribute("schemaLocation", location);
importSchemaElement.appendChild(wsdl.createTextNode("\n\t\t\t"));
importSchemaElement.appendChild(importElement);
importSchemaElement.appendChild(wsdl.createTextNode("\n\t\t"));
childDefinition.appendChild(wsdl.createTextNode("\n\t\t"));
childDefinition.appendChild(importSchemaElement);
childDefinition.appendChild(wsdl.createTextNode("\n\n"));
}
}
}
}
}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante l'aggiunto di uno schema nell'elemento Types: "+e.getMessage(),e);
}
}
/* ---------------- METODI GET ------------------------- */
public Node getIfExistsDefinitionsElementIntoWSDL(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
return child;
}
}
}
return null;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
/* ---------------- METODI READ IMPORTS ------------------------- */
public List<Node> readImports(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
List<Node> imports = new ArrayList<Node>();
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("import".equals(childDefinition.getLocalName())){
imports.add(childDefinition);
}
}
}
}
}
}
return imports;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
public List<Node> readImportsAndIncludesSchemaIntoTypes(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return readImportsIncludesSchemaIntoTypes(wsdl,true,true);
}
public List<Node> readImportsSchemaIntoTypes(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return readImportsIncludesSchemaIntoTypes(wsdl,true,false);
}
public List<Node> readIncludesSchemaIntoTypes(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
return readImportsIncludesSchemaIntoTypes(wsdl,false,true);
}
private List<Node> readImportsIncludesSchemaIntoTypes(Document wsdl,boolean readImport,boolean readInclude) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
List<Node> imports = new ArrayList<Node>();
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
NodeList listTypes = childDefinition.getChildNodes();
if(listTypes!=null){
for(int h=0; h<listTypes.getLength(); h++){
Node childTypes = listTypes.item(h);
if("schema".equals(childTypes.getLocalName())){
String targetNamespaceSchema = null;
if(targetNamespaceSchema==null){
try{
targetNamespaceSchema = xsdUtils.getTargetNamespace(childTypes);
}catch(Exception e){}
}
if(readImport){
List<Node> importsSchemi = xsdUtils.readImports(targetNamespaceSchema,childTypes);
if(importsSchemi!=null && importsSchemi.size()>0){
imports.addAll(importsSchemi);
}
}
if(readInclude){
List<Node> includesSchemi = xsdUtils.readIncludes(targetNamespaceSchema,childTypes);
if(includesSchemi!=null && includesSchemi.size()>0){
imports.addAll(includesSchemi);
}
}
}
}
}
}
}
}
}
}
}
return imports;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
public List<Node> readImportsAndIncludesFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
return xsdUtils.readImportsAndIncludes(getTargetNamespace(xsd),xsd.getElement());
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public List<Node> readImportsFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
return xsdUtils.readImports(getTargetNamespace(xsd),xsd.getElement());
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
public List<Node> readIncludesFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
return xsdUtils.readIncludes(getTargetNamespace(xsd),xsd.getElement());
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
}
/**
* Recupera l'array dei documenti in xsd:include
* @param wsdlNormalizzato
* @return array dei documenti in xsd:include
* @throws IOException
* @throws XMLException
* @throws org.openspcoop2.utils.wsdl.WSDLException
*/
public List<byte[]> getSchemiXSD(Definition wsdlNormalizzato) throws IOException,TransformerException, XMLException, org.openspcoop2.utils.wsdl.WSDLException{
if(this.xmlUtils==null){
throw new org.openspcoop2.utils.wsdl.WSDLException("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
// Il wsdl deve contenere solo schemi xsd completi
List<byte[]> v = new ArrayList<byte[]>();
Types types = wsdlNormalizzato.getTypes();
List<?> xsdTypes = types.getExtensibilityElements();
for (int i = 0; i< xsdTypes.size(); i++){
Schema schema = (Schema) xsdTypes.get(i);
v.add(this.xmlUtils.toByteArray(schema.getElement()));
}
return v;
}
public List<Node> getSchemiXSD(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
List<Node> schemi = new ArrayList<Node>();
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
NodeList listTypes = childDefinition.getChildNodes();
if(listTypes!=null){
for(int h=0; h<listTypes.getLength(); h++){
Node childTypes = listTypes.item(h);
if("schema".equals(childTypes.getLocalName()) && xsdUtils.isXSDSchema(childTypes) ){
schemi.add(childTypes);
}
}
}
}
}
}
}
}
}
return schemi;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
public List<byte[]> getBytesSchemiXSD(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
List<Node> schemi = this.getSchemiXSD(wsdl);
try{
if(this.xmlUtils==null){
throw new Exception("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
List<byte[]> schemiBytes = new ArrayList<byte[]>();
if(schemi!=null && schemi.size()>0){
for (Node node : schemi) {
schemiBytes.add(this.xmlUtils.toByteArray(node));
}
}
return schemiBytes;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
/* ---------------- METODI NORMALIZZAZIONE ------------------------- */
public String normalizzazioneSchemaPerInserimentoInWsdl(Element schemaXSD,Element wsdl,
HashMap<String,String> prefixForWSDL,String uniquePrefixWSDL,boolean docImportato,String targetNamespaceParent) throws org.openspcoop2.utils.wsdl.WSDLException{
String targetNamespace = null;
if(docImportato){
// GESTIONE DOCUMENTO IMPORTATO
//System.out.println("***** IMPORT");
// Esamino targetNamespace e prefisso dell'xsd per verificarne la presenza nel definitions del wsdl
targetNamespace = readPrefixForWsdl(schemaXSD, wsdl, prefixForWSDL, uniquePrefixWSDL, true);
// Rimozione completa di tutti gli attributi all'infuori del TargetNamespace e dell'associato prefix
NamedNodeMap attributi = schemaXSD.getAttributes();
List<Attr> attributiDaMantenere = new ArrayList<Attr>();
if(attributi!=null && attributi.getLength()>0){
for (int i = (attributi.getLength()-1); i >= 0; i--) {
Attr attr = (Attr) attributi.item(i);
//System.out.println("REMOVE NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
/*
* REMOVE NAME[xmlns:tns] LOCAL_NAME[tns] VALUE[http://example.ResponseError] URI[http://www.w3.org/2000/xmlns/]...
REMOVE NAME[xmlns:_p3_n4_tns] LOCAL_NAME[null] VALUE[http://example.ResponseError] URI[null]...
REMOVE NAME[xmlns:Q1] LOCAL_NAME[Q1] VALUE[http://example.libCodifiche] URI[http://www.w3.org/2000/xmlns/]...
REMOVE NAME[xmlns] LOCAL_NAME[xmlns] VALUE[http://www.w3.org/2001/XMLSchema] URI[http://www.w3.org/2000/xmlns/]...
REMOVE NAME[targetNamespace] LOCAL_NAME[targetNamespace] VALUE[http://example.ResponseError] URI[null]...
REMOVE NAME[elementFormDefault] LOCAL_NAME[elementFormDefault] VALUE[qualified] URI[null]...
REMOVE NAME[attributeFormDefault] LOCAL_NAME[attributeFormDefault] VALUE[unqualified] URI[null]...
**/
if(targetNamespace.equals(attr.getNodeValue()) ||
(!attr.getNodeName().equals("xmlns") && !attr.getNodeName().startsWith("xmlns:"))
){
//System.out.println("REMOVE NON EFFETTUATO");
attributiDaMantenere.add(attr);
}
_correctPrefix(attr, targetNamespace, prefixForWSDL, schemaXSD, attributiDaMantenere);
//schemaXSD.removeAttributeNode(attr);
this.xmlUtils.removeAttribute(attr, schemaXSD);
}
}
// IL Codice sotto non può funzionare, poichè in axiom la struttura NamedNodeMap non viene aggiornata dopo la remove
// while(attributi.getLength()>0){
// Attr attr = (Attr) attributi.item(0);
// System.out.println("REMOVE NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
// if(targetNamespace.equals(attr.getNodeValue())){
// System.out.println("REMOVE NON EFFETTUATO");
// attributiDaMantenere.add(attr);
// }
// schemaXSD.removeAttributeNode(attr);
// }
// // DEBUG DOPO ELIMINAZIONE
// attributi = schemaXSD.getAttributes();
// System.out.println("TEST: "+attributi.getLength());
// for (int i = 0; i < attributi.getLength(); i++) {
// Attr attr = (Attr) attributi.item(i);
// System.out.println("TEST NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
// }
while(attributiDaMantenere.size()>0){
//schemaXSD.setAttributeNode(attributiDaMantenere.remove(0));
Attr attr = attributiDaMantenere.remove(0);
//System.out.println("RE-ADD NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
this.xmlUtils.addAttribute(attr, schemaXSD);
}
// // DEBUG DOPO AGGIUNTA
// attributi = schemaXSD.getAttributes();
// System.out.println("TEST2: "+attributi.getLength());
// for (int i = 0; i < attributi.getLength(); i++) {
// Attr attr = (Attr) attributi.item(i);
// System.out.println("TEST2 NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
// }
}else{
// GESTIONE DOCUMENTO INCLUSO
//System.out.println("***** INCLUDE");
targetNamespace = targetNamespaceParent;
// Rimozione completa di tutti gli attributi
NamedNodeMap attributi = schemaXSD.getAttributes();
List<Attr> attributiDaMantenere = new ArrayList<Attr>();
if(attributi!=null && attributi.getLength()>0){
for (int i = (attributi.getLength()-1); i >= 0; i--) {
Attr attr = (Attr) attributi.item(i);
//System.out.println("REMOVE NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
if(targetNamespace.equals(attr.getNodeValue()) ||
(!attr.getNodeName().equals("xmlns") && !attr.getNodeName().startsWith("xmlns:"))
){
//System.out.println("REMOVE NON EFFETTUATO");
attributiDaMantenere.add(attr);
}
_correctPrefix(attr, targetNamespace, prefixForWSDL, schemaXSD, attributiDaMantenere);
//schemaXSD.removeAttributeNode(attr);
this.xmlUtils.removeAttribute(attr, schemaXSD);
}
}
// IL Codice sotto non può funzionare, poichè in axiom la struttura NamedNodeMap non viene aggiornata dopo la remove
// while(attributi.getLength()>0){
// Attr attr = (Attr) attributi.item(0);
// //System.out.println("REMOVE NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"]...");
// schemaXSD.removeAttributeNode(attr);
// }
// // DEBUG DOPO ELIMINAZIONE
// attributi = schemaXSD.getAttributes();
// System.out.println("TEST: "+attributi.getLength());
// for (int i = 0; i < attributi.getLength(); i++) {
// Attr attr = (Attr) attributi.item(i);
// System.out.println("TEST NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
// }
// Aggiungo targetNamespace e altri prefix associati al namespace
boolean foundTargetNamespace = false;
while(attributiDaMantenere.size()>0){
//schemaXSD.setAttributeNode(attributiDaMantenere.remove(0));
Attr attr = attributiDaMantenere.remove(0);
if("targetNamespace".equals(attr.getName())){
foundTargetNamespace = true;
}
//System.out.println("RE-ADD NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
this.xmlUtils.addAttribute(attr, schemaXSD);
}
if(!foundTargetNamespace){
schemaXSD.setAttribute("targetNamespace", targetNamespace);
}
// // DEBUG DOPO AGGIUNTA
// attributi = schemaXSD.getAttributes();
// System.out.println("TEST2: "+attributi.getLength());
// for (int i = 0; i < attributi.getLength(); i++) {
// Attr attr = (Attr) attributi.item(i);
// System.out.println("TEST2 NAME["+attr.getName()+"] LOCAL_NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] URI["+attr.getNamespaceURI()+"]...");
// }
}
return targetNamespace;
}
private void _correctPrefix(Attr attr, String targetNamespace, HashMap<String,String> prefixForWSDL, Element schemaXSD, List<Attr> attributiDaMantenere) throws org.openspcoop2.utils.wsdl.WSDLException {
XPathExpressionEngine xpathEngine = null;
DynamicNamespaceContext dnc = null;
String exprType = "//*/@type";
String exprRef = "//*/@ref";
List<String> exprs = new ArrayList<>();
exprs.add(exprType);
exprs.add(exprRef);
if(attr.getNodeName().startsWith("xmlns:") && attr.getLocalName()!=null) {
if(!targetNamespace.equals(attr.getNodeValue())){
boolean found = false;
String prefixDest = null;
String prefixSrc = null;
for (String prefix: prefixForWSDL.keySet()) {
String value = prefixForWSDL.get(prefix);
if(value.equals(attr.getNodeValue())) {
found = true;
prefixSrc = attr.getLocalName();
if(prefix.startsWith("xmlns:")) {
prefixDest = prefix.substring("xmlns:".length());
}
else {
prefixDest = prefix;
}
break;
}
}
if(found) {
//System.out.println("DEVO FARE REPLACE DI PREFIX '"+prefixSrc+"' con '"+prefixDest+"'");
for (String expr : exprs) {
if(xpathEngine==null) {
xpathEngine = new XPathExpressionEngine();
dnc = new DynamicNamespaceContext();
dnc.findPrefixNamespace(schemaXSD);
}
Object res = null;
try {
res = xpathEngine.getMatchPattern(schemaXSD, dnc, expr, XPathReturnType.NODESET);
}catch(XPathNotFoundException notFound) {
}
catch(Exception e) {
throw new org.openspcoop2.utils.wsdl.WSDLException(e.getMessage(),e);
}
if(res!=null) {
//System.out.println("XPATH RESULT ("+expr+"): "+res.getClass().getName());
if(res instanceof NodeList) {
NodeList nodeList = (NodeList) res;
for (int j = 0; j < nodeList.getLength(); j++) {
Node n = nodeList.item(j);
//System.out.println("i["+j+"] type["+n.getClass().getName()+"] value["+n.getNodeValue()+"]");
if(n.getNodeValue()!=null && n.getNodeValue().startsWith(prefixSrc+":")) {
n.setNodeValue(n.getNodeValue().replace(prefixSrc+":", prefixDest+":"));
}
}
}
}
// else {
// System.out.println("XPATH RESULT ("+expr+") NULL");
// }
}
}
else {
//System.out.println("REMOVE NON EFFETTUATO, DECL IN WSDL NON PRESENTE");
attributiDaMantenere.add(attr);
}
}
}
}
public String readPrefixForWsdl(Element schemaXSD,Element wsdl,
HashMap<String,String> prefixForWSDL,String uniquePrefixWSDL,boolean targetNamespaceObbligatorio) throws org.openspcoop2.utils.wsdl.WSDLException{
String targetNamespace = null;
//System.out.println("TARGETNAMESPACE="+docElement.getNamespaceURI());
NamedNodeMap attributi = schemaXSD.getAttributes();
if(attributi!=null){
// ricerca targetNamespace XSD
for(int i=0; i<attributi.getLength(); i++){
Node attr = attributi.item(i);
//System.out.println("NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] PREFIX["+attr.getPrefix()+"]");
if("targetNamespace".equals(attr.getLocalName())){
targetNamespace =attr.getNodeValue();
break;
}
}
if(targetNamespace==null){
if(targetNamespaceObbligatorio)
throw new org.openspcoop2.utils.wsdl.WSDLException("Target namespace non trovato");
else
return null;
}
// ricerca prefisso associato al target namespace dell'XSD
String prefixTargetNamespaceXSD = null;
for(int i=0; i<attributi.getLength(); i++){
Node attr = attributi.item(i);
//System.out.println("NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] PREFIX["+attr.getPrefix()+"]");
if(targetNamespace.equals(attr.getNodeValue()) && "xmlns".equals(attr.getPrefix())){
//System.out.println("FOUND");
prefixTargetNamespaceXSD =attr.getLocalName();
break;
}
}
//System.out.println("PREFIX!!! ["+prefixTargetNamespaceXSD+"] ["+targetNamespaceXSD+"]");
// Cerco il prefix nel definition del wsdl, ed in caso non sia definito lo registra per una successiva aggiunta
NamedNodeMap attributi_wsdl = wsdl.getAttributes();
if(attributi_wsdl!=null){
boolean findIntoWSDL = false;
for(int i=0; i<attributi_wsdl.getLength(); i++){
Node attr = attributi_wsdl.item(i);
//System.out.println("WSDL ATTR NAME["+attr.getLocalName()+"] VALUE["+attr.getNodeValue()+"] PREFIX["+attr.getPrefix()+"]");
if(targetNamespace.equals(attr.getNodeValue()) && "xmlns".equals(attr.getPrefix())){
if(prefixTargetNamespaceXSD==null){
findIntoWSDL = (attr.getLocalName()==null);
break;
}
else if(prefixTargetNamespaceXSD.equals(attr.getLocalName())){
findIntoWSDL = true;
break;
}
}
}
if(!findIntoWSDL){
String newPrefix = null;
if(prefixTargetNamespaceXSD==null){
//System.out.println("AGGIUNGO IN WSDL XMLNS (unique:"+uniquePrefixWSDL+"): "+targetNamespace);
if(uniquePrefixWSDL!=null){
newPrefix = "xmlns:"+uniquePrefixWSDL;
}
else{
newPrefix = "xmlns";
}
}else{
//System.out.println("AGGIUNGO IN WSDL XMLNS (unique:"+uniquePrefixWSDL+"):"+prefixTargetNamespaceXSD+" "+targetNamespace);
if(uniquePrefixWSDL!=null){
newPrefix = "xmlns:"+uniquePrefixWSDL+prefixTargetNamespaceXSD;
}else{
newPrefix = "xmlns:"+prefixTargetNamespaceXSD;
}
}
//System.out.println("SET NEW ATTRIBUTE NS LOCALNAME["+newPrefix+"] ...");
schemaXSD.setAttribute(newPrefix, targetNamespace);
//System.out.println("SET NEW ATTRIBUTE NS LOCALNAME["+newPrefix+"] ["+targetNamespace+"] OK");
if(prefixForWSDL.containsKey(newPrefix)==false){
prefixForWSDL.put(newPrefix, targetNamespace);
}
else{
String namespace = prefixForWSDL.get(newPrefix);
if(namespace.equals(targetNamespace)==false){
throw new org.openspcoop2.utils.wsdl.WSDLException("Rilevati due prefissi a cui sono stati associati namespace differenti. \nPrefix["+
newPrefix+"]=Namespace["+namespace+"]\nPrefix["+newPrefix+"]=Namespace["+targetNamespace+"]");
}
}
}
}
}
return targetNamespace;
}
/* ---------------- METODI REMOVE ------------------------- */
/**
* Rimuove i wsdl:import dal documento
*
* @param document
*/
public void removeImports(Document document){
removeImport(document,null);
}
public void removeImport(Document document,Node importNode){
// rimuovo eventuale import per i definitori, visto che nella versione byte[] dal db, gli import non possono essere risolti
NodeList list = document.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("import".equals(childDefinition.getLocalName())){
if(importNode==null){
// System.out.println("REMOVE IMPORT");
child.removeChild(childDefinition);
}else{
if(importNode.equals(childDefinition)){
//System.out.println("REMOVE MIRATA");
child.removeChild(childDefinition);
}
}
}
}
}
}
}
}
}
/**
* Rimuove gli schemi dal wsdl
*
* @param document
* @throws org.openspcoop2.utils.wsdl.WSDLException
*/
public void removeSchemiIntoTypes(Document document) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = document.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
NodeList listTypes = childDefinition.getChildNodes();
if(listTypes!=null){
boolean onlySchemaAndComment = true;
for(int h=0; h<listTypes.getLength(); h++){
Node childTypes = listTypes.item(h);
//System.out.println("?? IMPORT SCHEMA: "+childTypes.getLocalName());
if("schema".equals(childTypes.getLocalName())){
//System.out.println("REMOVE IMPORT SCHEMA");
childDefinition.removeChild(childTypes);
}
else{
if( !(childTypes instanceof Text) && !(childTypes instanceof Comment) ){
onlySchemaAndComment = false;
}
}
}
if(onlySchemaAndComment){
listTypes = childDefinition.getChildNodes();
if(listTypes!=null){
for(int h=0; h<listTypes.getLength(); h++){
childDefinition.removeChild(listTypes.item(h));
}
}
}
}
}
}
}
}
}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
/**
* Rimuove l'elemento types dal wsdl
*
* @param wsdl
* @throws org.openspcoop2.utils.wsdl.WSDLException
*/
public void removeTypes(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
//System.out.println("REMOVE TYPES");
child.removeChild(childDefinition);
}
}
}
}
}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la rimozione dell'elemento Types: "+e.getMessage(),e);
}
}
public void removeImportsFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
if(this.xmlUtils==null){
throw new org.openspcoop2.utils.wsdl.WSDLException("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
xsdUtils.removeImports(xsd.getElement());
}
public void removeIncludesFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
if(this.xmlUtils==null){
throw new org.openspcoop2.utils.wsdl.WSDLException("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
xsdUtils.removeIncludes(xsd.getElement());
}
public void removeImportsAndIncludesFromSchemaXSD(Schema xsd) throws org.openspcoop2.utils.wsdl.WSDLException{
if(this.xmlUtils==null){
throw new org.openspcoop2.utils.wsdl.WSDLException("XMLUtils not initialized in WSDLUtilities, use static instance 'getInstance(AbstractXMLUtils xmlUtils)'");
}
XSDUtils xsdUtils = new XSDUtils(this.xmlUtils);
xsdUtils.removeImportsAndIncludes(xsd.getElement());
}
/**
* Rimuove TUTTI gli Import da una definizione.
* @param definition La definizione da modificare.
*/
public void removeAllImports(Definition definition) throws WSDLException{
if (definition != null) {
DefinitionWrapper wsdl = new DefinitionWrapper(definition,this.xmlUtils);
wsdl.removeAllImports();
}else{
throw new WSDLException("removeAllImports(Definition definition)","WSDL non fornito");
}
}
/**
* Rimuove TUTTI i messaggi da una definizione.
* @param definition La definizione da modificare.
*/
public void removeAllMessages(Definition definition) throws WSDLException{
if (definition != null) {
DefinitionWrapper wsdl = new DefinitionWrapper(definition,this.xmlUtils);
wsdl.removeAllMessages();
}else{
throw new WSDLException("removeAllMessages(Definition definition)","WSDL non fornito");
}
}
/**
* Rimuove TUTTI i PortType da una definizione.
* @param definition La definizione da modificare.
*/
public void removeAllPortTypes(Definition definition) throws WSDLException{
if (definition != null) {
DefinitionWrapper wsdl = new DefinitionWrapper(definition,this.xmlUtils);
wsdl.removeAllPortTypes();
}else{
throw new WSDLException("removeAllPortTypes(Definition definition)","WSDL non fornito");
}
}
/**
* Rimuove TUTTI i Binding da una definizione.
* @param definition La definizione da modificare.
*/
public void removeAllBindings(Definition definition) throws WSDLException{
if (definition != null) {
DefinitionWrapper wsdl = new DefinitionWrapper(definition,this.xmlUtils);
wsdl.removeAllBindings();
}else{
throw new WSDLException("removeAllBindings(Definition definition)","WSDL non fornito");
}
}
/**
* Rimuove TUTTI i Service da una definizione.
* @param definition La definizione da modificare.
*/
public void removeAllServices(Definition definition) throws WSDLException{
if (definition != null) {
DefinitionWrapper wsdl = new DefinitionWrapper(definition,this.xmlUtils);
wsdl.removeAllServices();
}else{
throw new WSDLException("removeAllServices(Definition definition)","WSDL non fornito");
}
}
/* ---------------- TYPES ------------------------- */
public boolean existsTypes(Document document) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = document.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
return true;
}
}
}
}
}
}
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
return false;
}
public Node getIfExistsTypesElementIntoWSDL(Document wsdl) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
NodeList list = wsdl.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
return childDefinition;
}
}
}
}
}
}
return null;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
public Node addEmptyTypesIfNotExists(Document document) throws org.openspcoop2.utils.wsdl.WSDLException{
try{
boolean exists = false;
NodeList list = document.getChildNodes();
if(list!=null){
for(int i=0; i<list.getLength(); i++){
Node child = list.item(i);
if("definitions".equals(child.getLocalName())){
NodeList listDefinition = child.getChildNodes();
if(listDefinition!=null){
for(int j=0; j<listDefinition.getLength(); j++){
Node childDefinition = listDefinition.item(j);
if("types".equals(childDefinition.getLocalName())){
exists = true;
break;
}
}
}
if(!exists){
String name = "types";
if(child.getPrefix()!=null && !"".equals(child.getPrefix())){
name = child.getPrefix()+":"+name;
}
Node n = this.xmlUtils.getFirstNotEmptyChildNode(child,false);
//System.out.println("FIRST ["+n.getLocalName()+"] ["+n.getPrefix()+"] ["+n.getNamespaceURI()+"]");
Node type = document.createElementNS(child.getNamespaceURI(), name);
child.insertBefore(type,n);
return type;
}
}
}
}
return null;
}catch(Exception e){
throw new org.openspcoop2.utils.wsdl.WSDLException("Riscontrato errore durante la lettura del wsdl: "+e.getMessage(),e);
}
}
}