You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Donald Woods <dw...@apache.org> on 2010/04/15 23:21:36 UTC
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
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=<n> : where <n> denotes the integral number for Java source
> + -Aopenjpa.source=<n> : where <n> 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=<url> : A url whose content will appear as comment header to the generated file(s).
> + -Aopenjpa.header=<url> : 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
>
>
>