Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.codehaus.modello.plugin.dom4j;
  
  /*
   * Copyright (c) 2006, Codehaus.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy of
   * this software and associated documentation files (the "Software"), to deal in
   * the Software without restriction, including without limitation the rights to
   * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  * of the Software, and to permit persons to whom the Software is furnished to do
  * so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included in all
  * copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
 
 
 import java.util.List;
Generate a writer that uses Dom4J.

TODO: chunks are lifted from xpp3, including the tests. Can we abstract it in some way?

Author(s):
Brett Porter
 
 public class Dom4jWriterGenerator
     extends AbstractXmlJavaGenerator
 {
 
     private boolean requiresDomSupport;
 
     public void generateModel modelProperties parameters )
         throws ModelloException
     {
         initializemodelparameters );
 
          = false;
 
         try
         {
             generateDom4jWriter();
         }
         catch ( IOException ex )
         {
             throw new ModelloException"Exception while generating Dom4j Writer."ex );
         }
     }
 
     private void generateDom4jWriter()
         throws ModelloExceptionIOException
     {
         Model objectModel = getModel();
 
         String packageName = objectModel.getDefaultPackageNameisPackageWithVersion(), getGeneratedVersion() )
             + ".io.dom4j";
 
         String marshallerName = getFileName"Dom4jWriter" );
 
         JSourceWriter sourceWriter = newJSourceWriterpackageNamemarshallerName );
 
         JClass jClass = new JClasspackageName + '.' + marshallerName );
         initHeaderjClass );
         suppressAllWarningsobjectModeljClass );
 
         jClass.addImport"java.io.OutputStream" );
         jClass.addImport"java.io.Writer" );
         jClass.addImport"java.util.Arrays" );
         jClass.addImport"java.util.Iterator" );
         jClass.addImport"java.util.Locale" );
         jClass.addImport"java.text.DateFormat" );
         jClass.addImport"org.dom4j.Document" );
        jClass.addImport"org.dom4j.DocumentException" );
        jClass.addImport"org.dom4j.DocumentFactory" );
        jClass.addImport"org.dom4j.Element" );
        jClass.addImport"org.dom4j.io.OutputFormat" );
        jClass.addImport"org.dom4j.io.XMLWriter" );
        addModelImportsjClassnull );
        String root = objectModel.getRootgetGeneratedVersion() );
        ModelClass rootClass = objectModel.getClassrootgetGeneratedVersion() );
        String rootElement = resolveTagNamerootClass );
        String variableName = uncapitaliseroot );
        // ----------------------------------------------------------------------
        // Write the write( Reader, Model ) method which will do the unmarshalling.
        // ----------------------------------------------------------------------
        JMethod marshall = new JMethod"write" );
        marshall.addParameternew JParameternew JClass"Writer" ), "writer" ) );
        marshall.addParameternew JParameternew JClassroot ), variableName ) );
        marshall.addExceptionnew JClass"java.io.IOException" ) );
        JSourceCode sc = marshall.getSourceCode();
        sc.add"Document document = new DocumentFactory().createDocument();" );
        sc.add"write" + root + "( " + variableName + ", \"" + rootElement + "\", document );" );
        // TODO: pretty printing optional
        sc.add"OutputFormat format = OutputFormat.createPrettyPrint();" );
        sc.add"format.setLineSeparator( System.getProperty( \"line.separator\" ) );" );
        sc.add"XMLWriter serializer = new XMLWriter( writer, format );" );
        sc.add"serializer.write( document );" );
        jClass.addMethodmarshall );
        // ----------------------------------------------------------------------
        // Write the write( OutputStream, Model ) method which will do the unmarshalling.
        // ----------------------------------------------------------------------
        marshall = new JMethod"write" );
        marshall.addParameternew JParameternew JClass"OutputStream" ), "stream" ) );
        marshall.addParameternew JParameternew JClassroot ), variableName ) );
        marshall.addExceptionnew JClass"java.io.IOException" ) );
        sc = marshall.getSourceCode();
        sc.add"Document document = new DocumentFactory().createDocument();" );
        sc.add"write" + root + "( " + variableName + ", \"" + rootElement + "\", document );" );
        // TODO: pretty printing optional
        sc.add"OutputFormat format = OutputFormat.createPrettyPrint();" );
        sc.add"format.setLineSeparator( System.getProperty( \"line.separator\" ) );" );
        sc.add"format.setEncoding( " + variableName + ".getModelEncoding() );" );
        sc.add"XMLWriter serializer = new XMLWriter( stream, format );" );
        sc.add"serializer.write( document );" );
        jClass.addMethodmarshall );
        writeAllClassesobjectModeljClass );
        if (  )
        {
            jClass.addImport"org.codehaus.plexus.util.xml.Xpp3Dom" );
            writeDomHelpersjClass );
        }
        jClass.printsourceWriter );
        sourceWriter.close();
    }
    private void writeAllClassesModel objectModelJClass jClass )
        throws ModelloException
    {
        for ( ModelClass clazz : getClassesobjectModel ) )
        {
            writeClassclazzjClass );
        }
    }
    private void writeClassModelClass modelClassJClass jClass )
        throws ModelloException
    {
        String className = modelClass.getName();
        String uncapClassName = uncapitaliseclassName );
        JMethod marshall = new JMethod"write" + className );
        marshall.getModifiers().makePrivate();
        marshall.addParameternew JParameternew JClassclassName ), uncapClassName ) );
        marshall.addParameternew JParameternew JClass"String" ), "tagName" ) );
        ModelClassMetadata classMetadata = (ModelClassMetadatamodelClass.getMetadata. );
        marshall.addParameternew JParameternew JClass"org.dom4j.Branch" ), "parentElement" ) );
        marshall.addExceptionnew JClass"java.io.IOException" ) );
        JSourceCode sc = marshall.getSourceCode();
        sc.add"if ( " + uncapClassName + " != null )" );
        sc.add"{" );
        sc.indent();
        XmlModelMetadata xmlModelMetadata = (XmlModelMetadatamodelClass.getModel().getMetadata. );
        // add namespace information for root element only
        if ( classMetadata.isRootElement() && ( xmlModelMetadata.getNamespace() != null ) )
        {
            String namespace = xmlModelMetadata.getNamespacegetGeneratedVersion() );
            sc.add"Element element = parentElement.addElement( tagName, \"" + namespace + "\" );" );
            if ( xmlModelMetadata.getSchemaLocation() != null )
            {
                String url = xmlModelMetadata.getSchemaLocationgetGeneratedVersion() );
                sc.add"element.addAttribute( \"xmlns:xsi\", \"http://www.w3.org/2001/XMLSchema-instance\" );" );
                sc.add(
                    "element.addAttribute( \"xsi:schemaLocation\", \"" + namespace + " " + url + "\" );" );
            }
        }
        else
        {
            sc.add"Element element = parentElement.addElement( tagName );" );
        }
        ModelField contentField = null;
        String contentValue = null;
        List<ModelFieldmodelFields = getFieldsForXmlmodelClassgetGeneratedVersion() );
        // XML attributes
        for ( ModelField field : modelFields )
        {
            XmlFieldMetadata xmlFieldMetadata = (XmlFieldMetadatafield.getMetadata. );
            JavaFieldMetadata javaFieldMetadata = (JavaFieldMetadatafield.getMetadata. );
            String fieldTagName = resolveTagNamefieldxmlFieldMetadata );
            String type = field.getType();
            String value = uncapClassName + "." + getPrefixjavaFieldMetadata ) + capitalisefield.getName() ) + "()";
            if ( xmlFieldMetadata.isContent() )
            {
                contentField = field;
                contentValue = value;
                continue;
            }
            if ( xmlFieldMetadata.isAttribute() )
            {
                sc.addgetValueCheckertypevaluefield ) );
                sc.add"{" );
                sc.addIndented"element.addAttribute( \"" + fieldTagName + "\", "
                                + getValuefield.getType(), valuexmlFieldMetadata ) + " );" );
                sc.add"}" );
            }
        }
        if ( contentField != null )
        {
            XmlFieldMetadata xmlFieldMetadata = (XmlFieldMetadatacontentField.getMetadata. );
            sc.add"element.setText( " + getValuecontentField.getType(), contentValuexmlFieldMetadata ) + " );" );
        }
        // XML tags
        for ( ModelField field : modelFields )
        {
            XmlFieldMetadata xmlFieldMetadata = (XmlFieldMetadatafield.getMetadata. );
            if ( xmlFieldMetadata.isContent() )
            {
                // skip field with type Content
                continue;
            }
            if ( !xmlFieldMetadata.isAttribute() )
            {
                processFieldfieldxmlFieldMetadatauncapClassNamescmodelClassjClass );
            }
        }
        sc.unindent();
        sc.add"}" );
        jClass.addMethodmarshall );
    }
    private void processFieldModelField fieldXmlFieldMetadata xmlFieldMetadataString uncapClassName,
                               JSourceCode scModelClass modelClassJClass jClass )
        throws ModelloException
    {
        JavaFieldMetadata javaFieldMetadata = (JavaFieldMetadatafield.getMetadata. );
        String fieldTagName = resolveTagNamefieldxmlFieldMetadata );
        String type = field.getType();
        String value = uncapClassName + "." + getPrefixjavaFieldMetadata ) + capitalisefield.getName() ) + "()";
        if ( field instanceof ModelAssociation )
        {
            ModelAssociation association = (ModelAssociationfield;
            String associationName = association.getName();
            if ( association.isOneMultiplicity() )
            {
                sc.addgetValueCheckertypevalueassociation ) );
                sc.add"{" );
                sc.addIndented"write" + association.getTo() + "( " + value + ", \"" + fieldTagName + "\", element );" );
                sc.add"}" );
            }
            else
            {
                //MANY_MULTIPLICITY
                XmlAssociationMetadata xmlAssociationMetadata =
                    (XmlAssociationMetadataassociation.getAssociationMetadata. );
                String valuesTagName = resolveTagNamefieldTagNamexmlAssociationMetadata );
                type = association.getType();
                String toType = association.getTo();
                boolean wrappedItems = xmlAssociationMetadata.isWrappedItems();
                if ( ..equalstype ) || ..equalstype ) )
                {
                    sc.addgetValueCheckertypevalueassociation ) );
                    sc.add"{" );
                    sc.indent();
                    sc.add"Element listElement = element;" );
                    if ( wrappedItems )
                    {
                        sc.add"listElement = element.addElement( \"" + fieldTagName + "\" );" );
                    }
                    sc.add"for ( Iterator iter = " + value + ".iterator(); iter.hasNext(); )" );
                    sc.add"{" );
                    sc.indent();
                    if ( isClassInModelassociation.getTo(), modelClass.getModel() ) )
                    {
                        sc.addtoType + " o = (" + toType + ") iter.next();" );
                        sc.add"write" + toType + "( o, \"" + valuesTagName + "\", listElement );" );
                    }
                    else
                    {
                        sc.addtoType + " " + singularuncapitalisefield.getName() ) ) + " = (" + toType
                            + ") iter.next();" );
                        sc.add"listElement.addElement( \"" + valuesTagName + "\" ).setText( "
                            + singularuncapitalisefield.getName() ) ) + " );" );
                    }
                    sc.unindent();
                    sc.add"}" );
                    sc.unindent();
                    sc.add"}" );
                }
                else
                {
                    //Map or Properties
                    sc.addgetValueCheckertypevaluefield ) );
                    sc.add"{" );
                    sc.indent();
                    sc.add"Element listElement = element;" );
                    if ( wrappedItems )
                    {
                        sc.add"listElement = element.addElement( \"" + fieldTagName + "\" );" );
                    }
                    sc.add"for ( Iterator iter = " + value + ".keySet().iterator(); iter.hasNext(); )" );
                    sc.add"{" );
                    sc.indent();
                    sc.add"String key = (String) iter.next();" );
                    sc.add"String value = (String) " + value + ".get( key );" );
                    if ( xmlAssociationMetadata.isMapExplode() )
                    {
                        sc.add"Element assocElement = listElement.addElement( \"" + singularassociationName )
                            + "\" );" );
                        sc.add"assocElement.addElement( \"key\" ).setText( key );" );
                        sc.add"assocElement.addElement( \"value\" ).setText( value );" );
                    }
                    else
                    {
                        sc.add"listElement.addElement( key ).setText( value );" );
                    }
                    sc.unindent();
                    sc.add"}" );
                    sc.unindent();
                    sc.add"}" );
                }
            }
        }
        else
        {
            sc.addgetValueCheckertypevaluefield ) );
            sc.add"{" );
            sc.indent();
            if ( "DOM".equalsfield.getType() ) )
            {
                sc.add"writeXpp3DomToElement( (Xpp3Dom) " + value + ", element );" );
                 = true;
            }
            else
            {
                sc.add"element.addElement( \"" + fieldTagName + "\" ).setText( "
                    + getValuefield.getType(), valuexmlFieldMetadata ) + " );" );
            }
            sc.unindent();
            sc.add"}" );
        }
    }
    private void writeDomHelpersJClass jClass )
    {
        JMethod method = new JMethod"writeXpp3DomToElement" );
        method.getModifiers().makePrivate();
        method.addParameternew JParameternew JClass"Xpp3Dom" ), "xpp3Dom" ) );
        method.addParameternew JParameternew JClass"Element" ), "parentElement" ) );
        JSourceCode sc = method.getSourceCode();
        sc.add"Element element = parentElement.addElement( xpp3Dom.getName() );" );
        sc.add"if ( xpp3Dom.getValue() != null )" );
        sc.add"{" );
        sc.addIndented"element.setText( xpp3Dom.getValue() );" );
        sc.add"}" );
        sc.add"for ( Iterator i = Arrays.asList( xpp3Dom.getAttributeNames() ).iterator(); i.hasNext(); )" );
        sc.add"{" );
        sc.indent();
        sc.add"String name = (String) i.next();" );
        sc.add"element.addAttribute( name, xpp3Dom.getAttribute( name ) );" );
        sc.unindent();
        sc.add"}" );
        sc.add"for ( Iterator i = Arrays.asList( xpp3Dom.getChildren() ).iterator(); i.hasNext(); )" );
        sc.add"{" );
        sc.indent();
        sc.add"Xpp3Dom child = (Xpp3Dom) i.next();" );
        sc.add"writeXpp3DomToElement( child, element );" );
        sc.unindent();
        sc.add"}" );
        jClass.addMethodmethod );
    }
New to GrepCode? Check out our FAQ X