|
1 |
| package net.sf.crispy.impl; |
|
2 |
| |
|
3 |
| import java.lang.reflect.Method; |
|
4 |
| import java.math.BigDecimal; |
|
5 |
| import java.util.Date; |
|
6 |
| import java.util.Hashtable; |
|
7 |
| import java.util.Iterator; |
|
8 |
| import java.util.Map; |
|
9 |
| |
|
10 |
| import javax.xml.namespace.QName; |
|
11 |
| import javax.xml.rpc.Call; |
|
12 |
| import javax.xml.rpc.ParameterMode; |
|
13 |
| import javax.xml.rpc.Service; |
|
14 |
| import javax.xml.rpc.ServiceFactory; |
|
15 |
| import javax.xml.rpc.encoding.TypeMapping; |
|
16 |
| import javax.xml.rpc.encoding.XMLType; |
|
17 |
| |
|
18 |
| import net.sf.crispy.Executor; |
|
19 |
| import net.sf.crispy.InvocationStrategy; |
|
20 |
| import net.sf.crispy.Property; |
|
21 |
| import net.sf.crispy.impl.jaxrpc.TypeMappingFactory; |
|
22 |
| import net.sf.crispy.strategy.UrlPlusClassNameInvocationStrategy; |
|
23 |
| import net.sf.crispy.util.Util; |
|
24 |
| |
|
25 |
| |
|
26 |
| |
|
27 |
| |
|
28 |
| |
|
29 |
| |
|
30 |
| |
|
31 |
| public class JaxRpcExecutor extends Executor { |
|
32 |
| |
|
33 |
| public static final String DEFAULT_SERVICE_FACTORY = "org.apache.axis.client.ServiceFactory"; |
|
34 |
| public final static String DEFAULT_URL_AND_PORT = "http://localhost:9080/axis/services"; |
|
35 |
| |
|
36 |
| private String serviceFactory = DEFAULT_SERVICE_FACTORY; |
|
37 |
| private Service service = null; |
|
38 |
| private Call call = null; |
|
39 |
| |
|
40 |
| |
|
41 |
| private static Map paramMapper = intParamMap(); |
|
42 |
| |
|
43 |
| |
|
44 |
2
| public synchronized static Map intParamMap () {
|
|
45 |
| |
|
46 |
2
| paramMapper = new Hashtable();
|
|
47 |
| |
|
48 |
2
| paramMapper.put(Boolean.class, XMLType.XSD_BOOLEAN);
|
|
49 |
2
| paramMapper.put(Byte.class, XMLType.XSD_BYTE);
|
|
50 |
2
| paramMapper.put(Short.class, XMLType.XSD_SHORT);
|
|
51 |
2
| paramMapper.put(Integer.class, XMLType.XSD_INTEGER);
|
|
52 |
2
| paramMapper.put(Long.class, XMLType.XSD_LONG);
|
|
53 |
2
| paramMapper.put(Float.class, XMLType.XSD_FLOAT);
|
|
54 |
2
| paramMapper.put(Double.class, XMLType.XSD_DOUBLE);
|
|
55 |
2
| paramMapper.put(BigDecimal.class, XMLType.XSD_DECIMAL);
|
|
56 |
2
| paramMapper.put(Date.class, XMLType.XSD_DATETIME);
|
|
57 |
2
| paramMapper.put(String.class, XMLType.XSD_STRING);
|
|
58 |
2
| paramMapper.put(Character.class, XMLType.XSD_STRING);
|
|
59 |
| |
|
60 |
| |
|
61 |
2
| paramMapper.put(boolean.class, XMLType.XSD_BOOLEAN);
|
|
62 |
2
| paramMapper.put(byte.class, XMLType.XSD_BYTE);
|
|
63 |
2
| paramMapper.put(short.class, XMLType.XSD_SHORT);
|
|
64 |
2
| paramMapper.put(int.class, XMLType.XSD_INT);
|
|
65 |
2
| paramMapper.put(long.class, XMLType.XSD_LONG);
|
|
66 |
2
| paramMapper.put(float.class, XMLType.XSD_FLOAT);
|
|
67 |
2
| paramMapper.put(double.class, XMLType.XSD_DOUBLE);
|
|
68 |
2
| paramMapper.put(char.class, XMLType.XSD_STRING);
|
|
69 |
| |
|
70 |
2
| return paramMapper;
|
|
71 |
| } |
|
72 |
| |
|
73 |
100
| public String getDefaultUrlAndPort() { return DEFAULT_URL_AND_PORT; }
|
|
74 |
62
| public InvocationStrategy getDefaultInvocationStrategy() { return new UrlPlusClassNameInvocationStrategy(); }
|
|
75 |
| |
|
76 |
143
| public static QName getXMLTypeByClass (Class pvClass) {
|
|
77 |
143
| QName lvRetQName = (QName) paramMapper.get(pvClass);
|
|
78 |
143
| if (lvRetQName == null) {
|
|
79 |
10
| lvRetQName = Util.createQNameByClass(pvClass);
|
|
80 |
10
| paramMapper.put(pvClass, lvRetQName);
|
|
81 |
| } |
|
82 |
143
| return lvRetQName;
|
|
83 |
| } |
|
84 |
| |
|
85 |
61
| public Object execute(Class pvProxyClass, Object pvProxy, Method pvMethod, Object[] pvArgs) throws Exception {
|
|
86 |
61
| if (service == null) {
|
|
87 |
45
| serviceFactory = getProperties().getProperty(ServiceFactory.SERVICEFACTORY_PROPERTY, DEFAULT_SERVICE_FACTORY);
|
|
88 |
45
| System.setProperty (ServiceFactory.SERVICEFACTORY_PROPERTY, serviceFactory);
|
|
89 |
45
| service = (Service) ServiceFactory.newInstance().createService(null);
|
|
90 |
| |
|
91 |
| |
|
92 |
| |
|
93 |
45
| TypeMapping lvTypeMapping = service.getTypeMappingRegistry().getDefaultTypeMapping();
|
|
94 |
| |
|
95 |
45
| Map lvSorterMap = Util.getAllPropertiesByPrefixAndSort(getProperties(), TypeMappingFactory.PROPERTY_TYPE_MAPPING_FACTORY);
|
|
96 |
45
| Iterator it = lvSorterMap.values().iterator();
|
|
97 |
45
| while (it.hasNext()) {
|
|
98 |
40
| String lvValue = (String) it.next();
|
|
99 |
40
| String lvValues[] = lvValue.split(",");
|
|
100 |
40
| Class lvTypeMappingFactoryClass = Class.forName(lvValues[0]);
|
|
101 |
40
| TypeMappingFactory lvMappingFactory = (TypeMappingFactory) lvTypeMappingFactoryClass.newInstance();
|
|
102 |
40
| lvMappingFactory.setParameter(lvValues);
|
|
103 |
| |
|
104 |
40
| if (lvTypeMapping.isRegistered(lvMappingFactory.getJavaType(), lvMappingFactory.getXmlType()) == false) {
|
|
105 |
12
| lvTypeMapping.register( lvMappingFactory.getJavaType(),
|
|
106 |
| lvMappingFactory.getXmlType(), |
|
107 |
| lvMappingFactory.getSerializerFactory(), |
|
108 |
| lvMappingFactory.getDeserializerFactory()); |
|
109 |
| |
|
110 |
| |
|
111 |
| } |
|
112 |
| |
|
113 |
| } |
|
114 |
| |
|
115 |
45
| call = service.createCall();
|
|
116 |
| |
|
117 |
45
| String lvUser = getProperties().getProperty(Property.SECURITY_USER);
|
|
118 |
45
| String lvPassWd = getProperties().getProperty(Property.SECURITY_PASSWD);
|
|
119 |
45
| if ((lvUser != null) && (lvPassWd != null)) {
|
|
120 |
1
| call.setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY, lvUser);
|
|
121 |
1
| call.setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, lvPassWd);
|
|
122 |
| } |
|
123 |
| |
|
124 |
45
| String lvUrl = getInvocationStrategy().toString();
|
|
125 |
| if (log.isDebugEnabled()) { log.debug("Invoke with URL: " + lvUrl); } |
|
126 |
| |
|
127 |
45
| call.setTargetEndpointAddress(lvUrl);
|
|
128 |
| } |
|
129 |
| |
|
130 |
61
| call.removeAllParameters();
|
|
131 |
61
| call.setOperationName(new QName(pvMethod.getName()));
|
|
132 |
| |
|
133 |
| |
|
134 |
61
| for (int i = 0; i < pvMethod.getParameterTypes().length; i++) {
|
|
135 |
81
| Class lvArgClass = pvMethod.getParameterTypes()[i];
|
|
136 |
81
| if (lvArgClass.equals(Object.class)) {
|
|
137 |
3
| lvArgClass = pvArgs[i].getClass();
|
|
138 |
| } |
|
139 |
81
| QName lvParamXmlType = getXMLTypeByClass(lvArgClass);
|
|
140 |
81
| call.addParameter("arg" + i, lvParamXmlType, lvArgClass, ParameterMode.IN);
|
|
141 |
| } |
|
142 |
| |
|
143 |
| |
|
144 |
61
| Class lvReturnType = pvMethod.getReturnType();
|
|
145 |
61
| QName lvXmlReturnType = getXMLTypeByClass(lvReturnType);
|
|
146 |
61
| call.setReturnType(lvXmlReturnType);
|
|
147 |
| |
|
148 |
61
| Object result = null;
|
|
149 |
61
| try {
|
|
150 |
61
| result = call.invoke(pvArgs);
|
|
151 |
| } catch (Exception e) { |
|
152 |
3
| Throwable lvThrowable = Util.findDeepestThrowable(e);
|
|
153 |
3
| throw (Exception) lvThrowable;
|
|
154 |
| } |
|
155 |
| |
|
156 |
58
| return result;
|
|
157 |
| } |
|
158 |
| |
|
159 |
| } |