| 1 16 package org.apache.axis.wsdl.toJava; 17 18 import org.apache.axis.components.logger.LogFactory; 19 import org.apache.axis.utils.JavaUtils; 20 import org.apache.axis.utils.Messages; 21 import org.apache.axis.wsdl.gen.Generator; 22 import org.apache.axis.wsdl.gen.GeneratorFactory; 23 import org.apache.axis.wsdl.gen.NoopGenerator; 24 import org.apache.axis.wsdl.symbolTable.BaseTypeMapping; 25 import org.apache.axis.wsdl.symbolTable.BindingEntry; 26 import org.apache.axis.wsdl.symbolTable.ContainedAttribute; 27 import org.apache.axis.wsdl.symbolTable.Element; 28 import org.apache.axis.wsdl.symbolTable.ElementDecl; 29 import org.apache.axis.wsdl.symbolTable.FaultInfo; 30 import org.apache.axis.wsdl.symbolTable.MessageEntry; 31 import org.apache.axis.wsdl.symbolTable.Parameter; 32 import org.apache.axis.wsdl.symbolTable.Parameters; 33 import org.apache.axis.wsdl.symbolTable.PortTypeEntry; 34 import org.apache.axis.wsdl.symbolTable.SchemaUtils; 35 import org.apache.axis.wsdl.symbolTable.ServiceEntry; 36 import org.apache.axis.wsdl.symbolTable.SymTabEntry; 37 import org.apache.axis.wsdl.symbolTable.SymbolTable; 38 import org.apache.axis.wsdl.symbolTable.Type; 39 import org.apache.axis.wsdl.symbolTable.TypeEntry; 40 import org.apache.commons.logging.Log; 41 42 import javax.wsdl.Binding; 43 import javax.wsdl.Definition; 44 import javax.wsdl.Fault; 45 import javax.wsdl.Message; 46 import javax.wsdl.Operation; 47 import javax.wsdl.OperationType; 48 import javax.wsdl.Port; 49 import javax.wsdl.PortType; 50 import javax.wsdl.Service; 51 import javax.xml.namespace.QName ; 52 import javax.xml.rpc.holders.BooleanHolder ; 53 import java.io.IOException ; 54 import java.lang.reflect.Constructor ; 55 import java.util.ArrayList ; 56 import java.util.HashMap ; 57 import java.util.HashSet ; 58 import java.util.Iterator ; 59 import java.util.List ; 60 import java.util.Map ; 61 import java.util.Vector ; 62 63 66 public class JavaGeneratorFactory implements GeneratorFactory { 67 private static final Log log_ = 68 LogFactory.getLog(JavaGeneratorFactory.class.getName()); 69 70 71 protected Emitter emitter; 72 73 74 protected SymbolTable symbolTable; 75 76 77 public static String COMPLEX_TYPE_FAULT = "ComplexTypeFault"; 78 79 80 public static String EXCEPTION_CLASS_NAME = "ExceptionClassName"; 81 82 83 public static String EXCEPTION_DATA_TYPE = "ExceptionDataType"; 84 85 86 private static final String SERVICE_SUFFIX = "_Service"; 87 private static final String PORT_TYPE_SUFFIX = "_PortType"; private static final String TYPE_SUFFIX = "_Type"; 89 private static final String ELEMENT_SUFFIX = "_Element"; private static final String EXCEPTION_SUFFIX = "_Exception"; 91 private static final String BINDING_SUFFIX = "_Binding"; 92 93 94 98 public JavaGeneratorFactory() { 99 addGenerators(); 100 } 102 107 public JavaGeneratorFactory(Emitter emitter) { 108 109 this.emitter = emitter; 110 111 addGenerators(); 112 } 114 119 public void setEmitter(Emitter emitter) { 120 this.emitter = emitter; 121 } 123 126 private void addGenerators() { 127 128 addMessageGenerators(); 129 addPortTypeGenerators(); 130 addBindingGenerators(); 131 addServiceGenerators(); 132 addTypeGenerators(); 133 addDefinitionGenerators(); 134 } 136 147 protected void addMessageGenerators() { 148 } 150 153 protected void addPortTypeGenerators() { 154 } 156 159 protected void addBindingGenerators() { 160 } 162 165 protected void addServiceGenerators() { 166 } 168 171 protected void addTypeGenerators() { 172 } 174 177 protected void addDefinitionGenerators() { 178 179 addGenerator(Definition.class, JavaDefinitionWriter.class); addGenerator(Definition.class, 181 JavaDeployWriter.class); addGenerator(Definition.class, 183 JavaUndeployWriter.class); addGenerator(Definition.class, 185 JavaBuildFileWriter.class); 187 } 189 190 198 public void generatorPass(Definition def, SymbolTable symbolTable) { 199 200 this.symbolTable = symbolTable; 201 202 javifyNames(symbolTable); 203 setFaultContext(symbolTable); 204 resolveNameClashes(symbolTable); 205 determineInterfaceNames(symbolTable); 206 207 if (emitter.isAllWanted()) { 208 setAllReferencesToTrue(); 209 } else { 210 ignoreNonSOAPBindings(symbolTable); 211 } 212 213 constructSignatures(symbolTable); 214 determineIfHoldersNeeded(symbolTable); 215 } 217 218 private Writers messageWriters = new Writers(); 219 220 227 public Generator getGenerator(Message message, SymbolTable symbolTable) { 228 if (include(message.getQName())) { 229 MessageEntry mEntry = symbolTable.getMessageEntry(message.getQName()); 230 messageWriters.addStuff(new NoopGenerator(), mEntry, symbolTable); 231 return messageWriters; 232 } 233 else { 234 return new NoopGenerator(); 235 } 236 } 238 239 private Writers portTypeWriters = new Writers(); 240 241 248 public Generator getGenerator(PortType portType, SymbolTable symbolTable) { 249 if (include(portType.getQName())) { 250 PortTypeEntry ptEntry = 251 symbolTable.getPortTypeEntry(portType.getQName()); 252 portTypeWriters.addStuff(new NoopGenerator(), ptEntry, symbolTable); 253 return portTypeWriters; 254 } 255 else { 256 return new NoopGenerator(); 257 } 258 } 260 261 protected Writers bindingWriters = new Writers(); 262 263 270 public Generator getGenerator(Binding binding, SymbolTable symbolTable) { 271 if (include(binding.getQName())) { 272 Generator writer = new JavaBindingWriter(emitter, binding, 273 symbolTable); 274 BindingEntry bEntry = symbolTable.getBindingEntry(binding.getQName()); 275 bindingWriters.addStuff(writer, bEntry, symbolTable); 276 return bindingWriters; 277 } 278 else { 279 return new NoopGenerator(); 280 } 281 } 283 284 protected Writers serviceWriters = new Writers(); 285 286 293 public Generator getGenerator(Service service, SymbolTable symbolTable) { 294 if (include(service.getQName())) { 295 Generator writer = new JavaServiceWriter(emitter, service, 296 symbolTable); 297 ServiceEntry sEntry = symbolTable.getServiceEntry(service.getQName()); 298 serviceWriters.addStuff(writer, sEntry, symbolTable); 299 return serviceWriters; 300 } 301 else { 302 return new NoopGenerator(); 303 } 304 } 306 307 private Writers typeWriters = new Writers(); 308 309 316 public Generator getGenerator(TypeEntry type, SymbolTable symbolTable) { 317 if (include(type.getQName())) { 318 Generator writer = new JavaTypeWriter(emitter, type, symbolTable); 319 typeWriters.addStuff(writer, type, symbolTable); 320 return typeWriters; 321 } 322 else { 323 return new NoopGenerator(); 324 } 325 } 327 328 private Writers defWriters = new Writers(); 329 330 337 public Generator getGenerator(Definition definition, 338 SymbolTable symbolTable) { 339 if (include(definition.getQName())) { 340 defWriters.addStuff(null, definition, symbolTable); 341 return defWriters; 342 } 343 else { 344 return new NoopGenerator(); 345 } 346 } 348 350 355 protected class Writers implements Generator { 356 357 358 Vector writers = new Vector (); 359 360 361 SymbolTable symbolTable = null; 362 363 364 Generator baseWriter = null; 365 366 368 369 SymTabEntry entry = null; 370 371 372 Definition def = null; 373 374 379 public void addGenerator(Class writer) { 380 writers.add(writer); 381 } 383 390 public void addStuff(Generator baseWriter, SymTabEntry entry, 391 SymbolTable symbolTable) { 392 393 this.baseWriter = baseWriter; 394 this.entry = entry; 395 this.symbolTable = symbolTable; 396 } 398 405 public void addStuff(Generator baseWriter, Definition def, 406 SymbolTable symbolTable) { 407 408 this.baseWriter = baseWriter; 409 this.def = def; 410 this.symbolTable = symbolTable; 411 } 413 418 public void generate() throws IOException { 419 420 if (baseWriter != null) { 421 baseWriter.generate(); 422 } 423 424 Class [] formalArgs; 425 Object [] actualArgs; 426 427 if (entry != null) { 428 formalArgs = new Class []{Emitter.class, entry.getClass(), 429 SymbolTable.class}; 430 actualArgs = new Object []{emitter, entry, symbolTable}; 431 } else { 432 formalArgs = new Class []{Emitter.class, Definition.class, 433 SymbolTable.class}; 434 actualArgs = new Object []{emitter, def, symbolTable}; 435 } 436 437 for (int i = 0; i < writers.size(); ++i) { 438 Class wClass = (Class ) writers.get(i); 439 Generator gen; 440 441 try { 442 Constructor ctor = wClass.getConstructor(formalArgs); 443 444 gen = (Generator) ctor.newInstance(actualArgs); 445 } catch (Throwable t) { 446 throw new IOException (Messages.getMessage("exception01", 447 t.getMessage())); 448 } 449 450 gen.generate(); 451 } 452 } } 455 461 public void addGenerator(Class wsdlClass, Class generator) { 462 463 if (Message.class.isAssignableFrom(wsdlClass)) { 465 messageWriters.addGenerator(generator); 466 } else if (PortType.class.isAssignableFrom(wsdlClass)) { 467 portTypeWriters.addGenerator(generator); 468 } else if (Binding.class.isAssignableFrom(wsdlClass)) { 469 bindingWriters.addGenerator(generator); 470 } else if (Service.class.isAssignableFrom(wsdlClass)) { 471 serviceWriters.addGenerator(generator); 472 } else if (TypeEntry.class.isAssignableFrom(wsdlClass)) { 473 typeWriters.addGenerator(generator); 474 } else if (Definition.class.isAssignableFrom(wsdlClass)) { 475 defWriters.addGenerator(generator); 476 } 477 } 479 486 protected void javifyNames(SymbolTable symbolTable) { 487 488 int uniqueNum = 0; 489 HashMap anonQNames = new HashMap (); 490 Iterator it = symbolTable.getHashMap().values().iterator(); 491 492 while (it.hasNext()) { 493 Vector v = (Vector ) it.next(); 494 495 for (int i = 0; i < v.size(); ++i) { 496 SymTabEntry entry = (SymTabEntry) v.elementAt(i); 497 498 if (entry.getName() != null) { 499 continue; 500 } 501 502 if (entry instanceof TypeEntry) { 504 uniqueNum = javifyTypeEntryName(symbolTable, (TypeEntry) entry, anonQNames, uniqueNum); 505 } 506 507 else { 510 entry.setName(emitter.getJavaName(entry.getQName())); 511 } 512 } 513 } 514 } 516 517 protected int javifyTypeEntryName(SymbolTable symbolTable, TypeEntry entry, HashMap anonQNames, int uniqueNum) { 518 TypeEntry tEntry = entry; 519 String dims = tEntry.getDimensions(); 520 TypeEntry refType = tEntry.getRefType(); 521 while (refType != null) { 522 tEntry = refType; 523 dims += tEntry.getDimensions(); 524 refType = tEntry.getRefType(); 525 } 526 527 TypeEntry te = tEntry; 528 while (te != null) { 529 TypeEntry base = SchemaUtils.getBaseType(te, symbolTable); 530 if (base == null) 531 break; 532 533 uniqueNum = javifyTypeEntryName(symbolTable, base, anonQNames, uniqueNum); 534 535 if (Utils.getEnumerationBaseAndValues(te.getNode(), symbolTable) == null 536 &&SchemaUtils.getComplexElementExtensionBase(te.getNode(), symbolTable) == null 537 && te.getContainedAttributes() == null) { 538 if(!SchemaUtils.isSimpleTypeWithUnion(te.getNode())) { 539 if (base.isSimpleType()) { 540 te.setSimpleType(true); 546 te.setName(base.getName()); 547 te.setRefType(base); 548 } 549 550 if (base.isBaseType()) { 551 te.setBaseType(true); 557 te.setName(base.getName()); 558 te.setRefType(base); 559 } 560 } 561 } 562 563 if (!te.isSimpleType()) 564 break; 565 566 te = base; 567 } 568 569 if (tEntry.getName() == null) { 572 boolean processed = false; QName typeQName = tEntry.getQName(); 576 577 QName itemType = SchemaUtils.getListItemType(tEntry.getNode()); 580 if (itemType != null) { 581 TypeEntry itemEntry = symbolTable.getTypeEntry(itemType, false); 583 javifyTypeEntryName(symbolTable, itemEntry, anonQNames, uniqueNum); 586 TypeEntry refedEntry = itemEntry.getRefType(); 588 QName baseName = refedEntry == null ? itemEntry.getQName() : 589 refedEntry.getQName(); 590 typeQName = new QName (baseName.getNamespaceURI(), 591 baseName.getLocalPart() + "[]"); 592 } 593 594 if (emitter.isDeploy()) { 595 Class class1 = (Class ) emitter.getQName2ClassMap().get(typeQName); 596 if (class1 != null && !class1.isArray()) { 597 tEntry.setName(getJavaClassName(class1)); 598 processed = true; 599 } 600 } 601 602 if (!processed) { 603 if ((typeQName.getLocalPart(). 604 indexOf(SymbolTable.ANON_TOKEN) < 0)) { 605 tEntry.setName(emitter.getJavaName(typeQName)); 609 } else { 610 String localName = typeQName.getLocalPart(); 623 624 StringBuffer sb = new StringBuffer (localName); 630 int aidx; 631 632 while ((aidx = sb.toString().indexOf(SymbolTable.ANON_TOKEN)) > -1) { 633 sb.replace(aidx, aidx + SymbolTable.ANON_TOKEN.length(), ""); 634 char c = sb.charAt(aidx); 635 if (Character.isLetter(c) && Character.isLowerCase(c)) { 636 sb.setCharAt(aidx, Character.toUpperCase(c)); 637 } 638 } 639 640 localName = sb.toString(); 641 typeQName = new QName (typeQName.getNamespaceURI(), 642 localName); 643 644 if (emitter.isTypeCollisionProtection() && 645 !emitter.getNamespaceExcludes().contains(new NamespaceSelector(typeQName.getNamespaceURI()))) { 646 if (symbolTable.getType(typeQName) != null || 652 anonQNames.get(typeQName) != null) { 653 localName += "Type" + uniqueNum++; 654 typeQName = 655 new QName (typeQName.getNamespaceURI(), 656 localName); 657 } 658 659 anonQNames.put(typeQName, typeQName); 660 } 661 662 tEntry.setName(emitter.getJavaName(typeQName)); 664 } 665 } 667 Vector elements = tEntry.getContainedElements(); 668 if (elements != null) { 669 for (int i = 0; i < elements.size(); i++) { 670 ElementDecl elem = (ElementDecl) elements.get(i); 671 String varName = emitter.getJavaVariableName(typeQName, elem.getQName(), true); 672 elem.setName(varName); 673 } 674 } 675 676 Vector attributes = tEntry.getContainedAttributes(); 677 if (attributes != null) { 678 for (int i = 0; i < attributes.size(); i++) { 679 ContainedAttribute attr = (ContainedAttribute) attributes.get(i); 680 String varName = emitter.getJavaVariableName(typeQName, attr.getQName(), false); 681 attr.setName(varName); 682 } 683 } 684 } 685 686 entry.setName(tEntry.getName() + dims); 689 690 return uniqueNum; 691 } 692 693 699 private static String getJavaClassName(Class clazz) { 700 Class class1 = clazz; 701 702 while (class1.isArray()) { 703 class1 = class1.getComponentType(); 704 } 705 706 String name = class1.getName(); 707 name.replace('$', '.'); 708 return name; 709 } 710 711 724 private void setFaultContext(SymbolTable symbolTable) { 725 726 Iterator it = symbolTable.getHashMap().values().iterator(); 727 728 while (it.hasNext()) { 729 Vector v = (Vector ) it.next(); 730 731 for (int i = 0; i < v.size(); ++i) { 732 SymTabEntry entry = (SymTabEntry) v.elementAt(i); 733 734 if (entry instanceof BindingEntry) { 736 BindingEntry bEntry = (BindingEntry) entry; 737 HashMap allOpFaults = bEntry.getFaults(); 738 Iterator ops = allOpFaults.values().iterator(); 739 740 while (ops.hasNext()) { 742 ArrayList faults = (ArrayList ) ops.next(); 743 744 for (int j = 0; j < faults.size(); ++j) { 745 FaultInfo info = (FaultInfo) faults.get(j); 746 747 setFaultContext(info, symbolTable); 748 } 749 } 750 } 751 } 752 } 753 } 755 764 private void setFaultContext(FaultInfo fault, SymbolTable symbolTable) { 765 766 QName faultXmlType = null; 767 Vector parts = new Vector (); 768 769 try { 773 symbolTable.getParametersFromParts( 774 parts, fault.getMessage().getOrderedParts(null), false, 775 fault.getName(), null); 776 } catch (IOException e) { 777 } 778 779 String exceptionClassName = null; 781 782 for (int j = 0; j < parts.size(); j++) { 783 TypeEntry te = ((Parameter) (parts.elementAt(j))).getType(); 784 785 |