00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.ext.webservices.soap;
00032
00033 import java.lang.reflect.Method;
00034 import java.net.MalformedURLException;
00035 import java.net.URL;
00036 import java.util.Enumeration;
00037 import java.util.Hashtable;
00038 import java.util.StringTokenizer;
00039 import java.util.Vector;
00040
00041 import org.apache.soap.SOAPException;
00042 import org.apache.soap.server.DeploymentDescriptor;
00043 import org.apache.soap.server.ServiceManagerClient;
00044 import org.apache.soap.server.TypeMapping;
00045 import org.apache.soap.util.xml.QName;
00046 import org.objectweb.fractal.api.Component;
00047 import org.objectweb.fractal.api.Interface;
00048 import org.objectweb.fractal.api.control.LifeCycleController;
00049 import org.objectweb.proactive.core.body.http.util.HttpMarshaller;
00050 import org.objectweb.proactive.core.component.type.ProActiveInterfaceTypeImpl;
00051 import org.objectweb.proactive.ext.webservices.WSConstants;
00052 import org.objectweb.proactive.ext.webservices.wsdl.WSDLGenerator;
00053
00054
00060 public class ProActiveDeployer extends WSConstants {
00061
00069 public static void deploy(String urn, String url, Object o, String[] methods) {
00070 deploy(urn, url, o, null, methods, false);
00071 }
00072
00081 public static void deployComponent(String componentName, String url,
00082 Component component) {
00083 Object[] interfaces = component.getFcInterfaces();
00084
00085 for (int i = 0; i < interfaces.length; i++) {
00086 Interface interface_ = ((Interface) interfaces[i]);
00087
00088
00089 if (!(interface_ instanceof LifeCycleController)) {
00090 if (!((ProActiveInterfaceTypeImpl) interface_.getFcItfType()).isFcClientItf()) {
00091 String name = interface_.getFcItfName();
00092
00093
00094 Method[] methods = interface_.getClass().getMethods();
00095 Vector meths = new Vector();
00096
00097 for (int j = 0; j < methods.length; j++) {
00098 String methodName = methods[j].getName();
00099
00100 if (isAllowedMethod(methodName)) {
00101 meths.addElement(methodName);
00102 }
00103 }
00104
00105 String[] methsArray = new String[meths.size()];
00106 meths.toArray(methsArray);
00107 deploy(componentName + "_" + name, url, interface_,
00108 component, methsArray, true);
00109 }
00110 }
00111 }
00112 }
00113
00119 public static void undeploy(String urn, String url) {
00120 ServiceManagerClient serviceManagerClient = null;
00121
00122 try {
00123 serviceManagerClient = new ServiceManagerClient(new URL(url +
00124 ROUTER));
00125 serviceManagerClient.undeploy(urn);
00126 } catch (MalformedURLException e) {
00127 e.printStackTrace();
00128 } catch (SOAPException e1) {
00129 e1.printStackTrace();
00130 }
00131 }
00132
00139 public static void undeployComponent(String componentName, String url,
00140 Component component) {
00141 Object[] interfaces = component.getFcInterfaces();
00142
00143 for (int i = 0; i < interfaces.length; i++) {
00144 Interface inter = (Interface) interfaces[i];
00145
00146 if (!(inter instanceof LifeCycleController)) {
00147 if (!((ProActiveInterfaceTypeImpl) inter.getFcItfType()).isFcClientItf()) {
00148 String serviceName = componentName + "_" +
00149 inter.getFcItfName();
00150 undeploy(serviceName, url);
00151 }
00152 }
00153 }
00154 }
00155
00156
00157
00158
00159 private static void deploy(String urn, String url, Object o, Component c,
00160 String[] methods, boolean componentInterface) {
00161
00162
00163 String wsdl = WSDLGenerator.getWSDL(o.getClass().getSuperclass(), urn,
00164 url + ROUTER, DOCUMENTATION, methods);
00165
00166
00167 ServiceManagerClient serviceManagerClient = null;
00168
00169 try {
00170 serviceManagerClient = new ServiceManagerClient(new URL(url +
00171 ROUTER));
00172 } catch (MalformedURLException e) {
00173 e.printStackTrace();
00174 }
00175
00176
00177 DeploymentDescriptor dd = new DeploymentDescriptor();
00178 dd.setID(urn);
00179 dd.setProviderType(DeploymentDescriptor.PROVIDER_USER_DEFINED);
00180
00181 dd.setServiceClass(PROACTIVE_PROVIDER);
00182
00183 dd.setIsStatic(false);
00184
00185
00186 TypeMapping[] tms = getMappings(o.getClass(), methods);
00187 dd.setMappings(tms);
00188
00189 if (methods != null) {
00190 dd.setMethods(methods);
00191 } else {
00192 Method[] ms = o.getClass().getDeclaredMethods();
00193 Vector mv = new Vector();
00194 for (int i = 0; i < ms.length; i++)
00195 if (!disallowedMethods.contains(ms[i].getName())) {
00196 mv.addElement(ms[i].getName());
00197 }
00198 methods = new String[mv.size()];
00199 Enumeration e = mv.elements();
00200 int j = 0;
00201 while (e.hasMoreElements())
00202 methods[j++] = (String) e.nextElement();
00203
00204 dd.setMethods(methods);
00205 }
00206
00207 dd.setProviderClass(o.getClass().getName());
00208
00209
00210 Hashtable props = new Hashtable();
00211
00212 props.put(WSDL_FILE, wsdl);
00213
00214 if (componentInterface) {
00215 props.put(COMPONENT_INTERFACE, "true");
00216 props.put(PROACTIVE_STUB, HttpMarshaller.marshallObject(c));
00217 } else {
00218 props.put(COMPONENT_INTERFACE, "false");
00219 props.put(PROACTIVE_STUB, HttpMarshaller.marshallObject(o));
00220 }
00221
00222 dd.setProps(props);
00223
00224 try {
00225 serviceManagerClient.deploy(dd);
00226 } catch (SOAPException e1) {
00227 e1.printStackTrace();
00228 }
00229 }
00230
00231
00232
00233
00234 private static boolean isAllowedMethod(String method) {
00235 return !disallowedMethods.contains(method);
00236 }
00237
00238
00239
00240
00241
00242 private static TypeMapping[] getMappings(Class c, String[] methods) {
00243 Vector tms = new Vector();
00244 Vector sMethods = new Vector();
00245
00246 if (methods != null) {
00247 for (int i = 0; i < methods.length; i++) {
00248 sMethods.addElement(methods[i]);
00249 }
00250
00251 Vector mMethods = new Vector();
00252 Method[] ms = c.getDeclaredMethods();
00253
00254 for (int i = 0; i < ms.length; i++) {
00255 mMethods.addElement(ms[i]);
00256 }
00257
00258 Enumeration e = mMethods.elements();
00259
00260 while (e.hasMoreElements()) {
00261 Method m = (Method) e.nextElement();
00262
00263 if (sMethods.contains(m.getName())) {
00264 Class[] parameters = m.getParameterTypes();
00265
00266 for (int j = 0; j < parameters.length; j++) {
00267 if (!supportedTypes.contains(parameters[j])) {
00268 String pname = extractName(parameters[j]);
00269
00270 TypeMapping tm = new TypeMapping("http://schemas.xmlsoap.org/soap/encoding/",
00271 new QName("http://" + pname,
00272 getSimpleName(parameters[j])),
00273 parameters[j].getName(),
00274 "org.apache.soap.encoding.soapenc.BeanSerializer",
00275 "org.apache.soap.encoding.soapenc.BeanSerializer");
00276
00277 tms.addElement(tm);
00278 }
00279 }
00280 }
00281 }
00282 } else {
00283 Method[] ms = c.getDeclaredMethods();
00284
00285 for (int i = 0; i < ms.length; i++) {
00286 if (!disallowedMethods.contains(ms[i].getName())) {
00287 Class[] parameters = ms[i].getParameterTypes();
00288 for (int j = 0; j < parameters.length; j++) {
00289 if (!supportedTypes.contains(parameters[j])) {
00290 String pname = extractName(parameters[j]);
00291
00292 TypeMapping tm = new TypeMapping("http://schemas.xmlsoap.org/soap/encoding/",
00293 new QName("http://" + pname,
00294 getSimpleName(parameters[j])),
00295 parameters[j].getName(),
00296 "org.apache.soap.encoding.soapenc.BeanSerializer",
00297 "org.apache.soap.encoding.soapenc.BeanSerializer");
00298
00299 tms.addElement(tm);
00300 }
00301 }
00302 }
00303 }
00304 }
00305
00306 TypeMapping[] tmsArray = new TypeMapping[tms.size()];
00307 Enumeration e = tms.elements();
00308
00309 int i = 0;
00310
00311 while (e.hasMoreElements()) {
00312 tmsArray[i++] = (TypeMapping) e.nextElement();
00313 }
00314
00315 return tmsArray;
00316 }
00317
00318 private static String getSimpleName(Class c) {
00319 String cName = c.getName();
00320 StringTokenizer st = new StringTokenizer(cName, ".");
00321 String result = "";
00322
00323 while (st.hasMoreTokens())
00324 result = st.nextToken();
00325
00326 return result;
00327 }
00328
00329
00330
00331
00332 private static String extractName(Class c) {
00333 String result = new String();
00334
00335 Package p = c.getPackage();
00336
00337 if (p != null) {
00338 String packageName = p.getName();
00339 StringTokenizer st = new StringTokenizer(packageName, ".");
00340 int nbTokens = st.countTokens();
00341 String[] tmp = new String[nbTokens];
00342 int n = 0;
00343
00344 while (st.hasMoreTokens())
00345 tmp[n++] = st.nextToken();
00346
00347 for (int i = nbTokens - 1; i > -1; i--)
00348 result += (tmp[i] + ".");
00349
00350 return result.substring(0, result.length() - 1);
00351 }
00352
00353 return "DefaultNamespace";
00354 }
00355 }