1 10 11 package org.mmbase.bridge.remote.generator; 12 import java.util.*; 13 import java.io.*; 14 15 19 public class RemoteGenerator { 20 21 private MMCI mmci = null; 22 private String targetDir = null; 23 24 35 public RemoteGenerator(String targetDir, String mmciFile) throws Exception { 36 File file = new File(targetDir + "/org/mmbase/bridge/remote"); 38 if (!file.exists() || !file.isDirectory()) { 39 throw new Exception ("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 74 public void generateInterface(XMLClass xmlClass) { 75 String className = "Remote" + xmlClass.getClassName(); 76 StringBuffer sb = new StringBuffer (); 77 78 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 impl = " ServerMappedObject"; 101 103 String m = xmlClass.getImplements(); 104 StringTokenizer st = new StringTokenizer(m, ","); 105 while (st.hasMoreTokens()) { 106 String token = st.nextToken(); 107 XMLClass xmlc = mmci.getClass(token); 108 if (needsRemote(xmlc)) { 109 impl += ", Remote" + xmlc.getClassName(); 110 } else { 111 } 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 126 Iterator methodsIt = xmlClass.getMethods().iterator(); 127 while (methodsIt.hasNext()) { 128 XMLMethod xmlMethod = (XMLMethod)methodsIt.next(); 129 String 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 ("Return type of " + xmlMethod + " is null"); 136 } 137 String retTypeName = returnType.getShortName(); 138 139 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 e) { 187 System.err.println("writeFile" + e.getMessage()); 188 } 189 } 190 195 public void generateRmi(XMLClass xmlClass) { 196 String shortName = xmlClass.getShortName(); 197 String interfaceName = "Remote" + xmlClass.getClassName(); 198 String className = interfaceName + "_Rmi"; 199 StringBuffer sb = new StringBuffer (); 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 impl = ""; 221 222 if (needsRemote(xmlClass)) { 223 String m = xmlClass.getImplements(); 224 StringTokenizer st = new StringTokenizer(m, ","); 225 while (st.hasMoreTokens()) { 226 String token = st.nextToken(); 227 XMLClass xmlc = mmci.getClass(token); 229 if (xmlc != null && needsRemote(xmlc)) { 230 impl += ", Remote" + xmlc.getClassName(); 231 } else { 232 } 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 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 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 retTypeName = xmlMethod.getReturnType().getName(); 266 267 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 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 e) { 398 System.err.println(e.getMessage()); 399 } 400 } 401 402 406 public void generateImplementation(XMLClass xmlClass) { 407 String shortName = xmlClass.getShortName(); 408 String interfaceName = "Remote" + xmlClass.getClassName(); 409 String className = interfaceName + "_Impl"; 410 StringBuffer sb = new StringBuffer (); 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 impl = shortName + ",MappedObject"; 428 if (!xmlClass.getImplements().equals("")) { 430 impl += ","; 431 } 432 String 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 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 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 retTypeName = xmlMethod.getReturnType().getName(); 461 462 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 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 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 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 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(");\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 e) { 575 System.err.println(e.getMessage()); 576 } 577 } 578 579 582 void generateObjectWrappers(MMCI mmci) { 583 System.out.println("Creating ObjectWrapperHelper"); 584 StringBuffer helper = new StringBuffer (); 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 sb = new StringBuffer (); 604 StringBuffer sb2 = new StringBuffer (); 605 List v = new ArrayList(mmci.getClasses()); 606 List w = new ArrayList(); 607 609 int specificity = 0; 611 int currentSize = w.size() - 1; 612 while (v.size() > 0) { 613 specificity++; 614 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 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 shortName = xmlClass.getShortName(); 644 String 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 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 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 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 } 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 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 newClass = st.nextToken(); 713 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 e) { 722 System.err.println(e.getMessage()); 723 } 724 } 725 } 726 } 727 return retval; 728 } 729 730 734 public static void main(String [] argv) throws Exception { 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 |