Emitter knows about WSDL writers, one each for PortType, Binding, Service,
Definition, Type. But for some of these WSDL types, Wsdl2java generates
multiple files. Each of these files has a corresponding writer that extends
JavaWriter. So the Java WSDL writers (JavaPortTypeWriter, JavaBindingWriter,
etc.) each calls a file writer (JavaStubWriter, JavaSkelWriter, etc.) for
each file that that WSDL generates.
For example, when Emitter calls JavaWriterFactory for a Binding Writer, it
returns a JavaBindingWriter. JavaBindingWriter, in turn, contains a
JavaStubWriter, JavaSkelWriter, and JavaImplWriter since a Binding may cause
a stub, skeleton, and impl template to be generated.
Note that the writers that are given to Emitter by JavaWriterFactory DO NOT
extend JavaWriter. They simply implement Writer and delegate the actual
task of writing to extensions of JavaWriter.
All of Wsdl2java's Writer implementations follow a common behaviour.
JavaWriter is the abstract base class that dictates this common behaviour.
Many of the files generated are .java files, so this abstract class -
JavaClassWriter - exists. It extends JavaWriter and adds a bit of Java-
relative behaviour. This behaviour is primarily placed within the generate
method. The generate method calls, in succession (note: the starred methods
are the ones you are probably most interested in):
- getFileName
- This method is abstract in JavaWriter, but JavaClassWriter implements
this method. Subclasses should have no need to override it. It
returns the fully-qualified file name based on the fully-qualified
classname + ".java".
- isFileGenerated(file)
- You should not need to override this method. It checks to see whether
this file is in the List returned by emitter.getGeneratedFileNames.
- registerFile(file)
- You should not need to override this method. It registers this file by
calling emitter.getGeneratedFileInfo().add(...).
- * verboseMessage(file)
- You may override this method if you want to provide more information.
The generate method only calls verboseMessage if verbose is turned on.
- getPrintWriter(file)
- You should not need to override this method. Given the file name, it
creates a PrintWriter for it.
- writeFileHeader(pw)
- JavaClassWriter implements this method, so you should not need to
override it. This method generates a javadoc giving the filename and
a comment stating that this file is generated by WSDL2Java, and it
generates the class definition including the opening curly brace..
- * writeFileBody(pw)
- This is an abstract method that must be implemented by the subclass.
This is where the body of a file is generated.
- * writeFileFooter(pw)
- JavaClassWriter implements this method, so you should not need to
override it. It generates the closing curly brace for the class.
- closePrintWriter(pw)
- You should not need to override this method. It simply closes the
PrintWriter.
Additional behaviour that JavaClassWriter introduces beyond JavaWriter is
related to the class header and definition:
- writeHeaderComments
- Write the header comments, such as the file name and that the file was
generated by WSDL2Java. You need not override this method unless you
want a tailored comment.
- writePackage
- Write the package statement, if necessary. You should not need to
override this method.
- getClassModifiers
- Modifiers, such as "public", "final", "abstract" would be returned by
this method. The default implementation only generates "public ", so
any subclass that needs more must override this method.
- getClassText
- This simply returns "class ". If anything else is desired, for
instance, JavaInterfaceWriter prefers "interface ", then this method
must be overridden.
- getExtendsText
- The default implementation returns "". If a subclass desires to list
a set of classes this one extends, then this method must be overridden.
- getImplementsText
- Same as getExtendsText except for the implements clause.
|