Author: dwoods
Date: Fri Apr  9 19:46:24 2010
New Revision: 932560

URL: http://svn.apache.org/viewvc?rev=932560&view=rev
Log:
OPENJPA-1622 Invoking MetaModel generator.  Merged in from trunk.  Contributed 
by Pinaki.

Added:
    openjpa/branches/2.0.x/openjpa/src/main/resources/
    openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/
    openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/
    
openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
Modified:
    
openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
    
openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/CompileTimeLogger.java
    
openjpa/branches/2.0.x/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
    openjpa/branches/2.0.x/pom.xml

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=932560&r1=932559&r2=932560&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
 Fri Apr  9 19:46:24 2010
@@ -30,6 +30,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Generated;
@@ -45,6 +46,7 @@ import javax.lang.model.type.TypeKind;
 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;
@@ -56,33 +58,38 @@ import org.apache.openjpa.meta.MetaDataF
 import org.apache.openjpa.persistence.PersistenceMetaDataFactory;
 import org.apache.openjpa.persistence.util.SourceCode;
 
+
 /**
  * Annotation processing tool generates source code for a meta-model class 
given 
  * the annotated source code of persistent entity.
  * <p>
- * This tool is invoked during compilation for JDK6 compiler if OpenJPA and 
JPA 
- * libraries are specified in the compiler <code>-processorpath</code> option.
+ * 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.
+ * </UL>
  * <br>
  * <B>Usage</B><br>
- * <code>$ javac -processorpath path/to/openjpa-all.jar 
mypackage/MyEntity.java</code><br>
+ * <code>$ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generated=true 
mypackage/MyEntity.java</code><br>
  * will generate source code for canonical meta-model class 
<code>mypackage.MyEntity_.java</code>.
  * <p>
- * The Annotation Processor recognizes the following options (none of them are 
mandatory):
- * <LI><code>-Alog=TRACE|INFO|WARN|ERROR</code><br>
- * The logging level. Default is <code>WARN</code>.
- * <LI>-Asource=&lt;n&gt;<br>
- * where &lt;n&gt; denotes the integral number for Java source version of the 
generated code. 
- * Default is <code>6</code>.
- * <LI>-Anaming=class name <br>
- * fully-qualified name of a class implementing 
<code>org.apache.openjpa.meta.MetaDataFactory</code> that determines
+ * 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>
+ * <TABLE border="1">
+ * <TR><TD>-Alog={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 
+ * <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. 
- * <LI>-Aheader=&lt;url&gt;<br>
+ * <TR><TD>-Aheader={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.
- * <LI>-Aout=dir<br>
+ * <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>.
@@ -92,7 +99,9 @@ import org.apache.openjpa.persistence.ut
  * 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>
+ *
  * @author Pinaki Poddar
  * 
  * @since 2.0.0
@@ -102,17 +111,24 @@ import org.apache.openjpa.persistence.ut
     "javax.persistence.Entity",
     "javax.persistence.Embeddable", 
     "javax.persistence.MappedSuperclass" })
-...@supportedoptions( { "log", "out", "source", "naming", "header" })
+...@supportedoptions({ "openjpa.log", "log", 
+                     "openjpa.out", "out", 
+                     "openjpa.source", "source",
+                     "openjpa.naming", "naming",
+                     "openjpa.header", "header",
+                     "openjpa.generate"
+                  })
 @SupportedSourceVersion(RELEASE_6)
 
 public class AnnotationProcessor6 extends AbstractProcessor {
     private SourceAnnotationHandler handler;
     private StandardJavaFileManager fileManager;
-    private boolean isUserSpecifiedOutputLocation = false;
+    private boolean isUserSpecifiedOutputLocation;
     private MetaDataFactory factory;
     private int generatedSourceVersion = 6;
     private CompileTimeLogger logger;
     private String header;
+    private boolean active;
     private static Localizer _loc =  
Localizer.forPackage(AnnotationProcessor6.class);
 
     /**
@@ -190,8 +206,11 @@ public class AnnotationProcessor6 extend
     @Override
     public synchronized void init(ProcessingEnvironment processingEnv) {
         super.init(processingEnv);
-        logger = new CompileTimeLogger(processingEnv);
-        logger.info(_loc.get("mmg-tool-banner"));
+        active = "true".equalsIgnoreCase(getOptionValue("openjpa.generate"));
+        if (!active)
+            return;
+        processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, 
_loc.get("mmg-tool-banner").toString());
+        logger = new CompileTimeLogger(processingEnv, 
getOptionValue("openjpa.log", "log"));
         setSourceVersion();
         setFileManager();
         setNamingPolicy();
@@ -203,9 +222,8 @@ public class AnnotationProcessor6 extend
      * The entry point for java compiler.
      */
     @Override
-    public boolean process(Set<? extends TypeElement> annos,
-        RoundEnvironment roundEnv) {
-        if (!roundEnv.processingOver()) {
+    public boolean process(Set<? extends TypeElement> annos, RoundEnvironment 
roundEnv) {
+        if (active && !roundEnv.processingOver()) {
             Set<? extends Element> elements = roundEnv.getRootElements();
             for (Element e : elements) {
                 process((TypeElement) e);
@@ -314,7 +332,7 @@ public class AnnotationProcessor6 extend
      * n must be a integer. Default or wrong specification returns 6.
      */
     private void setSourceVersion() {
-        String version = processingEnv.getOptions().get("source");
+        String version = getOptionValue("openjpa.source", "source");
         if (version != null) {
             try {
                 generatedSourceVersion = Integer.parseInt(version);
@@ -328,7 +346,7 @@ public class AnnotationProcessor6 extend
     }
     
     private void setNamingPolicy() {
-        String policy = processingEnv.getOptions().get("naming");
+        String policy = getOptionValue("openjpa.naming","naming");
         if (policy != null) {
             try {
                 factory = (MetaDataFactory)Class.forName(policy).newInstance();
@@ -342,7 +360,7 @@ public class AnnotationProcessor6 extend
     }
     
     private void setHeader() {
-        String headerOption = processingEnv.getOptions().get("header");
+        String headerOption = getOptionValue("openjpa.header", "header");
         if (headerOption == null) {
             return;
         }
@@ -361,7 +379,7 @@ public class AnnotationProcessor6 extend
     private void setFileManager() {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         fileManager = compiler.getStandardFileManager(null, null, null);
-        String outDir = processingEnv.getOptions().get("out");
+        String outDir = getOptionValue("openjpa.out", "out");
         if (outDir != null)
            isUserSpecifiedOutputLocation = setSourceOutputDirectory(new 
File(outDir));
     }
@@ -409,6 +427,18 @@ public class AnnotationProcessor6 extend
     }
     
     /**
+     * Get the value for the given keys, whoever matches first, in the current 
available options.
+     */
+    private String getOptionValue(String... keys) {
+        Map<String,String> options = processingEnv.getOptions();
+        for (String key : keys) {
+            if (options.containsKey(key))
+                return options.get(key);
+        }
+        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.

Modified: 
openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/CompileTimeLogger.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/CompileTimeLogger.java?rev=932560&r1=932559&r2=932560&view=diff
==============================================================================
--- 
openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/CompileTimeLogger.java
 (original)
+++ 
openjpa/branches/2.0.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/CompileTimeLogger.java
 Fri Apr  9 19:46:24 2010
@@ -34,16 +34,14 @@ import org.apache.openjpa.lib.util.Local
  */
 public class CompileTimeLogger {
     private static enum Level {TRACE, INFO, WARN, ERROR};
-    private static Localizer _loc = Localizer.forPackage(
-            CompileTimeLogger.class);
+    private static Localizer _loc = 
Localizer.forPackage(CompileTimeLogger.class);
     private static Level DEFAULT_LEVEL = Level.WARN;
     private int logLevel;
     private Messager messager;
     
-    public CompileTimeLogger(ProcessingEnvironment env) {
+    public CompileTimeLogger(ProcessingEnvironment env, String level) {
         messager = env.getMessager();
         
-        String level = env.getOptions().get("log");
         if (level == null) {
             logLevel = DEFAULT_LEVEL.ordinal();
             return;

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=932560&r1=932559&r2=932560&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 
Fri Apr  9 19:46:24 2010
@@ -167,16 +167,18 @@ List result = query.getResultList();    
 Annotation processing tool generates source code for a metamodel class given 
 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>-processorpath</code> option.
+libraries are specified in the compiler <code>-classpath</code> option 
<emphasis>and</emphasis>
+Annotation processor option <code>-Aopenjpa.generate=true</code> is specified.
     <programlisting>
- $ javac -processor org.apache.openjpa.persistence.meta.AnnotationProcessor6 
-processorpath path/to/openjpa-all.jar mypackage/MyEntity.java
+ $ javac -classpath path/to/openjpa-all.jar -Aopenjpa.generate=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):
+(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.
     <itemizedlist>
         <listitem>
                        <para>

Added: 
openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor?rev=932560&view=auto
==============================================================================
--- 
openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
 (added)
+++ 
openjpa/branches/2.0.x/openjpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
 Fri Apr  9 19:46:24 2010
@@ -0,0 +1 @@
+org.apache.openjpa.persistence.meta.AnnotationProcessor6

Modified: openjpa/branches/2.0.x/pom.xml
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.0.x/pom.xml?rev=932560&r1=932559&r2=932560&view=diff
==============================================================================
--- openjpa/branches/2.0.x/pom.xml (original)
+++ openjpa/branches/2.0.x/pom.xml Fri Apr  9 19:46:24 2010
@@ -274,6 +274,7 @@
                                         javax.persistence.Persistence
                                     -->
                                     
<exclude>**/javax.persistence.spi.PersistenceProvider</exclude>
+                                    
<exclude>**/javax.annotation.processing.Processor</exclude>
 
                                     <!--
                                         comments are usupported by our rsrc 
parser
@@ -441,6 +442,7 @@
                                     javax.persistence.Persistence
                                 -->
                                 
<exclude>**/javax.persistence.spi.PersistenceProvider</exclude>
+                                
<exclude>**/javax.annotation.processing.Processor</exclude>
 
                                 <!--
                                     comments are usupported by our rsrc parser
@@ -854,6 +856,7 @@
                                 javax.persistence.Persistence
                             -->
                             
<exclude>**/javax.persistence.spi.PersistenceProvider</exclude>
+                            
<exclude>**/javax.annotation.processing.Processor</exclude>
 
                             <!--
                                 comments are usupported by our rsrc parser


Reply via email to