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=<n><br>
- * where <n> 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=<url><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