Compare commits

...

2 Commits

Author SHA1 Message Date
Dmytro Chmyga
9871199155 fix(TDI-41647): Replace com.sun.org.apache.xerces.internal.dom.ElementNSImpl
* Replace com.sun.org.apache.xerces.internal.dom.ElementNSImpl with org.w3c.dom.Element
2019-01-21 10:09:31 +02:00
Dmytro Chmyga
263f4440d1 fix(TDI-41647): Replace com.sun.org.apache.xerces.internal.dom.ElementNSImpl
* Move talend-ws library to tdi-studio-se

* Move talend-ws library to mvn

* Update dependencies to same versions as in tWebService component

* fix visitMethodInsn() method calls in JAXBUtils
2019-01-18 14:24:18 +02:00
40 changed files with 5411 additions and 0 deletions

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="org.talend.designer.components.libs" default="process" basedir=".">
<property name="component.plugin.home" value="../../../org.talend.designer.components.localprovider/components" />
<!-- #################################################### -->
<!-- modification 1: config -->
<property name="jar.name" value="talend-ws-1.0.jar" />
<property name="component.name" value="tWebService" />
<property name="author.name" value="bchen" />
<!-- modification 2: compile classpath -->
<path id="compile.classpath">
<pathelement location="${component.plugin.home}/tAlfrescoOutput/commons-codec-1.3.jar" />
<pathelement location="${component.plugin.home}/tMicrosoftCrmInput/commons-httpclient-3.1.jar" />
<pathelement location="${component.plugin.home}/tMicrosoftCrmInput/geronimo-stax-api_1.0_spec-1.0.1.jar" />
<pathelement location="${component.plugin.home}/tMicrosoftCrmInput/commons-logging-1.1.1.jar" />
<pathelement location="${component.plugin.home}/tWriteJSONFieldIn/commons-lang-2.6.jar" />
<pathelement location="${component.plugin.home}/tWebService/commons-collections-3.2.1.jar" />
<pathelement location="${component.plugin.home}/tWebService/commons-beanutils-1.7.0.jar" />
<pathelement location="${component.plugin.home}/tWebService/cxf-2.6.0-modified.jar" />
<pathelement location="${component.plugin.home}/tWebService/jaxb-xjc-2.2.5-modified.jar" />
<pathelement location="${component.plugin.home}/tWebService/jaxb-impl-2.2.5-modified.jar" />
<pathelement location="${component.plugin.home}/tWebService/wsdl4j-1.6.2.jar" />
<pathelement location="${component.plugin.home}/tWebService/xmlschema-core-2.0.2.jar" />
<pathelement location="${component.plugin.home}/tWebService/geronimo-annotation_1.0_spec-1.1.1.jar" />
<pathelement location="${component.plugin.home}/tWebService/geronimo-ws-metadata_2.0_spec-1.1.3.jar" />
<pathelement location="${component.plugin.home}/tWebService/geronimo-jaxws_2.2_spec-1.1.jar" />
<pathelement location="${component.plugin.home}/tWebService/woodstox-core-asl-4.1.2.jar" />
<pathelement location="${component.plugin.home}/tWebService/saaj-impl-1.3.18.jar" />
<pathelement location="${component.plugin.home}/tWebService/asm-3.3.1.jar" />
<pathelement location="${component.plugin.home}/tWebService/neethi-3.0.2.jar" />
<pathelement location="${component.plugin.home}/tWebService/saaj-api-1.3.4.jar" />
<pathelement location="${component.plugin.home}/tWebService/stax2-api-3.1.1.jar" />
<pathelement location="${component.plugin.home}/tWebService/velocity-1.7.jar" />
<pathelement location="${component.plugin.home}/tWebServiceInput/activation.jar" />
<pathelement location="${component.plugin.home}/tWebServiceInput/mail.jar" />
</path>
<!-- #################################################### -->
<!-- sourcecode and final jar path -->
<property name="source.home" value="." />
<property name="jar.home" value="${component.plugin.home}/${component.name}/${jar.name}" />
<!-- temp dir for clasee files -->
<property name="build.dir" value="../../build" />
<!-- compile option -->
<property name="compile.debug" value="true" />
<property name="compile.deprecation" value="false" />
<property name="compile.optimize" value="true" />
<target name="process" description="prepare a temp dir">
<antcall target="prepare" />
<antcall target="compile" />
<antcall target="clean" />
</target>
<target name="prepare" description="prepare a temp dir">
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
<mkdir dir="${build.dir}/classes" />
</target>
<target name="compile" description="Compile Java sources">
<!-- compile -->
<javac srcdir="${source.home}" destdir="${build.dir}/classes" debug="${compile.debug}" deprecation="${compile.deprecation}" optimize="${compile.optimize}">
<classpath refid="compile.classpath" />
</javac>
<!-- include source code -->
<copy todir="${build.dir}/classes">
<fileset dir="${source.home}">
<exclude name="build.xml" />
</fileset>
</copy>
<!-- make jar -->
<tstamp>
<format property="date" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp>
<jar destfile="${build.dir}/${jar.name}" basedir="${build.dir}/classes">
<manifest>
<!-- who -->
<attribute name="Built-By" value="${author.name}" />
<!-- when -->
<attribute name="Built-Date" value="${date}"/>
<!-- JDK version -->
<attribute name="Created-By" value="${java.version} (${java.vendor})" />
<!-- Information about the program itself -->
<attribute name="Implementation-Vendor" value="Talend SA" />
<attribute name="Implementation-Title" value="${jar.name}" />
<attribute name="Implementation-Version" value="1.0" />
</manifest>
</jar>
<!-- move jar -->
<move file="${build.dir}/${jar.name}" tofile="${jar.home}" />
</target>
<target name="clean" description="clean the temp dir">
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
</target>
</project>

View File

@@ -0,0 +1,254 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.talend.libraries</groupId>
<artifactId>talend-ws</artifactId>
<version>1.0.1-20190117</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<cxf.version>3.1.1</cxf.version>
<odata.version>4.3.0</odata.version>
<slf4j.version>1.7.12</slf4j.version>
<talend.nexus.url>https://artifacts-oss.talend.com</talend.nexus.url>
</properties>
<distributionManagement>
<snapshotRepository>
<id>talend_nexus_deployment</id>
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</snapshotRepository>
<repository>
<id>talend_nexus_deployment</id>
<url>${talend.nexus.url}/nexus/content/repositories/TalendOpenSourceRelease/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</distributionManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.woodstox/stax2-api -->
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-stax-api_1.0_spec -->
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-stax-api_1.0_spec</artifactId>
<version>1.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-tools-common</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-wsdl</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-databinding-jaxb</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.talend.libraries</groupId>
<artifactId>jaxb-xjc-2.2.6-modified</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.talend.libraries</groupId>
<artifactId>activation</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.talend.libraries</groupId>
<artifactId>mail</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.ws.xmlschema</groupId>
<artifactId>xmlschema-core</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>saaj-api</artifactId>
<version>1.3.4</version>
</dependency>
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.3.18</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.neethi</groupId>
<artifactId>neethi</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>talend_open</id>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>https://artifacts-oss.talend.com/nexus/content/repositories/TalendOpenSourceRelease/</url>
</repository>
<repository>
<id>talend_open_snapshots</id>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>https://artifacts-oss.talend.com/nexus/content/repositories/TalendOpenSourceSnapshot/</url>
</repository>
<repository>
<id>releases</id>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>https://artifacts-zl.talend.com/nexus/content/repositories/releases/</url>
</repository>
<repository>
<id>snapshots</id>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>https://artifacts-zl.talend.com/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>talend-update</id>
<url>https://talend-update.talend.com/nexus/content/repositories/libraries/</url>
</repository>
</repositories>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,51 @@
1. (2009-10-16 modify by wyang) to close the verbose in console
Retrieving document at http://euro2008.dataaccess.eu/footballpoolwebservice.wso?WSDL'.
ServiceDiscoveryHelper.java
please @see talend-ws-1.0.jar\org\talend\ws\helper\ServiceDiscoveryHelper.java
2.(2009-10-20 modify by bchen) to work for this webservice: 'http://euro2008.dataaccess.eu/footballpoolwebservice.wso?WSDL'
ListPropertyMapper.java
SimplePropertyMapper.java
please @see talend-ws-1.0.jar\org\talend\ws\mapper\ListPropertyMapper.java
talend-ws-1.0.jar\org\talend\ws\mapper\SimplePropertyMapper.java
3.(2009-11-18 modified by bchen) fixed bug 9900
for wrap type of webservice: update to cxf-2.2.4.jar, jaxb-xjc-2.1.12.jar and jaxb-impl-2.1.12.jar.
modified ListPropertyMapper.java
for bare type of webservice: modified ServiceInvokerHelper.java
please @see talend-ws-1.0.jar\org\talend\ws\mapper\ListPropertyMapper.java
talend-ws-1.0.jar\org\talend\ws\helper\ServiceInvokerHelper.java
4.(2009-11-18 modified by bchen) support for this webservice:http://www.ebi.ac.uk/intact/binary-search-ws/binarysearch?wsdl
consider the situation about no targetnamespace in schema
modified ServiceInvokerHelper.java
please @see talend-ws-1.0.jar\org\talend\ws\helper\ServiceInvokerHelper.java
5.(2009-11-23 modified by bchen) fiexd bug 8674
please @see org\talend\ws\helper\ServiceDiscoveryHelper.java
org\talend\ws\helper\ServiceInvokerHelper.java
6.(2010-01-05 modified by bchen) fiexd bug 8674
please @see org\talend\ws\helper\ServiceDiscoveryHelper.java
org\talend\ws\helper\ServiceInvokerHelper.java
7.(2010-02-01 modified by bchen) fixed bug 11351
8.(2010-02-23 modified by bchen) fixed bug 11351 add an ability to config temporary path for wsdl file.
9.(2010-03-16 modified by bchen) fixed bug 11917
please @see org\talend\ws\helper\ServiceInvokerHelper.java
org\talend\ws\mapper\MapperFactory.java
10.(2019-01-18 modified by dchmyga) fixed TDI-41647

View File

@@ -0,0 +1,21 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.exception;
/**
*
* @author rlamarche
*/
public class IllegalPropertyAccessException extends LocalizedException {
/**
* Constructs an instance of <code>IllegalPropertyAccessException</code> with the specified detail message.
* @param msg the detail message.
*/
public IllegalPropertyAccessException(String property, String clazz, IllegalAccessException ex) {
super("org.talend.ws.exception.IllegalPropertyAccessException", new String[] {property, clazz}, ex);
}
}

View File

@@ -0,0 +1,28 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.exception;
/**
*
* @author rlamarche
*/
public class InvalidEnumValueException extends LocalizedException {
/**
* Constructs an instance of <code>InvalidEnumValueException</code> with the specified detail message.
* @param msg the detail message.
*/
public InvalidEnumValueException(String value, String enumeration) {
super("org.talend.ws.exception.InvalidEnumValueException", new String[]{value, enumeration});
}
public String getValue() {
return (String) arguments[0];
}
public String getEnum() {
return (String) arguments[1];
}
}

View File

@@ -0,0 +1,28 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.exception;
/**
*
* @author rlamarche
*/
public class InvocationTargetPropertyAccessor extends LocalizedException {
/**
* Constructs an instance of <code>NoSuchPropertyException</code> with the specified detail message.
* @param msg the detail message.
*/
public InvocationTargetPropertyAccessor(String property, String clazz, Throwable ex) {
super("org.talend.ws.exception.InvocationTargetPropertyAccessor", new String[]{property, clazz}, ex);
}
public String getProperty() {
return (String) arguments[0];
}
public String getClazz() {
return (String) arguments[1];
}
}

View File

@@ -0,0 +1,71 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.exception;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
/**
*
* @author rlamarche
*/
public class LocalizedException extends Exception {
protected Object[] arguments;
private static ResourceBundle messages;
static {
messages = ResourceBundle.getBundle("messages");
}
/**
* Creates a new instance of <code>LocalizedException</code> without detail message.
*/
public LocalizedException() {
}
public LocalizedException(String msg, Throwable cause) {
super(msg, cause);
}
public LocalizedException(String msg, Object[] arguments, Throwable cause) {
super(msg, cause);
this.arguments = arguments;
}
public LocalizedException(String msg) {
super(msg);
}
/**
* Constructs an instance of <code>LocalizedException</code> with the specified detail message.
* @param msg the detail message.
*/
public LocalizedException(String msg, Object[] arguments) {
this(msg);
this.arguments = arguments;
}
@Override
public String getLocalizedMessage() {
String msg = getMessage();
if (msg != null) {
msg = messages.getString(msg);
if (msg == null) {
return getMessage();
} else {
if (arguments == null) {
return msg;
} else {
return MessageFormat.format(msg, arguments);
}
}
} else {
return null;
}
}
}

View File

@@ -0,0 +1,21 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.exception;
/**
*
* @author rlamarche
*/
public class NoSuchPropertyException extends LocalizedException {
/**
* Constructs an instance of <code>NoSuchPropertyException</code> with the specified detail message.
* @param msg the detail message.
*/
public NoSuchPropertyException(String property, String clazz, NoSuchMethodException ex) {
super("org.talend.ws.exception.NoSuchPropertyException", new String[] {property, clazz}, ex);
}
}

View File

@@ -0,0 +1,191 @@
// ============================================================================
//
// Copyright (C) 2006-2018 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.webservice.helper;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
/**
* created by wwang on 2013-1-10
* util to procss the path string
*
*/
public class PathUtil {
/**
*
* It is like String.indexOf(String),but not process the :anytype{*} part
* @param path
* @param sep
* @return
*/
public static int indexOfPath(String path,String sep) {
if(path == null || sep == null || sep.length() == 0) {
return -1;
}
if(sep.contains(":") || sep.contains("{") || sep.contains("}")) {
throw new RuntimeException("separator can't contain :,{,}");
}
char first = sep.charAt(0);
boolean isTypeDefine = false;
for(int i=0;i<path.length();i++) {
char c = path.charAt(i);
if(c == '{') {
isTypeDefine = true;
} else if(c == '}') {
isTypeDefine = false;
}
if(c != first) {
while (++i < path.length()) {
char ch = path.charAt(i);
if(!isTypeDefine && (ch == first)) {//look for the first char that is not in type define substring.
break;
}
if(ch == '{') {
isTypeDefine = true;
} else if(ch == '}') {
isTypeDefine = false;
}
};
}
if (i < path.length()) {//look for the rest that is not in type define substring.
int j = i + 1;
int end = j + sep.length() - 1;
for (int k = 1; j < end && path.charAt(j) ==
sep.charAt(k); j++, k++);
if (j == end) {
return i;
}
}
}
return -1;
}
/**
*
* It is like org.apache.commons.lang.StringUtils.split(String,String),but not process the :anytype{*} part
* @param path
* @param sep
* @return
*/
public static String[] splitPath(String path, String separatorChars) {
if (path == null) {
return null;
}
int len = path.length();
if (len == 0) {
return ArrayUtils.EMPTY_STRING_ARRAY;
}
List list = new ArrayList();
int i = 0, start = 0;
boolean match = false;
boolean lastMatch = false;
boolean isTypeDefine = false;
if (separatorChars == null) {
// Null separator means use whitespace
while (i < len) {
char c = path.charAt(i);
if(c == '{') {
isTypeDefine = true;
} else if(c == '}') {
isTypeDefine = false;
}
if (Character.isWhitespace(c) && !isTypeDefine) {
if (match) {
lastMatch = true;
list.add(path.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
} else if (separatorChars.length() == 1) {
// Optimise 1 character case
char sep = separatorChars.charAt(0);
while (i < len) {
char c = path.charAt(i);
if(c == '{') {
isTypeDefine = true;
} else if(c == '}') {
isTypeDefine = false;
}
if ((c == sep) && !isTypeDefine) {
if (match) {
lastMatch = true;
list.add(path.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
} else {
// standard case
while (i < len) {
char c = path.charAt(i);
if(c == '{') {
isTypeDefine = true;
} else if(c == '}') {
isTypeDefine = false;
}
if ((separatorChars.indexOf(c) >= 0) && !isTypeDefine) {
if (match) {
lastMatch = true;
list.add(path.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
}
if (match) {
list.add(path.substring(start, i));
}
return (String[]) list.toArray(new String[list.size()]);
}
}

View File

@@ -0,0 +1,467 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.helper;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.wsdl.Definition;
import javax.wsdl.Import;
import javax.wsdl.Types;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.extensions.schema.SchemaImport;
import javax.wsdl.extensions.schema.SchemaReference;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.talend.webservice.helper.conf.ServiceHelperConfiguration;
import org.talend.webservice.helper.conf.WSDLLocatorImpl;
import org.w3c.dom.Element;
import com.ibm.wsdl.Constants;
import com.ibm.wsdl.extensions.schema.SchemaConstants;
import com.ibm.wsdl.util.xml.DOMUtils;
import com.ibm.wsdl.util.xml.QNameUtils;
/**
* This helper allow easy discovery of services and types
*
* @author rlamarche
*/
public class ServiceDiscoveryHelper {
private String wsdlUri;
private WSDLFactory wsdlFactory;
private ServiceHelperConfiguration configuration;
private File wsdlTmpDir;
private Map<String, Definition> definitions;
private XmlSchemaCollection schemaCollection;
private Set<String> namespaces;
private final String LOCAL_WSDL_NAME = "mainWSDL.wsdl";
public ServiceDiscoveryHelper(String wsdlUri) throws WSDLException, IOException, TransformerException, URISyntaxException {
this(wsdlUri, null, null);
}
public ServiceDiscoveryHelper(String wsdlUri, String tempPath) throws WSDLException, IOException, TransformerException,
URISyntaxException {
this(wsdlUri, null, tempPath);
}
public ServiceDiscoveryHelper(String wsdlUri, ServiceHelperConfiguration configuration) throws WSDLException, IOException,
TransformerException, URISyntaxException {
this(wsdlUri, configuration, null);
}
public ServiceDiscoveryHelper(String wsdlUri, ServiceHelperConfiguration configuration, String tempPath)
throws WSDLException, IOException, TransformerException, URISyntaxException {
this.wsdlUri = wsdlUri;
this.configuration = configuration;
this.wsdlTmpDir = createTempWsdlDir(tempPath);
init();
}
private File createTempWsdlDir(String tempPath) {
File tmpWsdlDir;
if (tempPath != null && !"".equals(tempPath)) {
tmpWsdlDir = new File(tempPath, "wsdl" + String.valueOf(new Date().getTime()) + Thread.currentThread().getId());
} else {
tmpWsdlDir = new File(System.getProperty("java.io.tmpdir"), "wsdl" + String.valueOf(new Date().getTime()) + Thread.currentThread().getId());
}
if (!tmpWsdlDir.mkdir()) {
throw new SecurityException("Unable to create temporary directory," + tmpWsdlDir.getAbsolutePath());
}
tmpWsdlDir.deleteOnExit();
return tmpWsdlDir;
}
/**
* Read the wsdl and schema
*
* @throws javax.wsdl.WSDLException
* @throws TransformerException
* @throws URISyntaxException
*/
private void init() throws WSDLException, IOException, TransformerException, URISyntaxException {
wsdlFactory = WSDLFactory.newInstance();
WSDLReader newWSDLReader = wsdlFactory.newWSDLReader();
newWSDLReader.setFeature(com.ibm.wsdl.Constants.FEATURE_VERBOSE, false);
Definition definition;
URI wsdlURI = new URI(wsdlUri);
if (configuration != null && wsdlURI.getScheme().startsWith("http")) {
definition = newWSDLReader.readWSDL(configuration.createWSDLLocator(wsdlUri));
} else {
definition = newWSDLReader.readWSDL(wsdlUri);
}
Map<String, Definition> defs = new HashMap<String, Definition>();
defs.put(LOCAL_WSDL_NAME, definition);
List<String> importKeys = new LinkedList<String>();
String parentLoc = absoluteLocation(null, wsdlUri);
importKeys.add(definition.getTargetNamespace() + " " + parentLoc);
definitions = findWsdlImport(definition, parentLoc, defs, importKeys);
schemaCollection = getSchemaCollection(definitions);
namespaces = collectNamespaces();
generateTempWsdlFile();
}
private void generateTempWsdlFile() throws FileNotFoundException, WSDLException, TransformerException, URISyntaxException {
generateImportAndIncludeXsd(definitions);
for (Object key : definitions.keySet()) {
File importFile = new File(wsdlTmpDir, key.toString());
importFile.deleteOnExit();
wsdlFactory.newWSDLWriter().writeWSDL(definitions.get(key), new FileOutputStream(importFile));
}
}
@SuppressWarnings("unchecked")
private void generateImportAndIncludeXsd(Map<String, Definition> definitions) throws FileNotFoundException,
TransformerException, URISyntaxException {
Map<String, Types> typesList = getTypesFromWsdl(definitions);
Map<String, String> schemaIDs = null;
for (Object key : typesList.keySet()) {
Types types = typesList.get(key);
if (types != null) {
List<ExtensibilityElement> extensibilityElements = types.getExtensibilityElements();
for (ExtensibilityElement el : extensibilityElements) {
if (el instanceof Schema) {
Schema schema = (Schema) el;
if (schemaIDs == null) {
schemaIDs = new HashMap<String, String>();
schemaIDs.put(schema.getDocumentBaseURI(), key.toString());
}
createTempImportSchemaFile(schema, schemaIDs);
}
}
}
}
}
@SuppressWarnings("unchecked")
private void createTempImportSchemaFile(Schema schema, Map<String, String> schemaIDs) throws FileNotFoundException,
TransformerException, URISyntaxException {
if (schema.getImports() != null) {
Iterator<?> importSchemaIte = schema.getImports().values().iterator();
while (importSchemaIte.hasNext()) {
List<?> importSchemaList = (List<?>) importSchemaIte.next();
for (Object importSchemaObj : importSchemaList) {
if (importSchemaObj instanceof SchemaImport) {
SchemaImport importSchema = (SchemaImport) importSchemaObj;
String schId = importSchema.getId();
String schNS = importSchema.getNamespaceURI();
String schLocUri = importSchema.getSchemaLocationURI();
Schema refSchema = importSchema.getReferencedSchema();
createTempImportSchemaFile(schema, schLocUri, schNS, schId, refSchema, schemaIDs);
}
}
}
}
if (schema.getIncludes() != null || schema.getRedefines() != null) {
List<SchemaReference> includes = new ArrayList<SchemaReference>();
if (schema.getIncludes() != null && !schema.getIncludes().isEmpty()) {
includes.addAll(schema.getIncludes());
}
if (schema.getRedefines() != null && !schema.getRedefines().isEmpty()) {
includes.addAll(schema.getRedefines());
}
for (SchemaReference include : includes) {
Schema refSchema = include.getReferencedSchema();
String schId = include.getId();
String schLocUri = include.getSchemaLocationURI();
createTempImportSchemaFile(schema, schLocUri, null, schId, refSchema, schemaIDs);
}
}
}
private void createTempImportSchemaFile(Schema schema, String schLocUri, String schNS, String schId, Schema refSchema,
Map<String, String> schemaIDs) throws FileNotFoundException, TransformerException, URISyntaxException {
if (schLocUri != null && refSchema != null) {
if (!schemaIDs.containsKey(refSchema.getDocumentBaseURI())) {
String xsdFileName = "schemaXSD" + schemaIDs.size() + ".xsd";
schemaIDs.put(refSchema.getDocumentBaseURI(), xsdFileName);
// lookup child import wsdl
createTempImportSchemaFile(refSchema, schemaIDs);
// create current wsdl
createTempXSDFile(refSchema, xsdFileName);
// modified the parent wsdl
changeImportXsdLocation(schema, schId, schNS, schLocUri, xsdFileName);
} else {
changeImportXsdLocation(schema, schId, schNS, schLocUri, schemaIDs.get(refSchema.getDocumentBaseURI()));
// only remove the duplicate XSD:IMPORT, for bug[http://jira.talendforge.org/browse/TDI-18573]
removeImportXsdLocation(schema, schId, schNS, schemaIDs.get(refSchema.getDocumentBaseURI()));
}
}
}
private void createTempXSDFile(Schema sourceSchema, String xsdFileName) throws FileNotFoundException, TransformerException {
Element e = sourceSchema.getElement();
DOMSource domSource = new DOMSource(e);
File xsdFile = new File(this.wsdlTmpDir, xsdFileName);
FileOutputStream fileOutputStream = new FileOutputStream(xsdFile);
StreamResult streamResult = new StreamResult(fileOutputStream);
TransformerFactory tf = TransformerFactory.newInstance();
tf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, streamResult);
}
private void removeImportXsdLocation(Schema schema, String id, String ns, String location) {
Element schemaElem = schema.getElement();
Element tempEl = DOMUtils.getFirstChildElement(schemaElem);
for (; tempEl != null; tempEl = DOMUtils.getNextSiblingElement(tempEl)) {
QName tempElType = QNameUtils.newQName(tempEl);
if (SchemaConstants.XSD_IMPORT_QNAME_LIST.contains(tempElType)) {
if ((DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_ID) == null ? id == null : DOMUtils.getAttribute(tempEl,
SchemaConstants.ATTR_ID).equals(id))
&& (DOMUtils.getAttribute(tempEl, Constants.ATTR_NAMESPACE) == null ? ns == null : DOMUtils.getAttribute(
tempEl, Constants.ATTR_NAMESPACE).equals(ns))
&& (DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_SCHEMA_LOCATION) == null ? location == null
: DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_SCHEMA_LOCATION).equals(location))) {
schemaElem.removeChild(tempEl);
}
}
}
}
private void changeImportXsdLocation(Schema schema, String id, String ns, String location, String newXSDFileName) {
Element schemaElem = schema.getElement();
Element tempEl = DOMUtils.getFirstChildElement(schemaElem);
for (; tempEl != null; tempEl = DOMUtils.getNextSiblingElement(tempEl)) {
QName tempElType = QNameUtils.newQName(tempEl);
if (SchemaConstants.XSD_IMPORT_QNAME_LIST.contains(tempElType)
|| SchemaConstants.XSD_INCLUDE_QNAME_LIST.contains(tempElType)
|| SchemaConstants.XSD_REDEFINE_QNAME_LIST.contains(tempElType)) {
if ((DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_ID) == null ? id == null : DOMUtils.getAttribute(tempEl,
SchemaConstants.ATTR_ID).equals(id))
&& (DOMUtils.getAttribute(tempEl, Constants.ATTR_NAMESPACE) == null ? ns == null : DOMUtils.getAttribute(
tempEl, Constants.ATTR_NAMESPACE).equals(ns))
&& (DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_SCHEMA_LOCATION) == null ? location == null
: DOMUtils.getAttribute(tempEl, SchemaConstants.ATTR_SCHEMA_LOCATION).equals(location))) {
tempEl.getAttributeNode(SchemaConstants.ATTR_SCHEMA_LOCATION).setValue(newXSDFileName);
}
}
}
}
private Map<String, Definition> findWsdlImport(Definition definition, String parentLocation,
Map<String, Definition> definitions, List<String> importKeys) {
if (definition.getImports() != null && !definition.getImports().isEmpty()) {
Map<?, ?> imports = definition.getImports();
List<Import> importsToRemove = new LinkedList<Import>();
for (Map.Entry<?, ?> entry : imports.entrySet()) {
String namespace = (String) entry.getKey();
Vector<?> importsVector = (Vector<?>) entry.getValue();
for (Object importObj : importsVector) {
Import importDecl = (Import) importObj;
String importLoc = absoluteLocation(parentLocation, importDecl.getLocationURI());
String importKey = namespace + " " + importLoc;
if (importKeys.contains(importKey)) {
importsToRemove.add(importDecl);
} else {
importKeys.add(importKey);
String importWsdlFileName = "importWsdl" + definitions.size() + ".wsdl";
Definition importDef = importDecl.getDefinition();
if (importDef != null) {
definitions.put(importWsdlFileName, importDef);
findWsdlImport(importDef, importLoc, definitions, importKeys);
}
importDecl.setLocationURI(importWsdlFileName);
}
}
}
if (!importsToRemove.isEmpty()) {
for (Import importToRemove : importsToRemove) {
definition.removeImport(importToRemove);
}
}
}
return definitions;
}
@SuppressWarnings("unchecked")
private XmlSchemaCollection getSchemaCollection(Map<String, Definition> definitions) throws FileNotFoundException,
TransformerException, URISyntaxException {
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
Map<String, Types> typesList = getTypesFromWsdl(definitions);
int tmpCount = 0;
String tmpTNName = "";
for (Object key : typesList.keySet()) {
Types types = typesList.get(key);
if (types != null) {
List<ExtensibilityElement> extensibilityElements = types.getExtensibilityElements();
for (ExtensibilityElement el : extensibilityElements) {
if (el instanceof Schema) {
Schema schema = (Schema) el;
// for bug 8674
// set base uri for relative path in schemaLocation.
schemaCollection.setBaseUri(schema.getDocumentBaseURI());
// synthetic URI for the schemas without targetNamespace,avoid conflict error.
if (schema.getElement().getAttributeNode("targetNamespace") == null) {
tmpTNName = schema.getDocumentBaseURI() + "#type" + tmpCount;
schemaCollection.read(schema.getElement(), tmpTNName);
tmpCount++;
} else {
schemaCollection.read(schema.getElement());
}
}
}
}
}
return schemaCollection;
}
private Map<String, Types> getTypesFromWsdl(Map<String, Definition> importDefinitions) {
Map<String, Types> typesList = new HashMap<String, Types>();
for (Object key : importDefinitions.keySet()) {
Definition importDef = importDefinitions.get(key);
if (importDef != null) {
if (importDef.getTypes() != null) {
typesList.put(key.toString(), importDef.getTypes());
}
}
}
return typesList;
}
@SuppressWarnings("unchecked")
private Set<String> collectNamespaces() {
Set<String> namespaces = new HashSet<String>();
for (Object key : definitions.keySet()) {
Set<Map.Entry<String, String>> entrySet = definitions.get(key).getNamespaces().entrySet();
for (Map.Entry<String, String> entry : entrySet) {
if (namespaces.contains(entry.getValue())) {
continue;
}
namespaces.add(entry.getValue());
}
}
// some targetnamespace in schema missing in definitions,code for bug 9900 (for bare webservice)
if (schemaCollection != null) {
org.apache.ws.commons.schema.XmlSchema[] xs = schemaCollection.getXmlSchemas();
if (xs != null) {
for (org.apache.ws.commons.schema.XmlSchema x : xs) {
if (namespaces.contains(x.getTargetNamespace()) || x.getTargetNamespace() == null) {
continue;
}
namespaces.add(x.getTargetNamespace());
}
}
}
return namespaces;
}
/**
* Return the parsed wsdl, it contains all services
*
* @return
*/
public Definition getDefinition() {
return definitions.get(this.LOCAL_WSDL_NAME);
}
/**
* Return the xml schema collection
*
* @return
*/
public XmlSchemaCollection getSchema() {
return schemaCollection;
}
public String getWsdlUri() {
return wsdlUri;
}
public String getLocalWsdlUri() {
return new File(wsdlTmpDir, this.LOCAL_WSDL_NAME).toURI().toString();
}
public Set<String> getNamespaces() {
return namespaces;
}
private static String absoluteLocation(String parentLocation, String wsdlLocation) {
try {
return WSDLLocatorImpl.getURL(parentLocation, wsdlLocation).toExternalForm();
} catch (MalformedURLException e) {
return "NOLOCATION";
}
}
}

View File

@@ -0,0 +1,351 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.helper;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import javax.wsdl.Input;
import javax.wsdl.Message;
import javax.wsdl.Operation;
import javax.wsdl.Output;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.WSDLException;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.ws.commons.schema.XmlSchemaType;
import org.talend.webservice.exception.LocalizedException;
import org.talend.webservice.helper.conf.ServiceHelperConfiguration;
import org.talend.webservice.helper.map.MapConverter;
import org.talend.webservice.jaxb.JAXBUtils;
import org.talend.webservice.jaxb.JAXBUtils.IdentifierType;
import org.talend.webservice.mapper.AnyPropertyMapper;
import org.talend.webservice.mapper.ClassMapper;
import org.talend.webservice.mapper.EmptyMessageMapper;
import org.talend.webservice.mapper.MapperFactory;
import org.talend.webservice.mapper.MessageMapper;
/**
*
* @author rlamarche
*/
public class ServiceInvokerHelper implements ClassMapper {
private ServiceDiscoveryHelper serviceDiscoveryHelper;
private DynamicClientFactory dynamicClientFactory;
private final String packagePrefix;
private Map<String, String> namespacePackageMap;
private Map<String, String> packageNamespaceMap;
private Map<QName, Map<QName, Client>> clients;
private List<String> bindingFiles;
private Map<Message, MessageMapper> mappers;
private MapperFactory mapperFactory;
private ServiceHelperConfiguration configuration;
protected ServiceInvokerHelper() {
packagePrefix = "tmp" + (String.valueOf((new Random(Calendar.getInstance().getTimeInMillis())).nextInt()).substring(1));
dynamicClientFactory = DynamicClientFactory.newInstance();
namespacePackageMap = new HashMap<String, String>();
packageNamespaceMap = new HashMap<String, String>();
clients = new HashMap<QName, Map<QName, Client>>();
mappers = new HashMap<Message, MessageMapper>();
}
public ServiceInvokerHelper(String wsdlUri) throws WSDLException, IOException, TransformerException, URISyntaxException {
this(new ServiceDiscoveryHelper(wsdlUri));
}
public ServiceInvokerHelper(String wsdlUri, String tempPath) throws WSDLException, IOException, TransformerException,
URISyntaxException {
this(new ServiceDiscoveryHelper(wsdlUri, tempPath));
}
public ServiceInvokerHelper(String wsdlUri, ServiceHelperConfiguration configuration) throws WSDLException, IOException,
TransformerException, URISyntaxException {
this(new ServiceDiscoveryHelper(wsdlUri, configuration));
}
public ServiceInvokerHelper(String wsdlUri, ServiceHelperConfiguration configuration, String tempPath) throws WSDLException,
IOException, TransformerException, URISyntaxException {
this(new ServiceDiscoveryHelper(wsdlUri, configuration, tempPath), configuration);
}
public ServiceInvokerHelper(ServiceDiscoveryHelper serviceDiscoveryHelper, ServiceHelperConfiguration configuration) {
this(serviceDiscoveryHelper);
this.configuration = configuration;
}
public ServiceInvokerHelper(ServiceDiscoveryHelper serviceDiscoveryHelper) {
this();
this.serviceDiscoveryHelper = serviceDiscoveryHelper;
Set<String> namespaces = serviceDiscoveryHelper.getNamespaces();
bindingFiles = new ArrayList<String>(namespaces.size());
for (String ns : namespaces) {
String packageName = packagePrefix + JAXBUtils.namespaceURIToPackage(ns);
namespacePackageMap.put(ns, packageName);
packageNamespaceMap.put(packageName, ns);
File f = org.apache.cxf.tools.util.JAXBUtils.getPackageMappingSchemaBindingFile(ns, packageName);
f.deleteOnExit();
bindingFiles.add(f.getAbsolutePath());
}
mapperFactory = new MapperFactory(this, serviceDiscoveryHelper.getSchema());
}
public Client getClient(QName service, QName port) {
Map<QName, Client> serviceClients = clients.get(service);
if (serviceClients == null) {
serviceClients = new HashMap<QName, Client>();
clients.put(service, serviceClients);
}
if (serviceClients.get(port) == null) {
serviceClients.put(port, createClient(service, port));
}
return serviceClients.get(port);
}
protected Client createClient(QName service, QName port) {
// bug 8674
Client client = dynamicClientFactory.createClient(serviceDiscoveryHelper.getLocalWsdlUri(), service, Thread
.currentThread().getContextClassLoader(), port, bindingFiles);
// end
HTTPConduit conduit = (HTTPConduit) client.getConduit();
if (configuration != null) {
configuration.configureHttpConduit(conduit);
}
return client;
}
private MessageMapper getMessageMapper(Message message) throws LocalizedException {
MessageMapper messageMapper = mappers.get(message);
if (messageMapper == null) {
messageMapper = createMessageMapper(message);
mappers.put(message, messageMapper);
}
return messageMapper;
}
private MessageMapper createMessageMapper(Message message) throws LocalizedException {
return mapperFactory.createMessageMapper(message);
}
protected Map<String, Object> invoke(Client client, Operation operation, QName operationQName, Object value)
throws Exception, LocalizedException {
Input input = operation.getInput();
Output output = operation.getOutput();
MessageMapper inMessageMapper = null;
MessageMapper outMessageMapper = null;
BindingOperationInfo bindingOperationInfo = client.getEndpoint().getEndpointInfo().getBinding()
.getOperation(operationQName);
if (input != null) {
inMessageMapper = getMessageMapper(input.getMessage());
} else {
inMessageMapper = new EmptyMessageMapper();
}
if (output != null) {
outMessageMapper = getMessageMapper(output.getMessage());
} else {
outMessageMapper = new EmptyMessageMapper();
}
if (bindingOperationInfo.isUnwrappedCapable()) {
inMessageMapper.setUnwrapped(true);
outMessageMapper.setUnwrapped(true);
}
Object[] retParams;
if (value != null) {
Object[] params = inMessageMapper.convertToParams(value);
retParams = client.invoke(operationQName, params);
} else {
retParams = client.invoke(operationQName);
}
Map<String, Object> retValues = outMessageMapper.convertToValue(retParams);
return retValues;
}
public Map<String, Object> invoke(QName serviceName, QName portName, String operationName, Object params) throws Exception,
LocalizedException {
if (serviceName == null) {
throw new IllegalArgumentException("serviceName is mandatory.");
}
Service service = serviceDiscoveryHelper.getDefinition().getService(serviceName);
if (service == null) {
throw new IllegalArgumentException("Service " + serviceName.toString() + " does not exists.");
}
if (portName == null) {
throw new IllegalArgumentException("portName is mandatory.");
}
Port port = service.getPort(portName.getLocalPart());
if (port == null) {
throw new IllegalArgumentException("Port " + portName + " does not exists for service " + serviceName.toString()
+ ".");
}
if (operationName == null) {
throw new IllegalArgumentException("operationName is mandatory.");
}
Operation operation = port.getBinding().getPortType().getOperation(operationName, null, null);
if (operation == null) {
throw new IllegalArgumentException("Operation " + operationName + " does not exists for service "
+ serviceName.toString() + ".");
}
QName operationQName = new QName(port.getBinding().getPortType().getQName().getNamespaceURI(), operation.getName());
Client client = getClient(serviceName, portName);
return invoke(client, operation, operationQName, params);
}
/**
* Invoke a service with a simple map of parametes (address.city=LYON, address.zipCode=69003, etc ...) Returned
* results are also in this format
*
* @param serviceName
* @param portName
* @param operationName
* @param params
* @return
* @throws java.lang.Exception
* @throws org.talend.webservice.exception.LocalizedException
*/
public Map<String, Object> invokeSimple(QName serviceName, QName portName, String operationName, Object params)
throws Exception, LocalizedException {
if (params instanceof Map) {
params = MapConverter.mapToDeepMap((Map<String, Object>) params);
}
Map<String, Object> result = invoke(serviceName, portName, operationName, params);
return MapConverter.deepMapToMap(result);
}
protected String getClassNameForType(QName xmlSchemaTypeMapperQname) {
StringBuilder sb = new StringBuilder();
sb.append(getPackageForNamespaceURI(xmlSchemaTypeMapperQname.getNamespaceURI()));
sb.append(".");
sb.append(getClassNameForTypeName(xmlSchemaTypeMapperQname.getLocalPart()));
String className = sb.toString();
return className;
}
protected String getPackageForNamespaceURI(String ns) {
return namespacePackageMap.get(ns);
}
protected String getNamespaceURIForPackage(String packageName) {
return packageNamespaceMap.get(packageName);
}
protected String getClassNameForTypeName(String typeName) {
return toCamelCase(JAXBUtils.nameToIdentifier(typeName, IdentifierType.CLASS), true);
}
public Class<?> getClassForType(QName xmlSchemaTypeMapperQname) {
String className = getClassNameForType(xmlSchemaTypeMapperQname);
try {
Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
return clazz;
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
}
}
public Class<?> getClassForType(QName xmlSchemaTypeMapperQName, List<String> propertiesName, int tempSuffix) {
Class<?> clazz = getClassForType(xmlSchemaTypeMapperQName);
boolean allCorrect = false;
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(clazz);
if (propertiesName.size() == 0) {
allCorrect = true;
}
for (String propertyName : propertiesName) {
for (PropertyDescriptor descriptor : descriptors) {
if (propertyName.equalsIgnoreCase(descriptor.getName()) || (AnyPropertyMapper.LABEL.equalsIgnoreCase(propertyName) && ("any".equalsIgnoreCase(descriptor.getName()) || "content".equalsIgnoreCase(descriptor.getName())))) {
allCorrect = true;
break;
} else {
allCorrect = false;
}
}
}
if (!allCorrect) {
return getClassForType(new QName(xmlSchemaTypeMapperQName.getNamespaceURI(), xmlSchemaTypeMapperQName.getLocalPart()
+ tempSuffix), propertiesName, tempSuffix++);
} else {
return clazz;
}
}
public XmlSchemaType getTypeForClass(Class<?> clazz) {
if (clazz.isAnnotationPresent(XmlType.class)) {
XmlType type = clazz.getAnnotation(XmlType.class);
XmlSchema schema = clazz.getPackage().getAnnotation(XmlSchema.class);
QName qname = new QName(schema.namespace(), type.name());
return serviceDiscoveryHelper.getSchema().getTypeByQName(qname);
} else {
QName type = MapperFactory.javaTypeToBuiltInType(clazz.getName());
if (type != null) {
return serviceDiscoveryHelper.getSchema().getTypeByQName(type);
} else {
throw new IllegalArgumentException("Unmapped class : " + clazz.getName());
}
}
}
public ServiceDiscoveryHelper getServiceDiscoveryHelper() {
return serviceDiscoveryHelper;
}
private String toCamelCase(String value, boolean startWithLowerCase) {
String[] strings = StringUtils.split(value, "_");
for (int i = startWithLowerCase ? 1 : 0; i < strings.length; i++) {
strings[i] = StringUtils.capitalize(strings[i]);
}
return StringUtils.join(strings, "_");
}
}

View File

@@ -0,0 +1,122 @@
package org.talend.webservice.helper;
import org.apache.commons.lang.StringUtils;
import org.talend.webservice.jaxb.JAXBUtils;
public class Utils {
public final String LIST_SIZE_SYMBOL = ".size";
public final String LEFT_SQUARE_BRACKET = "[";
public final String RIGHT_SQUARE_BRACKET = "]";
public final String ALL_LIST_SYMBOL = "[*]";
public void resolveInputPath(java.util.Map<String, Object> inputMap) {
java.util.Map<String, Object> tempStoreMap = new java.util.HashMap<String, Object>();
java.util.List<String> tempRemovePath = new java.util.ArrayList<String>();
for (String key : inputMap.keySet()) {
if (key.indexOf(ALL_LIST_SYMBOL) != -1) {
String listHeadPath = key.substring(0, key.indexOf(ALL_LIST_SYMBOL));
String listFootPath = key.substring(key.indexOf(ALL_LIST_SYMBOL) + ALL_LIST_SYMBOL.length());
java.util.List listElement = (java.util.List) inputMap.get(key);
// if the list is null, ignore it but remove the
// original key
if (listElement != null) {
for (int i = 0; i < listElement.size(); i++) {
tempStoreMap.put(listHeadPath + LEFT_SQUARE_BRACKET + i + RIGHT_SQUARE_BRACKET + listFootPath,
listElement.get(i));
}
}
tempRemovePath.add(key);
}
}
inputMap.putAll(tempStoreMap);
for (String removePath : tempRemovePath) {
inputMap.remove(removePath);
}
}
public String removePunctuation(String path) {
String[] strings = PathUtil.splitPath(path, ".");
for (int i = 0; i < strings.length; i++) {
strings[i] = JAXBUtils.removePunctuation(strings[i]);
}
return StringUtils.join(strings, ".");
}
public Object getValue(java.util.Map<String, Object> map, String path) {
if (path == null || "".equals(path)) {
return null;
}
if (map == null || map.isEmpty()) {
return null;
}
java.util.List<String> paths = new java.util.ArrayList<String>();
resolvePath(map, path, paths);
if (paths.size() > 0) {
if (path.indexOf(ALL_LIST_SYMBOL) == -1) {
return map.get(paths.get(0));
} else {
int size = paths.size();
java.util.List<Object> out = new java.util.ArrayList<Object>(size);
for (int i = 0; i < size; i++) {
out.add(map.get(paths.get(i)));
}
return out;
}
} else {
return null;
}
}
public void resolvePath(java.util.Map<String, Object> map, String path, java.util.List<String> paths) {
String listHeadPath = "";
String listFootPath = "";
int size = 0;
String tempPath = "";
if (path.indexOf(ALL_LIST_SYMBOL) != -1) {
listHeadPath = path.substring(0, path.indexOf(ALL_LIST_SYMBOL));
listFootPath = path.substring(path.indexOf(ALL_LIST_SYMBOL) + ALL_LIST_SYMBOL.length());
if (map.get(listHeadPath) == null && map.get(listHeadPath + LIST_SIZE_SYMBOL) != null) {
size = Integer.parseInt(map.get(listHeadPath + LIST_SIZE_SYMBOL).toString());
for (int i = 0; i < size; i++) {
tempPath = listHeadPath + LEFT_SQUARE_BRACKET + i + RIGHT_SQUARE_BRACKET + listFootPath;
if (tempPath.indexOf(ALL_LIST_SYMBOL) != -1) {
resolvePath(map, tempPath, paths);
} else {
paths.add(tempPath);
}
}
}
} else {
paths.add(path);
}
}
public java.util.List<Object> normalize(String inputValue, String delimiter) {
if (inputValue == null || "".equals(inputValue)) {
return null;
}
Object[] inputValues = inputValue.split(delimiter);
return java.util.Arrays.asList(inputValues);
}
public String denormalize(java.util.List inputValues, String delimiter) {
if (inputValues == null || inputValues.isEmpty()) {
return null;
}
StringBuffer sb = new StringBuffer();
for (Object o : inputValues) {
sb.append(String.valueOf(o));
sb.append(delimiter);
}
if (sb.length() > 0) {
sb.delete(sb.length() - delimiter.length(), sb.length());
}
return sb.toString();
}
}

View File

@@ -0,0 +1,277 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.helper.conf;
import java.io.FileInputStream;
import java.security.KeyStore;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.wsdl.xml.WSDLLocator;
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.configuration.security.ProxyAuthorizationPolicy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.transports.http.configuration.ProxyServerType;
/**
*
* @author rlamarche
*/
public class ServiceHelperConfiguration {
private String proxyServer;
private int proxyPort;
private Long connectionTimeout;
private Long receiveTimeout;
private String cookie;
private String username;
private String password;
private String proxyUsername;
private String proxyPassword;
private String trustStoreFile;
private String trustStorePwd;
private String trustStoreType;
private String keyStoreFile;
private String keyStorePwd;
private String keyStoreType;
private boolean allowChunking = true;
public boolean isAllowChunking() {
return allowChunking;
}
public void setAllowChunking(boolean allowChunking) {
this.allowChunking = allowChunking;
}
public WSDLLocator createWSDLLocator(String wsdlUri) {
return new WSDLLocatorImpl(this, wsdlUri);
}
private void updateClientPolicy(HTTPClientPolicy hTTPClientPolicy) {
if (proxyServer != null) {
hTTPClientPolicy.setProxyServer(proxyServer);
hTTPClientPolicy.setProxyServerPort(proxyPort);
hTTPClientPolicy.setProxyServerType(ProxyServerType.HTTP);
} else {
hTTPClientPolicy.setProxyServer(null);
}
if (connectionTimeout != null) {
hTTPClientPolicy.setConnectionTimeout(connectionTimeout);
}
if (receiveTimeout != null) {
hTTPClientPolicy.setReceiveTimeout(receiveTimeout);
}
if (cookie != null) {
hTTPClientPolicy.setCookie(cookie);
} else {
hTTPClientPolicy.setCookie(null);
}
hTTPClientPolicy.setAllowChunking(allowChunking);
}
public void configureHttpConduit(HTTPConduit httpConduit) {
createAuthorizationPolicy(httpConduit);
createProxyAuthorizationPolicy(httpConduit);
httpConduit.setTlsClientParameters(createTLSClientParameters());
updateClientPolicy(httpConduit.getClient());
}
private void createAuthorizationPolicy(HTTPConduit httpConduit) {
if (username != null) {
AuthorizationPolicy authorizationPolicy = httpConduit.getAuthorization();
// authorizationPolicy.setAuthorizationType("Basic");
authorizationPolicy.setUserName(username);
authorizationPolicy.setPassword(password);
}
}
private void createProxyAuthorizationPolicy(HTTPConduit httpConduit) {
if (proxyUsername != null) {
ProxyAuthorizationPolicy authorizationPolicy = httpConduit.getProxyAuthorization();
// authorizationPolicy.setAuthorizationType("Basic");
authorizationPolicy.setUserName(proxyUsername);
authorizationPolicy.setPassword(proxyPassword);
}
}
private TLSClientParameters createTLSClientParameters() {
if (trustStoreFile != null || keyStoreFile != null) {
TLSClientParameters tlsCP = new TLSClientParameters();
if (trustStoreFile != null) {
try {
KeyStore trustStore = KeyStore.getInstance(trustStoreType);
trustStore.load(new FileInputStream(trustStoreFile), trustStorePwd.toCharArray());
String alg = KeyManagerFactory.getDefaultAlgorithm();
TrustManagerFactory fac = TrustManagerFactory.getInstance(alg);
fac.init(trustStore);
TrustManager[] myTrustStoreKeyManagers = fac.getTrustManagers();
tlsCP.setTrustManagers(myTrustStoreKeyManagers);
} catch (Exception ex) {
ex.printStackTrace();
}
}
if (keyStoreFile != null) {
try {
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(new FileInputStream(keyStoreFile), keyStorePwd.toCharArray());
String alg = KeyManagerFactory.getDefaultAlgorithm();
char[] keyPass = keyStorePwd != null ? keyStorePwd.toCharArray() : null;
KeyManagerFactory fac = KeyManagerFactory.getInstance(alg);
fac.init(keyStore, keyPass);
KeyManager[] myKeyManagers = fac.getKeyManagers();
tlsCP.setKeyManagers(myKeyManagers);
} catch (Exception ex) {
ex.printStackTrace();
}
}
tlsCP.setDisableCNCheck(true);
return tlsCP;
} else {
return null;
}
}
public Long getConnectionTimeout() {
return connectionTimeout;
}
public void setConnectionTimeout(Long connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
public String getCookie() {
return cookie;
}
public void setCookie(String cookie) {
this.cookie = cookie;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getProxyPort() {
return proxyPort;
}
public void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
public String getProxyServer() {
return proxyServer;
}
public void setProxyServer(String proxyServer) {
this.proxyServer = proxyServer;
}
public Long getReceiveTimeout() {
return receiveTimeout;
}
public void setReceiveTimeout(Long receiveTimeout) {
this.receiveTimeout = receiveTimeout;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getProxyPassword() {
return proxyPassword;
}
public void setProxyPassword(String proxyPassword) {
this.proxyPassword = proxyPassword;
}
public String getProxyUsername() {
return proxyUsername;
}
public void setProxyUsername(String proxyUsername) {
this.proxyUsername = proxyUsername;
}
public String getTrustStoreFile() {
return trustStoreFile;
}
public void setTrustStoreFile(String trustStoreFile) {
this.trustStoreFile = trustStoreFile;
}
public String getTrustStorePwd() {
return trustStorePwd;
}
public void setTrustStorePwd(String trustStorePwd) {
this.trustStorePwd = trustStorePwd;
}
public String getTrustStoreType() {
return trustStoreType;
}
public void setTrustStoreType(String trustStoreType) {
this.trustStoreType = trustStoreType;
}
public String getKeyStoreFile() {
return keyStoreFile;
}
public void setKeyStoreFile(String keyStoreFile) {
this.keyStoreFile = keyStoreFile;
}
public String getKeyStorePwd() {
return keyStorePwd;
}
public void setKeyStorePwd(String keyStorePwd) {
this.keyStorePwd = keyStorePwd;
}
public String getKeyStoreType() {
return keyStoreType;
}
public void setKeyStoreType(String keyStoreType) {
this.keyStoreType = keyStoreType;
}
}

View File

@@ -0,0 +1,145 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.helper.conf;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.wsdl.xml.WSDLLocator;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.xml.sax.InputSource;
/**
*
* @author rlamarche
*/
public class WSDLLocatorImpl implements WSDLLocator {
private static final String HTTP_HEADER_COOKIE = "Cookie";
private String wsdlUri;
private String latestImportUri;
private ServiceHelperConfiguration configuration;
private HttpClient httpClient;
private Set<InputStream> inputStreams;
public WSDLLocatorImpl(ServiceHelperConfiguration configuration, String wsdlUri) {
this.configuration = configuration;
this.httpClient = createHttpClient();
this.wsdlUri = wsdlUri;
inputStreams = new HashSet<InputStream>();
}
public InputSource getBaseInputSource() {
GetMethod get = createGetMethod(wsdlUri);
try {
httpClient.executeMethod(get);
InputStream is = get.getResponseBodyAsStream();
inputStreams.add(is);
return new InputSource(is);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
public InputSource getImportInputSource(String parentLocation, String importLocation) {
try {
URL url = getURL(parentLocation, importLocation);
latestImportUri = url.toExternalForm();
GetMethod get = createGetMethod(latestImportUri);
httpClient.executeMethod(get);
InputStream is = get.getResponseBodyAsStream();
inputStreams.add(is);
return new InputSource(is);
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
public static URL getURL(String parentLocation, String wsdlLocation) throws MalformedURLException {
URL contextURL = (parentLocation != null) ? getURL(null, parentLocation) : null;
try {
return new URL(contextURL, wsdlLocation);
} catch (MalformedURLException e) {
File tempFile = new File(wsdlLocation);
if (contextURL == null || (contextURL != null && tempFile.isAbsolute())) {
return tempFile.toURI().toURL();
}
// this line is reached if contextURL != null, wsdlLocation is a relative path,
// and a MalformedURLException has been thrown - so re-throw the Exception.
throw e;
}
}
public String getBaseURI() {
return wsdlUri;
}
public String getLatestImportURI() {
return latestImportUri;
}
public void close() {
for (InputStream is : inputStreams) {
try {
is.close();
} catch (IOException ex) {
Logger.getLogger(WSDLLocatorImpl.class.getName()).log(Level.WARNING, null, ex);
}
}
inputStreams.clear();
}
private GetMethod createGetMethod(String uri) {
GetMethod get = new GetMethod(uri);
if (configuration.getCookie() != null) {
get.setRequestHeader(HTTP_HEADER_COOKIE, configuration.getCookie());
}
return get;
}
private HttpClient createHttpClient() {
HttpClient httpClient = new HttpClient();
if (configuration.getProxyServer() != null) {
HostConfiguration hostConfiguration = new HostConfiguration();
hostConfiguration.setProxy(configuration.getProxyServer(), configuration.getProxyPort());
httpClient.setHostConfiguration(hostConfiguration);
}
if (configuration.getUsername() != null) {
Credentials credentials = new UsernamePasswordCredentials(configuration.getUsername(), configuration.getPassword());
httpClient.getState().setCredentials(AuthScope.ANY, credentials);
}
if (configuration.getProxyUsername() != null) {
Credentials credentials = new UsernamePasswordCredentials(configuration.getProxyUsername(),
configuration.getProxyPassword());
httpClient.getState().setProxyCredentials(AuthScope.ANY, credentials);
httpClient.getHostConfiguration().setProxy(configuration.getProxyServer(), configuration.getProxyPort());
}
return httpClient;
}
}

View File

@@ -0,0 +1,218 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.helper.map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.talend.webservice.helper.PathUtil;
import org.talend.webservice.mapper.AnyTypeMapper;
/**
*
* @author rlamarche
*/
public class MapConverter {
public static final String SEPARATOR = ".";
public static final String LEFT_SQUARE_BRACKET = "[";
public static final String RIGHT_SQUARE_BRACKET = "]";
public static Map<String, Object> deepMapToMap(Map<String, Object> map) {
return deepMapToMap(map, null, SEPARATOR);
}
public static Map<String, Object> mapToDeepMap(Map<String, Object> map) {
return mapToDeepMap(map, SEPARATOR);
}
private static Map<String, Object> deepMapToMap(Object value, String k, String sep) {
if (value instanceof Map) {
Map<String, Object> map = (Map<String, Object>) value;
Map<String, Object> out = new HashMap<String, Object>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (k == null) {
out.putAll(deepMapToMap(entry.getValue(), entry.getKey(), sep));
} else {
out.putAll(deepMapToMap(entry.getValue(), k + sep + entry.
getKey(), sep));
}
}
return out;
} else if (value instanceof List) {
List<Object> list = (List<Object>) value;
Map<String, Object> out = new HashMap<String, Object>();
int i = 0;
for (Object val : list) {
StringBuffer sb = new StringBuffer();
sb.append(k).append(LEFT_SQUARE_BRACKET).append(i).append(RIGHT_SQUARE_BRACKET);
out.putAll(deepMapToMap(val, sb.toString(), sep));
i++;
}
out.put(k + ".size", list.size());
return out;
} else {
if (k == null) {
throw new IllegalArgumentException("value must be a map or you must provide a key name");
} else {
Map<String, Object> out = new HashMap<String, Object>(1);
out.put(k, value);
return out;
}
}
}
private static Map<String, Object> mapToDeepMap(Map<String, Object> in, String sep) {
Map<String, Object> out = new HashMap<String, Object>();
Map<String, Map<String, Object>> stack = new HashMap<String, Map<String, Object>>();
Map<String, List<Object>> listStack = new HashMap<String, List<Object>>();
for (Map.Entry<String, Object> entry : in.entrySet()) {
String key = entry.getKey();
int pos = PathUtil.indexOfPath(key, sep);
if (pos == -1) {
int index = getIndexOfKey(key);
if (index == -1) {
processAnyType(out,key,entry.getValue(),null);
} else {
String listName = key.substring(0, key.indexOf(LEFT_SQUARE_BRACKET));
List<Object> list = listStack.get(listName);
if (list == null) {
list = new ArrayList<Object>();
listStack.put(listName, list);
}
if (index < list.size()) {
list.set(index, entry.getValue());
} else {
for (int i = list.size(); i < index; i++) {
list.add(null);
}
list.add(entry.getValue());
}
}
} else {
String k = key.substring(0, pos);
int index = getIndexOfKey(k);
String subK = key.substring(pos + sep.length());
if (index == -1) {
Map<String, Object> stackVal = stack.get(k);
if (stackVal == null) {
stackVal = new HashMap<String, Object>();
stack.put(k, stackVal);
}
stackVal.put(subK, entry.getValue());
} else {
String listName = k.substring(0, k.indexOf(LEFT_SQUARE_BRACKET));
List<Object> list = listStack.get(listName);
if (list == null) {
list = new ArrayList<Object>();
listStack.put(listName, list);
}
Map<String, Object> lmap = null;
if (index < list.size()) {
lmap = (Map<String, Object>) list.get(index);
if (lmap == null) {
lmap = new HashMap<String, Object>();
list.set(index, lmap);
}
} else {
for (int i = list.size(); i < index; i++) {
list.add(null);
}
list.add(new HashMap<String, Object>());
lmap = (Map<String, Object>) list.get(index);
}
lmap.put(subK, entry.getValue());
}
}
}
for (Map.Entry<String, Map<String, Object>> entry : stack.entrySet()) {
processAnyType(out,entry.getKey(),mapToDeepMap(entry.getValue(), sep),null);
}
for (Map.Entry<String, List<Object>> entry : listStack.entrySet()) {
List<Object> values = new ArrayList<Object>(entry.getValue().size());
for (Object val : entry.getValue()) {
if (val instanceof Map) {
values.add(mapToDeepMap((Map<String, Object>) val, sep));
} else {
values.add(val);
}
}
processAnyType(out,entry.getKey(),null,values);
}
return out;
}
private static void processAnyType(Map<String,Object> out,String key,Object value,List<Object> values) {
int i = key.indexOf(AnyTypeMapper.ANYTYPE_PREFIX);
String namespace = null;
String localnameOfType = null;
if(i!=-1) {
int j = key.indexOf(",");
namespace = key.substring(key.indexOf("{")+1,j);
localnameOfType = key.substring(j+1,key.indexOf("}"));
key = key.substring(0,i);
}
if(values!=null) {
if(i!=-1) {
for(int k=0;k<values.size();k++) {
Map<String,Object> anyTypeValue = new HashMap<String,Object>();
anyTypeValue.put(AnyTypeMapper.ANYTYPE_TYPE,new QName(namespace,localnameOfType));
anyTypeValue.put(AnyTypeMapper.ANYTYPE_VALUE,values.get(k));
values.set(k, anyTypeValue);
}
}
out.put(key, values);
} else {
if(i == -1) {
out.put(key, value);
} else {
Map<String,Object> anyTypeValue = new HashMap<String,Object>();
anyTypeValue.put(AnyTypeMapper.ANYTYPE_TYPE,new QName(namespace,localnameOfType));
anyTypeValue.put(AnyTypeMapper.ANYTYPE_VALUE,value);
out.put(key, anyTypeValue);
}
}
}
private static int getIndexOfKey(String key) {
int lpos = key.indexOf(LEFT_SQUARE_BRACKET);
if (lpos == -1) {
return -1;
} else {
int rpos = key.indexOf(RIGHT_SQUARE_BRACKET);
if (rpos != key.length() - 1) {
return -1;
} else {
if (rpos - lpos > 1) {
String strVal = key.substring(lpos + 1, rpos);
try {
return Integer.valueOf(strVal);
} catch (NumberFormatException e) {
return -1;
}
} else {
return -1;
}
}
}
}
}

View File

@@ -0,0 +1,142 @@
package org.talend.webservice.mapper;
import java.beans.PropertyDescriptor;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.beanutils.PropertyUtils;
import org.talend.webservice.exception.IllegalPropertyAccessException;
import org.talend.webservice.exception.InvocationTargetPropertyAccessor;
import org.talend.webservice.exception.LocalizedException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class AnyPropertyMapper implements PropertyMapper {
public static String LABEL = "_content_";
private MapperFactory mapperFactory;
private TypeMapper xmlBeanMapper;
private String propertyName;
private final String AnyPropertyName = "any";
private final String AnyContentPropertyName = "content";
private PropertyDescriptor propertyDescriptor;
private QName schemaTypeQName;
public AnyPropertyMapper(Class<?> clazz, MapperFactory mapperFactory) throws LocalizedException {
this.mapperFactory = mapperFactory;
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(clazz);
for (PropertyDescriptor descriptor : descriptors) {
if (AnyPropertyName.equalsIgnoreCase(descriptor.getName())
|| AnyContentPropertyName.equalsIgnoreCase(descriptor.getName())) {
this.propertyName = descriptor.getName();
propertyDescriptor = descriptor;
break;
}
}
if (propertyDescriptor == null) {
throw new IllegalArgumentException("Unable to get propertyDescriptor for bean " + clazz.getName() + " and property "
+ propertyName);
}
}
public String getMappedPropertyName() {
return propertyName;
}
public void setValueTo(Object destination, Object value) throws LocalizedException {
try {
Method method = propertyDescriptor.getWriteMethod();
if (method.getParameterTypes()[0].equals(JAXBElement.class)) {
value = new JAXBElement(new QName(getMappedPropertyName()), getMappedClass(), value);
propertyDescriptor.getWriteMethod().invoke(destination, value);
} else {
propertyDescriptor.getWriteMethod().invoke(destination, value);
}
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), destination.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), destination.getClass().getName(), ex
.getTargetException());
} catch (IllegalArgumentException ex) {
throw ex;
}
}
public Object getValueFrom(Object source) throws LocalizedException {
try {
Method method = propertyDescriptor.getReadMethod();
String value = "";
if (method.getReturnType().equals(java.util.List.class)) {
List<Element> anyList = (List<Element>) propertyDescriptor.getReadMethod().invoke(source);
for (Element child : anyList) {
Document doc = child.getOwnerDocument();
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
Result result = new StreamResult(writer);
Transformer transformer;
try {
TransformerFactory transFactory = TransformerFactory.newInstance();
transFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
transformer = transFactory.newTransformer();
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
value += writer.getBuffer().toString();
}
return value;
} else {
// shouldn't be there.
return null;
}
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), source.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), source.getClass().getName(), ex
.getTargetException());
}
}
public Class<?> getMappedClass() {
return xmlBeanMapper.getClazz();
}
public Object createProperty(Object value) throws LocalizedException {
xmlBeanMapper = mapperFactory.typeMappers.get(schemaTypeQName);
return xmlBeanMapper.convertToType(value);
}
public Object createValue(Object property) throws LocalizedException {
xmlBeanMapper = mapperFactory.typeMappers.get(schemaTypeQName);
return xmlBeanMapper.typeToValue(property);
}
}

View File

@@ -0,0 +1,104 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.ws.commons.schema.XmlSchemaType;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class AnyTypeMapper implements TypeMapper {
public static final String ANYTYPE_VALUE = "anyType";
public static final String ANYTYPE_TYPE = "anyType_type";
public static final String ANYTYPE_PREFIX = ":anyType";
private MapperFactory mapperFactory;
private Map<QName, TypeMapper> mappers = new HashMap<QName, TypeMapper>();
private TypeMapper lastTypeMapper = null;
public AnyTypeMapper(MapperFactory mapperFactory) {
this.mapperFactory = mapperFactory;
}
public Class<?> getClazz() {
if (lastTypeMapper != null) {
return lastTypeMapper.getClazz();
} else {
return Object.class;
}
}
public Object convertToType(Object value) throws LocalizedException {
if (value == null) {
return null;
}
if (!(value instanceof Map)) {
throw new LocalizedException("org.talend.ws.exception.InvalidParameterAnyType");
}
Map<String, Object> map = (Map<String, Object>) value;
value = map.get(ANYTYPE_VALUE);
if (value == null) {
throw new LocalizedException("org.talend.ws.exception.InvalidParameterAnyType");
}
Object typeValue = map.get(ANYTYPE_TYPE);
if (typeValue == null || !(typeValue instanceof QName)) {
throw new LocalizedException("org.talend.ws.exception.InvalidParameterAnyType");
}
QName type = (QName) typeValue;
lastTypeMapper = getTypeMapper(type);
if (lastTypeMapper == null) {
throw new IllegalArgumentException("Type " + type + " is invalid.");
}
return lastTypeMapper.convertToType(value);
}
public Object typeToValue(Object bean) throws LocalizedException {
if (bean == null) {
return null;
}
XmlSchemaType type = mapperFactory.getClassMapper().getTypeForClass(bean.getClass());
lastTypeMapper = getTypeMapper(type.getQName());
if (lastTypeMapper == null) {
throw new IllegalArgumentException("Class " + bean.getClass().getName() + " is not mapped.");
}
Map<String, Object> map = new HashMap<String, Object>();
map.put(ANYTYPE_TYPE, type.getQName());
map.put(ANYTYPE_VALUE, lastTypeMapper.typeToValue(bean));
return map;
}
private TypeMapper getTypeMapper(QName type) throws LocalizedException {
TypeMapper typeMapper = mappers.get(type);
if (typeMapper == null) {
XmlSchemaType xmlSchemaType = mapperFactory.getSchemaCollection().getTypeByQName(type);
if (xmlSchemaType == null) {
throw new IllegalArgumentException("Unsupported schema type : " + type);
}
typeMapper = mapperFactory.createTypeMapper(xmlSchemaType);
mappers.put(type, typeMapper);
}
return typeMapper;
}
}

View File

@@ -0,0 +1,20 @@
package org.talend.webservice.mapper;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.ws.commons.schema.XmlSchemaType;
/**
*
* @author rlamarche
*/
public interface ClassMapper {
public Class<?> getClassForType(QName xmlSchemaTypeMapperQName, List<String> propertiesName, int tempSuffix);
public Class<?> getClassForType(QName xmlSchemaTypeMapperQName);
public XmlSchemaType getTypeForClass(Class<?> clazz);
}

View File

@@ -0,0 +1,216 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class ComplexTypeMapper implements TypeMapper {
private Map<String, PropertyMapper> mappers;
private Class<?> clazz;
private List<String> propertiesOrder;
private Map<QName, ComplexTypeMapper> instanceComplexTypeMapper;
private boolean hasInstance = false;
private QName typeName = null;
private final String ABSTRACT_TYPE_NAME = "@type";
public boolean hasInstance() {
return hasInstance;
}
protected ComplexTypeMapper(Map<String, PropertyMapper> mappers, Class<?> clazz, List<String> propertiesOrder, QName typeName) {
this.mappers = mappers;
this.clazz = clazz;
this.propertiesOrder = propertiesOrder;
this.typeName = typeName;
}
public void setInstanceComplexTypeMapper(Map<QName, ComplexTypeMapper> instanceComplexTypeMapper) {
if (instanceComplexTypeMapper != null) {
this.instanceComplexTypeMapper = instanceComplexTypeMapper;
hasInstance = true;
}
}
public Class<?> getClazz() {
return clazz;
}
public Object convertToType(Object value) throws LocalizedException {
if (value == null) {
return null;
}
if (hasInstance) {
if (value instanceof Map) {
Map<String, Object> values = (Map<String, Object>) value;
if (values.containsKey(ABSTRACT_TYPE_NAME)) {
QName type = (QName) values.get(ABSTRACT_TYPE_NAME);
ComplexTypeMapper instanceComplexTypeMapper = findInstanceByQName(type);
if (instanceComplexTypeMapper != null) {
return instanceComplexTypeMapper.convertToType(values.get(instanceComplexTypeMapper.typeName
.getLocalPart()));
}
}
}
}
Object bean = null;
try {
bean = clazz.newInstance();
} catch (InstantiationException ex) {
throw new RuntimeException("Unable to instantiate bean of type " + clazz.getName(), ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Unable to instantiate bean of type " + clazz.getName(), ex);
}
if (!(value instanceof Map)) {
if (mappers.get("value") != null && mappers.get("value") instanceof SimpleContentPropertyMapper) {
PropertyMapper propertyMapper = mappers.get("value");
if (propertyMapper != null) {
propertyMapper.setValueTo(bean, value);
} else {
// TODO log a warning ?
}
} else {
throw new IllegalArgumentException("You must provide a Map to create a complexType.");
}
} else {
Map<String, Object> values = (Map<String, Object>) value;
for (Map.Entry<String, Object> entry : values.entrySet()) {
PropertyMapper propertyMapper = mappers.get(entry.getKey());
if (propertyMapper != null) {
propertyMapper.setValueTo(bean, entry.getValue());
} else {
// TODO log a warning ?
}
}
}
return bean;
}
public ComplexTypeMapper findInstanceByQName(QName typeQName) {
ComplexTypeMapper complexTypeMapper = instanceComplexTypeMapper.get(typeQName);
if (complexTypeMapper != null) {
return complexTypeMapper;
} else {
for (ComplexTypeMapper childComplexTypeMapper : instanceComplexTypeMapper.values()) {
if (childComplexTypeMapper.hasInstance()) {
ComplexTypeMapper iComplexTypeMapper = childComplexTypeMapper.findInstanceByQName(typeQName);
if (iComplexTypeMapper != null) {
return iComplexTypeMapper;
}
}
}
}
return null;
}
public ComplexTypeMapper findInstanceByClassName(String className) {
for (ComplexTypeMapper complexTypeMapper : instanceComplexTypeMapper.values()) {
if (complexTypeMapper.getClazz().getName().equals(className)) {
return complexTypeMapper;
} else if (complexTypeMapper.hasInstance()) {
ComplexTypeMapper iComplexTypeMapper = complexTypeMapper.findInstanceByClassName(className);
if (iComplexTypeMapper != null) {
return iComplexTypeMapper;
}
}
}
return null;
}
public Object typeToValue(Object bean) throws LocalizedException {
if (bean == null) {
return null;
} else {
if (!clazz.isInstance(bean)) {
throw new IllegalArgumentException("You must provide an object of type specified by property clazz.");
}
if (hasInstance) {
String beanName = bean.getClass().getName();
if (!clazz.getName().equals(beanName)) {
ComplexTypeMapper instanceComplexTypeMapper = findInstanceByClassName(beanName);
if (instanceComplexTypeMapper != null) {
Map<String, Object> values = new HashMap<String, Object>();
values.put(ABSTRACT_TYPE_NAME, instanceComplexTypeMapper.typeName);
values.put(instanceComplexTypeMapper.typeName.getLocalPart(), instanceComplexTypeMapper.typeToValue(bean));
return values;
}
}
}
if (mappers.get("value") != null && mappers.get("value") instanceof SimpleContentPropertyMapper) {
PropertyMapper propertyMapper = mappers.get("value");
if (propertyMapper != null) {
return propertyMapper.getValueFrom(bean);
} else {
return null;
}
} else {
Map<String, Object> values = new HashMap<String, Object>(mappers.size());
for (Map.Entry<String, PropertyMapper> entry : mappers.entrySet()) {
Object value = entry.getValue().getValueFrom(bean);
if (value != null) {
values.put(entry.getKey(), value);
}
}
return values;
}
}
}
public Object[] convertToTypeUnwrapped(Map<String, Object> values) throws LocalizedException {
Object[] objects = new Object[propertiesOrder.size()];
int i = 0;
for (String property : propertiesOrder) {
Object value = values.get(property);
if (value != null) {
PropertyMapper propertyMapper = mappers.get(property);
objects[i] = propertyMapper.createProperty(value);
}
i++;
}
return objects;
}
public Map<String, Object> typeToValueUnwrapped(Object[] params) throws LocalizedException {
if (params == null) {
return null;
}
Map<String, Object> values = new HashMap<String, Object>(mappers.size());
int i = 0;
for (Object param : params) {
if (i >= propertiesOrder.size()) {
throw new IllegalArgumentException("Too much params.");
}
String property = propertiesOrder.get(i);
PropertyMapper propertyMapper = mappers.get(property);
values.put(property, propertyMapper.createValue(param));
i++;
}
return values;
}
}

View File

@@ -0,0 +1,38 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.Map;
import javax.wsdl.Message;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class EmptyMessageMapper implements MessageMapper {
public Message getMessage() {
return null;
}
public Object[] convertToParams(Object value) throws LocalizedException {
return null;
}
public Map<String, Object> convertToValue(Object[] params) throws LocalizedException {
return null;
}
public boolean isUnwrapped() {
return false;
}
public void setUnwrapped(boolean unwrapped) {
}
}

View File

@@ -0,0 +1,79 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.ConvertUtils;
import org.talend.webservice.exception.InvalidEnumValueException;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class EnumTypeMapper implements TypeMapper {
private Class<?> clazz;
private Method value;
private Method fromValue;
public EnumTypeMapper(Class<?> clazz) {
if (!clazz.isEnum()) {
throw new IllegalArgumentException("You must provide an enum class.");
}
this.clazz = clazz;
try {
this.fromValue = clazz.getMethod("fromValue", String.class);
this.value = clazz.getMethod("value");
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
} catch (SecurityException ex) {
throw new RuntimeException(ex);
}
}
public Class<?> getClazz() {
return clazz;
}
public Object convertToType(Object value) throws LocalizedException {
if (value == null) {
return null;
}
if (!clazz.isInstance(value)) {
String str = ConvertUtils.convert(value);
try {
return fromValue.invoke(null, str);// bug 13000
// return valueOf.invoke(null, str);
} catch (IllegalAccessException ex) {
throw new LocalizedException("org.talend.ws.exception.illegalAccessValueOf", new String[] { clazz.getName() }, ex);
} catch (InvocationTargetException ex) {
if (ex.getTargetException() instanceof IllegalArgumentException) {
throw new InvalidEnumValueException(str, clazz.getName());
} else {
throw new LocalizedException("org.talend.ws.exception.Unknown", ex.getTargetException());
}
}
} else {
return value;
}
}
public Object typeToValue(Object bean) throws LocalizedException {
if (bean == null) {
return null;
} else {
try {
return value.invoke(bean); // bug 13000
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
}

View File

@@ -0,0 +1,153 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.commons.beanutils.PropertyUtils;
import org.talend.webservice.exception.IllegalPropertyAccessException;
import org.talend.webservice.exception.InvocationTargetPropertyAccessor;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class ListPropertyMapper implements PropertyMapper {
private Map<QName, TypeMapper> schemaTypeMap;
private TypeMapper xmlBeanMapper;
private String propertyName;
private PropertyDescriptor propertyDescriptor;
private QName schemaTypeQName;
public ListPropertyMapper(Class<?> clazz, QName typeQName, String propertyName, Map<QName, TypeMapper> schemaTypeMap) {
this.schemaTypeMap = schemaTypeMap;
this.schemaTypeQName = typeQName;
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(clazz);
for (PropertyDescriptor descriptor : descriptors) {
if (propertyName.equalsIgnoreCase(descriptor.getName())) {
this.propertyName = descriptor.getName();
propertyDescriptor = descriptor;
break;
}
}
if (propertyDescriptor == null) {
throw new IllegalArgumentException("Unable to get propertyDescriptor for bean " + typeQName + " and property "
+ propertyName);
}
}
public Class<?> getMappedClass() {
return xmlBeanMapper.getClazz();
}
public String getMappedPropertyName() {
return propertyName;
}
public void setValueTo(Object destination, Object value) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
if (value == null) {
return;
}
List values;
if (value instanceof List) {
values = (List) value;
} else {
values = Arrays.asList(value);
}
List target;
try {
target = (List) propertyDescriptor.getReadMethod().invoke(destination);
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), destination.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), destination.getClass().getName(), ex);
}
for (Object val : values) {
target.add(xmlBeanMapper.convertToType(val));
}
}
public Object getValueFrom(Object source) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
List values;
try {
values = (List) propertyDescriptor.getReadMethod().invoke(source);
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), source.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), source.getClass().getName(), ex);
}
List newValues = new ArrayList(values.size());
for (Object value : values) {
newValues.add(xmlBeanMapper.typeToValue(value));
}
return newValues;
}
public Object createProperty(Object value) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
if (value == null) {
return null;
}
List values;
if (value instanceof List) {
values = (List) value;
} else {
values = Arrays.asList(value);
}
List property = new ArrayList(values.size());
for (Object val : values) {
property.add(xmlBeanMapper.convertToType(val));
}
return property;
}
public Object createValue(Object property) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
if (property == null) {
return null;
}
if (!(property instanceof List)) {
if (!(property instanceof Object[])) {// treat Object[] as List ,bug for 9900 (wrap webservice)
throw new IllegalArgumentException("You must provide a list of properties");
}// end
}
List<Object> properties = null;
if (property instanceof Object[]) {// treat Object[] as List ,bug for 9900 (wrap webservice)
Object[] os = (Object[]) property;
properties = Arrays.asList(os);
} else {// end
properties = (List<Object>) property;
}
List<Object> values = new ArrayList<Object>(properties.size());
for (Object prop : properties) {
values.add(xmlBeanMapper.typeToValue(prop));
}
return values;
}
}

View File

@@ -0,0 +1,567 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.wsdl.Message;
import javax.wsdl.Part;
import javax.xml.namespace.QName;
import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaAll;
import org.apache.ws.commons.schema.XmlSchemaAny;
import org.apache.ws.commons.schema.XmlSchemaChoice;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.apache.ws.commons.schema.XmlSchemaComplexContent;
import org.apache.ws.commons.schema.XmlSchemaComplexContentExtension;
import org.apache.ws.commons.schema.XmlSchemaComplexContentRestriction;
import org.apache.ws.commons.schema.XmlSchemaComplexType;
import org.apache.ws.commons.schema.XmlSchemaContent;
import org.apache.ws.commons.schema.XmlSchemaContentModel;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.apache.ws.commons.schema.XmlSchemaEnumerationFacet;
import org.apache.ws.commons.schema.XmlSchemaFacet;
import org.apache.ws.commons.schema.XmlSchemaGroupParticle;
import org.apache.ws.commons.schema.XmlSchemaGroupRef;
import org.apache.ws.commons.schema.XmlSchemaObject;
import org.apache.ws.commons.schema.XmlSchemaParticle;
import org.apache.ws.commons.schema.XmlSchemaSequence;
import org.apache.ws.commons.schema.XmlSchemaSequenceMember;
import org.apache.ws.commons.schema.XmlSchemaSimpleContent;
import org.apache.ws.commons.schema.XmlSchemaSimpleContentExtension;
import org.apache.ws.commons.schema.XmlSchemaSimpleContentRestriction;
import org.apache.ws.commons.schema.XmlSchemaSimpleType;
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeContent;
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeList;
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeRestriction;
import org.apache.ws.commons.schema.XmlSchemaSimpleTypeUnion;
import org.apache.ws.commons.schema.XmlSchemaType;
import org.apache.ws.commons.schema.utils.XmlSchemaObjectBase;
import org.talend.webservice.exception.LocalizedException;
import org.talend.webservice.jaxb.JAXBUtils;
/**
*
* @author rlamarche
*/
public class MapperFactory {
private static final Map<String, String> BUILTIN_DATATYPES_MAP;
private static final Map<String, String> BUILTIN_DATATYPES_MAP_REVERSE;
private static final String W3C_XML_SCHEMA_URI = "http://www.w3.org/2001/XMLSchema";
private static final String W3C_XML_SCHEMA_DATETYPES_URI = "http://www.w3.org/2001/XMLSchema-datatypes";
private static final QName ANYTYPE_QNAME = new QName(W3C_XML_SCHEMA_URI, "anyType");
private static String byteArrayName = new byte[0].getClass().getName();
// refer to :http://www.w3.org/TR/xmlschema-2/
static {
BUILTIN_DATATYPES_MAP = new HashMap<String, String>();
BUILTIN_DATATYPES_MAP.put("string", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("integer", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP.put("int", "java.lang.Integer");
BUILTIN_DATATYPES_MAP.put("long", "java.lang.Long");
BUILTIN_DATATYPES_MAP.put("short", "java.lang.Short");
BUILTIN_DATATYPES_MAP.put("decimal", "java.math.BigDecimal");
BUILTIN_DATATYPES_MAP.put("float", "java.lang.Float");
BUILTIN_DATATYPES_MAP.put("double", "java.lang.Double");
BUILTIN_DATATYPES_MAP.put("boolean", "java.lang.Boolean");
BUILTIN_DATATYPES_MAP.put("byte", "java.lang.Byte");
BUILTIN_DATATYPES_MAP.put("QName", "javax.xml.namespace.QName");
BUILTIN_DATATYPES_MAP.put("dateTime", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("base64Binary", byteArrayName);
BUILTIN_DATATYPES_MAP.put("hexBinary", byteArrayName);
BUILTIN_DATATYPES_MAP.put("unsignedInt", "java.lang.Long");
BUILTIN_DATATYPES_MAP.put("unsignedShort", "java.lang.Integer");
BUILTIN_DATATYPES_MAP.put("unsignedByte", "java.lang.Short");
BUILTIN_DATATYPES_MAP.put("time", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("date", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("gYear", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("gYearMonth", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("gMonth", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("gMonthDay", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("gDay", "javax.xml.datatype.XMLGregorianCalendar");
BUILTIN_DATATYPES_MAP.put("duration", "javax.xml.datatype.Duration");
BUILTIN_DATATYPES_MAP.put("NOTATION", "javax.xml.namespace.QName");
BUILTIN_DATATYPES_MAP.put("anyURI", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("token", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("IDREF", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("NCName", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("ENTITY", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("normalizedString", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("language", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("Name", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("NMTOKEN", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("NMTOKENS", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("ID", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("IDREFS", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("ENTITIES", "java.lang.String");
BUILTIN_DATATYPES_MAP.put("nonPositiveInteger", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP.put("nonNegativeInteger", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP.put("negativeInteger", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP.put("positiveInteger", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP.put("unsignedLong", "java.math.BigInteger");
BUILTIN_DATATYPES_MAP_REVERSE = new HashMap<String, String>();
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.String", "string");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.math.BigInteger", "integer");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Integer", "int");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Long", "long");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Short", "short");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.math.BigDecimal", "decimal");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Float", "float");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Double", "double");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Boolean", "boolean");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Byte", "byte");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.namespace.QName", "QName");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "dateTime");
BUILTIN_DATATYPES_MAP_REVERSE.put(byteArrayName, "base64Binary");
BUILTIN_DATATYPES_MAP_REVERSE.put(byteArrayName, "hexBinary");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Long", "unsignedInt");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Short", "unsignedShort");
BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.Byte", "unsignedByte");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "time");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "date");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "gYear");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "gYearMonth");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "gMonth");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "gMonthDay");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.XMLGregorianCalendar", "gDay");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.datatype.Duration", "duration");
BUILTIN_DATATYPES_MAP_REVERSE.put("javax.xml.namespace.QName", "NOTATION");
// BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.String", "anyURI"); // bug13001
// BUILTIN_DATATYPES_MAP_REVERSE.put("java.lang.String", "token"); // bug13001
}
protected ClassMapper classMapper;
protected XmlSchemaCollection schemaCollection;
// bug 13001 nested call type
protected Map<QName, TypeMapper> typeMappers;
public MapperFactory(ClassMapper classMapper, XmlSchemaCollection schemaCollection) {
this.classMapper = classMapper;
this.schemaCollection = schemaCollection;
this.typeMappers = new HashMap<QName, TypeMapper>();
}
public XmlSchemaCollection getSchemaCollection() {
return schemaCollection;
}
public ClassMapper getClassMapper() {
return classMapper;
}
/**
* Return the message mapper or null if the message does not have any parts or is null
*
* @param message
* @return
*/
public MessageMapper createMessageMapper(Message message) throws LocalizedException {
if (message == null) {
return new EmptyMessageMapper();
}
Map<String, Part> parts = message.getParts();
if (parts == null || parts != null && parts.size() == 0) {
return new EmptyMessageMapper();
} else {
Map<String, TypeMapper> mappers = new HashMap<String, TypeMapper>(parts.size());
for (Map.Entry<String, Part> entry : parts.entrySet()) {
String name = entry.getKey();
Part part = entry.getValue();
XmlSchemaType xmlSchemaType = null;
QName elementName = part.getElementName();
if (elementName == null) {
QName typeName = part.getTypeName();
if (typeName == null) {
throw new IllegalArgumentException("Unable to find type of part " + part.getName() + " for message "
+ message.getQName());
}
xmlSchemaType = schemaCollection.getTypeByQName(typeName);
if (xmlSchemaType.getName() == null) {
xmlSchemaType.setName(typeName.getLocalPart());
}
} else {
XmlSchemaElement xmlSchemaElement = schemaCollection.getElementByQName(part.getElementName());
xmlSchemaType = xmlSchemaElement.getSchemaType();
if (xmlSchemaType.getName() == null) {
xmlSchemaType.setName(xmlSchemaElement.getName());
}
}
if (xmlSchemaType == null) {
throw new IllegalArgumentException("Type " + part.getElementName() + " was not found in the schema.");
}
mappers.put(name, createTypeMapper(xmlSchemaType));
}
return new MessageMapperImpl(mappers, message);
}
}
protected TypeMapper createTypeMapper(XmlSchemaType xmlSchemaType) throws LocalizedException {
if (!typeMappers.containsKey(xmlSchemaType.getQName())) {
typeMappers.put(xmlSchemaType.getQName(), null);
TypeMapper typeMapper = null;
if (xmlSchemaType instanceof XmlSchemaComplexType) {
typeMapper = createComplexTypeMapper((XmlSchemaComplexType) xmlSchemaType);
} else if (xmlSchemaType instanceof XmlSchemaSimpleType) {
if (ANYTYPE_QNAME.equals(xmlSchemaType.getQName())) {
typeMapper = new AnyTypeMapper(this);
} else {
typeMapper = createSimpleTypeMapper((XmlSchemaSimpleType) xmlSchemaType);
}
} else {
throw new IllegalArgumentException("Type " + xmlSchemaType.getClass().getName() + " is not yes supported.");
}
typeMappers.put(xmlSchemaType.getQName(), typeMapper);
return typeMapper;
} else {
return typeMappers.get(xmlSchemaType.getQName());
}
}
private TypeMapper createSimpleTypeMapper(XmlSchemaSimpleType xmlSchemaSimpleType) {
XmlSchemaSimpleTypeContent xmlSchemaSimpleTypeContent = xmlSchemaSimpleType.getContent();
QName qname = xmlSchemaSimpleType.getQName();
String namespaceuri = qname == null ? null : qname.getNamespaceURI();
// simple type
String simpleClassName = builtInTypeToJavaType(xmlSchemaSimpleType.getName());
if (simpleClassName != null && (W3C_XML_SCHEMA_URI.equals(namespaceuri) || W3C_XML_SCHEMA_DATETYPES_URI.equals(namespaceuri))) {
Class<?> clazz;
try {
clazz = Class.forName(simpleClassName);
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Unable to find java type " + simpleClassName, ex);
}
return new SimpleTypeMapper(clazz);
} else if (xmlSchemaSimpleTypeContent instanceof XmlSchemaSimpleTypeList) {
// using java.util.list to map xmlschemasimpletypelist
// bug 13922
Class<?> clazz;
try {
clazz = Class.forName("java.util.List");
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Unable to find java type java.util.List", ex);
}
return new SimpleTypeMapper(clazz);
} else if (xmlSchemaSimpleTypeContent instanceof XmlSchemaSimpleTypeRestriction) {
// Enum or others
// bug 13001 for
// <xsd:simpleType name="EventType">
// <xsd:restriction base="xsd:string"/>
// </xsd:simpleType>
// and not enum
// and enum have not typename,means jaxb didn't gen class for the enum without simpleType.getName
XmlSchemaSimpleTypeRestriction xmlSchemaSimpleTypeRestriction = (XmlSchemaSimpleTypeRestriction) xmlSchemaSimpleTypeContent;
List<XmlSchemaFacet> facets = xmlSchemaSimpleTypeRestriction.getFacets();
if (facets.size() > 0 && facets.get(0) instanceof XmlSchemaEnumerationFacet && xmlSchemaSimpleType.getName() != null) {
Class<?> clazz = classMapper.getClassForType(xmlSchemaSimpleType.getQName());
if (!clazz.isEnum()) {
throw new IllegalArgumentException("Class " + clazz.getName() + " should be an enum.");
}
return new EnumTypeMapper(clazz);
} else {
String className = builtInTypeToJavaType(((XmlSchemaSimpleTypeRestriction) xmlSchemaSimpleTypeContent)
.getBaseTypeName().getLocalPart());
if (className == null) {
throw new IllegalArgumentException("Unsupported type " + xmlSchemaSimpleType.getQName());
}
Class<?> clazz;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Unable to find java type " + className, ex);
}
return new SimpleTypeMapper(clazz);
}
} else if (xmlSchemaSimpleTypeContent instanceof XmlSchemaSimpleTypeUnion) {
Class<?> clazz;
try {
clazz = Class.forName("java.lang.String");
} catch (ClassNotFoundException ex) {
throw new IllegalArgumentException("Unable to find java type java.lang.String", ex);
}
return new SimpleTypeMapper(clazz);
} else {
throw new IllegalArgumentException("Unsupported type " + xmlSchemaSimpleTypeContent.getClass().getName());
}
}
private ComplexTypeMapper createComplexTypeMapper(XmlSchemaComplexType xmlSchemaComplexType) throws LocalizedException {
// 0. if that class is abstract, find the instance class
Map<QName, ComplexTypeMapper> instanceComplexTypeMapper = null;
if (xmlSchemaComplexType.isAbstract()) {
instanceComplexTypeMapper = findInstance(xmlSchemaComplexType.getQName());
}
// 1. get the all properties from complexType
Map<String, Object> properties = getProperties(xmlSchemaComplexType);
Map<String, Object> tempProperties = new ListOrderedMap();
for (String key : properties.keySet()) {
tempProperties.put(JAXBUtils.removePunctuation(key), properties.get(key));
}
properties.clear();
properties.putAll(tempProperties);
// 2. get class with typeMapperQname(type Qname, element Qname, inner class Qname)
// and use properties to check the class name(class,class1,class2)
ListOrderedMap orderedMap = (ListOrderedMap) properties;
Class<?> clazz = classMapper.getClassForType(xmlSchemaComplexType.getQName(), orderedMap.keyList(), 1);
// 3.create propertyMapper (propertyName,class,schemaTypeMap,typeMapperQname)
Map<String, PropertyMapper> mappers = new HashMap<String, PropertyMapper>();
for (String key : properties.keySet()) {
Object xmlSchemaObject = properties.get(key);
if (xmlSchemaObject == null) {
if (AnyPropertyMapper.LABEL.equals(key)) {
mappers.put(key, new AnyPropertyMapper(clazz, this));
}
} else if (xmlSchemaObject instanceof XmlSchemaElement) {
mappers.put(key, createPropertyMapper((XmlSchemaElement) xmlSchemaObject, clazz, key));
} else if (xmlSchemaObject instanceof XmlSchemaType) {
mappers.put(key, createPropertyMapper((XmlSchemaType) xmlSchemaObject, clazz, key));
}
}
// 4.create new ComplexTypeMapper
ComplexTypeMapper complexTypeMapper = new ComplexTypeMapper(mappers, clazz, orderedMap.keyList(),
xmlSchemaComplexType.getQName());
if (instanceComplexTypeMapper != null && !instanceComplexTypeMapper.isEmpty()) {
complexTypeMapper.setInstanceComplexTypeMapper(instanceComplexTypeMapper);
}
return complexTypeMapper;
}
/**
* DOC bchen Comment method "findInstance".
*
* @param qName
* @throws LocalizedException
*/
private Map<QName, ComplexTypeMapper> findInstance(QName abstractQName) throws LocalizedException {
Map<QName, ComplexTypeMapper> instanceTypeMappers = new HashMap<QName, ComplexTypeMapper>();
XmlSchema[] xmlSchemas = schemaCollection.getXmlSchemas();
for (XmlSchema xmlSchema : xmlSchemas) {
Map<QName, XmlSchemaType> xmlSchemaTypes = xmlSchema.getSchemaTypes();
for (QName key : xmlSchemaTypes.keySet()) {
XmlSchemaType xmlSchemaType = xmlSchemaTypes.get(key);
if (xmlSchemaType instanceof XmlSchemaComplexType) {
XmlSchemaContentModel xmlSchemaContentModel = ((XmlSchemaComplexType) xmlSchemaType).getContentModel();
XmlSchemaComplexContent xmlSchemaComplexContent = (XmlSchemaComplexContent) xmlSchemaContentModel;
if (xmlSchemaContentModel instanceof XmlSchemaComplexContent) {
XmlSchemaContent xmlSchemaContent = xmlSchemaComplexContent.getContent();
if (xmlSchemaContent instanceof XmlSchemaComplexContentExtension) {
XmlSchemaComplexContentExtension xmlSchemaComplexContentExtension = (XmlSchemaComplexContentExtension) xmlSchemaContent;
if (xmlSchemaComplexContentExtension.getBaseTypeName().equals(abstractQName)) {
instanceTypeMappers.put(xmlSchemaType.getQName(),
(ComplexTypeMapper) createTypeMapper(xmlSchemaType));
}
}
}
}
}
}
return instanceTypeMappers;
}
protected PropertyMapper createPropertyMapper(XmlSchemaType xmlSchemaType, Class<?> clazz, String propertyName)
throws LocalizedException {
if (propertyName == null || "".equals(propertyName)) {
propertyName = xmlSchemaType.getName();
}
createTypeMapper(xmlSchemaType);
return new SimpleContentPropertyMapper(clazz, xmlSchemaType.getQName(), propertyName, typeMappers);
}
protected PropertyMapper createPropertyMapper(XmlSchemaElement xmlSchemaElement, Class<?> clazz, String propertyName)
throws LocalizedException {
XmlSchemaType xmlSchemaType = xmlSchemaElement.getSchemaType();
// bug 13001
if (xmlSchemaType == null && xmlSchemaElement.getRef() != null && xmlSchemaElement.getRef().getTarget() != null) {
xmlSchemaElement = schemaCollection.getElementByQName(xmlSchemaElement.getRef().getTargetQName());
xmlSchemaType = xmlSchemaElement.getSchemaType();
}
// bug 13001, inner class
if (xmlSchemaType.getName() == null) {
if (xmlSchemaType instanceof XmlSchemaComplexType) {
String innerClassName = clazz.getName().substring(clazz.getName().lastIndexOf(".") + 1);
innerClassName += "$";
// innerClassName += xmlSchemaElement.getName(); inner Class name
// should be capital first
innerClassName += xmlSchemaElement.getName().substring(0, 1).toUpperCase()
+ xmlSchemaElement.getName().substring(1);
xmlSchemaType.setName(innerClassName);
} else {
// The name is required if the simpleType element is a child of the
// schema element, otherwise it is not allowed
xmlSchemaType.setName(xmlSchemaElement.getName());
}
}
createTypeMapper(xmlSchemaType);
if (xmlSchemaElement.getMaxOccurs() > 1) {
return new ListPropertyMapper(clazz, xmlSchemaType.getQName(), propertyName, typeMappers);
} else {
return new SimplePropertyMapper(clazz, xmlSchemaType.getQName(), propertyName, typeMappers);
}
}
private Map<String, Object> getProperties(XmlSchemaComplexType xmlSchemaComplexType) throws LocalizedException {
Map<String, Object> mappers = new ListOrderedMap();
XmlSchemaContentModel xmlSchemaContentModel = xmlSchemaComplexType.getContentModel();
if (xmlSchemaContentModel == null) {
XmlSchemaParticle xmlSchemaParticle = xmlSchemaComplexType.getParticle();
if (xmlSchemaParticle instanceof XmlSchemaGroupParticle) {
XmlSchemaGroupParticle xmlSchemaGroupParticle = (XmlSchemaGroupParticle) xmlSchemaParticle;
mappers.putAll(getProperties(xmlSchemaGroupParticle));
} else if (xmlSchemaParticle instanceof XmlSchemaGroupRef) {
XmlSchemaGroupRef xmlSchemaGroupRef = (XmlSchemaGroupRef) xmlSchemaParticle;
XmlSchemaGroupParticle xmlSchemaGroupRefParticle = xmlSchemaGroupRef.getParticle();
mappers.putAll(getProperties(xmlSchemaGroupRefParticle));
} else {
// if(!xmlSchemaComplexType.isAbstract())
// throw new IllegalArgumentException("unknown Content of XmlSchemaComplexType:" +
// xmlSchemaComplexType.getQName());
}
} else if (xmlSchemaContentModel instanceof XmlSchemaComplexContent) {
XmlSchemaComplexContent xmlSchemaComplexContent = (XmlSchemaComplexContent) xmlSchemaContentModel;
XmlSchemaContent xmlSchemaContent = xmlSchemaComplexContent.getContent();
if (xmlSchemaContent instanceof XmlSchemaComplexContentExtension) {
XmlSchemaComplexContentExtension xmlSchemaComplexContentExtension = (XmlSchemaComplexContentExtension) xmlSchemaContent;
XmlSchemaComplexType baseXmlSchemaComplexType = (XmlSchemaComplexType) schemaCollection
.getTypeByQName(xmlSchemaComplexContentExtension.getBaseTypeName());
// First, recursion on parent class (for properties order)
mappers.putAll(getProperties(baseXmlSchemaComplexType));
XmlSchemaParticle xmlSchemaParticle = xmlSchemaComplexContentExtension.getParticle();
if (xmlSchemaParticle instanceof XmlSchemaGroupParticle) {
mappers.putAll(getProperties((XmlSchemaGroupParticle) xmlSchemaParticle));
}
} else if (xmlSchemaContent instanceof XmlSchemaComplexContentRestriction) {
// TODO
throw new IllegalArgumentException("XmlSchemaComplexContentRestriction is not yet supported.");
} else {
throw new IllegalArgumentException("Invalid XmlSchemaContent for a XmlSchemaComplexContent.");
}
} else if (xmlSchemaContentModel instanceof XmlSchemaSimpleContent) {
XmlSchemaSimpleContent xmlSchemaSimpleContent = (XmlSchemaSimpleContent) xmlSchemaContentModel;
XmlSchemaContent xmlSchemaContent = xmlSchemaSimpleContent.getContent();
if (xmlSchemaContent instanceof XmlSchemaSimpleContentExtension) {
XmlSchemaSimpleContentExtension xmlSchemaSimpleContentExtension = (XmlSchemaSimpleContentExtension) xmlSchemaContent;
XmlSchemaType baseXmlSchemaType = schemaCollection.getTypeByQName(xmlSchemaSimpleContentExtension
.getBaseTypeName());
if (baseXmlSchemaType instanceof XmlSchemaSimpleType) {
mappers.put("value", baseXmlSchemaType);
} else if (baseXmlSchemaType instanceof XmlSchemaComplexType) {
throw new IllegalArgumentException(
"A complex type with a simple content or a simple type is expected but found:"
+ baseXmlSchemaType.getQName());
}
} else if (xmlSchemaContent instanceof XmlSchemaSimpleContentRestriction) {
XmlSchemaSimpleContentRestriction xmlSchemaSimpleContentRestriction = (XmlSchemaSimpleContentRestriction) xmlSchemaContent;
// TODO
throw new IllegalArgumentException("XmlSchemaSimpleContentRestriction is not yet supported.");
} else {
throw new IllegalArgumentException("Invalid XmlSchemaContent for a XmlSchemaComplexContent.");
}
} else {
throw new IllegalArgumentException("unknown XmlSchemaContentModel.");
}
return mappers;
}
private Map<String, XmlSchemaElement> getProperties(XmlSchemaGroupParticle xmlSchemaGroupParticle) throws LocalizedException {
Map<String, XmlSchemaElement> mappers = new ListOrderedMap();
if (xmlSchemaGroupParticle instanceof XmlSchemaSequence) {
XmlSchemaSequence xmlSchemaSequence = (XmlSchemaSequence) xmlSchemaGroupParticle;
List<XmlSchemaSequenceMember> sequences = xmlSchemaSequence.getItems();
for (XmlSchemaSequenceMember sequence : sequences) {
mappers.putAll(getProperties(sequence));
}
} else if (xmlSchemaGroupParticle instanceof XmlSchemaAll) {
XmlSchemaAll xmlSchemaAll = (XmlSchemaAll) xmlSchemaGroupParticle;
List<XmlSchemaElement> elements = xmlSchemaAll.getItems();
for (XmlSchemaElement element : elements) {
mappers.put(element.getName(), element);
}
} else if (xmlSchemaGroupParticle instanceof XmlSchemaChoice) {
XmlSchemaChoice xmlSchemaChoice = (XmlSchemaChoice) xmlSchemaGroupParticle;
List<XmlSchemaObject> xmlSchemaObjects = xmlSchemaChoice.getItems();
for (XmlSchemaObject xmlSchemaObject : xmlSchemaObjects) {
mappers.putAll(getProperties(xmlSchemaObject));
}
}
return mappers;
}
private Map<String, XmlSchemaElement> getProperties(XmlSchemaObjectBase xmlSchemaObjectBase) throws LocalizedException {
Map<String, XmlSchemaElement> mappers = new ListOrderedMap();
if (xmlSchemaObjectBase instanceof XmlSchemaElement) {
XmlSchemaElement xmlSchemaElement = (XmlSchemaElement) xmlSchemaObjectBase;
if (xmlSchemaElement.getName() == null) {
if (xmlSchemaElement.getRefBase() != null && xmlSchemaElement.getRefBase().getTargetQName() != null) {
mappers.put(xmlSchemaElement.getRefBase().getTargetQName().getLocalPart(), xmlSchemaElement);
} else {
throw new IllegalArgumentException("An Element don't defined name.");
}
} else {
mappers.put(xmlSchemaElement.getName(), xmlSchemaElement);
}
} else if (xmlSchemaObjectBase instanceof XmlSchemaAny) { // bug 14053
mappers.put(AnyPropertyMapper.LABEL, null);
} else if (xmlSchemaObjectBase instanceof XmlSchemaChoice) {
mappers.putAll(getProperties((XmlSchemaChoice) xmlSchemaObjectBase));
} else if (xmlSchemaObjectBase instanceof XmlSchemaGroupRef) {
XmlSchemaGroupRef xmlSchemaGroupRef = (XmlSchemaGroupRef) xmlSchemaObjectBase;
XmlSchemaGroupParticle xmlSchemaGroupRefParticle = xmlSchemaGroupRef.getParticle();
mappers.putAll(getProperties(xmlSchemaGroupRefParticle));
} else if (xmlSchemaObjectBase instanceof XmlSchemaSequence) {
mappers.putAll(getProperties((XmlSchemaSequence) xmlSchemaObjectBase));
} else {
throw new IllegalArgumentException("Invalid xmlSchemaObject.");
}
return mappers;
}
private static String builtInTypeToJavaType(String type) {
return BUILTIN_DATATYPES_MAP.get(type);
}
public static QName javaTypeToBuiltInType(String type) {
return new QName(W3C_XML_SCHEMA_URI, BUILTIN_DATATYPES_MAP_REVERSE.get(type));
}
}

View File

@@ -0,0 +1,40 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.Map;
import javax.wsdl.Message;
import org.talend.webservice.exception.LocalizedException;
/**
* Define the transformation between params and Message parts
* @author rlamarche
*/
public interface MessageMapper {
/**
* @return the targeted message
*/
public Message getMessage();
/**
* Convert value to parts
* @param value
* @return
*/
public Object[] convertToParams(Object value) throws LocalizedException;
;
/**
* Convert parts to value
* @param params
* @return
*/
public Map<String, Object> convertToValue(Object[] params) throws LocalizedException;
public boolean isUnwrapped();
public void setUnwrapped(boolean unwrapped);
}

View File

@@ -0,0 +1,178 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.mapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.wsdl.Message;
import javax.wsdl.Part;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class MessageMapperImpl implements MessageMapper {
/**
* contains TypeMappers for each parts of the message
*/
private Map<String, TypeMapper> mappers;
private Map<String, Integer> partsOrder;
private Message message;
private boolean unwrapped;
protected MessageMapperImpl(Map<String, TypeMapper> mappers, Message message) {
this.mappers = mappers;
this.message = message;
partsOrder = new HashMap<String, Integer>(mappers.size());
int i = 0;
for (Part part : (List<Part>) message.getOrderedParts(null)) {
partsOrder.put(part.getName(), i);
i++;
}
}
public Message getMessage() {
return message;
}
public Object[] convertToParams(Object value) throws LocalizedException {
if (value instanceof Map) {
Map<String, Object> values = (Map<String, Object>) value;
return convertToParams(values);
} else if (value instanceof Object[]) {
Object[] values = (Object[]) value;
return convertToParams(values);
} else {
return convertToParams(new Object[]{value});
}
}
private Object[] convertToParams(Map<String, Object> values) throws LocalizedException {
if (unwrapped) {
TypeMapper typeMapper = mappers.entrySet().iterator().next().
getValue();
if (!(typeMapper instanceof ComplexTypeMapper)) {
throw new IllegalArgumentException("This message can't be unwrapped.");
}
ComplexTypeMapper complexTypeMapper = (ComplexTypeMapper) typeMapper;
Map.Entry<String, Object> entry = values.entrySet().iterator().next();
if (!(entry.getValue() instanceof Map)) {
throw new IllegalArgumentException("These params can't be unwrapped.");
}
return complexTypeMapper.convertToTypeUnwrapped((Map) entry.getValue());
} else {
Object[] params = new Object[mappers.size()];
for (Map.Entry<String, Object> entry : values.entrySet()) {
TypeMapper typeMapper = mappers.get(entry.getKey());
if (typeMapper == null) {
// TODO skip and warn ?
} else {
params[partsOrder.get(entry.getKey())] = typeMapper.
convertToType(entry.getValue());
}
}
return params;
}
}
private Object[] convertToParams(Object[] values) throws LocalizedException {
if (values == null) {
return null;
}
if (values.length == 0) {
return null;
}
if (unwrapped) {
TypeMapper typeMapper = mappers.entrySet().iterator().next().
getValue();
if (!(typeMapper instanceof ComplexTypeMapper)) {
throw new IllegalArgumentException("This message can't be unwrapped.");
}
ComplexTypeMapper complexTypeMapper = (ComplexTypeMapper) typeMapper;
Object value = values[0];
if (!(value instanceof Map)) {
throw new IllegalArgumentException("These params can't be unwrapped.");
}
return complexTypeMapper.convertToTypeUnwrapped((Map) value);
} else {
List<Part> orderedParts = message.getOrderedParts(null);
Object[] params = new Object[orderedParts.size()];
int i = 0;
for (Part part : orderedParts) {
if (i >= values.length) {
break;
}
params[i] = mappers.get(part.getName()).convertToType(values[i]);
i++;
}
return params;
}
}
public Map<String, Object> convertToValue(Object params[]) throws LocalizedException {
if (params == null || params != null && params.length == 0) {
return null;
}
if (unwrapped) {
Part part = (Part) message.getOrderedParts(null).get(0);
if (part == null) {
return null;
}
TypeMapper typeMapper = mappers.entrySet().iterator().next().
getValue();
if (!(typeMapper instanceof ComplexTypeMapper)) {
throw new IllegalArgumentException("This message can't be unwrapped.");
}
ComplexTypeMapper complexTypeMapper = (ComplexTypeMapper) typeMapper;
Map<String, Object> values = complexTypeMapper.typeToValueUnwrapped(params);
Map<String, Object> wrappedValue = new HashMap<String, Object>(1);
wrappedValue.put(part.getName(), values);
return wrappedValue;
} else {
List<Part> orderedParts = message.getOrderedParts(null);
Map<String, Object> values = new HashMap<String, Object>(params.length);
int i = 0;
for (Object param : params) {
Part part = orderedParts.get(i);
if (part == null) {
throw new IllegalArgumentException("Too much params.");
}
TypeMapper typeMapper = mappers.get(part.getName());
values.put(part.getName(), typeMapper.typeToValue(param));
i++;
}
return values;
}
}
public boolean isUnwrapped() {
return unwrapped;
}
public void setUnwrapped(boolean unwrapped) {
this.unwrapped = unwrapped;
}
}

View File

@@ -0,0 +1,25 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.mapper;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public interface PropertyMapper {
public Class<?> getMappedClass();
public String getMappedPropertyName();
public void setValueTo(Object destination, Object value) throws LocalizedException;
public Object getValueFrom(Object source) throws LocalizedException;
public Object createProperty(Object value) throws LocalizedException;
public Object createValue(Object property) throws LocalizedException;
}

View File

@@ -0,0 +1,16 @@
package org.talend.webservice.mapper;
import java.util.Map;
import javax.xml.namespace.QName;
import org.talend.webservice.exception.LocalizedException;
public class SimpleContentPropertyMapper extends SimplePropertyMapper {
public SimpleContentPropertyMapper(Class<?> clazz, QName typeQName, String propertyName, Map<QName, TypeMapper> schemaTypeMap)
throws LocalizedException {
super(clazz, typeQName, propertyName, schemaTypeMap);
}
}

View File

@@ -0,0 +1,121 @@
package org.talend.webservice.mapper;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import org.apache.commons.beanutils.PropertyUtils;
import org.talend.webservice.exception.IllegalPropertyAccessException;
import org.talend.webservice.exception.InvocationTargetPropertyAccessor;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public class SimplePropertyMapper implements PropertyMapper {
private Map<QName, TypeMapper> schemaTypeMap;
private TypeMapper xmlBeanMapper;
private String propertyName;
private PropertyDescriptor propertyDescriptor;
private QName schemaTypeQName;
public SimplePropertyMapper(Class<?> clazz, QName typeQName, String propertyName, Map<QName, TypeMapper> schemaTypeMap)
throws LocalizedException {
this.schemaTypeMap = schemaTypeMap;
this.schemaTypeQName = typeQName;
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(clazz);
for (PropertyDescriptor descriptor : descriptors) {
if (propertyName.equalsIgnoreCase(descriptor.getName())) {
this.propertyName = descriptor.getName();
propertyDescriptor = descriptor;
break;
}
}
if (propertyDescriptor == null) {
throw new IllegalArgumentException("Unable to get propertyDescriptor for bean " + typeQName + " and property "
+ propertyName);
}
}
public String getMappedPropertyName() {
return propertyName;
}
public void setValueTo(Object destination, Object value) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
try {
Method method = propertyDescriptor.getWriteMethod();
if (method == null) {
method = propertyDescriptor.getReadMethod();
if (method != null) {
Object returnValue = method.invoke(destination);
if (returnValue instanceof List) {
List values = (List) returnValue;
Object tempValue = xmlBeanMapper.convertToType(value);
if (tempValue != null) {
values.addAll((List) tempValue);
}
}
}
} else {
if (method.getParameterTypes()[0].equals(JAXBElement.class)) {
value = new JAXBElement(new QName(getMappedPropertyName()), getMappedClass(),
xmlBeanMapper.convertToType(value));
propertyDescriptor.getWriteMethod().invoke(destination, value);
} else {
propertyDescriptor.getWriteMethod().invoke(destination, xmlBeanMapper.convertToType(value));
}
}
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), destination.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), destination.getClass().getName(),
ex.getTargetException());
} catch (IllegalArgumentException ex) {
throw ex;
}
}
public Object getValueFrom(Object source) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
try {
Method method = propertyDescriptor.getReadMethod();
if (method.getReturnType().equals(JAXBElement.class)) {
JAXBElement jAXBElement = (JAXBElement) method.invoke(source);
return xmlBeanMapper.typeToValue(jAXBElement != null ? jAXBElement.getValue() : null);
} else {
return xmlBeanMapper.typeToValue(propertyDescriptor.getReadMethod().invoke(source));
}
} catch (IllegalAccessException ex) {
throw new IllegalPropertyAccessException(propertyDescriptor.getName(), source.getClass().getName(), ex);
} catch (InvocationTargetException ex) {
throw new InvocationTargetPropertyAccessor(propertyDescriptor.getName(), source.getClass().getName(),
ex.getTargetException());
}
}
public Class<?> getMappedClass() {
return schemaTypeMap.get(schemaTypeQName).getClazz();
}
public Object createProperty(Object value) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
return xmlBeanMapper.convertToType(value);
}
public Object createValue(Object property) throws LocalizedException {
xmlBeanMapper = schemaTypeMap.get(schemaTypeQName);
return xmlBeanMapper.typeToValue(property);
}
}

View File

@@ -0,0 +1,36 @@
/*
* To change this template, choose Tools | Templates and open the template in the editor.
*/
package org.talend.webservice.mapper;
import org.talend.webservice.mapper.converter.ConvertTool;
/**
*
* @author rlamarche
*/
public class SimpleTypeMapper implements TypeMapper {
private Class<?> clazz;
public SimpleTypeMapper(Class<?> clazz) {
this.clazz = clazz;
}
public Class<?> getClazz() {
return clazz;
}
public Object convertToType(Object value) {
if (value == null) {
return null;
} else {
// return ConvertUtils.convert(ConvertUtils.convert(value), clazz);
return ConvertTool.convert(value, clazz);// bug13001, for date type value
}
}
public Object typeToValue(Object bean) {
return bean;
}
}

View File

@@ -0,0 +1,20 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.talend.webservice.mapper;
import org.talend.webservice.exception.LocalizedException;
/**
*
* @author rlamarche
*/
public interface TypeMapper {
public Class<?> getClazz();
public Object convertToType(Object value) throws LocalizedException;
public Object typeToValue(Object bean) throws LocalizedException;
}

View File

@@ -0,0 +1,55 @@
package org.talend.webservice.mapper.converter;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.ByteArrayConverter;
public class ConvertTool {
static byte byteArray[] = new byte[0];
private static final Map<Class, Converter> converters;
static {
converters = new HashMap<Class, Converter>();
converters.put(XMLGregorianCalendar.class, new XMLGregorianCalendarConverter());
converters.put(byteArray.getClass(), new ByteArrayConverter());
converters.put(List.class, new ListConverter());
}
public static Object convert(Object value, Class clazz) {
Converter converter = converters.get(clazz);
if (converter != null) {
return converter.convert(clazz, value);
}
return ConvertUtils.convert(ConvertUtils.convert(value), clazz);
}
private static XMLGregorianCalendar DateConverter(Object value, Class clazz) {
if (value instanceof XMLGregorianCalendar) {
return (XMLGregorianCalendar) value;
} else if (value instanceof Date) {
try {
GregorianCalendar c = new GregorianCalendar();
c.setTime((Date) value);
XMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
return date;
} catch (javax.xml.datatype.DatatypeConfigurationException ex) {
ex.printStackTrace();
}
} else {
throw new ConversionException("Should be javax.xml.datatype.XMLGregorianCalendar type or java.util.Date type");
}
return null;
}
}

View File

@@ -0,0 +1,22 @@
package org.talend.webservice.mapper.converter;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.Converter;
public class ListConverter implements Converter {
public Object convert(Class type, Object value) {
if (value == null) {
return new ArrayList();
}
if (value instanceof List) {
return value;
} else {
List v = new ArrayList();
v.add(value);
return v;
}
}
}

View File

@@ -0,0 +1,36 @@
package org.talend.webservice.mapper.converter;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
public class XMLGregorianCalendarConverter implements Converter {
public Object convert(Class type, Object value) {
if (value == null) {
return null;
}
if (value instanceof XMLGregorianCalendar) {
return (value);
} else if (value instanceof Date) {
try {
GregorianCalendar c = new GregorianCalendar();
c.setTime((Date) value);
XMLGregorianCalendar date = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
return date;
} catch (javax.xml.datatype.DatatypeConfigurationException ex) {
ex.printStackTrace();
}
} else {
throw new ConversionException("Should be javax.xml.datatype.XMLGregorianCalendar type or java.util.Date type");
}
return null;
}
}

View File

@@ -0,0 +1,8 @@
org.talend.ws.exception.IllegalPropertyAccessException=Unable to access property {0} which is not accessible for type {1}
org.talend.ws.exception.NoSuchPropertyException=Property {0} does not exist for type {1}
org.talend.ws.exception.Instantiation=Unable to instantiate class of type {0}
org.talend.ws.exception.InvocationTargetPropertyAccessor=A property accessor has thrown an exception : property {0} of class {1}
org.talend.ws.exception.illegalAccessValueOf=Unable to call method valueOf for enum type {0}
org.talend.ws.exception.Unknown=An unknown exception has been thrown
org.talend.ws.exception.InvalidEnumValueException=Value {0} is not valid for enum {1}
org.talend.ws.exception.InvalidParameterAnyType=You must specify a map like this for anyTypes : {anyType: value, anyType_type: qname} pour les anyType

View File

@@ -0,0 +1,7 @@
org.talend.ws.exception.IllegalPropertyAccessException=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03C3\u03C4\u03B7\u03BD \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 {0} \u03C0\u03BF\u03C5 \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B9\u03BC\u03B7 \u03B3\u03B9\u03B1 \u03C4\u03CD\u03C0\u03BF {1}
org.talend.ws.exception.NoSuchPropertyException=\u0397 \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 {0} \u03B4\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03C4\u03CD\u03C0\u03BF {1}
org.talend.ws.exception.Instantiation=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03BD\u03B1 \u03B4\u03BF\u03B8\u03B5\u03AF \u03C5\u03C0\u03CC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C3\u03B5 \u03BA\u03BB\u03AC\u03C3\u03B7 \u03C4\u03CD\u03C0\u03BF\u03C5 {0}
org.talend.ws.exception.illegalAccessValueOf=\u0391\u03B4\u03C5\u03BD\u03B1\u03BC\u03AF\u03B1 \u03BA\u03BB\u03AE\u03C3\u03B7\u03C2 \u03BC\u03B5\u03B8\u03CC\u03B4\u03BF\u03C5 valueOf \u03B3\u03B9\u03B1 \u03C4\u03CD\u03C0\u03BF enum {0}
org.talend.ws.exception.Unknown=\u039C\u03B9\u03B1 \u03AC\u03B3\u03BD\u03C9\u03C3\u03C4\u03B7 \u03B5\u03BE\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C0\u03C1\u03BF\u03AD\u03BA\u03C5\u03C8\u03B5
org.talend.ws.exception.InvalidEnumValueException=\u0397 \u03C4\u03B9\u03BC\u03AE {0} \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B3\u03B9\u03B1 enum {1}
org.talend.ws.exception.InvalidParameterAnyType=\u03A0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B4\u03B9\u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1\u03BD \u03C7\u03AC\u03C1\u03C4\u03B7 \u03C3\u03B1\u03BD \u03B1\u03C5\u03C4\u03CC\u03BD \u03B3\u03B9\u03B1 anyTypes : {anyType: value, anyType_type: qname}

View File

@@ -0,0 +1,8 @@
org.talend.ws.exception.IllegalPropertyAccessException=Unable to access property {0} which is not accessible for type {1}
org.talend.ws.exception.NoSuchPropertyException=Property {0} does not exist for type {1}
org.talend.ws.exception.Instantiation=Unable to instantiate class of type {0}
org.talend.ws.exception.InvocationTargetPropertyAccessor=A property accessor has thrown an exception : property {0} of class {1}
org.talend.ws.exception.illegalAccessValueOf=Unable to call method valueOf for enum type {0}
org.talend.ws.exception.Unknown=An unknown exception has been thrown
org.talend.ws.exception.InvalidEnumValueException=Value {0} is not valid for enum {1}
org.talend.ws.exception.InvalidParameterAnyType=You must specify a map like this for anyTypes : {anyType: value, anyType_type: qname} pour les anyType

View File

@@ -0,0 +1,6 @@
org.talend.ws.exception.IllegalPropertyAccessException=Impossible d'acc\u00e9der \u00e0 la propri\u00e9t\u00e9 {0} qui est inaccessible pour le type {1}
org.talend.ws.exception.NoSuchPropertyException=La propri\u00e9t\u00e9 {0} n'existe pas pour le type {1}
org.talend.ws.exception.Instantiation=Impossible d'instancier la classe de type {0}
org.talend.ws.exception.illegalAccessValueOf=Impossible d'appeler une m\u00e9thode valueOf pour le type enum {0}
org.talend.ws.exception.Unknown=Une exception inconnue a \u00e9t\u00e9 rencontr\u00e9e
org.talend.ws.exception.InvalidEnumValueException=La valeur {0} n'est pas valide pour enum {1}

View File

@@ -0,0 +1,8 @@
org.talend.ws.exception.IllegalPropertyAccessException=\u30BF\u30A4\u30D7 {1} \u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u306A\u3044\u30D7\u30ED\u30D1\u30C6\u30A3 {0} \u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093
org.talend.ws.exception.NoSuchPropertyException=\u30BF\u30A4\u30D7 {1} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3 {0} \u306F\u5B58\u5728\u3057\u307E\u305B\u3093
org.talend.ws.exception.Instantiation=\u30BF\u30A4\u30D7 {0} \u306E\u30AF\u30E9\u30B9\u3092\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u5316\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093
org.talend.ws.exception.InvocationTargetPropertyAccessor=\u30D7\u30ED\u30D1\u30C6\u30A3\u30A2\u30AF\u30BB\u30C3\u30B5\u306F\u4F8B\u5916\u3092\u767A\u751F\u3055\u305B\u307E\u3057\u305F\uFF1A\u30AF\u30E9\u30B9 {1} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3 {0}
org.talend.ws.exception.illegalAccessValueOf=enum\u578B {0} \u306E\u30E1\u30BD\u30C3\u30C9\u3092\u547C\u3073\u51FA\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093
org.talend.ws.exception.Unknown=\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F
org.talend.ws.exception.InvalidEnumValueException=\u5024 {0} \u306F\u5217\u6319\u578B {1} \u3068\u3057\u3066\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093
org.talend.ws.exception.InvalidParameterAnyType=\u3053\u306E\u3088\u3046\u306A anyTypes \u306E\u30DE\u30C3\u30D7\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 : {anyType: value, anyType_type: qname}

View File

@@ -0,0 +1,8 @@
org.talend.ws.exception.IllegalPropertyAccessException=\u65E0\u6CD5\u8BBF\u95EE\u5C5E\u6027 {0}\uFF0C\u56E0\u4E3A\u5BF9\u4E8E\u7C7B\u578B {1} \u800C\u8A00\u8BE5\u5C5E\u6027\u4E0D\u53EF\u8BBF\u95EE
org.talend.ws.exception.NoSuchPropertyException=\u5C5E\u6027 {0} \u5BF9\u4E8E\u7C7B\u578B {1} \u800C\u8A00\u4E0D\u5B58\u5728
org.talend.ws.exception.Instantiation=\u65E0\u6CD5\u5B9E\u4F8B\u5316\u7C7B\u578B {0} \u7684\u7C7B
org.talend.ws.exception.InvocationTargetPropertyAccessor=\u5C5E\u6027\u8BBF\u95EE\u5668\u629B\u51FA\u4E86\u4E00\u4E2A\u5F02\u5E38\uFF1A\u7C7B {1} \u7684\u5C5E\u6027 {0}
org.talend.ws.exception.illegalAccessValueOf=\u65E0\u6CD5\u4E3A\u679A\u4E3E\u7C7B\u578B {0} \u8C03\u7528\u65B9\u6CD5valueOf
org.talend.ws.exception.Unknown=\u4E00\u4E2A\u672A\u77E5\u7684\u5F02\u5E38\u5DF2\u88AB\u629B\u51FA
org.talend.ws.exception.InvalidEnumValueException=\u503C {0} \u5BF9\u4E8E\u679A\u4E3E {1} \u65E0\u6548
org.talend.ws.exception.InvalidParameterAnyType=\u60A8\u5FC5\u987B\u6309\u5982\u4E0B\u6240\u793A\u4E3A anyType \u6307\u5B9A\u6620\u5C04\uFF1A{anyType: value, anyType_type: qname}