You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/04/15 20:33:24 UTC

svn commit: r934511 - in /openjpa/branches/2.0.x: openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java openjpa-project/src/doc/manual/jpa_overview_criteria.xml scripts/mmg.bat scripts/mmg.options

Author: ppoddar
Date: Thu Apr 15 18:33:24 2010
New Revision: 934511

URL: http://svn.apache.org/viewvc?rev=934511&view=rev
Log:
OPENJPA-1628: Usability changes. Merged from trunk revision 934507

Removed:
    openjpa/branches/2.0.x/scripts/mmg.options
Modified:
    openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
    openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
    openjpa/branches/2.0.x/scripts/mmg.bat

Modified: openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=934511&r1=934510&r2=934511&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
+++ openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Thu Apr 15 18:33:24 2010
@@ -20,14 +20,10 @@ package org.apache.openjpa.persistence.m
 
 import static javax.lang.model.SourceVersion.RELEASE_6;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.io.PrintWriter;
-import java.net.URI;
 import java.net.URL;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -47,11 +43,7 @@ import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
 import javax.persistence.metamodel.StaticMetamodel;
 import javax.tools.Diagnostic;
-import javax.tools.JavaCompiler;
 import javax.tools.JavaFileObject;
-import javax.tools.StandardJavaFileManager;
-import javax.tools.StandardLocation;
-import javax.tools.ToolProvider;
 
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.MetaDataFactory;
@@ -66,39 +58,29 @@ import org.apache.openjpa.persistence.ut
  * This tool is invoked during compilation for JDK6 compiler if 
  * <UL>
  * <LI>OpenJPA and JPA libraries are available in the compiler classpath
- * and <LI>Annotation Processor option <code>-Aopenjpa.generate=true</code> is specified.
+ * and <LI>Annotation Processor option <code>-Aopenjpa.metamodel=true</code> is specified.
  * </UL>
  * <br>
  * <B>Usage</B><br>
- * <code>$ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generated=true mypackage/MyEntity.java</code><br>
+ * <code>$ javac -classpath path/to/openjpa-all.jar -Aopenjpa.metamodel=true mypackage/MyEntity.java</code><br>
  * will generate source code for canonical meta-model class <code>mypackage.MyEntity_.java</code>.
+ * The source code is generated relative to the directory specified in <code>-s</code> option
+ * of <code>javac</code> compiler and defaulted to the current directory.
  * <p>
- * The Annotation Processor also recognizes the following options (none of them are mandatory).
- * Each of the following option key can also be prefixed with <code>openjpa.</code> to distinguish if multiple 
- * annotation processors are active during compilation:<br>
+ * The Annotation Processor also recognizes the following options (none of them are mandatory):<br>
  * <TABLE border="1">
- * <TR><TD>-Alog={log level}<TD>The logging level. Default is <code>WARN</code>. Permissible values are 
+ * <TR><TD>-Aopenjpa.log={log level}<TD>The logging level. Default is <code>WARN</code>. Permissible values are 
  *     <code>TRACE</code>, <code>INFO</code>, <code>WARN</code> or <code> ERROR</code>.
- * <TR><TD>-Asource={n}         <TD>Java source version of the generated code. Default is <code>6</code>.
- * <TR><TD>-Anaming={class name}        <TD>fully-qualified name of a class implementing 
+ * <TR><TD>-Aopenjpa.source={n}          <TD>Java source version of the generated code. Default is <code>6</code>.
+ * <TR><TD>-Aopenjpa.naming={class name} <TD>fully-qualified name of a class implementing 
  * <code>org.apache.openjpa.meta.MetaDataFactory</code> that determines
  * the name of a meta-class given the name of the original persistent Java entity class. Defaults to
  * <code>org.apache.openjpa.persistence.PersistenceMetaDataFactory</code> which appends a underscore character
  * (<code>_</code>) to the original Java class name. 
- * <TR><TD>-Aheader={url}           <TD>
+ * <TR><TD>-Aopenjpa.header={url}        <TD>
  * A url whose content will appear as comment header to the generated file(s). Recognizes special value
  * <code>ASL</code> for Apache Source License header as comment. By default adds a OpenJPA proprietary   
  * text.
- * <TR><TD>-Aout={dir}                      <TD>
- * A directory in the local file system. The generated files will be written <em>relative</em> to this directory
- * according to the package structure i.e. if <code>dir</code> is specified as <code>/myproject/generated-src</code>
- * then the generated source code will be written to <code>/myproject/generated-src/mypackage/MyEntity_.java</code>.
- * If this option is not specified, then an attempt will be made to write the generated source file in the same
- * directory of the source code of original class <code>mypackage.MyEntity</code>. The source code location for 
- * <code>mypackage.MyEntity</code> can only be determined for Sun JDK6 and <code>tools.jar</code> being available 
- * to the compiler classpath. If the source code location for the original class can not be determined, and the 
- * option is not specified, then the generated source code is written relative to the current directory according 
- * to the package structure.  
  * </TABLE>
  * <br>
  *
@@ -111,19 +93,16 @@ import org.apache.openjpa.persistence.ut
     "javax.persistence.Entity",
     "javax.persistence.Embeddable", 
     "javax.persistence.MappedSuperclass" })
-@SupportedOptions({ "openjpa.log", "log", 
-                     "openjpa.out", "out", 
-                     "openjpa.source", "source",
-                     "openjpa.naming", "naming",
-                     "openjpa.header", "header",
-                     "openjpa.generate"
+@SupportedOptions({ "openjpa.log", 
+                    "openjpa.source",
+                    "openjpa.naming",
+                    "openjpa.header",
+                    "openjpa.metamodel"
                   })
 @SupportedSourceVersion(RELEASE_6)
 
 public class AnnotationProcessor6 extends AbstractProcessor {
     private SourceAnnotationHandler handler;
-    private StandardJavaFileManager fileManager;
-    private boolean isUserSpecifiedOutputLocation;
     private MetaDataFactory factory;
     private int generatedSourceVersion = 6;
     private CompileTimeLogger logger;
@@ -206,13 +185,12 @@ public class AnnotationProcessor6 extend
     @Override
     public synchronized void init(ProcessingEnvironment processingEnv) {
         super.init(processingEnv);
-        active = "true".equalsIgnoreCase(getOptionValue("openjpa.generate"));
+        active = "true".equalsIgnoreCase(getOptionValue("openjpa.metamodel"));
         if (!active)
             return;
         processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, _loc.get("mmg-tool-banner").toString());
-        logger = new CompileTimeLogger(processingEnv, getOptionValue("openjpa.log", "log"));
+        logger = new CompileTimeLogger(processingEnv, getOptionValue("openjpa.log"));
         setSourceVersion();
-        setFileManager();
         setNamingPolicy();
         setHeader();
         handler = new SourceAnnotationHandler(processingEnv, logger);
@@ -252,8 +230,7 @@ public class AnnotationProcessor6 extend
         annotate(source, originalClass);
         TypeElement supCls = handler.getPersistentSupertype(e);
         if (supCls != null) {
-            String superName = factory.getMetaModelClassName(
-                    supCls.toString());
+            String superName = factory.getMetaModelClassName(supCls.toString());
             source.getTopLevelClass().setSuper(superName);
         }
         try {
@@ -327,12 +304,12 @@ public class AnnotationProcessor6 extend
     }
     
     /**
-     * Parse annotation processor option <code>-Asource=n</code> to detect
+     * Parse annotation processor option <code>-Aopenjpa.source=n</code> to detect
      * the source version for the generated classes. 
      * n must be a integer. Default or wrong specification returns 6.
      */
     private void setSourceVersion() {
-        String version = getOptionValue("openjpa.source", "source");
+        String version = getOptionValue("openjpa.source");
         if (version != null) {
             try {
                 generatedSourceVersion = Integer.parseInt(version);
@@ -346,7 +323,7 @@ public class AnnotationProcessor6 extend
     }
     
     private void setNamingPolicy() {
-        String policy = getOptionValue("openjpa.naming","naming");
+        String policy = getOptionValue("openjpa.naming");
         if (policy != null) {
             try {
                 factory = (MetaDataFactory)Class.forName(policy).newInstance();
@@ -360,7 +337,7 @@ public class AnnotationProcessor6 extend
     }
     
     private void setHeader() {
-        String headerOption = getOptionValue("openjpa.header", "header");
+        String headerOption = getOptionValue("openjpa.header");
         if (headerOption == null) {
             return;
         }
@@ -376,54 +353,15 @@ public class AnnotationProcessor6 extend
         }
     }
     
-    private void setFileManager() {
-        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        fileManager = compiler.getStandardFileManager(null, null, null);
-        String outDir = getOptionValue("openjpa.out", "out");
-        if (outDir != null)
-           isUserSpecifiedOutputLocation = setSourceOutputDirectory(new File(outDir));
-    }
-
     /**
      * Creates a file where source code of the given metaClass will be written.
      * 
      */
     private PrintWriter createSourceFile(String originalClass, String metaClass, TypeElement e) 
         throws IOException {
-        if (!isUserSpecifiedOutputLocation) {
-            setSourceOutputDirectory(OutputPath.getAbsoluteDirectory(processingEnv, e));
-        }
-        JavaFileObject javaFile = fileManager.getJavaFileForOutput(StandardLocation.SOURCE_OUTPUT, 
-            metaClass, JavaFileObject.Kind.SOURCE, 
-            null); // do not use sibling hint because of indeterminable behavior across JDK 
-        logger.info(_loc.get("mmg-process", javaFile.toUri()));
-        OutputStream out = javaFile.openOutputStream();
-        PrintWriter writer = new PrintWriter(out);
-        return writer;
-    }
-    
-    /**
-     * Sets the output directory for generated source files.
-     * Tries to create the directory structure if does not exist.
-     * 
-     * @return true if the output has been set successfully.
-     */
-    boolean setSourceOutputDirectory(File outDir) {
-        if (outDir == null)
-            return false;
-        if (!outDir.exists()) {
-            if (!outDir.mkdirs()) {
-                logger.warn(_loc.get("mmg-bad-out", outDir, StandardLocation.SOURCE_OUTPUT));
-                return false;
-            }
-        }
-        try {
-            fileManager.setLocation(StandardLocation.SOURCE_OUTPUT, Collections.singleton(outDir));
-            return true;
-        } catch (IOException e) {
-            logger.warn(_loc.get("mmg-bad-out", outDir, StandardLocation.SOURCE_OUTPUT));
-            return false;
-        }
+        JavaFileObject javaFile = processingEnv.getFiler().createSourceFile(metaClass, e);
+        logger.info(_loc.get("mmg-process", javaFile.toUri().normalize()));
+        return new PrintWriter(javaFile.openWriter());
     }
     
     /**
@@ -437,97 +375,4 @@ public class AnnotationProcessor6 extend
         }
         return null;
     }
-    
-    /**
-     * An utility class to determine the source file corresponding to a {@link TypeElement}.
-     * The utility uses Sun JDK internal API (com.sun.tools.*) and hence works reflectively
-     * to avoid compile-time dependency.
-     *   
-     * @author Pinaki Poddar
-     *
-     */
-    public static class OutputPath {
-        private static Class<?> trees = null;
-        static {
-            try {
-                trees = Class.forName("com.sun.source.util.Trees");
-            } catch (Throwable t) {
-                
-            }
-        }
-        
-        /**
-         * Gets the directory relative to the Java source file corresponding to the TypeElement.
-         * 
-         * @return null if the com.sun.source.util.* package is not available or the given TypeElement
-         * does not correspond to a compilation unit associated to a source file.
-         */
-        public static File getAbsoluteDirectory(ProcessingEnvironment env, TypeElement e) {
-            if (trees == null)
-                return null;
-            try {
-                // Trees root = Trees.instance(env);
-                Object root = trees.getMethod("instance", new Class[]{ProcessingEnvironment.class})
-                    .invoke(null, env);
-                
-                // TreePath path = root.getPath(e);
-                Object path = root.getClass().getMethod("getPath", new Class[]{Element.class})
-                    .invoke(root, e);
-                
-                // CompilationUnitTree unit = path.getCompilationUnit();
-                Object unit = path.getClass().getMethod("getCompilationUnit", (Class[])null)
-                    .invoke(path, (Object[])null);
-                
-                // JavaFileObject f = unit.getSourceFile();
-                JavaFileObject f = (JavaFileObject)unit.getClass().getMethod("getSourceFile", (Class[])null)
-                    .invoke(unit, (Object[])null);
-                
-                URI uri = f.toUri();
-                File dir = getParentFile(new File(uri.toURL().getPath()), 
-                        packageDepth(e.getQualifiedName().toString()));
-                return dir;
-            } catch (Throwable t) {
-                return null;
-            }
-        }
-        
-        /**
-         * Gets the parent of the given file recursively traversing to given number of levels.
-         */
-        public static File getParentFile(File f, int n) {
-            if (n < 0)
-                return f;
-            if (n == 0)
-                return f.getParentFile();
-            return getParentFile(f.getParentFile(), n-1);
-        }
-        
-        public static int packageDepth(String s) {
-            String pkg = getPackageName(s);
-            if (pkg == null)
-                return 0;
-            int depth = 1;
-            int i = 0;
-            while ((i = pkg.indexOf('.')) != -1) {
-                depth++;
-                pkg = pkg.substring(i+1);
-            }
-            return depth;
-        }
-        
-        public static String getPackageName(String s) {
-            if (s == null)
-                return null;
-            int i = s.lastIndexOf('.');
-            return (i == -1) ? null : s.substring(0, i);
-        }
-        
-        public static String getSimpleName(String s) {
-            if (s == null)
-                return null;
-            int i = s.lastIndexOf('.');
-            return (i == -1) ? s : s.substring(i+1);
-        }
-    }
-
 }

Modified: openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml?rev=934511&r1=934510&r2=934511&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml (original)
+++ openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml Thu Apr 15 18:33:24 2010
@@ -168,32 +168,31 @@ Annotation processing tool generates sou
 the annotated source code of persistent entity. 
 This tool is invoked during compilation for JDK6 compiler if OpenJPA and JPA 
 libraries are specified in the compiler <code>-classpath</code> option <emphasis>and</emphasis>
-Annotation processor option <code>-Aopenjpa.generate=true</code> is specified.
+Annotation processor option <code>-Aopenjpa.metamodel=true</code> is specified.
     <programlisting>
- $ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generate=true mypackage/MyEntity.java
+ $ javac -classpath path/to/openjpa-all.jar -Aopenjpa.metamodel=true mypackage/MyEntity.java
     </programlisting>
 will generate source code for canonical meta-model class <code>mypackage.MyEntity_.java</code>.
       </para>
       
       <para>
 The Annotation Processor recognizes the following options specified in the command-line with <code>-A</code> 
-(none of them are mandatory). Each of the following option key can also be prefixed with <code>openjpa.</code> 
-to distinguish if multiple annotation processors are active during compilation.
+(none of them are mandatory).
     <itemizedlist>
         <listitem>
 			<para>
-              -Alog=TRACE|INFO|WARN|ERROR : The logging level. Default is <code>WARN</code>.
+              -Aopenjpa.log=TRACE|INFO|WARN|ERROR : The logging level. Default is <code>WARN</code>.
             </para>
         </listitem>
         <listitem>
 			<para>
-             -Asource=&lt;n&gt; : where &lt;n&gt; denotes the integral number for Java source 
+             -Aopenjpa.source=&lt;n&gt; : where &lt;n&gt; denotes the integral number for Java source 
              version of the generated code. Default is <code>6</code>.
              </para>
         </listitem>
         <listitem>
 			<para>
-               -Anaming=class name : fully-qualified name of a class implementing 
+               -Aopenjpa.naming=class name : fully-qualified name of a class implementing 
                <code>org.apache.openjpa.meta.MetaDataFactory</code> that determines
 the name of a meta-class given the name of the original persistent Java entity class. Defaults to
 <code>org.apache.openjpa.persistence.PersistenceMetaDataFactory</code> which appends a underscore character
@@ -202,7 +201,7 @@ the name of a meta-class given the name 
         </listitem>
         <listitem>
 			<para>
-               -Aheader=&lt;url&gt; : A url whose content will appear as comment header to the generated file(s). 
+               -Aopenjpa.header=&lt;url&gt; : A url whose content will appear as comment header to the generated file(s). 
                Recognizes special value <code>ASL</code> for Apache Source License header as comment. 
                By default, adds a OpenJPA proprietary text as comment block.
              </para>

Modified: openjpa/branches/2.0.x/scripts/mmg.bat
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/scripts/mmg.bat?rev=934511&r1=934510&r2=934511&view=diff
==============================================================================
--- openjpa/branches/2.0.x/scripts/mmg.bat (original)
+++ openjpa/branches/2.0.x/scripts/mmg.bat Thu Apr 15 18:33:24 2010
@@ -21,34 +21,45 @@
 @rem Example Batch script to generate canonical meta-model classes
 @rem
 @rem Usage
-@rem   $ mmg.bat <options.file> <class.list>
+@rem   $ mmg.bat <class.list>
 @rem 
 @rem The canonical meta-model classes can be generated during compilation of
 @rem domain classes. This batch file compiles a set of classes (X.java) listed 
-@rem in <class.list> file. The compiler is invoked with an annotation
-@rem processor which generates a meta-model class X_.java for each X.java. 
-@rem The options for annotation processor is specified in <options.file>.
+@rem in <class.list> file. The compiler discoveres the annotation
+@rem processor if openjpa classes are in classpath. The discovered annotation
+@rem processor, however, is active only if -Aopenjpa.metamodel=true is set.  
 @rem 
 @rem See also 
-@rem    mmg.options       : The options to Javac compiler 
 @rem    domain-class.list : The domain classes to be compiled
 @rem ---------------------------------------------------------------------------
 @echo off
 setlocal
-set JAVA_HOME=c:\java\jdk1.6.0_10
 set JAVAC=%JAVA_HOME%\bin\javac
 
+@rem ---------------------------------------------------------------------------
+@rem Compiler classpath shown for a typical OpenJPA development environment in Windows. 
+@rem The essential aspect is openjpa libraries must be in the compiler's classpath.
 set M_REPO="C:\Documents and Settings\Administrator\.m2\repository"
 set SPEC=geronimo-jpa_2.0_spec
 set VERSION=1.0-EA9-SNAPSHOT
 set JPA_LIB=%M_REPO%\org\apache\geronimo\specs\%SPEC%\%VERSION%\%SPEC%-%VERSION%.jar
 
 set CLASSPATH=%JPA_LIB%
-set CLASSPATH=%CLASSPATH%;.\openjpa-lib\target\classes
-set CLASSPATH=%CLASSPATH%;.\openjpa-persistence\src\main\resources
-set CLASSPATH=%CLASSPATH%;.\openjpa-persistence\target\classes
-set CLASSPATH=%CLASSPATH%;.\openjpa-kernel\target\classes
+set CLASSPATH=%CLASSPATH%;..\openjpa\src\main\resources
+set CLASSPATH=%CLASSPATH%;..\openjpa-persistence\target\classes
+set CLASSPATH=%CLASSPATH%;..\openjpa-kernel\target\classes
+set CLASSPATH=%CLASSPATH%;..\openjpa-lib\target\classes
+
+@rem ---------------------------------------------------------------------------
+echo Using Java Compiler %JAVAC%
+%JAVAC% -version
+
+@rem ---------------------------------------------------------------------------
+@rem Root directory for of the generated source files. Specified as -s option 
+set GEN_DIR=../openjpa-persistence-jdbc/src/test/java
 
-%JAVAC% -cp %CLASSPATH% @%1 @%2
+@rem Only one option is shown for logging. Other available options are documented in
+@rem OpenJPA User Manual and JavaDoc
+%JAVAC% -cp %CLASSPATH% -s %GEN_DIR% -Aopenjpa.metamodel=true -Aopenjpa.log=TRACE @%1
 
 endlocal



Re: svn commit: r934511 - in /openjpa/branches/2.0.x: openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java openjpa-project/src/doc/manual/jpa_overview_criteria.xml scripts/mmg.bat scripts/mmg.options

Posted by Donald Woods <dw...@apache.org>.
Does this also include the changes made in trunk r933342?

URL: http://svn.apache.org/viewvc?rev=933342&view=rev
Log:
OPENJPA-1628,OPENJPA-1187,OPENJPA-1622: Use javac's -s option to control
output rather than extraneous -Aout option


-Donald


On 4/15/10 2:33 PM, ppoddar@apache.org wrote:
> Author: ppoddar
> Date: Thu Apr 15 18:33:24 2010
> New Revision: 934511
> 
> URL: http://svn.apache.org/viewvc?rev=934511&view=rev
> Log:
> OPENJPA-1628: Usability changes. Merged from trunk revision 934507
> 
> Removed:
>     openjpa/branches/2.0.x/scripts/mmg.options
> Modified:
>     openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
>     openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
>     openjpa/branches/2.0.x/scripts/mmg.bat
> 
> Modified: openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
> URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=934511&r1=934510&r2=934511&view=diff
> ==============================================================================
> --- openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
> +++ openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Thu Apr 15 18:33:24 2010
> @@ -20,14 +20,10 @@ package org.apache.openjpa.persistence.m
>  
>  import static javax.lang.model.SourceVersion.RELEASE_6;
>  
> -import java.io.File;
>  import java.io.IOException;
> -import java.io.OutputStream;
>  import java.io.PrintWriter;
> -import java.net.URI;
>  import java.net.URL;
>  import java.util.Arrays;
> -import java.util.Collections;
>  import java.util.Date;
>  import java.util.List;
>  import java.util.Map;
> @@ -47,11 +43,7 @@ import javax.lang.model.type.TypeMirror;
>  import javax.lang.model.util.Elements;
>  import javax.persistence.metamodel.StaticMetamodel;
>  import javax.tools.Diagnostic;
> -import javax.tools.JavaCompiler;
>  import javax.tools.JavaFileObject;
> -import javax.tools.StandardJavaFileManager;
> -import javax.tools.StandardLocation;
> -import javax.tools.ToolProvider;
>  
>  import org.apache.openjpa.lib.util.Localizer;
>  import org.apache.openjpa.meta.MetaDataFactory;
> @@ -66,39 +58,29 @@ import org.apache.openjpa.persistence.ut
>   * This tool is invoked during compilation for JDK6 compiler if 
>   * <UL>
>   * <LI>OpenJPA and JPA libraries are available in the compiler classpath
> - * and <LI>Annotation Processor option <code>-Aopenjpa.generate=true</code> is specified.
> + * and <LI>Annotation Processor option <code>-Aopenjpa.metamodel=true</code> is specified.
>   * </UL>
>   * <br>
>   * <B>Usage</B><br>
> - * <code>$ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generated=true mypackage/MyEntity.java</code><br>
> + * <code>$ javac -classpath path/to/openjpa-all.jar -Aopenjpa.metamodel=true mypackage/MyEntity.java</code><br>
>   * will generate source code for canonical meta-model class <code>mypackage.MyEntity_.java</code>.
> + * The source code is generated relative to the directory specified in <code>-s</code> option
> + * of <code>javac</code> compiler and defaulted to the current directory.
>   * <p>
> - * The Annotation Processor also recognizes the following options (none of them are mandatory).
> - * Each of the following option key can also be prefixed with <code>openjpa.</code> to distinguish if multiple 
> - * annotation processors are active during compilation:<br>
> + * The Annotation Processor also recognizes the following options (none of them are mandatory):<br>
>   * <TABLE border="1">
> - * <TR><TD>-Alog={log level}<TD>The logging level. Default is <code>WARN</code>. Permissible values are 
> + * <TR><TD>-Aopenjpa.log={log level}<TD>The logging level. Default is <code>WARN</code>. Permissible values are 
>   *     <code>TRACE</code>, <code>INFO</code>, <code>WARN</code> or <code> ERROR</code>.
> - * <TR><TD>-Asource={n}         <TD>Java source version of the generated code. Default is <code>6</code>.
> - * <TR><TD>-Anaming={class name}        <TD>fully-qualified name of a class implementing 
> + * <TR><TD>-Aopenjpa.source={n}          <TD>Java source version of the generated code. Default is <code>6</code>.
> + * <TR><TD>-Aopenjpa.naming={class name} <TD>fully-qualified name of a class implementing 
>   * <code>org.apache.openjpa.meta.MetaDataFactory</code> that determines
>   * the name of a meta-class given the name of the original persistent Java entity class. Defaults to
>   * <code>org.apache.openjpa.persistence.PersistenceMetaDataFactory</code> which appends a underscore character
>   * (<code>_</code>) to the original Java class name. 
> - * <TR><TD>-Aheader={url}           <TD>
> + * <TR><TD>-Aopenjpa.header={url}        <TD>
>   * A url whose content will appear as comment header to the generated file(s). Recognizes special value
>   * <code>ASL</code> for Apache Source License header as comment. By default adds a OpenJPA proprietary   
>   * text.
> - * <TR><TD>-Aout={dir}                      <TD>
> - * A directory in the local file system. The generated files will be written <em>relative</em> to this directory
> - * according to the package structure i.e. if <code>dir</code> is specified as <code>/myproject/generated-src</code>
> - * then the generated source code will be written to <code>/myproject/generated-src/mypackage/MyEntity_.java</code>.
> - * If this option is not specified, then an attempt will be made to write the generated source file in the same
> - * directory of the source code of original class <code>mypackage.MyEntity</code>. The source code location for 
> - * <code>mypackage.MyEntity</code> can only be determined for Sun JDK6 and <code>tools.jar</code> being available 
> - * to the compiler classpath. If the source code location for the original class can not be determined, and the 
> - * option is not specified, then the generated source code is written relative to the current directory according 
> - * to the package structure.  
>   * </TABLE>
>   * <br>
>   *
> @@ -111,19 +93,16 @@ import org.apache.openjpa.persistence.ut
>      "javax.persistence.Entity",
>      "javax.persistence.Embeddable", 
>      "javax.persistence.MappedSuperclass" })
> -@SupportedOptions({ "openjpa.log", "log", 
> -                     "openjpa.out", "out", 
> -                     "openjpa.source", "source",
> -                     "openjpa.naming", "naming",
> -                     "openjpa.header", "header",
> -                     "openjpa.generate"
> +@SupportedOptions({ "openjpa.log", 
> +                    "openjpa.source",
> +                    "openjpa.naming",
> +                    "openjpa.header",
> +                    "openjpa.metamodel"
>                    })
>  @SupportedSourceVersion(RELEASE_6)
>  
>  public class AnnotationProcessor6 extends AbstractProcessor {
>      private SourceAnnotationHandler handler;
> -    private StandardJavaFileManager fileManager;
> -    private boolean isUserSpecifiedOutputLocation;
>      private MetaDataFactory factory;
>      private int generatedSourceVersion = 6;
>      private CompileTimeLogger logger;
> @@ -206,13 +185,12 @@ public class AnnotationProcessor6 extend
>      @Override
>      public synchronized void init(ProcessingEnvironment processingEnv) {
>          super.init(processingEnv);
> -        active = "true".equalsIgnoreCase(getOptionValue("openjpa.generate"));
> +        active = "true".equalsIgnoreCase(getOptionValue("openjpa.metamodel"));
>          if (!active)
>              return;
>          processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, _loc.get("mmg-tool-banner").toString());
> -        logger = new CompileTimeLogger(processingEnv, getOptionValue("openjpa.log", "log"));
> +        logger = new CompileTimeLogger(processingEnv, getOptionValue("openjpa.log"));
>          setSourceVersion();
> -        setFileManager();
>          setNamingPolicy();
>          setHeader();
>          handler = new SourceAnnotationHandler(processingEnv, logger);
> @@ -252,8 +230,7 @@ public class AnnotationProcessor6 extend
>          annotate(source, originalClass);
>          TypeElement supCls = handler.getPersistentSupertype(e);
>          if (supCls != null) {
> -            String superName = factory.getMetaModelClassName(
> -                    supCls.toString());
> +            String superName = factory.getMetaModelClassName(supCls.toString());
>              source.getTopLevelClass().setSuper(superName);
>          }
>          try {
> @@ -327,12 +304,12 @@ public class AnnotationProcessor6 extend
>      }
>      
>      /**
> -     * Parse annotation processor option <code>-Asource=n</code> to detect
> +     * Parse annotation processor option <code>-Aopenjpa.source=n</code> to detect
>       * the source version for the generated classes. 
>       * n must be a integer. Default or wrong specification returns 6.
>       */
>      private void setSourceVersion() {
> -        String version = getOptionValue("openjpa.source", "source");
> +        String version = getOptionValue("openjpa.source");
>          if (version != null) {
>              try {
>                  generatedSourceVersion = Integer.parseInt(version);
> @@ -346,7 +323,7 @@ public class AnnotationProcessor6 extend
>      }
>      
>      private void setNamingPolicy() {
> -        String policy = getOptionValue("openjpa.naming","naming");
> +        String policy = getOptionValue("openjpa.naming");
>          if (policy != null) {
>              try {
>                  factory = (MetaDataFactory)Class.forName(policy).newInstance();
> @@ -360,7 +337,7 @@ public class AnnotationProcessor6 extend
>      }
>      
>      private void setHeader() {
> -        String headerOption = getOptionValue("openjpa.header", "header");
> +        String headerOption = getOptionValue("openjpa.header");
>          if (headerOption == null) {
>              return;
>          }
> @@ -376,54 +353,15 @@ public class AnnotationProcessor6 extend
>          }
>      }
>      
> -    private void setFileManager() {
> -        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
> -        fileManager = compiler.getStandardFileManager(null, null, null);
> -        String outDir = getOptionValue("openjpa.out", "out");
> -        if (outDir != null)
> -           isUserSpecifiedOutputLocation = setSourceOutputDirectory(new File(outDir));
> -    }
> -
>      /**
>       * Creates a file where source code of the given metaClass will be written.
>       * 
>       */
>      private PrintWriter createSourceFile(String originalClass, String metaClass, TypeElement e) 
>          throws IOException {
> -        if (!isUserSpecifiedOutputLocation) {
> -            setSourceOutputDirectory(OutputPath.getAbsoluteDirectory(processingEnv, e));
> -        }
> -        JavaFileObject javaFile = fileManager.getJavaFileForOutput(StandardLocation.SOURCE_OUTPUT, 
> -            metaClass, JavaFileObject.Kind.SOURCE, 
> -            null); // do not use sibling hint because of indeterminable behavior across JDK 
> -        logger.info(_loc.get("mmg-process", javaFile.toUri()));
> -        OutputStream out = javaFile.openOutputStream();
> -        PrintWriter writer = new PrintWriter(out);
> -        return writer;
> -    }
> -    
> -    /**
> -     * Sets the output directory for generated source files.
> -     * Tries to create the directory structure if does not exist.
> -     * 
> -     * @return true if the output has been set successfully.
> -     */
> -    boolean setSourceOutputDirectory(File outDir) {
> -        if (outDir == null)
> -            return false;
> -        if (!outDir.exists()) {
> -            if (!outDir.mkdirs()) {
> -                logger.warn(_loc.get("mmg-bad-out", outDir, StandardLocation.SOURCE_OUTPUT));
> -                return false;
> -            }
> -        }
> -        try {
> -            fileManager.setLocation(StandardLocation.SOURCE_OUTPUT, Collections.singleton(outDir));
> -            return true;
> -        } catch (IOException e) {
> -            logger.warn(_loc.get("mmg-bad-out", outDir, StandardLocation.SOURCE_OUTPUT));
> -            return false;
> -        }
> +        JavaFileObject javaFile = processingEnv.getFiler().createSourceFile(metaClass, e);
> +        logger.info(_loc.get("mmg-process", javaFile.toUri().normalize()));
> +        return new PrintWriter(javaFile.openWriter());
>      }
>      
>      /**
> @@ -437,97 +375,4 @@ public class AnnotationProcessor6 extend
>          }
>          return null;
>      }
> -    
> -    /**
> -     * An utility class to determine the source file corresponding to a {@link TypeElement}.
> -     * The utility uses Sun JDK internal API (com.sun.tools.*) and hence works reflectively
> -     * to avoid compile-time dependency.
> -     *   
> -     * @author Pinaki Poddar
> -     *
> -     */
> -    public static class OutputPath {
> -        private static Class<?> trees = null;
> -        static {
> -            try {
> -                trees = Class.forName("com.sun.source.util.Trees");
> -            } catch (Throwable t) {
> -                
> -            }
> -        }
> -        
> -        /**
> -         * Gets the directory relative to the Java source file corresponding to the TypeElement.
> -         * 
> -         * @return null if the com.sun.source.util.* package is not available or the given TypeElement
> -         * does not correspond to a compilation unit associated to a source file.
> -         */
> -        public static File getAbsoluteDirectory(ProcessingEnvironment env, TypeElement e) {
> -            if (trees == null)
> -                return null;
> -            try {
> -                // Trees root = Trees.instance(env);
> -                Object root = trees.getMethod("instance", new Class[]{ProcessingEnvironment.class})
> -                    .invoke(null, env);
> -                
> -                // TreePath path = root.getPath(e);
> -                Object path = root.getClass().getMethod("getPath", new Class[]{Element.class})
> -                    .invoke(root, e);
> -                
> -                // CompilationUnitTree unit = path.getCompilationUnit();
> -                Object unit = path.getClass().getMethod("getCompilationUnit", (Class[])null)
> -                    .invoke(path, (Object[])null);
> -                
> -                // JavaFileObject f = unit.getSourceFile();
> -                JavaFileObject f = (JavaFileObject)unit.getClass().getMethod("getSourceFile", (Class[])null)
> -                    .invoke(unit, (Object[])null);
> -                
> -                URI uri = f.toUri();
> -                File dir = getParentFile(new File(uri.toURL().getPath()), 
> -                        packageDepth(e.getQualifiedName().toString()));
> -                return dir;
> -            } catch (Throwable t) {
> -                return null;
> -            }
> -        }
> -        
> -        /**
> -         * Gets the parent of the given file recursively traversing to given number of levels.
> -         */
> -        public static File getParentFile(File f, int n) {
> -            if (n < 0)
> -                return f;
> -            if (n == 0)
> -                return f.getParentFile();
> -            return getParentFile(f.getParentFile(), n-1);
> -        }
> -        
> -        public static int packageDepth(String s) {
> -            String pkg = getPackageName(s);
> -            if (pkg == null)
> -                return 0;
> -            int depth = 1;
> -            int i = 0;
> -            while ((i = pkg.indexOf('.')) != -1) {
> -                depth++;
> -                pkg = pkg.substring(i+1);
> -            }
> -            return depth;
> -        }
> -        
> -        public static String getPackageName(String s) {
> -            if (s == null)
> -                return null;
> -            int i = s.lastIndexOf('.');
> -            return (i == -1) ? null : s.substring(0, i);
> -        }
> -        
> -        public static String getSimpleName(String s) {
> -            if (s == null)
> -                return null;
> -            int i = s.lastIndexOf('.');
> -            return (i == -1) ? s : s.substring(i+1);
> -        }
> -    }
> -
>  }
> 
> Modified: openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
> URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml?rev=934511&r1=934510&r2=934511&view=diff
> ==============================================================================
> --- openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml (original)
> +++ openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml Thu Apr 15 18:33:24 2010
> @@ -168,32 +168,31 @@ Annotation processing tool generates sou
>  the annotated source code of persistent entity. 
>  This tool is invoked during compilation for JDK6 compiler if OpenJPA and JPA 
>  libraries are specified in the compiler <code>-classpath</code> option <emphasis>and</emphasis>
> -Annotation processor option <code>-Aopenjpa.generate=true</code> is specified.
> +Annotation processor option <code>-Aopenjpa.metamodel=true</code> is specified.
>      <programlisting>
> - $ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generate=true mypackage/MyEntity.java
> + $ javac -classpath path/to/openjpa-all.jar -Aopenjpa.metamodel=true mypackage/MyEntity.java
>      </programlisting>
>  will generate source code for canonical meta-model class <code>mypackage.MyEntity_.java</code>.
>        </para>
>        
>        <para>
>  The Annotation Processor recognizes the following options specified in the command-line with <code>-A</code> 
> -(none of them are mandatory). Each of the following option key can also be prefixed with <code>openjpa.</code> 
> -to distinguish if multiple annotation processors are active during compilation.
> +(none of them are mandatory).
>      <itemizedlist>
>          <listitem>
>  			<para>
> -              -Alog=TRACE|INFO|WARN|ERROR : The logging level. Default is <code>WARN</code>.
> +              -Aopenjpa.log=TRACE|INFO|WARN|ERROR : The logging level. Default is <code>WARN</code>.
>              </para>
>          </listitem>
>          <listitem>
>  			<para>
> -             -Asource=&lt;n&gt; : where &lt;n&gt; denotes the integral number for Java source 
> +             -Aopenjpa.source=&lt;n&gt; : where &lt;n&gt; denotes the integral number for Java source 
>               version of the generated code. Default is <code>6</code>.
>               </para>
>          </listitem>
>          <listitem>
>  			<para>
> -               -Anaming=class name : fully-qualified name of a class implementing 
> +               -Aopenjpa.naming=class name : fully-qualified name of a class implementing 
>                 <code>org.apache.openjpa.meta.MetaDataFactory</code> that determines
>  the name of a meta-class given the name of the original persistent Java entity class. Defaults to
>  <code>org.apache.openjpa.persistence.PersistenceMetaDataFactory</code> which appends a underscore character
> @@ -202,7 +201,7 @@ the name of a meta-class given the name 
>          </listitem>
>          <listitem>
>  			<para>
> -               -Aheader=&lt;url&gt; : A url whose content will appear as comment header to the generated file(s). 
> +               -Aopenjpa.header=&lt;url&gt; : A url whose content will appear as comment header to the generated file(s). 
>                 Recognizes special value <code>ASL</code> for Apache Source License header as comment. 
>                 By default, adds a OpenJPA proprietary text as comment block.
>               </para>
> 
> Modified: openjpa/branches/2.0.x/scripts/mmg.bat
> URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/scripts/mmg.bat?rev=934511&r1=934510&r2=934511&view=diff
> ==============================================================================
> --- openjpa/branches/2.0.x/scripts/mmg.bat (original)
> +++ openjpa/branches/2.0.x/scripts/mmg.bat Thu Apr 15 18:33:24 2010
> @@ -21,34 +21,45 @@
>  @rem Example Batch script to generate canonical meta-model classes
>  @rem
>  @rem Usage
> -@rem   $ mmg.bat <options.file> <class.list>
> +@rem   $ mmg.bat <class.list>
>  @rem 
>  @rem The canonical meta-model classes can be generated during compilation of
>  @rem domain classes. This batch file compiles a set of classes (X.java) listed 
> -@rem in <class.list> file. The compiler is invoked with an annotation
> -@rem processor which generates a meta-model class X_.java for each X.java. 
> -@rem The options for annotation processor is specified in <options.file>.
> +@rem in <class.list> file. The compiler discoveres the annotation
> +@rem processor if openjpa classes are in classpath. The discovered annotation
> +@rem processor, however, is active only if -Aopenjpa.metamodel=true is set.  
>  @rem 
>  @rem See also 
> -@rem    mmg.options       : The options to Javac compiler 
>  @rem    domain-class.list : The domain classes to be compiled
>  @rem ---------------------------------------------------------------------------
>  @echo off
>  setlocal
> -set JAVA_HOME=c:\java\jdk1.6.0_10
>  set JAVAC=%JAVA_HOME%\bin\javac
>  
> +@rem ---------------------------------------------------------------------------
> +@rem Compiler classpath shown for a typical OpenJPA development environment in Windows. 
> +@rem The essential aspect is openjpa libraries must be in the compiler's classpath.
>  set M_REPO="C:\Documents and Settings\Administrator\.m2\repository"
>  set SPEC=geronimo-jpa_2.0_spec
>  set VERSION=1.0-EA9-SNAPSHOT
>  set JPA_LIB=%M_REPO%\org\apache\geronimo\specs\%SPEC%\%VERSION%\%SPEC%-%VERSION%.jar
>  
>  set CLASSPATH=%JPA_LIB%
> -set CLASSPATH=%CLASSPATH%;.\openjpa-lib\target\classes
> -set CLASSPATH=%CLASSPATH%;.\openjpa-persistence\src\main\resources
> -set CLASSPATH=%CLASSPATH%;.\openjpa-persistence\target\classes
> -set CLASSPATH=%CLASSPATH%;.\openjpa-kernel\target\classes
> +set CLASSPATH=%CLASSPATH%;..\openjpa\src\main\resources
> +set CLASSPATH=%CLASSPATH%;..\openjpa-persistence\target\classes
> +set CLASSPATH=%CLASSPATH%;..\openjpa-kernel\target\classes
> +set CLASSPATH=%CLASSPATH%;..\openjpa-lib\target\classes
> +
> +@rem ---------------------------------------------------------------------------
> +echo Using Java Compiler %JAVAC%
> +%JAVAC% -version
> +
> +@rem ---------------------------------------------------------------------------
> +@rem Root directory for of the generated source files. Specified as -s option 
> +set GEN_DIR=../openjpa-persistence-jdbc/src/test/java
>  
> -%JAVAC% -cp %CLASSPATH% @%1 @%2
> +@rem Only one option is shown for logging. Other available options are documented in
> +@rem OpenJPA User Manual and JavaDoc
> +%JAVAC% -cp %CLASSPATH% -s %GEN_DIR% -Aopenjpa.metamodel=true -Aopenjpa.log=TRACE @%1
>  
>  endlocal
> 
> 
>