Author: vsiveton
Date: Wed Oct 17 06:33:15 2007
New Revision: 585489

URL: http://svn.apache.org/viewvc?rev=585489&view=rev
Log:
o fixed XMLDoclet to generated the XML from a user option
o added test case which call javadoc tool
o updated javadoc and added maven-javadoc-plugin in pom

Added:
    
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/
    
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
   (with props)
Modified:
    maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/pom.xml
    
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/main/java/org/apache/maven/jxr/java/doc/XMLDoclet.java

Modified: maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/pom.xml?rev=585489&r1=585488&r2=585489&view=diff
==============================================================================
--- maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/pom.xml (original)
+++ maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/pom.xml Wed Oct 17 
06:33:15 2007
@@ -95,4 +95,19 @@
     <antlrArtifactId>antlrall</antlrArtifactId>
     <antlrVersion>2.7.4</antlrVersion>
   </properties>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <links>
+            <link>http://java.sun.com/j2se/1.4.2/docs/api</link>
+            
<link>http://java.sun.com/j2se/1.4.2/docs/tooldocs/javadoc/doclet/</link>
+          </links>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
 </project>

Modified: 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/main/java/org/apache/maven/jxr/java/doc/XMLDoclet.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/main/java/org/apache/maven/jxr/java/doc/XMLDoclet.java?rev=585489&r1=585488&r2=585489&view=diff
==============================================================================
--- 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/main/java/org/apache/maven/jxr/java/doc/XMLDoclet.java
 (original)
+++ 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/main/java/org/apache/maven/jxr/java/doc/XMLDoclet.java
 Wed Oct 17 06:33:15 2007
@@ -20,16 +20,19 @@
  */
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Enumeration;
 import java.util.Vector;
 
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.sax.SAXTransformerFactory;
 import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
 
-import org.apache.log4j.Logger;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
@@ -37,6 +40,7 @@
 import com.sun.javadoc.ClassDoc;
 import com.sun.javadoc.ConstructorDoc;
 import com.sun.javadoc.Doc;
+import com.sun.javadoc.DocErrorReporter;
 import com.sun.javadoc.Doclet;
 import com.sun.javadoc.ExecutableMemberDoc;
 import com.sun.javadoc.FieldDoc;
@@ -57,9 +61,10 @@
 public class XMLDoclet
     extends Doclet
 {
-
-    /** Logger for this class  */
-    private static final Logger log = Logger.getLogger( XMLDoclet.class );
+    /**
+     * The specified DTD for the generated Javadoc XML.
+     */
+    public static final String XMLDOCLET_DTD = "javadoc-v04draft.dtd";
 
     private String xmlns = "jvx";
 
@@ -69,15 +74,19 @@
 
     private TransformerHandler handler = null;
 
-    private String targetFileName = "simple.xml";
-
     private Attributes emptyAtts = new AttributesImpl();
 
-    public XMLDoclet( RootDoc root )
+    /**
+     * Default constructor
+     *
+     * @param root of the Javadoc structure information
+     * @param outputXML the XML file generated by this doclet.
+     * @throws Exception if any
+     */
+    protected XMLDoclet( RootDoc root, String outputXML )
         throws Exception
     {
-
-        SAXTransformerFactory tFactory = (SAXTransformerFactory) 
SAXTransformerFactory.newInstance();
+        SAXTransformerFactory tFactory = (SAXTransformerFactory) 
TransformerFactory.newInstance();
         if ( !( tFactory.getFeature( javax.xml.transform.sax.SAXSource.FEATURE 
) && tFactory
             .getFeature( javax.xml.transform.stream.StreamResult.FEATURE ) ) )
         {
@@ -85,9 +94,13 @@
             throw new Exception( "The supplied TrAX transformer library is 
inadeguate."
                 + "Please upgrade to the latest version." );
         }
+        if ( outputXML == null )
+        {
+            throw new IllegalArgumentException( "outputXML could not be null" 
);
+        }
 
-        File writer = new File( targetFileName );
-        StreamResult result = new StreamResult( writer );
+        File outputXMLFile = new File( outputXML );
+        StreamResult result = new StreamResult( outputXMLFile );
 
         // SAX2.0 ContentHandler.
         handler = tFactory.newTransformerHandler();
@@ -96,11 +109,103 @@
         serializer.setOutputProperty( OutputKeys.ENCODING, encodingFormat );
         serializer.setOutputProperty( OutputKeys.INDENT, "yes" );
         serializer.setOutputProperty( OutputKeys.DOCTYPE_PUBLIC, 
"-//APACHE//DTD JavaDoc V0.4//EN" );
-        serializer.setOutputProperty( OutputKeys.DOCTYPE_SYSTEM, 
"javadoc-v04draft.dtd" );
+        serializer.setOutputProperty( OutputKeys.DOCTYPE_SYSTEM, XMLDOCLET_DTD 
);
 
         handler.setResult( result );
 
         javadocXML( root );
+
+        copyDtd( this.getClass().getClassLoader(), 
outputXMLFile.getParentFile() );
+    }
+
+    /** @see Doclet#validOptions(String[][], DocErrorReporter) */
+    public static boolean validOptions( String options[][], DocErrorReporter 
reporter )
+    {
+        boolean foundOutputDirOption = false;
+        for ( int i = 0; i < options.length; i++ )
+        {
+            String[] opt = options[i];
+
+            if ( opt[0].equals( "-o" ) )
+            {
+                if ( foundOutputDirOption )
+                {
+                    reporter.printError( "Only one -o option allowed." );
+                    return false;
+                }
+
+                String outputXML = opt[1];
+                if ( outputXML == null || outputXML.length() == 0 )
+                {
+                    reporter
+                        .printError( "Usage: javadoc -o 
/path/to/generatedXmlFile -doclet org.apache.maven.jxr.java.doc.XMLDoclet ..." 
);
+                    return false;
+                }
+                File outputXMLFile = new File( outputXML );
+                if ( outputXMLFile.exists() && outputXMLFile.isDirectory() )
+                {
+                    reporter.printError( "Output XML '" + outputXML + "' 
should be a file." );
+                    return false;
+                }
+                if ( !outputXMLFile.getParentFile().exists() && 
!outputXMLFile.getParentFile().mkdirs() )
+                {
+                    reporter.printError( "Cannot create the parent directory 
for: " + outputXML );
+                    return false;
+                }
+
+                foundOutputDirOption = true;
+            }
+        }
+
+        if ( !foundOutputDirOption )
+        {
+            reporter
+                .printError( "Usage: javadoc -o /path/to/generatedXmlFile 
-doclet org.apache.maven.jxr.java.doc.XMLDoclet ..." );
+            return false;
+        }
+
+        return foundOutputDirOption;
+    }
+
+    /** @see Doclet#optionLength(String) */
+    public static int optionLength( String option )
+    {
+        // -o generatedXmlFile
+        return 2;
+    }
+
+    /** @see Doclet#start(RootDoc) */
+    public static boolean start( RootDoc root )
+    {
+        try
+        {
+            new XMLDoclet( root, getOutputDir( root.options() ) );
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace();
+            return false;
+        }
+
+        return true;
+    }
+
+    // ----------------------------------------------------------------------
+    // Private
+    // ----------------------------------------------------------------------
+
+    private static String getOutputDir( String[][] options )
+    {
+        for ( int i = 0; i < options.length; i++ )
+        {
+            String[] opt = options[i];
+            if ( opt[0].equals( "-o" ) )
+            {
+                return opt[1];
+            }
+        }
+
+        throw new IllegalArgumentException( "No output option specified." );
     }
 
     /**
@@ -110,7 +215,6 @@
     private void javadocXML( RootDoc root )
         throws SAXException
     {
-
         handler.startDocument();
 
         handler.startElement( xmlns, localName, "javadoc", emptyAtts );
@@ -798,17 +902,44 @@
         }
     }
 
-    public static boolean start( RootDoc root )
+    /**
+     * Copy the Javadoc DTD near the generated XML
+     *
+     * @param classloader the given class loader, not null
+     * @param resourcesPath the path of a resources file in the given class 
loader, not null
+     * @param outputDirectory the output directory, not null
+     * @throws IOException if any
+     */
+    private static void copyDtd( ClassLoader classloader, File outputDirectory 
)
+        throws IOException
     {
-        try
+        InputStream is = classloader.getResourceAsStream( 
XMLDoclet.class.getPackage().getName().replace( ".", "/" )
+            + "/" + XMLDOCLET_DTD );
+
+        if ( is == null )
         {
-            new XMLDoclet( root );
-            return true;
+            throw new IOException( "The resource " + 
XMLDoclet.class.getPackage().getName().replace( ".", "/" ) + "/"
+                + XMLDOCLET_DTD + " doesn't exist." );
         }
-        catch ( Exception e )
+
+        File outputFile = new File( outputDirectory, XMLDOCLET_DTD );
+
+        if ( !outputFile.getParentFile().exists() )
         {
-            log.error( "Exception: " + e.getMessage(), e );
-            return false;
+            outputFile.getParentFile().mkdirs();
         }
+
+        FileOutputStream w = new FileOutputStream( outputFile );
+
+        final byte[] buffer = new byte[1024 * 4];
+        int n = 0;
+        while ( -1 != ( n = is.read( buffer ) ) )
+        {
+            w.write( buffer, 0, n );
+        }
+
+        is.close();
+
+        w.close();
     }
 }

Added: 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java?rev=585489&view=auto
==============================================================================
--- 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
 (added)
+++ 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
 Wed Oct 17 06:33:15 2007
@@ -0,0 +1,77 @@
+package org.apache.maven.jxr.java.doc;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import com.sun.tools.javadoc.Main;
+
+/**
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Siveton</a>
+ * @version $Id$
+ */
+public class XMLDocletTest
+    extends TestCase
+{
+    /**
+     * Call Javadoc tool with XML doclet.
+     *
+     * @throws Exception if any
+     */
+    public void testDefaultExecute()
+        throws Exception
+    {
+        final String basedir = new File( "" ).getAbsolutePath();
+
+        File outputXML = new File( basedir, 
"target/unit/xmldoclet-default/javadoc.xml" );
+
+        // test phase is after compile phase, so we are sure that classes dir 
exists
+        // TODO wrap syso and syserr
+        String[] args = {
+            "-package",
+            "-sourcepath",
+            new File( basedir, "src/test/resources/javasrc" 
).getAbsolutePath(),
+            "-doclet",
+            "org.apache.maven.jxr.java.doc.XMLDoclet",
+            "-docletpath",
+            new File( basedir, "target/classes" ).getAbsolutePath(),
+            "-o",
+            outputXML.getAbsolutePath(),
+            "test.packA",
+            "test.packB",
+            "test.packC",
+            "test.packD",
+            "test.packE",
+            "test.packF",
+            "test.packG.a",
+            "test.packG.b" };
+
+        Main.execute( "javadoc", XMLDoclet.class.getName(), args );
+
+        // Generated files
+        assertTrue( outputXML.exists() );
+        assertTrue( outputXML.length() > 0 );
+        File dtd = new File( basedir, "target/unit/xmldoclet-default/" + 
XMLDoclet.XMLDOCLET_DTD );
+        assertTrue( dtd.exists() );
+        assertTrue( dtd.length() > 0 );
+    }
+}

Propchange: 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/sandbox/trunk/jxr/maven-jxr/maven-jxr-java/src/test/java/org/apache/maven/jxr/java/doc/XMLDocletTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"


Reply via email to