KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > remote > generator > RemoteGenerator


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9  */

10
11 package org.mmbase.bridge.remote.generator;
12 import java.util.*;
13 import java.io.*;
14
15 /**
16  * @author Kees Jongenburger <keesj@dds.nl>
17  * @author Michiel Meeuwissen
18  **/

19 public class RemoteGenerator {
20
21     private MMCI mmci = null;
22     private String JavaDoc targetDir = null;
23
24     /*
25      * main method to generate the Remote MMCI files
26      * this method wil create 2 directories
27      * <UL>
28      * <LI>org/mmbase/bridge/remote/rmi</LI>
29      * <LI>org/mmbase/bridge/remote/implementation</LI>
30      * </UL>
31      * @param targetDir the root directory of the mmbase source where the generated sources
32      * should be (e.q) /home/mmbase/src/
33      * @param mmciFile the location of the MMCI.xml file generated by org.mmbase.bridge.generator.MMCI
34      */

35     public RemoteGenerator(String JavaDoc targetDir, String JavaDoc mmciFile) throws Exception JavaDoc {
36         //check if the org/mmbase/bridge/remote dir exists
37
File file = new File(targetDir + "/org/mmbase/bridge/remote");
38         if (!file.exists() || !file.isDirectory()) {
39             throw new Exception JavaDoc("directory {" + file.getName() + "} does not contain a sub directory org/mmbase/bridge/remote. this is required for RemoteGenerator to work");
40         }
41         file = new File(targetDir + "/org/mmbase/bridge/remote/rmi");
42         if (!file.exists()) {
43             file.mkdirs();
44         }
45         file = new File(targetDir + "/org/mmbase/bridge/remote/implementation");
46         if (!file.exists()) {
47             file.mkdirs();
48         }
49         mmci = MMCI.getDefaultMMCI(mmciFile);
50         this.targetDir = targetDir;
51         Iterator i = mmci.getClasses().iterator();
52         while (i.hasNext()) {
53
54             XMLClass xmlClass = (XMLClass) i.next();
55             if (needsRemote(xmlClass)) {
56                 generateInterface(xmlClass);
57                 generateRmi(xmlClass);
58                 generateImplementation(xmlClass);
59             }
60         }
61         generateObjectWrappers(mmci);
62     }
63
64
65     public boolean needsRemote(XMLClass xmlClass) {
66         return xmlClass != null && xmlClass.getOriginalName().indexOf("org.mmbase") == 0 && xmlClass.isInterface && ! xmlClass.isSerializable;
67     }
68
69     /**
70      * This method generates an (RMI)remote interface based on
71      * an XMLClass
72      * @param xmlClass Class defined in the MMCI.xml
73      */

74     public void generateInterface(XMLClass xmlClass) {
75         String JavaDoc className = "Remote" + xmlClass.getClassName();
76         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
77
78         //create the default imports for the interface
79
sb.append("package org.mmbase.bridge.remote;\n");
80         sb.append("\n");
81
82         sb.append("import java.util.*;\n");
83         sb.append("import java.rmi.*;\n");
84         sb.append("import org.mmbase.datatypes.*;\n");
85         sb.append("import org.mmbase.security.*;\n");
86         sb.append("import org.mmbase.cache.*;\n");
87         sb.append("import org.mmbase.util.LocalizedString;\n");
88         sb.append("import org.mmbase.util.functions.*;\n");
89         sb.append("\n");
90
91         sb.append("/**\n");
92         sb.append(" * " + className + " is a generated interface based on " + xmlClass.getName() + "<br />\n");
93         sb.append(" * This interface has almost the same methods names as the " + xmlClass.getName() + " interface.\n");
94         sb.append(" * The interface is created in such way that it can implement java.rmi.Remote.\n");
95         sb.append(" * Where needed other return values or parameters are used.\n");
96         sb.append(" * @author generated by org.mmbase.bridge.remote.generator.RemoteGenerator\n");
97         sb.append(" */\n");
98         sb.append(" //DO NOT EDIT THIS FILE, IT IS GENERATED by org.mmbase.bridge.remote.remoteGenerator\n");
99
100         String JavaDoc impl = " ServerMappedObject";
101         //impl += ",java.io.Serializable";
102

103         String JavaDoc m = xmlClass.getImplements();
104         StringTokenizer st = new StringTokenizer(m, ",");
105         while (st.hasMoreTokens()) {
106             String JavaDoc token = st.nextToken();
107             XMLClass xmlc = mmci.getClass(token);
108             if (needsRemote(xmlc)) {
109                 impl += ", Remote" + xmlc.getClassName();
110             } else {
111                 //impl += ", " + token;
112
}
113         }
114
115         if (xmlClass.isInterface) {
116             System.err.println("generate interface " + className);
117             sb.append("public interface " + className + " extends " + impl + "{\n");
118         } else {
119             System.err.println("No need to generated class " + className);
120             return;
121         }
122
123         //for every method in the XMLClass create an alternate method for the
124
//remote interface
125

126         Iterator methodsIt = xmlClass.getMethods().iterator();
127         while (methodsIt.hasNext()) {
128             XMLMethod xmlMethod = (XMLMethod)methodsIt.next();
129             String JavaDoc methodName = xmlMethod.getName();
130             if (methodName.equals("equals") || methodName.equals("hashCode") || methodName.equals("toString") || methodName.equals("clone")) {
131                 methodName = "wrapped_" + methodName;
132             }
133             XMLClass returnType = xmlMethod.getReturnType();
134             if (returnType == null) {
135                 throw new IllegalStateException JavaDoc("Return type of " + xmlMethod + " is null");
136             }
137             String JavaDoc retTypeName = returnType.getShortName();
138
139             //if the return type is in the MMBase bridge we need to
140
//create a wrapper
141
if (needsRemote(returnType)) {
142                 retTypeName = "Remote" + returnType.getClassName();
143             }
144
145             if (returnType.isArray) {
146                 sb.append(" public " + retTypeName + "[] " + methodName + "(");
147             } else {
148                 sb.append(" public " + retTypeName + " " + methodName + "(");
149             }
150
151             Iterator iter = xmlMethod.getParameterList().iterator();
152             int counter = 0;
153             while (iter.hasNext()) {
154                 counter++;
155                 XMLClass parameter = (XMLClass)iter.next();
156                 if (parameter != null) {
157                     if (parameter.isArray) {
158                         if (needsRemote(parameter)) {
159                             sb.append("Remote" + parameter.getClassName() + "[] param" + counter);
160                         } else {
161                             sb.append(parameter.getOriginalName() + "[] param" + counter);
162                         }
163                     } else {
164                         if (needsRemote(parameter)) {
165                             sb.append("Remote" + parameter.getClassName() + " param" + counter);
166                         } else {
167                             sb.append(parameter.getOriginalName() + " param" + counter);
168                         }
169                     }
170                 } else {
171                     System.err.println("Class " + xmlMethod.getName() + " Parameter == null");
172                 }
173                 if (iter.hasNext()) {
174                     sb.append(" ,");
175                 }
176             }
177             sb.append(") throws RemoteException;\n");
178         }
179         sb.append("}\n");
180         try {
181             File file = new File(targetDir + "/org/mmbase/bridge/remote/" + className + ".java");
182             FileOutputStream fos = new FileOutputStream(file);
183             fos.write(sb.toString().getBytes());
184             fos.flush();
185             fos.close();
186         } catch (Exception JavaDoc e) {
187             System.err.println("writeFile" + e.getMessage());
188         }
189     }
190     /**
191      * This method generates an (RMI)remote implementation based on
192      * an XMLClass
193      * @param xmlClass Class defined in the MMCI.xml
194      */

195     public void generateRmi(XMLClass xmlClass) {
196         String JavaDoc shortName = xmlClass.getShortName();
197         String JavaDoc interfaceName = "Remote" + xmlClass.getClassName();
198         String JavaDoc className = interfaceName + "_Rmi";
199         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
200         sb.append("package org.mmbase.bridge.remote.rmi;\n");
201         sb.append("\n");
202         sb.append("import org.mmbase.bridge.*;\n");
203         sb.append("import org.mmbase.datatypes.*;\n");
204         sb.append("import org.mmbase.security.*;\n");
205         sb.append("import org.mmbase.storage.search.*;\n");
206         sb.append("import org.mmbase.util.functions.*;\n");
207         sb.append("import org.mmbase.util.logging.*;\n");
208         sb.append("import java.util.*;\n");
209         sb.append("import java.rmi.*;\n");
210         sb.append("import java.rmi.server.*;\n");
211         sb.append("import org.mmbase.bridge.remote.*;\n\n");
212         sb.append("import org.mmbase.bridge.remote.util.*;\n\n");
213
214         sb.append("/**\n");
215         sb.append(" * " + className + " in a generated implementation of " + interfaceName + "<br />\n");
216         sb.append(" * This implementation is used by rmci to create a stub and skeleton for communication between remote and server.\n");
217         sb.append(" * @author generated by org.mmbase.bridge.remote.generator.RemoteGenerator\n");
218         sb.append(" */\n");
219         sb.append(" //DO NOT EDIT THIS FILE, IT IS GENERATED by remote.remote.remoteGenerator\n");
220         String JavaDoc impl = "";
221
222         if (needsRemote(xmlClass)) {
223             String JavaDoc m = xmlClass.getImplements();
224             StringTokenizer st = new StringTokenizer(m, ",");
225             while (st.hasMoreTokens()) {
226                 String JavaDoc token = st.nextToken();
227                 //XMLClass xmlc = mmci.getClass(xmlClass.getImplements());
228
XMLClass xmlc = mmci.getClass(token);
229                 if (xmlc != null && needsRemote(xmlc)) {
230                     impl += ", Remote" + xmlc.getClassName();
231                 } else {
232                     //impl = ", " + token;
233
}
234             }
235         }
236
237         sb.append("public class " + className + " extends UnicastRemoteObject implements Unreferenced, " + interfaceName + impl + " {\n");
238         System.err.println("generate implementation " + className);
239
240         sb.append(" //original object\n");
241         sb.append(" " + shortName + " originalObject;\n\n");
242         sb.append(" //mapper code\n");
243         sb.append(" String mapperCode = null;\n\n");
244         sb.append(" int port = 1100;\n\n");
245
246         sb.append(" private static Logger log = Logging.getLoggerInstance(" + className + ".class);\n");
247
248         //constructor
249
sb.append(" public " + className + "(" + shortName + " originalObject, int port) throws RemoteException{\n");
250         sb.append(" super(port);\n");
251         sb.append(" this.port = port;\n");
252         sb.append(" log.debug(\"new " + className + "\");\n");
253         sb.append(" this.originalObject = originalObject;\n");
254         sb.append(" mapperCode = StubToLocalMapper.add(this.originalObject);\n");
255         sb.append(" }\n");
256
257         Iterator methodsIt = xmlClass.getMethods().iterator();
258         while (methodsIt.hasNext()) {
259             XMLMethod xmlMethod = (XMLMethod)methodsIt.next();
260             String JavaDoc methodName = xmlMethod.getName();
261             if (methodName.equals("equals") || methodName.equals("hashCode") || methodName.equals("toString") || methodName.equals("clone")) {
262                 methodName = "wrapped_" + methodName;
263             }
264             XMLClass returnType = xmlMethod.getReturnType();
265             String JavaDoc retTypeName = xmlMethod.getReturnType().getName();
266
267             //if the return type is in the MMBase bridge we need to
268
//create a wrapper
269
if (needsRemote(xmlMethod.getReturnType())) {
270                 retTypeName = "Remote" + xmlMethod.getReturnType().getClassName();
271             }
272
273             if (returnType.isArray) {
274                 sb.append(" public " + retTypeName + "[] " + methodName + "(");
275             } else {
276                 sb.append(" public " + retTypeName + " " + methodName + "(");
277             }
278
279             Iterator iter = xmlMethod.getParameterList().iterator();
280             int counter = 0;
281             while (iter.hasNext()) {
282                 counter++;
283                 XMLClass parameter = (XMLClass)iter.next();
284                 if (parameter.isArray) {
285                     if (needsRemote(parameter)) {
286                         sb.append("Remote" + parameter.getClassName() + "[] param" + counter);
287                     } else {
288                         sb.append(parameter.getOriginalName() + "[] param" + counter);
289                     }
290                 } else {
291                     if (needsRemote(parameter)) {
292                         sb.append("Remote" + parameter.getClassName() + " param" + counter);
293                     } else {
294                         sb.append(parameter.getOriginalName() + " param" + counter);
295                     }
296                 }
297                 if (iter.hasNext()) {
298                     sb.append(" ,");
299                 }
300             }
301             sb.append(") throws RemoteException{\n");
302
303             int paramCounter = 0;
304             Iterator paramIter = xmlMethod.getParameterList().iterator();
305             while (paramIter.hasNext()) {
306                 XMLClass parameter = (XMLClass)paramIter.next();
307                 paramCounter++;
308                 if (needsRemote(parameter)) {
309                     if (parameter.isArray) {
310                         sb.append(" " + parameter.getShortName() + "[] localparam" + paramCounter + " = new " + parameter.getShortName() + "[param" + paramCounter + ".length];\n");
311                         sb.append(" for(int i = 0; i <param" + paramCounter + ".length; i++ ) {\n");
312                         sb.append(" localparam" + paramCounter + "[i] = "+
313                           "(" + parameter.getShortName() + ")StubToLocalMapper.get(param" + paramCounter + "[i] == null ? \"\" + null : param" + paramCounter + "[i].getMapperCode());");
314                         sb.append(" }\n");
315                     } else {
316                         sb.append(parameter.getShortName() +" localparam" + paramCounter + " = "+
317                           "(" + parameter.getShortName() + ")StubToLocalMapper.get(param" + paramCounter + " == null ? \"\" + null : param" + paramCounter + ".getMapperCode());");
318                     }
319                 }
320             }
321
322             if (xmlMethod.getReturnType().getName().indexOf("void") == -1) {
323                 if (needsRemote(xmlMethod.getReturnType())) {
324                     if (!xmlMethod.getReturnType().isArray) {
325                         sb.append(" Remote" + xmlMethod.getReturnType().getClassName() + " retval =(Remote" + xmlMethod.getReturnType().getClassName() + ")");
326                     } else {
327                         sb.append(" Remote" + xmlMethod.getReturnType().getClassName() + "[] retval =(Remote" + xmlMethod.getReturnType().getClassName() + "[])");
328                     }
329                 } else {
330                     if (!xmlMethod.getReturnType().isArray) {
331                         sb.append(" " + xmlMethod.getReturnType().getName() + " retval =(" + xmlMethod.getReturnType().getName() + ")");
332                     } else {
333                         sb.append(" " + xmlMethod.getReturnType().getName() + "[] retval =(" + xmlMethod.getReturnType().getName() + "[])");
334                     }
335
336                 }
337             }
338
339             String JavaDoc typeName = xmlMethod.getReturnType().getOriginalName();
340             if (needsRemote(xmlMethod.getReturnType()) || typeName.equals("java.lang.Object") || typeName.equals("java.util.List") || typeName.equals("java.util.SortedSet")) {
341                 sb.append("ObjectWrapper.localToRMIObject(originalObject." + xmlMethod.getName() + "(");
342             } else {
343                 sb.append("originalObject." + xmlMethod.getName() + "(");
344             }
345
346             paramCounter = 0;
347             paramIter = xmlMethod.getParameterList().iterator();
348             while (paramIter.hasNext()) {
349                 XMLClass parameter = (XMLClass)paramIter.next();
350
351                 paramCounter++;
352                 if (needsRemote(parameter)) {
353                     sb.append(" localparam" + paramCounter);
354                 } else if ((parameter.getOriginalName().equals("java.lang.Object") || parameter.getOriginalName().equals("java.util.List")|| parameter.getOriginalName().equals("java.util.SortedSet")) && !parameter.isArray) {
355                     sb.append("(" + parameter.getName() + ")ObjectWrapper.rmiObjectToLocal(param" + paramCounter + ")");
356                 } else {
357                     sb.append(" param" + paramCounter);
358                 }
359                 if (paramIter.hasNext()) {
360                     sb.append(" ,");
361                 }
362                 
363             }
364             if (needsRemote(xmlMethod.getReturnType()) || typeName.equals("java.lang.Object") || typeName.equals("java.util.List") || typeName.equals("java.util.SortedSet")) {
365                 sb.append("), this.port");
366             }
367             if (!xmlMethod.getReturnType().getOriginalName().equals(xmlMethod.getReturnType().getName())) {
368                 sb.append(")");
369             }
370             sb.append(");\n");
371
372             if (xmlMethod.getReturnType().getName().indexOf("void") == -1) {
373                 sb.append("return retval;\n");
374             }
375             sb.append(" }\n");
376             sb.append("\n");
377         }
378
379         sb.append("\n");
380         sb.append(" public String getMapperCode() throws RemoteException{\n");
381         sb.append(" return mapperCode;\n");
382         sb.append(" }\n");
383         sb.append("\n");
384         sb.append(" //clean up StubToLocalMapper when the class is unreferenced\n");
385         sb.append(" public void unreferenced() {\n");
386         sb.append(" if (StubToLocalMapper.remove(mapperCode)){\n");
387         sb.append(" mapperCode = null;\n");
388         sb.append(" }\n");
389         sb.append(" }\n");
390         sb.append("}\n");
391         try {
392             File file = new File(targetDir + "/org/mmbase/bridge/remote/rmi/" + className + ".java");
393             FileOutputStream fos = new FileOutputStream(file);
394             fos.write(sb.toString().getBytes());
395             fos.flush();
396             fos.close();
397         } catch (Exception JavaDoc e) {
398             System.err.println(e.getMessage());
399         }
400     }
401
402     /**
403      * This method generates an (Remote)bridge implementation
404      * @param xmlClass Class defined in the MMCI.xml
405      */

406     public void generateImplementation(XMLClass xmlClass) {
407         String JavaDoc shortName = xmlClass.getShortName();
408         String JavaDoc interfaceName = "Remote" + xmlClass.getClassName();
409         String JavaDoc className = interfaceName + "_Impl";
410         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
411         sb.append("package org.mmbase.bridge.remote.implementation;\n");
412         sb.append("\n");
413         sb.append("import java.util.*;\n");
414         sb.append("import org.mmbase.bridge.*;\n");
415         sb.append("import org.mmbase.datatypes.*;\n");
416         sb.append("import org.mmbase.storage.search.*;\n");
417         sb.append("import org.mmbase.util.functions.*;\n");
418         sb.append("import org.mmbase.bridge.remote.*;\n");
419         sb.append("import org.mmbase.security.*;\n\n");
420         sb.append("import org.mmbase.bridge.remote.util.*;\n\n");
421         sb.append("/**\n");
422         sb.append(" * " + className + " in a generated implementation of " + shortName + "<BR>\n");
423         sb.append(" * This implementation is used by a local class when the MMCI is called remotely\n");
424         sb.append(" * @author generated by org.mmbase.bridge.remote.generator.RemoteGenerator\n");
425         sb.append(" */\n");
426         sb.append(" //DO NOT EDIT THIS FILE. IT IS GENERATED by remote.remote.remoteGenerator\n");
427         String JavaDoc impl = shortName + ",MappedObject";
428         //impl += ",java.io.Serializable";
429
if (!xmlClass.getImplements().equals("")) {
430             impl += ",";
431         }
432         String JavaDoc extendsString = "";
433         if (xmlClass.getImplements().indexOf("List") != -1 && xmlClass.getImplements().indexOf("Iterator") == -1) {
434             extendsString = " extends AbstractList ";
435         }
436         sb.append("public class " + className + extendsString + " implements " + impl + xmlClass.getImplements() + " {\n");
437         System.err.println("generate implementation " + className);
438
439         sb.append(" //original object\n");
440         sb.append(" " + interfaceName + " originalObject;\n\n");
441
442         //constructor
443
sb.append(" public " + className + "(" + interfaceName + " originalObject) {\n");
444         sb.append(" super();\n");
445         sb.append(" this.originalObject = originalObject;\n");
446         sb.append(" }\n");
447
448         Iterator methodsIt = xmlClass.getMethods().iterator();
449         while (methodsIt.hasNext()) {
450             XMLMethod xmlMethod = (XMLMethod)methodsIt.next();
451             String JavaDoc methodName = xmlMethod.getName();
452
453             boolean wrapped = false;
454             if (!methodName.equals("toArray") && !methodName.equals("iterator") && !methodName.equals("listIterator")) {
455
456                 if (methodName.equals("equals") || methodName.equals("hashCode") || methodName.equals("toString") || methodName.equals("clone")) {
457                     wrapped = true;
458                 }
459                 XMLClass returnType = xmlMethod.getReturnType();
460                 String JavaDoc retTypeName = xmlMethod.getReturnType().getName();
461
462                 //if the return type is in the MMBase bridge we need to
463
//create a wrapper
464
if (needsRemote(xmlMethod.getReturnType())) {
465                     retTypeName = xmlMethod.getReturnType().getShortName();
466                 }
467
468                 if (returnType.isArray) {
469                     sb.append(" public " + retTypeName + "[] " + xmlMethod.getName() + "(");
470                 } else {
471                     sb.append(" public " + retTypeName + " " + xmlMethod.getName() + "(");
472                 }
473
474                 Iterator iter = xmlMethod.getParameterList().iterator();
475                 int counter = 0;
476                 while (iter.hasNext()) {
477                     counter++;
478                     XMLClass parameter = (XMLClass)iter.next();
479                     if (parameter.isArray) {
480                         sb.append(parameter.getOriginalName() + "[] param" + counter);
481                     } else {
482                         sb.append(parameter.getOriginalName() + " param" + counter);
483                     }
484                     if (iter.hasNext()) {
485                         sb.append(" ,");
486
487                     }
488                 }
489                 sb.append(") {\n");
490                 sb.append(" try {\n");
491
492                 int paramCounter = 0;
493                 Iterator paramIter = xmlMethod.getParameterList().iterator();
494                 while (paramIter.hasNext()) {
495                     XMLClass parameter = (XMLClass)paramIter.next();
496                     paramCounter++;
497                     if (needsRemote(parameter)) {
498                         if (parameter.isArray) {
499                             sb.append(" Remote" + parameter.getClassName() + "[] remoteparam" + paramCounter + " = new Remote" + parameter.getClassName() + "[param" + paramCounter + ".length];\n");
500                             sb.append(" for(int i = 0; i <param" + paramCounter + ".length; i++ ) {\n");
501                             sb.append(" remoteparam" + paramCounter + "[i] = (Remote" + parameter.getClassName() + ")( param" + paramCounter + "[i] == null ? null : ((MappedObject) param" + paramCounter + "[i]).getWrappedObject());\n");
502                             sb.append(" }\n");
503                         } else {
504                             sb.append(" Remote" + parameter.getClassName() + " remoteparam" + paramCounter + " = (Remote" + parameter.getClassName() + ")( param" + paramCounter + " == null ? null : ((MappedObject) param" + paramCounter + ").getWrappedObject());\n");
505                         }
506                     }
507                 }
508
509                 //**
510
if (xmlMethod.getReturnType().getName().indexOf("void") == -1) {
511                     if (!xmlMethod.getReturnType().isArray) {
512                         sb.append(" " + xmlMethod.getReturnType().getName() + " retval =(" + xmlMethod.getReturnType().getName() + ")");
513                     } else {
514                         sb.append(" " + xmlMethod.getReturnType().getName() + "[] retval =(" + xmlMethod.getReturnType().getName() + "[])");
515                     }
516                 }
517
518                 String JavaDoc typeName = xmlMethod.getReturnType().getOriginalName();
519                 if (needsRemote(xmlMethod.getReturnType()) || typeName.equals("java.lang.Object") || typeName.equals("java.util.List") || typeName.equals("java.util.SortedSet")) {
520                     sb.append("ObjectWrapper.rmiObjectToRemoteImplementation(originalObject." + (wrapped ? "wrapped_" : "") + xmlMethod.getName() + "(");
521                 } else {
522                     sb.append("originalObject." + (wrapped ? "wrapped_" : "") + xmlMethod.getName() + "(");
523                 }
524                 //sb.append("originalObject." + (wrapped ? "wrapped_" : "") + xmlMethod.getName() + "(");
525

526                 paramCounter = 0;
527                 paramIter = xmlMethod.getParameterList().iterator();
528                 while (paramIter.hasNext()) {
529                     XMLClass parameter = (XMLClass)paramIter.next();
530                     paramCounter++;
531                     if (needsRemote(parameter)) {
532                         sb.append("remoteparam" + paramCounter);
533                     } else {
534                         if (parameter.getOriginalName().equals("java.lang.Object") || parameter.getOriginalName().equals("java.util.List") || parameter.getOriginalName().equals("java.util.SortedSet")) {
535                             String JavaDoc sss = className.substring(6, className.length() - 9);
536                             if (sss.equals("String")) {
537                                 sb.append("param" + paramCounter);
538                             } else {
539                                 sb.append("(" + parameter.getName() + ")ObjectWrapper.remoteImplementationToRMIObject(param" + paramCounter + ")");
540                             }
541                         } else {
542                             sb.append("param" + paramCounter);
543                         }
544                     }
545                     if (paramIter.hasNext()) {
546                         sb.append(" ,");
547                     }
548                 }
549                 if (needsRemote(xmlMethod.getReturnType()) || typeName.equals("java.lang.Object") || typeName.equals("java.util.List")|| typeName.equals("java.util.SortedSet")) {
550                     sb.append(")");
551                 }
552                 //sb.append(")");
553
sb.append(");\n");
554                 if (typeName.indexOf("void") == -1) {
555
556                     sb.append(" return retval;\n");
557                 }
558
559                 sb.append(" } catch (RuntimeException e){ throw e ;} catch(Exception e) {\nthrow new BridgeException(e.getMessage(), e);\n}\n");
560
561                 sb.append(" }\n");
562                 sb.append("\n");
563             }
564         }
565         sb.append(" public String getMapperCode(){ String code =null; try {code = originalObject.getMapperCode();} catch (Exception e){} return code ;}\n");
566         sb.append(" public Object getWrappedObject(){ return originalObject ;}\n");
567         sb.append("}\n");
568         try {
569             File file = new File(targetDir + "/org/mmbase/bridge/remote/implementation/" + className + ".java");
570             FileOutputStream fos = new FileOutputStream(file);
571             fos.write(sb.toString().getBytes());
572             fos.flush();
573             fos.close();
574         } catch (Exception JavaDoc e) {
575             System.err.println(e.getMessage());
576         }
577     }
578
579     /**
580      * @javadoc
581      */

582     void generateObjectWrappers(MMCI mmci) {
583         System.out.println("Creating ObjectWrapperHelper");
584         StringBuffer JavaDoc helper = new StringBuffer JavaDoc();
585         helper.append("package org.mmbase.bridge.remote;");
586         helper.append("import java.util.*;\n");
587         helper.append("import java.rmi.*;\n");
588
589         helper.append("import org.mmbase.bridge.*;\n");
590         helper.append("import org.mmbase.datatypes.processors.*;\n");
591         helper.append("import org.mmbase.datatypes.*;\n");
592         helper.append("import org.mmbase.security.*;\n");
593         helper.append("import org.mmbase.bridge.remote.*;\n");
594         helper.append("import org.mmbase.bridge.remote.rmi.*;\n");
595         helper.append("import org.mmbase.bridge.remote.implementation.*;\n");
596
597         helper.append("import org.mmbase.storage.search.*;\n");
598         helper.append("import org.mmbase.util.functions.*;\n");
599         helper.append("import org.mmbase.util.logging.*;\n");
600
601         helper.append("public abstract class ObjectWrapperHelper {\n");
602
603         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
604         StringBuffer JavaDoc sb2 = new StringBuffer JavaDoc();
605         List v = new ArrayList(mmci.getClasses());
606         List w = new ArrayList();
607         // System.out.println("Sorting " + v);
608

609         // now handle more specific classes
610
int specificity = 0;
611         int currentSize = w.size() - 1;
612         while (v.size() > 0) {
613             specificity++;
614             // System.out.println("specificity:" + specificity);
615
if (w.size() == currentSize) {
616                 System.err.println("ERROR: Could not resolve order in ObjectWrapperHelper");
617                 w.add(0, v);
618             }
619             currentSize = w.size();
620             for (Iterator i = v.iterator(); i.hasNext();) {
621                 XMLClass xml = (XMLClass) i.next();
622                 if (w.containsAll(getSuperClasses(xml))) {
623                     w.add(0, xml);
624                     i.remove();
625                     break;
626                 }
627             }
628         }
629
630
631         //System.out.println("Result " + v);
632
Iterator i = w.iterator();
633
634         sb.append("public static Object localToRMIObject(Object o, int port) throws RemoteException {\n");
635         sb.append(" Object retval = null;\n");
636         sb2.append("public static Object rmiObjectToRemoteImplementation(Object o) throws RemoteException {\n");
637         sb2.append(" Object retval = null;\n");
638
639         boolean isFirst = true;
640         while (i.hasNext()) {
641
642             XMLClass xmlClass = (XMLClass) i.next ();
643             String JavaDoc shortName = xmlClass.getShortName();
644             String JavaDoc className = "Remote" + xmlClass.getClassName();
645
646             if (needsRemote(xmlClass)) {
647                 if (!isFirst) {
648                     sb.append("} else");
649                     sb2.append("} else");
650                 }
651                 sb.append(" if (o instanceof " + shortName + ") {\n");
652                 sb.append("retval = new " + className + "_Rmi((" + shortName + ")o, port);\n");
653
654                 sb2.append(" if (o instanceof " + className + ") {\n");
655                 sb2.append("retval = new " + className + "_Impl((" + className + ")o);\n");
656                 isFirst = false;
657             }
658         }
659         sb.append(" }\n;return retval ;\n}\n");
660         sb2.append(" }\n; return retval ;\n}\n");
661         helper.append(sb);
662         helper.append(sb2);
663         helper.append("}\n");
664         //System.out.println(helper.toString());
665
try {
666             File file = new File(targetDir + "/org/mmbase/bridge/remote/ObjectWrapperHelper.java");
667             FileOutputStream fos = new FileOutputStream(file);
668             fos.write(helper.toString().getBytes());
669             fos.flush();
670             fos.close();
671         } catch (Exception JavaDoc e) {
672             System.err.println(e.getMessage());
673         }
674     }
675
676     static List getSubClasses(XMLClass xmlClass) {
677         List retval = new ArrayList();
678         MMCI mmci = null;
679         try {
680             mmci = MMCI.getDefaultMMCI();
681         } catch (Exception JavaDoc e) {
682             System.err.println("can not get MMCI");
683         }
684         List v = mmci.getClasses();
685         Iterator iter = v.iterator();
686         while (iter.hasNext()) {
687             XMLClass f = (XMLClass)iter.next();
688             List list = getSuperClasses(f);
689             for (int x = 0; x < list.size(); x++) {
690                 XMLClass listItem = (XMLClass)list.get(x);
691                 if (listItem.getName().equals(xmlClass.getName())) {
692                     retval.add(f);
693                     retval.addAll(getSubClasses(f));
694                     //System.err.println(xmlClass.getName() + " has subclass " + f.getName());
695
}
696             }
697         }
698         return retval;
699     }
700
701     static List getSuperClasses(XMLClass xmlClass) {
702         List retval = new ArrayList();
703         try {
704             MMCI.getDefaultMMCI();
705         } catch (Exception JavaDoc e) {
706             System.err.println("can not get MMCI");
707         }
708
709         if (xmlClass.getImplements() != null && xmlClass.getImplements().trim().length() > 0) {
710             StringTokenizer st = new StringTokenizer(xmlClass.getImplements(), ",");
711             while (st.hasMoreTokens()) {
712                 String JavaDoc newClass = st.nextToken();
713                 //System.err.println(newClass);
714
if (newClass.indexOf("mmbase") != -1) {
715                     try {
716                         XMLClass f = MMCI.getDefaultMMCI().getClass(newClass);
717                         retval.add(f);
718                         retval.addAll(getSuperClasses(f));
719                     } catch (NotInMMCIException e) {
720                         System.err.println(e.getMessage());
721                     } catch (Exception JavaDoc e) {
722                         System.err.println(e.getMessage());
723                     }
724                 }
725             }
726         }
727         return retval;
728     }
729
730     /*
731      * main method
732      * parameters required are targetdirectory and MMCI.xml file location
733      */

734     public static void main(String JavaDoc[] argv) throws Exception JavaDoc {
735         if (argv.length != 2) {
736             System.err.println("Usage: java org.mmbase.bridge.remote.generator.RemoteGenerator <targetdir> <mmci-xml-file>");
737             System.exit(1);
738         }
739         new RemoteGenerator(argv[0], argv[1]);
740     }
741 }
742
Popular Tags