You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2016/05/09 14:48:32 UTC
[13/35] karaf-boot git commit: JPA persistence.xml generation
JPA persistence.xml generation
Project: http://git-wip-us.apache.org/repos/asf/karaf-boot/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-boot/commit/dd56eb85
Tree: http://git-wip-us.apache.org/repos/asf/karaf-boot/tree/dd56eb85
Diff: http://git-wip-us.apache.org/repos/asf/karaf-boot/diff/dd56eb85
Branch: refs/heads/master
Commit: dd56eb8539118c462e55564becf8f1a647cf53d6
Parents: d68761c
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Apr 14 20:35:17 2016 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Apr 14 20:37:55 2016 +0200
----------------------------------------------------------------------
.../karaf-boot-starter-jpa/pom.xml | 57 ++++++++
.../org/apache/karaf/boot/jpa/EclipseLink.java | 4 +
.../org/apache/karaf/boot/jpa/Hibernate.java | 93 ++++++++++++
.../java/org/apache/karaf/boot/jpa/OpenJpa.java | 38 +++++
.../apache/karaf/boot/jpa/PersistentUnit.java | 36 +++++
.../org/apache/karaf/boot/jpa/Property.java | 13 ++
.../org/apache/karaf/boot/jpa/Provider.java | 10 ++
.../apache/karaf/boot/jpa/TransactionType.java | 6 +
.../karaf/boot/jpa/impl/JpaProcessor.java | 140 +++++++++++++++++++
.../javax.annotation.processing.Processor | 1 +
karaf-boot-starters/pom.xml | 1 +
11 files changed, 399 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/pom.xml
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/pom.xml b/karaf-boot-starters/karaf-boot-starter-jpa/pom.xml
new file mode 100644
index 0000000..c0ce5b8
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/pom.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.karaf.boot</groupId>
+ <artifactId>karaf-boot-starters</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>karaf-boot-starter-jpa</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.cmpn</artifactId>
+ <version>${osgi.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jpa_2.0_spec</artifactId>
+ <version>1.1</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <compilerArgument>-proc:none</compilerArgument>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/EclipseLink.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/EclipseLink.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/EclipseLink.java
new file mode 100644
index 0000000..f1cba0d
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/EclipseLink.java
@@ -0,0 +1,4 @@
+package org.apache.karaf.boot.jpa;
+
+public interface EclipseLink {
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Hibernate.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Hibernate.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Hibernate.java
new file mode 100644
index 0000000..06361d4
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Hibernate.java
@@ -0,0 +1,93 @@
+package org.apache.karaf.boot.jpa;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.karaf.boot.jpa.PersistentUnit.ProviderProperty;
+
+public interface Hibernate {
+
+ @ProviderProperty("hibernate.query.substitutions")
+ @Target(ElementType.TYPE)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface QuerySubstitutions {
+ String value();
+ }
+
+ @ProviderProperty("hibernate.hbm2ddl.auto")
+ @Target(ElementType.TYPE)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface Hbm2DdlAuto {
+ Hbm2DdlAutoType value();
+ }
+
+ @ProviderProperty("hibernate.dialect")
+ @Target(ElementType.TYPE)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface Dialect {
+ DialectType value();
+ }
+
+ enum DialectType {
+ Cache71,
+ DataDirectOracle9,
+ DB2390,
+ DB2400,
+ DB2,
+ Derby,
+ Firebird,
+ FrontBase,
+ H2,
+ HSQL,
+ Informix,
+ Ingres10,
+ Ingres9,
+ Ingres,
+ Interbase,
+ JDataStore,
+ Mckoi,
+ MimerSQL,
+ MySQL5,
+ MySQL5InnoDB,
+ MySQL,
+ MySQLInnoDB,
+ MySQLMyISAM,
+ Oracle10g,
+ Oracle8i,
+ Oracle9,
+ Oracle9i,
+ Oracle,
+ Pointbase,
+ PostgresPlus,
+ PostgreSQL,
+ Progress,
+ RDMSOS2200,
+ SAPDB,
+ SQLServer2008,
+ SQLServer,
+ Sybase11,
+ SybaseAnywhere,
+ SybaseASE15,
+ Sybase,
+ Teradata,
+ TimesTen;
+
+ public String toString() {
+ return "org.hibernate.dialect." + super.toString() + "Dialect";
+ }
+ }
+
+ enum Hbm2DdlAutoType {
+ Validate,
+ Update,
+ Create,
+ CreateDrop;
+
+ public String toString() {
+ return super.toString().toLowerCase();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/OpenJpa.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/OpenJpa.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/OpenJpa.java
new file mode 100644
index 0000000..01186fc
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/OpenJpa.java
@@ -0,0 +1,38 @@
+package org.apache.karaf.boot.jpa;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.karaf.boot.jpa.PersistentUnit.ProviderProperty;
+
+public interface OpenJpa {
+
+ @ProviderProperty("openjpa.AutoClear")
+ @Target(ElementType.TYPE)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface AutoClear {
+ Value value();
+ enum Value {
+ Datastore, All;
+ public String toString() {
+ return super.toString().toLowerCase();
+ }
+ }
+ }
+
+ @ProviderProperty("openjpa.AutoDetach")
+ @Target(ElementType.TYPE)
+ @Retention(RetentionPolicy.SOURCE)
+ @interface AutoDetach {
+ Value value();
+ enum Value {
+ Close, Commit, Nontx_Read;
+ public String toString() {
+ return super.toString().toLowerCase().replace('_', '-');
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/PersistentUnit.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/PersistentUnit.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/PersistentUnit.java
new file mode 100644
index 0000000..ada2ef3
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/PersistentUnit.java
@@ -0,0 +1,36 @@
+package org.apache.karaf.boot.jpa;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.SOURCE)
+public @interface PersistentUnit {
+
+ String name();
+
+ String description() default "";
+
+ TransactionType transactionType() default TransactionType.RESOURCE_LOCAL;
+
+ Provider provider() default Provider.Default;
+
+ String providerName() default "";
+
+ String jtaDataSource() default "";
+
+ String nonJtaDataSource() default "";
+
+ // TODO: mapping-file, jar-file, class, exclude-unlisted-classes, shared-cache-mode, validation-mode
+
+ Property[] properties() default {};
+
+
+ @Target(ElementType.ANNOTATION_TYPE)
+ @interface ProviderProperty {
+ String value();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Property.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Property.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Property.java
new file mode 100644
index 0000000..5cce58c
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Property.java
@@ -0,0 +1,13 @@
+package org.apache.karaf.boot.jpa;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.SOURCE)
+public @interface Property {
+
+ String name();
+
+ String value();
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Provider.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Provider.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Provider.java
new file mode 100644
index 0000000..13a62d4
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/Provider.java
@@ -0,0 +1,10 @@
+package org.apache.karaf.boot.jpa;
+
+public enum Provider {
+
+ Default,
+ Hibernate,
+ OpenJpa,
+ EclipseLink;
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/TransactionType.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/TransactionType.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/TransactionType.java
new file mode 100644
index 0000000..53e76d2
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/TransactionType.java
@@ -0,0 +1,6 @@
+package org.apache.karaf.boot.jpa;
+
+public enum TransactionType {
+ RESOURCE_LOCAL,
+ JTA
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/impl/JpaProcessor.java
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/impl/JpaProcessor.java b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/impl/JpaProcessor.java
new file mode 100644
index 0000000..4becbc2
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/java/org/apache/karaf/boot/jpa/impl/JpaProcessor.java
@@ -0,0 +1,140 @@
+package org.apache.karaf.boot.jpa.impl;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Messager;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
+import javax.tools.Diagnostic.Kind;
+import javax.tools.FileObject;
+import javax.tools.StandardLocation;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.karaf.boot.jpa.PersistentUnit;
+import org.apache.karaf.boot.jpa.Property;
+import org.apache.karaf.boot.jpa.Provider;
+
+public class JpaProcessor extends AbstractProcessor {
+
+ public JpaProcessor() {
+ }
+
+ @Override
+ public Set<String> getSupportedAnnotationTypes() {
+ return new HashSet<String>(Arrays.asList(
+ PersistentUnit.class.getName()
+ ));
+ }
+
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ Map<PersistentUnit, List<? extends AnnotationMirror>> units = new HashMap<PersistentUnit, List<? extends AnnotationMirror>>();
+
+
+ for (Element elem : roundEnv.getElementsAnnotatedWith(PersistentUnit.class)) {
+ PersistentUnit pu = elem.getAnnotation(PersistentUnit.class);
+ units.put(pu, elem.getAnnotationMirrors());
+ }
+ if (!units.isEmpty()) {
+ try {
+ Set<String> puNames = new HashSet<String>();
+ FileObject o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT,
+ "", "META-INF/persistence.xml");
+ PrintWriter w = new PrintWriter(o.openWriter());
+ w.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ w.println("<persistence version=\"2.0\" xmlns=\"http://java.sun.com/xml/ns/persistence\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">");
+ for (PersistentUnit pu : units.keySet()) {
+ if (pu.name() == null || pu.name().isEmpty()) {
+ throw new IOException("Missing persistent unit name");
+ }
+ if (!puNames.add(pu.name())) {
+ throw new IOException("Duplicate persistent unit name: " + pu.name());
+ }
+ w.println(" <persistence-unit name=\"" + pu.name() + "\" transaction-type=\"" + pu.transactionType().toString() + "\">");
+ if (!pu.description().isEmpty()) {
+ w.println(" <description>" + pu.description() + "</description>");
+ }
+ if (pu.provider() != Provider.Default || !pu.providerName().isEmpty()) {
+ if (pu.provider() != Provider.Default && !pu.providerName().isEmpty()) {
+ throw new IOException("At most one of provider and providerName can be used");
+ }
+ String name;
+ if (!pu.providerName().isEmpty()) {
+ name = pu.providerName();
+ } else {
+ switch (pu.provider()) {
+ case Hibernate:
+ name = "org.hibernate.jpa.HibernatePersistenceProvider";
+ break;
+ default:
+ // TODO
+ throw new IOException("Unsupported provider: " + pu.provider());
+ }
+ }
+ w.println(" <provider>" + name + "</provider>");
+ }
+ if (!pu.jtaDataSource().isEmpty()) {
+ w.println(" <jta-data-source>" + pu.jtaDataSource() + "</jta-data-source>");
+ }
+ if (!pu.nonJtaDataSource().isEmpty()) {
+ w.println(" <non-jta-data-source>" + pu.nonJtaDataSource() + "</non-jta-data-source>");
+ }
+ if (pu.properties().length > 0) {
+ w.println(" <properties>");
+ for (Property property : pu.properties()) {
+ w.println(" <property name=\"" + property.name() + "\" value=\"" + property.value() + "\"/>");
+ }
+
+
+ for (AnnotationMirror annMirror : units.get(pu)) {
+
+ String name = null;
+ for (AnnotationMirror a : processingEnv.getElementUtils().getAllAnnotationMirrors(annMirror.getAnnotationType().asElement())) {
+ if (a.toString().startsWith("@org.apache.karaf.boot.jpa.PersistentUnit.ProviderProperty")) {
+ name = a.getElementValues().values().iterator().next().getValue().toString();
+ break;
+ }
+ }
+ if (name != null) {
+ String value = annMirror.getElementValues().values().iterator().next().getValue().toString();
+ w.println(" <property name=\"" + name + "\" value=\"" + value + "\"/>");
+ }
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation: " + annMirror);
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation type: " + annMirror.getAnnotationType());
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation annot: " + annMirror.getAnnotationType().getAnnotationMirrors());
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation annot: " + processingEnv.getElementUtils().getAllAnnotationMirrors(annMirror.getAnnotationType().asElement()));
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation values: " + annMirror.getElementValues());
+// if (annMirror.getAnnotationType().getAnnotation(PersistentUnit.ProviderProperty.class) != null) {
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation ok");
+// } else {
+// processingEnv.getMessager().printMessage(Kind.MANDATORY_WARNING, "Annotation nok");
+// }
+ }
+
+ w.println(" </properties>");
+ }
+ w.println(" </persistence-unit>");
+ }
+ w.println("</persistence>");
+ w.close();
+ processingEnv.getMessager().printMessage(Kind.NOTE, "Generated META-INF/persistence.xml");
+ } catch (IOException e) {
+ processingEnv.getMessager().printMessage(Kind.ERROR, "Error: " + e.getMessage());
+ }
+ }
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/karaf-boot-starter-jpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/karaf-boot-starter-jpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..eb83448
--- /dev/null
+++ b/karaf-boot-starters/karaf-boot-starter-jpa/src/main/resources/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+org.apache.karaf.boot.jpa.impl.JpaProcessor
http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/dd56eb85/karaf-boot-starters/pom.xml
----------------------------------------------------------------------
diff --git a/karaf-boot-starters/pom.xml b/karaf-boot-starters/pom.xml
index caa5d44..8a22ae1 100644
--- a/karaf-boot-starters/pom.xml
+++ b/karaf-boot-starters/pom.xml
@@ -36,6 +36,7 @@
<module>karaf-boot-starter-ds</module>
<module>karaf-boot-starter-shell</module>
<module>karaf-boot-starter-web</module>
+ <module>karaf-boot-starter-jpa</module>
</modules>
</project>
\ No newline at end of file