blob: 7a1f6d5b7ac6b3d58ff5b8772ab2d9e1015b46f9 [file] [log] [blame]
/*
* 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.test;
import java.io.IOException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.spi.PersistenceUnitInfo;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.PersistenceProductDerivation;
import org.apache.openjpa.persistence.PersistenceProviderImpl;
import org.apache.openjpa.persistence.PersistenceUnitInfoImpl;
/*
* This abstract test framework class provides scaffolding for using
* PersistenceProvider.createContainerEntityManagerFactory from within
* a JSE environment. Tests which extend this class can specify a non-default
* persistence file name by overriding the getPersistenceResourceName()
* method.
*
*/
public abstract class ContainerEMFTest extends SingleEMFTestCase {
// Use this constant as a config map key to specify a list of persistent
// classes. For example:
// List<Class<?>> clist = new ArrayList<Class<?>>();
// clist.add(com.my.Cls.class);
// clist.add(com.my.OtherCls.class);
// cfgMap.put(PERSISTENT_CLASS_LIST, clist);
// emf = createContainerEMF("pu","persistence.xml", cfgMap);
public static final String PERSISTENT_CLASS_LIST = "PERSISTENT_CLASS_LIST";
// The persistence file name to parse. This file gets parsed
// and converted into one or more PersistenceUnitInfo's
public String getPersistenceResourceName() {
return PersistenceProductDerivation.RSRC_DEFAULT;
}
// Creates an EMF through the typical container path. This EMF may be
// a bit quirky, but provides some level of testing from within a JSE
// environment.
@Override
public void setUp(Object...props) {
Map<String, Object> map = getPropertiesMap(props);
emf = createContainerEMF(getPersistenceUnitName(),
getPersistenceResourceName(), map);
}
// Create an EMF through the path a container normally takes - calling
// createContainerEntityManagerFactory directly on the persistence impl.
@SuppressWarnings("unchecked")
protected OpenJPAEntityManagerFactorySPI createContainerEMF(final String pu,
final String persistenceFile, Map<String, Object> map) {
List<Class<?>> clist = null;
OpenJPAEntityManagerFactorySPI oemf = null;
Map<String, Object> config = new HashMap(System.getProperties());
if (map != null) {
config.putAll(map);
// Get the persistent class list
clist = (List<Class<?>>)map.remove(PERSISTENT_CLASS_LIST);
}
PersistenceProductDerivation.ConfigurationParser cfgParser =
new PersistenceProductDerivation.ConfigurationParser(config);
try {
URL url = getResourceURL(persistenceFile);
cfgParser.parse(url);
List<PersistenceUnitInfoImpl> units = cfgParser.getResults();
PersistenceUnitInfo puinf = null;
// Find the pu info that matches the pu name
for (PersistenceUnitInfo pui : units) {
if (pu.equals(pui.getPersistenceUnitName())) {
puinf = pui;
break;
}
}
// If there is a persistent class list, add each class to the puinfo
if (clist != null) {
for (Class<?> cl : clist) {
((PersistenceUnitInfoImpl)puinf).addManagedClassName(cl.getName());
}
}
oemf = createContainerEMF(pu, puinf, config);
}
catch (IOException ioe) {
throw new RuntimeException("Failed to parse: " + getPersistenceResourceName(), ioe);
}
if (oemf == null) {
throw new NullPointerException("Expected an entity manager factory " + "for the persistence unit named: \""
+ pu + "\"");
}
return oemf;
}
// Creates an instance of the OpenJPA PersistenceProviderImpl and
// returns an EMF via createContainerEntityManagerFactory
private OpenJPAEntityManagerFactorySPI createContainerEMF(String puName,
PersistenceUnitInfo pui, Map<String, Object> map) {
PersistenceProviderImpl ppi = new PersistenceProviderImpl();
return (OpenJPAEntityManagerFactorySPI)ppi.createContainerEntityManagerFactory(pui, map);
}
// Build a resource URL for the given resource
private static URL getResourceURL(String rsrc) throws IOException {
Enumeration<URL> urls = null;
try {
ClassLoader cl = ContainerEMFTest.class.getClassLoader();
urls = AccessController.doPrivileged(
J2DoPrivHelper.getResourcesAction(cl, rsrc));
} catch (PrivilegedActionException pae) {
throw (IOException) pae.getException();
}
return Collections.list(urls).get(0);
}
}