mirror of https://github.com/apache/openjpa.git
OPENJPA-932 Committing code and tests contributed by Rick Curtis
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@769901 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1677b481b2
commit
bd50e177bb
|
@ -54,6 +54,32 @@
|
||||||
<id>jdk5-compiler</id>
|
<id>jdk5-compiler</id>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<additionalClasspathElements>
|
||||||
|
<additionalClasspathElement>${basedir}/target/test-classes/second-persistence.jar</additionalClasspathElement>
|
||||||
|
</additionalClasspathElements>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<jar destfile="${basedir}/target/test-classes/second-persistence.jar"
|
||||||
|
basedir="${basedir}/src/test/resources/second-persistence" />
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
@ -78,6 +104,32 @@
|
||||||
<id>jdk6-compiler</id>
|
<id>jdk6-compiler</id>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<additionalClasspathElements>
|
||||||
|
<additionalClasspathElement>${basedir}/target/test-classes/second-persistence.jar</additionalClasspathElement>
|
||||||
|
</additionalClasspathElements>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<jar destfile="${basedir}/target/test-classes/second-persistence.jar"
|
||||||
|
basedir="${basedir}/src/test/resources/second-persistence" />
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
|
|
@ -27,9 +27,12 @@ import java.security.PrivilegedActionException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.MissingResourceException;
|
import java.util.MissingResourceException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.persistence.spi.PersistenceUnitInfo;
|
import javax.persistence.spi.PersistenceUnitInfo;
|
||||||
import javax.persistence.spi.PersistenceUnitTransactionType;
|
import javax.persistence.spi.PersistenceUnitTransactionType;
|
||||||
|
@ -82,6 +85,8 @@ public class PersistenceProductDerivation
|
||||||
private static final Localizer _loc = Localizer.forPackage
|
private static final Localizer _loc = Localizer.forPackage
|
||||||
(PersistenceProductDerivation.class);
|
(PersistenceProductDerivation.class);
|
||||||
|
|
||||||
|
private HashMap<String, PUNameCollision> _puNameCollisions
|
||||||
|
= new HashMap<String,PUNameCollision>();
|
||||||
public void putBrokerFactoryAliases(Map m) {
|
public void putBrokerFactoryAliases(Map m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,15 +271,17 @@ public class PersistenceProductDerivation
|
||||||
public List getAnchorsInResource(String resource) throws Exception {
|
public List getAnchorsInResource(String resource) throws Exception {
|
||||||
ConfigurationParser parser = new ConfigurationParser(null);
|
ConfigurationParser parser = new ConfigurationParser(null);
|
||||||
try {
|
try {
|
||||||
|
List results = new ArrayList();
|
||||||
ClassLoader loader = AccessController.doPrivileged(
|
ClassLoader loader = AccessController.doPrivileged(
|
||||||
J2DoPrivHelper.getContextClassLoaderAction());
|
J2DoPrivHelper.getContextClassLoaderAction());
|
||||||
List<URL> urls = getResourceURLs(resource, loader);
|
List<URL> urls = getResourceURLs(resource, loader);
|
||||||
if (urls != null) {
|
if (urls != null) {
|
||||||
for (URL url : urls) {
|
for (URL url : urls) {
|
||||||
parser.parse(url);
|
parser.parse(url);
|
||||||
|
results.addAll(getUnitNames(parser));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return getUnitNames(parser);
|
return results;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// not all configuration files are XML; return null if unparsable
|
// not all configuration files are XML; return null if unparsable
|
||||||
return null;
|
return null;
|
||||||
|
@ -318,6 +325,21 @@ public class PersistenceProductDerivation
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method checks to see if the provided <code>puName</code> was
|
||||||
|
* detected in multiple resources. If a collision is detected, a warning
|
||||||
|
* will be logged and this method will return <code>true</code>.
|
||||||
|
* <p>
|
||||||
|
*/
|
||||||
|
public boolean checkPuNameCollisions(Log logger,String puName){
|
||||||
|
PUNameCollision p = _puNameCollisions.get(puName);
|
||||||
|
if(p!=null){
|
||||||
|
p.logCollision(logger);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private static List<URL> getResourceURLs(String rsrc, ClassLoader loader)
|
private static List<URL> getResourceURLs(String rsrc, ClassLoader loader)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
Enumeration<URL> urls = null;
|
Enumeration<URL> urls = null;
|
||||||
|
@ -407,11 +429,24 @@ public class PersistenceProductDerivation
|
||||||
private PersistenceUnitInfoImpl findUnit(List<PersistenceUnitInfoImpl>
|
private PersistenceUnitInfoImpl findUnit(List<PersistenceUnitInfoImpl>
|
||||||
pinfos, String name, ClassLoader loader) {
|
pinfos, String name, ClassLoader loader) {
|
||||||
PersistenceUnitInfoImpl ojpa = null;
|
PersistenceUnitInfoImpl ojpa = null;
|
||||||
|
PersistenceUnitInfoImpl result = null;
|
||||||
for (PersistenceUnitInfoImpl pinfo : pinfos) {
|
for (PersistenceUnitInfoImpl pinfo : pinfos) {
|
||||||
// found named unit?
|
// found named unit?
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
if (name.equals(pinfo.getPersistenceUnitName()))
|
if (name.equals(pinfo.getPersistenceUnitName())){
|
||||||
return pinfo;
|
|
||||||
|
if(result!=null){
|
||||||
|
this.addPuNameCollision(name,
|
||||||
|
result.getPersistenceXmlFileUrl().toString(),
|
||||||
|
pinfo.getPersistenceXmlFileUrl().toString());
|
||||||
|
|
||||||
|
}else{
|
||||||
|
// Grab a ref to the pinfo that matches the name we're
|
||||||
|
// looking for. Keep going to look for duplicate pu
|
||||||
|
// names.
|
||||||
|
result = pinfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,6 +460,9 @@ public class PersistenceProductDerivation
|
||||||
ojpa = pinfo;
|
ojpa = pinfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(result!=null){
|
||||||
|
return result;
|
||||||
|
}
|
||||||
return ojpa;
|
return ojpa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,6 +507,16 @@ public class PersistenceProductDerivation
|
||||||
System.err.println(msg);
|
System.err.println(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addPuNameCollision(String puName, String file1, String file2){
|
||||||
|
PUNameCollision pun = _puNameCollisions.get(puName);
|
||||||
|
if(pun!=null){
|
||||||
|
pun.addCollision(file1, file2);
|
||||||
|
}else{
|
||||||
|
_puNameCollisions.put(puName,
|
||||||
|
new PUNameCollision(puName, file1, file2));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Custom configuration provider.
|
* Custom configuration provider.
|
||||||
*/
|
*/
|
||||||
|
@ -691,4 +739,32 @@ public class PersistenceProductDerivation
|
||||||
_info.setPersistenceXmlFileUrl(_source);
|
_info.setPersistenceXmlFileUrl(_source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* This private class is used to hold onto information regarding
|
||||||
|
* PersistentUnit name collisions.
|
||||||
|
*/
|
||||||
|
private static class PUNameCollision{
|
||||||
|
private String _puName;
|
||||||
|
private Set<String> _resources;
|
||||||
|
|
||||||
|
PUNameCollision(String puName, String file1, String file2) {
|
||||||
|
_resources = new LinkedHashSet<String>();
|
||||||
|
_resources.add(file1);
|
||||||
|
_resources.add(file2);
|
||||||
|
|
||||||
|
_puName=puName;
|
||||||
|
}
|
||||||
|
void logCollision(Log logger){
|
||||||
|
if(logger.isWarnEnabled()){
|
||||||
|
logger.warn(_loc.getFatal("dup-pu",
|
||||||
|
new Object[]{_puName,_resources.toString(),
|
||||||
|
_resources.iterator().next()}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void addCollision(String file1, String file2){
|
||||||
|
_resources.add(file1);
|
||||||
|
_resources.add(file2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.apache.openjpa.kernel.BrokerFactory;
|
||||||
import org.apache.openjpa.lib.conf.Configuration;
|
import org.apache.openjpa.lib.conf.Configuration;
|
||||||
import org.apache.openjpa.lib.conf.ConfigurationProvider;
|
import org.apache.openjpa.lib.conf.ConfigurationProvider;
|
||||||
import org.apache.openjpa.lib.conf.Configurations;
|
import org.apache.openjpa.lib.conf.Configurations;
|
||||||
|
import org.apache.openjpa.lib.conf.ProductDerivations;
|
||||||
import org.apache.openjpa.lib.log.Log;
|
import org.apache.openjpa.lib.log.Log;
|
||||||
import org.apache.openjpa.lib.util.Localizer;
|
import org.apache.openjpa.lib.util.Localizer;
|
||||||
import org.apache.openjpa.meta.MetaDataModes;
|
import org.apache.openjpa.meta.MetaDataModes;
|
||||||
|
@ -60,6 +61,7 @@ public class PersistenceProviderImpl
|
||||||
private static final Localizer _loc = Localizer.forPackage(
|
private static final Localizer _loc = Localizer.forPackage(
|
||||||
PersistenceProviderImpl.class);
|
PersistenceProviderImpl.class);
|
||||||
|
|
||||||
|
private Log _log;
|
||||||
/**
|
/**
|
||||||
* Loads the entity manager specified by <code>name</code>, applying
|
* Loads the entity manager specified by <code>name</code>, applying
|
||||||
* the properties in <code>m</code> as overrides to the properties defined
|
* the properties in <code>m</code> as overrides to the properties defined
|
||||||
|
@ -80,6 +82,11 @@ public class PersistenceProviderImpl
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
BrokerFactory factory = getBrokerFactory(cp, poolValue, null);
|
BrokerFactory factory = getBrokerFactory(cp, poolValue, null);
|
||||||
|
_log = factory.getConfiguration()
|
||||||
|
.getLog(OpenJPAConfiguration.LOG_RUNTIME);
|
||||||
|
if(pd.checkPuNameCollisions(_log,name)==true){
|
||||||
|
;//return null;
|
||||||
|
}
|
||||||
return JPAFacadeHelper.toEntityManagerFactory(factory);
|
return JPAFacadeHelper.toEntityManagerFactory(factory);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw PersistenceExceptions.toPersistenceException(e);
|
throw PersistenceExceptions.toPersistenceException(e);
|
||||||
|
|
|
@ -179,6 +179,9 @@ unwrap-em-invalid: EntityManager can not be unwrapped to an instance of "{0}".
|
||||||
unwrap-query-invalid: Query can not be unwrapped to an instance of "{0}".
|
unwrap-query-invalid: Query can not be unwrapped to an instance of "{0}".
|
||||||
invalid_entity_argument: Object being locked must be an valid and not detached \
|
invalid_entity_argument: Object being locked must be an valid and not detached \
|
||||||
entity.
|
entity.
|
||||||
|
dup-pu: The persistence unit "{0}" was found multiple times in the following \
|
||||||
|
resources "{1}", but persistence unit names should be unique. The first \
|
||||||
|
persistence unit matching the provided name in "{2}" is being used.
|
||||||
bad-lock-level: Invalid lock mode/level. Valid values are \
|
bad-lock-level: Invalid lock mode/level. Valid values are \
|
||||||
"none"(0), "read"(10), "optimistic"(15), "write"(20), \
|
"none"(0), "read"(10), "optimistic"(15), "write"(20), \
|
||||||
"optimistic-force-increment"(25), \
|
"optimistic-force-increment"(25), \
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.apache.openjpa.persistence;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
public class TestPersistenceProductDerivation extends TestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Added for OPENJPA-932. Verifies a ppd properly loads pu's from multiple archives.
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void testGetAnchorsInResource()throws Exception{
|
||||||
|
|
||||||
|
List<String> expectedPUs = Arrays.asList(
|
||||||
|
new String[]{"pu_1","pu_2","pu_3"});
|
||||||
|
|
||||||
|
PersistenceProductDerivation ppd = new PersistenceProductDerivation();
|
||||||
|
List actual = ppd.getAnchorsInResource("META-INF/persistence.xml");
|
||||||
|
|
||||||
|
assertEquals(expectedPUs, actual);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
version="1.0">
|
||||||
|
<persistence-unit name="pu_1" transaction-type="RESOURCE_LOCAL">
|
||||||
|
</persistence-unit>
|
||||||
|
<persistence-unit name="pu_2" transaction-type="RESOURCE_LOCAL">
|
||||||
|
</persistence-unit>
|
||||||
|
</persistence>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
version="1.0">
|
||||||
|
<persistence-unit name="pu_3" transaction-type="RESOURCE_LOCAL">
|
||||||
|
</persistence-unit>
|
||||||
|
</persistence>
|
||||||
|
|
Loading…
Reference in New Issue