Compare commits
2 Commits
patchrelea
...
dchmyga/TD
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9871199155 | ||
|
|
263f4440d1 |
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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()]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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, "_");
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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}
|
||||
@@ -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
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user