blob: 4d81080aa270f2a779a72559493bbb45e7493c8f [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;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import junit.framework.TestCase;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.conf.OpenJPAConfigurationImpl;
import org.apache.openjpa.lib.conf.ConfigurationProvider;
import org.apache.openjpa.lib.encryption.EncryptionProvider;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
public class TestPersistenceProductDerivation extends TestCase {
private File sourceFile;
private File targetFile;
ClassLoader originalLoader = null;
ClassLoader tempLoader = null;
protected void setUp() throws Exception {
super.setUp();
String currentDir = System.getProperty("user.dir");
// openjpa-persistence/target/test-classes/resources/second-persistence/META-INF/persistence.xml
sourceFile = new File(currentDir + File.separator
+ "target" + File.separator + "test-classes"
+ File.separator + "second-persistence" + File.separator
+ "META-INF" + File.separator + "persistence.xml");
// openjpa-persistence/target/test-classes/
// TestPersistenceProductDerivation_generated_(time_stamp).jar
targetFile = new File(currentDir + File.separator + "target" +
File.separator + "test-classes" + File.separator +
"TestPersistenceProductDerivation_generated_" +
System.currentTimeMillis() + ".jar");
AccessController.doPrivileged(J2DoPrivHelper
.deleteOnExitAction(targetFile));
buildJar(sourceFile,targetFile);
// Hold a reference to the current classloader so we can cleanup
// when we're done.
originalLoader = Thread.currentThread().getContextClassLoader();
tempLoader = new TempUrlLoader(new URL[]{targetFile.toURI().toURL()}
,originalLoader);
AccessController.doPrivileged(J2DoPrivHelper
.setContextClassLoaderAction(tempLoader));
}
protected void tearDown() throws Exception {
super.tearDown();
// Restore the original classloader.
Thread.currentThread().setContextClassLoader(originalLoader);
// For whatever reason, this file won't ever delete. I searched around
// and found numerous documented problems with deleting files. Perhaps
// sometime in the future this problem will be fixed. For now it doesn't
// really matter since we generate a new file every time.
boolean deleted = AccessController.doPrivileged(J2DoPrivHelper
.deleteAction(targetFile));
if(deleted==false){
System.out.println("The file " + targetFile + " wasn't deleted.");
}
}
/**
* Added for OPENJPA-932. Verifies a PersistenceProductDerivation 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<String> actual = ppd.getAnchorsInResource("META-INF/persistence.xml");
assertTrue(actual.containsAll(expectedPUs));
// Added for OPENJPA-993
assertFalse(actual.contains("bad_provider"));
}
public void testEncryptionPluginConfiguration() throws Exception {
PersistenceProductDerivation ppd = new PersistenceProductDerivation();
OpenJPAConfiguration conf = new OpenJPAConfigurationImpl();
String encryptedPassword = "encrypted_password";
ClassLoader loader = null;
ConfigurationProvider provider = ppd.load(
PersistenceProductDerivation.RSRC_DEFAULT,
"encryption_plugin_pu", loader);
provider.setInto(conf);
EncryptionProvider ep = conf.getEncryptionProvider();
assertNotNull(ep);
// Cast to test impl
TestEncryptionProvider tep = (TestEncryptionProvider) ep;
conf.setConnectionPassword(encryptedPassword);
// Validate that when we get the ConnectionPassword from configuration
// that it is decrypted
assertEquals(TestEncryptionProvider.decryptedPassword, conf
.getConnectionPassword());
// Validate that the EncryptionProvider is called with the 'encrypted'
// password
assertEquals(encryptedPassword, tep.getEncryptedPassword());
}
public void testEncryptionPluginConfigurationDefaultValue() throws Exception {
PersistenceProductDerivation ppd = new PersistenceProductDerivation();
OpenJPAConfiguration conf = new OpenJPAConfigurationImpl();
ClassLoader loader = null;
ConfigurationProvider provider = ppd.load(
PersistenceProductDerivation.RSRC_DEFAULT,
"encryption_plugin_default_pu", loader);
provider.setInto(conf);
assertNull(conf.getEncryptionProvider());
}
/*
* Verifies value of exclude-unlisted-classes with a version 1.0
* persistence.xml.
*/
public void testJPA1ExcludeUnlistedClasses() throws Exception {
PersistenceProductDerivation.ConfigurationParser cp =
new PersistenceProductDerivation.ConfigurationParser(new HashMap());
List<URL> urls = getResourceURL(PersistenceProductDerivation.RSRC_DEFAULT);
assertNotNull(urls);
assertEquals(1, urls.size());
cp.parse(urls.get(0));
List<PersistenceUnitInfoImpl> units = cp.getResults();
int vfyCount = 0;
for (PersistenceUnitInfoImpl ppui : units) {
if ("exclude_not_specified".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertFalse(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified, but
// is the default ie <exclude-unlisted-classes/>
if ("exclude_default".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertFalse(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified as
// true <exclude-unlisted-classes>true</exclude-unlisted-classes>
if ("exclude_true".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertTrue(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified as
// false <exclude-unlisted-classes>false</exclude-unlisted-classes>
if ("exclude_false".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertFalse(ppui.excludeUnlistedClasses());
}
}
// Make sure all pu's were validated
assertEquals(4, vfyCount);
}
/*
* Verifies value of exclude-unlisted-classes with a version 2.0
* persistence.xml.
*/
public void testExcludeUnlistedClasses() throws Exception {
PersistenceProductDerivation.ConfigurationParser cp =
new PersistenceProductDerivation.ConfigurationParser(new HashMap());
List<URL> urls = getResourceURL("META-INF/persistence-2_0.xml");
assertNotNull(urls);
assertEquals(1, urls.size());
cp.parse(urls.get(0));
List<PersistenceUnitInfoImpl> units = cp.getResults();
int vfyCount = 0;
for (PersistenceUnitInfoImpl ppui : units) {
// Verify case where exclude-unlisted-classes was not specified
if ("exclude_not_specified".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertTrue(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified, but
// is the default ie <exclude-unlisted-classes/>
if ("exclude_default".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertTrue(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified as
// true <exclude-unlisted-classes>true</exclude-unlisted-classes>
if ("exclude_true".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertTrue(ppui.excludeUnlistedClasses());
}
// Verify case where exclude-unlisted-classes was specified as
// false <exclude-unlisted-classes>false</exclude-unlisted-classes>
if ("exclude_false".equals(ppui.getPersistenceUnitName())) {
vfyCount++;
assertFalse(ppui.excludeUnlistedClasses());
}
}
// Make sure all pu's were validated
assertEquals(4, vfyCount);
}
private static List<URL> getResourceURL(String rsrc)
throws IOException {
Enumeration<URL> urls = null;
try {
ClassLoader cl = TestPersistenceProductDerivation.class.getClassLoader();
urls = AccessController.doPrivileged(
J2DoPrivHelper.getResourcesAction(cl, rsrc));
if (!urls.hasMoreElements()) {
if (!rsrc.startsWith("META-INF"))
urls = AccessController.doPrivileged(
J2DoPrivHelper.getResourcesAction(cl, "META-INF/" + rsrc));
if (!urls.hasMoreElements())
return null;
}
} catch (PrivilegedActionException pae) {
throw (IOException) pae.getException();
}
return Collections.list(urls);
}
private void buildJar(File sourceFile, File targetFile) throws Exception {
JarOutputStream out = new JarOutputStream(
new BufferedOutputStream(new FileOutputStream(targetFile)));
BufferedInputStream in =
new BufferedInputStream(new FileInputStream(sourceFile));
out.putNextEntry(new JarEntry("META-INF/"));
out.putNextEntry(new JarEntry("META-INF/persistence.xml"));
//write the xml to the jar
byte[] buf = new byte[1024];
int i;
while ((i = in.read(buf)) != -1) {
out.write(buf, 0, i);
}
out.close();
in.close();
}
class TempUrlLoader extends URLClassLoader {
public TempUrlLoader(URL[] urls, ClassLoader parent) {
super(urls,parent);
}
}
public static class TestEncryptionProvider implements EncryptionProvider {
public static final String decryptedPassword = "decypted_password";
// Save the 'encrypted' password so our UT can perform validation.
private String encryptedPassword;
public String getEncryptedPassword() {
return encryptedPassword;
}
/**
* This method ALWAYS returns the String "decypted_password".
*
* @see EncryptionProvider#decrypt(String)
*/
public String decrypt(String password) {
encryptedPassword = password;
return decryptedPassword;
}
/**
* @see EncryptionProvider#encrypt(String)
*/
public String encrypt(String password) {
return password;
}
}
}