applied patch provided by Willem Jiang (see SMX4-355)
git-svn-id: https://svn.apache.org/repos/asf/servicemix/smx4/specs/trunk@813452 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/java-persistence-api-1.1.1/pom.xml b/java-persistence-api-1.1.1/pom.xml
new file mode 100644
index 0000000..85a2b9d
--- /dev/null
+++ b/java-persistence-api-1.1.1/pom.xml
@@ -0,0 +1,176 @@
+<?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/maven-v4_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.servicemix.specs</groupId>
+ <artifactId>specs</artifactId>
+ <version>1.4-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.apache.servicemix.specs</groupId>
+ <artifactId>org.apache.servicemix.specs.java-persistence-api-1.1.1</artifactId>
+ <packaging>bundle</packaging>
+ <version>1.4-SNAPSHOT</version>
+ <name>Apache ServiceMix Specs :: JAVA PERSISTENCE API 1.4</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.servicemix.specs</groupId>
+ <artifactId>org.apache.servicemix.specs.locator</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jpa_3.0_spec</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+ <Export-Package>javax.persistence*;version=1.1.1;-split-package:=merge-first</Export-Package>
+ <Import-Package>*</Import-Package>
+ <Private-Package>org.apache.servicemix.specs.locator;-split-package:=merge-first</Private-Package>
+ <Bundle-Activator>org.apache.servicemix.specs.locator.Activator</Bundle-Activator>
+ <Implementation-Title>Apache ServiceMix</Implementation-Title>
+ <Implementation-Version>${project.version}</Implementation-Version>
+ </instructions>
+ <unpackBundle>true</unpackBundle>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <artifactSet>
+ <includes>
+ <include>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</include>
+ <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
+ <include>${project.groupId}:${project.artifactId}</include>
+ </includes>
+ </artifactSet>
+ <filters>
+ <filter>
+ <artifact>org.apache.geronimo.specs:geronimo-jpa_3.0_spec</artifact>
+ <excludes>
+ <exclude>javax/**</exclude>
+ </excludes>
+ </filter>
+ <filter>
+ <artifact>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</artifact>
+ <excludes>
+ <exclude>org/**</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ <createSourcesJar>${createSourcesJar}</createSourcesJar>
+ <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+ <createDependencyReducedPom>true</createDependencyReducedPom>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>deploy</id>
+ <properties>
+ <createSourcesJar>true</createSourcesJar>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpack-sources</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.apache.servicemix.specs</groupId>
+ <artifactId>org.apache.servicemix.specs.locator</artifactId>
+ <classifier>sources</classifier>
+ </artifactItem>
+ </artifactItems>
+ <outputDirectory>${project.build.directory}/sources</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>package</id>
+ <phase>package</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <minmemory>128m</minmemory>
+ <maxmemory>512m</maxmemory>
+ <sourcepath>${project.build.directory}/sources</sourcepath>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java b/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java
new file mode 100644
index 0000000..35dee31
--- /dev/null
+++ b/java-persistence-api-1.1.1/src/main/java/javax/persistence/Persistence.java
@@ -0,0 +1,194 @@
+/*
+ * 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.
+ */
+
+//
+// This source code implements specifications defined by the Java
+// Community Process. In order to remain compliant with the specification
+// DO NOT add / change / or delete method signatures!
+//
+package javax.persistence;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.spi.PersistenceProvider;
+/**
+ * @version $Rev$ $Date$
+ */
+
+/**
+ * Bootstrap class that is used to obtain {@link javax.persistence.EntityManagerFactory}
+ * references.
+ */
+public class Persistence {
+
+ protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
+ // Changed to the hard coded PERSISTENCE_PROVIDER value to pass signature tests.
+ // public static final java.lang.String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName();
+ public static final java.lang.String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";
+ static final String PERSISTENCE_PROVIDER_PROPERTY = "javax.persistence.provider";
+ static final String PERSISTENCE_PROVIDER_SERVICE = "META-INF/services/"
+ + PersistenceProvider.class.getName();
+ /**
+ * Create and return an EntityManagerFactory for the named persistence unit.
+ *
+ * @param persistenceUnitName The name of the persistence unit
+ * @return The factory that creates EntityManagers configured according to the
+ * specified persistence unit
+ */
+ public static EntityManagerFactory createEntityManagerFactory(
+ String persistenceUnitName) {
+ return createEntityManagerFactory(persistenceUnitName, Collections.EMPTY_MAP);
+ }
+
+ /**
+ * Create and return an EntityManagerFactory for the named persistence unit using the
+ * given properties.
+ *
+ * @param persistenceUnitName The name of the persistence unit
+ * @param properties Additional properties to use when creating the factory. The values of
+ * these properties override any values that may have been configured
+ * elsewhere.
+ * @return The factory that creates EntityManagers configured according to the
+ * specified persistence unit.
+ */
+ public static EntityManagerFactory createEntityManagerFactory(
+ String persistenceUnitName,
+ Map properties) {
+
+ if (properties == null) {
+ properties = Collections.EMPTY_MAP;
+ }
+
+ // start by loading a provider explicitly specified in properties. The spec
+ // doesn't seem to forbid providers that are not deployed as a service
+ Object providerName = properties.get(PERSISTENCE_PROVIDER_PROPERTY);
+ if (providerName instanceof String) {
+ EntityManagerFactory factory = createFactory(
+ providerName.toString(),
+ persistenceUnitName,
+ properties);
+ if (factory != null) {
+ return factory;
+ }
+ }
+
+ //If we are deployed into an OSGi environment, leverage it
+ Class providerClass = org.apache.servicemix.specs.locator.OsgiLocator.locate("javax.persistence.spi.PersistenceProvider");
+ if (providerClass != null) {
+ try {
+ PersistenceProvider provider = (PersistenceProvider) providerClass
+ .newInstance();
+ return provider.createEntityManagerFactory(persistenceUnitName,
+ properties);
+ }
+ catch (Exception e) {
+ throw new PersistenceException("Provider error. Provider: "
+ + providerName, e);
+ }
+ }
+
+ // load correctly deployed providers
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Enumeration<URL> providers = loader
+ .getResources(PERSISTENCE_PROVIDER_SERVICE);
+ while (providers.hasMoreElements()) {
+
+ String name = getProviderName(providers.nextElement());
+
+ if (name != null) {
+
+ EntityManagerFactory factory = createFactory(
+ name,
+ persistenceUnitName,
+ properties);
+
+ if (factory != null) {
+ return factory;
+ }
+ }
+ }
+ }
+ catch (IOException e) {
+ // spec doesn't mention any exceptions thrown by this method
+ }
+
+ return null;
+ }
+
+ static String getProviderName(URL url) throws IOException {
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ url.openStream(),
+ "UTF-8"));
+
+ String providerName;
+
+ try {
+ providerName = in.readLine();
+ }
+ finally {
+ in.close();
+ }
+
+ if (providerName != null) {
+ providerName = providerName.trim();
+ }
+
+ return providerName;
+ }
+
+ static EntityManagerFactory createFactory(
+ String providerName,
+ String persistenceUnitName,
+ Map properties)
+ throws PersistenceException {
+
+ Class providerClass;
+ try {
+ providerClass = Class.forName(providerName, true, Thread
+ .currentThread().getContextClassLoader());
+ }
+ catch (Exception e) {
+ throw new PersistenceException(
+ "Invalid or inaccessible provider class: " + providerName,
+ e);
+ }
+
+ try {
+ PersistenceProvider provider = (PersistenceProvider) providerClass
+ .newInstance();
+ return provider.createEntityManagerFactory(persistenceUnitName,
+ properties);
+ }
+ catch (Exception e) {
+ throw new PersistenceException("Provider error. Provider: "
+ + providerName, e);
+ }
+ }
+}
+
diff --git a/pom.xml b/pom.xml
index 74322fa..2e9eafe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
<parent>
<groupId>org.apache.servicemix</groupId>
<artifactId>servicemix-pom</artifactId>
- <version>2</version>
+ <version>3</version>
</parent>
<groupId>org.apache.servicemix.specs</groupId>
@@ -52,6 +52,7 @@
<module>jsr311-api-1.1</module>
<module>javamail-api-1.4</module>
<module>activation-api-1.1</module>
+ <module>java-persistence-api-1.1.1</module>
</modules>
<scm>