You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/05/02 01:08:10 UTC

svn commit: r398724 - in /incubator/cayenne/jpa/trunk/cayenne-jpa/src: main/java/org/apache/cayenne/jpa/bridge/ main/java/org/apache/cayenne/jpa/conf/ main/java/org/apache/cayenne/jpa/cspi/ main/java/org/apache/cayenne/jpa/enhancer/ main/java/org/apach...

Author: aadamchik
Date: Mon May  1 16:08:04 2006
New Revision: 398724

URL: http://svn.apache.org/viewcvs?rev=398724&view=rev
Log:
finished integrating enahcer in the loading procedure.
Enhancer itself still needs work

Added:
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnitClassLoader.java
Modified:
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoaderContext.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoader.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/CayenneAgent.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnit.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoaderTest.java

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java Mon May  1 16:08:04 2006
@@ -382,6 +382,8 @@
             JpaQueryHint hint = jpaQuery.getHint(QueryHints.QUERY_TYPE_HINT);
             if (hint != null && !Util.isEmptyString(hint.getValue())) {
                 try {
+
+                    // query class is not enhanced, so use normal class loader
                     Class cayenneQueryClass = Class.forName(hint.getValue(), true, Thread
                             .currentThread()
                             .getContextClassLoader());

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoader.java Mon May  1 16:08:04 2006
@@ -86,7 +86,7 @@
     protected void loadEntityMap(PersistenceUnitInfo persistenceUnit)
             throws JpaProviderException {
 
-        this.context = new EntityMapLoaderContext();
+        this.context = new EntityMapLoaderContext(persistenceUnit);
 
         try {
             loadFromAnnotations(persistenceUnit);
@@ -121,18 +121,17 @@
      * present anywhere on the classpath. An orm.xml file or other mapping file is loaded
      * as a resource by the persistence provider.
      */
-    protected void updateFromXML(PersistenceUnitInfo persistenceUnit) throws IOException {
+    protected void updateFromXML(PersistenceUnitInfo unit) throws IOException {
 
         EntityMapMergeProcessor merger = new EntityMapMergeProcessor(context);
 
         Set loadedLocations = new HashSet();
-        EntityMapXMLLoader loader = new EntityMapXMLLoader();
+        EntityMapXMLLoader loader = new EntityMapXMLLoader(unit.getClassLoader(), false);
 
         // 1. load from the standard file called orm.xml
         loadedLocations.add(DESCRIPTOR_LOCATION);
-        Enumeration<URL> standardDescriptors = persistenceUnit
-                .getClassLoader()
-                .getResources(DESCRIPTOR_LOCATION);
+        Enumeration<URL> standardDescriptors = unit.getClassLoader().getResources(
+                DESCRIPTOR_LOCATION);
 
         while (standardDescriptors.hasMoreElements()) {
             JpaEntityMap map = loader.getEntityMap(standardDescriptors.nextElement());
@@ -143,15 +142,14 @@
         // TODO: andrus, 4/20/2006 - load from the jar files
 
         // 3. load from explicitly specified descriptors
-        for (String descriptor : persistenceUnit.getMappingFileNames()) {
+        for (String descriptor : unit.getMappingFileNames()) {
 
             // avoid loading duplicates, such as META-INF/orm.xml that is also explicitly
             // mentioned in the unit...
             if (loadedLocations.add(descriptor)) {
 
-                Enumeration<URL> mappedDescriptors = persistenceUnit
-                        .getClassLoader()
-                        .getResources(descriptor);
+                Enumeration<URL> mappedDescriptors = unit.getClassLoader().getResources(
+                        descriptor);
                 while (mappedDescriptors.hasMoreElements()) {
                     JpaEntityMap map = loader.getEntityMap(mappedDescriptors
                             .nextElement());
@@ -168,6 +166,8 @@
 
         if (!persistenceUnit.getManagedClassNames().isEmpty()) {
 
+            // must use Unit class loader to prevent loading an un-enahnced class in the
+            // app ClassLoader.
             ClassLoader loader = persistenceUnit.getClassLoader();
             EntityMapAnnotationLoader annotationLoader = new EntityMapAnnotationLoader(
                     context);

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoaderContext.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoaderContext.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoaderContext.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapLoaderContext.java Mon May  1 16:08:04 2006
@@ -40,9 +40,14 @@
     protected JpaEntityMap entityMap;
     protected PersistenceUnitInfo unit;
 
-    public EntityMapLoaderContext() {
+    public EntityMapLoaderContext(PersistenceUnitInfo unit) {
+        this.unit = unit;
         this.conflicts = new ValidationResult();
         this.entityMap = new JpaEntityMap();
+    }
+
+    public PersistenceUnitInfo getUnit() {
+        return unit;
     }
 
     public JpaEntityMap getEntityMap() {

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoader.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoader.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoader.java Mon May  1 16:08:04 2006
@@ -31,8 +31,8 @@
 import org.xml.sax.SAXException;
 
 /**
- * {@link org.apache.cayenne.jpa.map.JpaEntityMap} loader that reads mapping
- * information from the XML sources compatible with the JPA ORM schema.
+ * {@link org.apache.cayenne.jpa.map.JpaEntityMap} loader that reads mapping information
+ * from the XML sources compatible with the JPA ORM schema.
  * 
  * @author Andrus Adamchik
  */
@@ -43,11 +43,15 @@
 
     Schema schema;
 
+    protected ClassLoader classLoader;
+
     public EntityMapXMLLoader() {
-        this(false);
+        this(Thread.currentThread().getContextClassLoader(), false);
     }
 
-    public EntityMapXMLLoader(boolean validateDescriptors) {
+    public EntityMapXMLLoader(ClassLoader classLoader, boolean validateDescriptors) {
+
+        this.classLoader = classLoader;
 
         // TODO: andrus, 04/18/2006 - merge validation capabilities to the XMLDecoder...
         if (validateDescriptors) {
@@ -60,8 +64,7 @@
             // xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
             // http://java.sun.com/xml/ns/persistence/orm/orm_1_0.xsd">
 
-            URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(
-                    ORM_SCHEMA);
+            URL schemaURL = classLoader.getResource(ORM_SCHEMA);
 
             SchemaFactory factory = SchemaFactory
                     .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
@@ -85,8 +88,7 @@
 
         // TODO: andrus, 04/18/2006 XMLDecoder should support classpath locations for
         // mapping descriptors
-        URL mappingURL = Thread.currentThread().getContextClassLoader().getResource(
-                XML_CODER_MAPPING);
+        URL mappingURL = classLoader.getResource(XML_CODER_MAPPING);
         if (mappingURL == null) {
             throw new RuntimeException("No code mapping found: " + XML_CODER_MAPPING);
         }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaPersistenceProvider.java Mon May  1 16:08:04 2006
@@ -111,7 +111,9 @@
 
             EntityMapLoader loader = new EntityMapLoader(info);
 
-            // now that all entities are resolved, add an enhancer...
+            // we must set enhancer in this exact place, between JPA and Cayenne mapping
+            // loading. By now all the JpaEntities are loaded (using separate unit class
+            // loader) and Cayenne mapping will be using the App ClassLoader.
             info.addTransformer(new UnitClassTranformer(
                     loader.getEntityMap(),
                     new CglibEnhancer()));
@@ -173,8 +175,10 @@
         }
 
         try {
-            Class dbAdapterClass = Class.forName(adapterClass, true, info
-                    .getClassLoader());
+            // adapter class is not enhanced, so use a normal class loader
+            Class dbAdapterClass = Class.forName(adapterClass, true, Thread
+                    .currentThread()
+                    .getContextClassLoader());
             return (DbAdapter) dbAdapterClass.newInstance();
         }
         catch (Exception e) {

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/enhancer/UnitClassTranformer.java Mon May  1 16:08:04 2006
@@ -17,10 +17,14 @@
 
 import java.lang.instrument.IllegalClassFormatException;
 import java.security.ProtectionDomain;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.persistence.spi.ClassTransformer;
 
+import org.apache.cayenne.jpa.map.JpaEntity;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.map.JpaMappedSuperclass;
 
 /**
  * A ClassTransformer decorator that passes through classes mentioned in the JpaEntityMap
@@ -30,12 +34,22 @@
  */
 public class UnitClassTranformer implements ClassTransformer {
 
-    protected JpaEntityMap entityMap;
     protected ClassTransformer transformer;
+    protected Set<String> managedClasses;
 
     public UnitClassTranformer(JpaEntityMap entityMap, ClassTransformer transformer) {
-        this.entityMap = entityMap;
         this.transformer = transformer;
+        this.managedClasses = new HashSet<String>();
+
+        for (JpaMappedSuperclass entity : entityMap.getMappedSuperclasses()) {
+            managedClasses.add(entity.getClassName().replace('.', '/'));
+        }
+
+        for (JpaEntity entity : entityMap.getEntities()) {
+            // TODO: andrus, 5/1/2006 - need not enhance entities extending mapped
+            // superclasses
+            managedClasses.add(entity.getClassName().replace('.', '/'));
+        }
     }
 
     public byte[] transform(
@@ -57,6 +71,6 @@
      * expected in the internal format, separated by "/", not ".".
      */
     protected boolean isManagedClass(String className) {
-        return true;
+        return managedClasses.contains(className);
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/CayenneAgent.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/CayenneAgent.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/CayenneAgent.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/instrument/CayenneAgent.java Mon May  1 16:08:04 2006
@@ -28,7 +28,7 @@
  * the JVM with the "-javaagent:" option. E.g.:
  * 
  * <pre>
- *   java -javaagent:/path/to/cayenne-jpa-3.0.jar org.example.Main
+ *         java -javaagent:/path/to/cayenne-jpa-3.0.jar org.example.Main
  * </pre>
  * 
  * @author Andrus Adamchik
@@ -42,6 +42,29 @@
     public static void premain(String agentArgs, Instrumentation instrumentation) {
         System.out.println("*** CayenneAgent starting...");
         InstrumentingUnit.setInstrumentation(instrumentation);
+
+        // TODO: andrus, 5/1/2006 - add explicit debugging option to the agent
+        
+        // This can be used to debug enhancer:
+        // instrumentation.addTransformer(new ClassFileTransformer() {
+        //
+        // public byte[] transform(
+        // ClassLoader loader,
+        // String className,
+        // Class<?> classBeingRedefined,
+        // ProtectionDomain protectionDomain,
+        // byte[] classfileBuffer) throws IllegalClassFormatException {
+        //
+        // if (className.indexOf("jpa") > 0) {
+        // System.out.println("*** className..."
+        // + className
+        // + ", loader: "
+        // + loader);
+        // }
+        // return null;
+        // }
+        // });
+
         System.setProperty(JpaPersistenceProvider.UNIT_FACTORY_PROPERTY, FACTORY_CLASS);
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnit.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnit.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnit.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnit.java Mon May  1 16:08:04 2006
@@ -60,9 +60,7 @@
         this.managedClassNames = new ArrayList<String>(30);
         this.properties = new Properties();
 
-        // create a class loader that is separate from the app class loader, as we want
-        // all app class loader classes to go through the enhancers
-        this.classLoader = new URLClassLoader(new URL[0], getClass().getClassLoader());
+        setDefaultClassLoader();
     }
 
     public String getPersistenceUnitName() {
@@ -113,6 +111,7 @@
         }
 
         try {
+            // use app class loader - this is not the class to enhance...
             return (JpaDataSourceFactory) Class.forName(
                     factory,
                     true,
@@ -201,10 +200,17 @@
      */
     public void setClassLoader(ClassLoader classLoader) {
         if (classLoader == null) {
-            classLoader = Thread.currentThread().getContextClassLoader();
+            setDefaultClassLoader();
         }
+        else {
+            this.classLoader = classLoader;
+        }
+    }
 
-        this.classLoader = classLoader;
+    protected void setDefaultClassLoader() {
+        this.classLoader = new JpaUnitClassLoader(Thread
+                .currentThread()
+                .getContextClassLoader());
     }
 
     public void addManagedClassName(String managedClassName) {

Added: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnitClassLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnitClassLoader.java?rev=398724&view=auto
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnitClassLoader.java (added)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaUnitClassLoader.java Mon May  1 16:08:04 2006
@@ -0,0 +1,99 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed 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.cayenne.jpa.spi;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.SecureClassLoader;
+
+/**
+ * A special class loader that uses parent loader to get resoirces, but does not load any
+ * classes though the parent to avoid parent pollution with un-enhanced classes.
+ * 
+ * @author Andrus Adamchik
+ */
+public class JpaUnitClassLoader extends SecureClassLoader {
+
+    public JpaUnitClassLoader(ClassLoader parent) {
+        super(parent);
+    }
+
+    @Override
+    protected synchronized Class<?> loadClass(String name, boolean resolve)
+            throws ClassNotFoundException {
+
+        if (name.startsWith("java.") || name.startsWith("javax.")) {
+            return super.loadClass(name, resolve);
+        }
+
+        Class c = findLoadedClass(name);
+
+        if (c == null) {
+            c = findClass(name);
+        }
+
+        if (resolve) {
+            resolveClass(c);
+        }
+
+        return c;
+    }
+
+    /**
+     * Loads a class bypassing parent class loader.
+     */
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException {
+        String path = name.replace('.', '/') + ".class";
+
+        InputStream in = getResourceAsStream(path);
+        if (in == null) {
+            throw new ClassNotFoundException(name);
+        }
+
+        try {
+            ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
+            byte[] buffer = new byte[1024];
+            int read;
+
+            while ((read = in.read(buffer, 0, 1024)) > 0) {
+                out.write(buffer, 0, read);
+            }
+
+            out.close();
+            byte[] classBytes = out.toByteArray();
+
+            return defineClass(name, classBytes, 0, classBytes.length);
+        }
+        catch (SecurityException e) {
+            // JVM doesn't allow us to define class here... Is there a way to detect this
+            // upfront?
+            return super.findClass(name);
+        }
+        catch (IOException e) {
+            throw new ClassNotFoundException(name, e);
+        }
+        finally {
+            try {
+                in.close();
+            }
+            catch (IOException e) {
+                // ignore close exceptions...
+            }
+        }
+    }
+}

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java Mon May  1 16:08:04 2006
@@ -26,12 +26,14 @@
 import org.apache.cayenne.jpa.entity.cayenne.MockCayenneTargetEntity1;
 import org.apache.cayenne.jpa.entity.cayenne.MockCayenneTargetEntity2;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.spi.MockPersistenceUnitInfo;
 import org.objectstyle.cayenne.map.DataMap;
 
 public class DataMapConverterTest extends TestCase {
 
     public void testDataMapDefaults() {
-        EntityMapLoaderContext context = new EntityMapLoaderContext();
+        EntityMapLoaderContext context = new EntityMapLoaderContext(
+                new MockPersistenceUnitInfo());
         JpaEntityMap jpaMap = context.getEntityMap();
         jpaMap.setPackageName("p1");
         jpaMap.setSchema("s1");
@@ -49,7 +51,8 @@
      * @see org.apache.cayenne.jpa.conf.EntityMapAnnotationLoaderTest#testLoadClassMapping()
      */
     public void testLoadClassMapping() throws Exception {
-        EntityMapLoaderContext context = new EntityMapLoaderContext();
+        EntityMapLoaderContext context = new EntityMapLoaderContext(
+                new MockPersistenceUnitInfo());
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
 
         loader.loadClassMapping(MockCayenneEntity1.class);

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapAnnotationLoaderTest.java Mon May  1 16:08:04 2006
@@ -40,13 +40,14 @@
 import org.apache.cayenne.jpa.map.JpaAttributeOverride;
 import org.apache.cayenne.jpa.map.JpaEntity;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
+import org.apache.cayenne.jpa.spi.MockPersistenceUnitInfo;
 
 public class EntityMapAnnotationLoaderTest extends TestCase {
 
     public void testSortAnnotations() throws Exception {
 
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(
-                new EntityMapLoaderContext());
+                new EntityMapLoaderContext(new MockPersistenceUnitInfo()));
 
         Annotation[] a1 = new Annotation[3];
         a1[0] = MockAnnotatedBean1.class.getAnnotation(NamedQuery.class);
@@ -66,7 +67,8 @@
      */
     public void testAttributeOverride() {
 
-        EntityMapLoaderContext context = new EntityMapLoaderContext();
+        EntityMapLoaderContext context = new EntityMapLoaderContext(
+                new MockPersistenceUnitInfo());
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
         loader.loadClassMapping(MockAnnotatedBean2.class);
 
@@ -97,7 +99,8 @@
      */
     public void testLoadClassMapping() throws Exception {
 
-        EntityMapLoaderContext context = new EntityMapLoaderContext();
+        EntityMapLoaderContext context = new EntityMapLoaderContext(
+                new MockPersistenceUnitInfo());
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
 
         loader.loadClassMapping(MockEntity1.class);

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java Mon May  1 16:08:04 2006
@@ -25,6 +25,7 @@
 import org.apache.cayenne.jpa.map.JpaEntity;
 import org.apache.cayenne.jpa.map.JpaEntityMap;
 import org.apache.cayenne.jpa.map.JpaId;
+import org.apache.cayenne.jpa.spi.MockPersistenceUnitInfo;
 
 public class EntityMapDefaultsProcessorTest extends TestCase {
 
@@ -36,7 +37,7 @@
         // sanity check - test object must not be serializable to be rejected...
         assertFalse(Serializable.class.isAssignableFrom(MockAnnotatedBean3.class));
 
-        context = new EntityMapLoaderContext();
+        context = new EntityMapLoaderContext(new MockPersistenceUnitInfo());
         EntityMapAnnotationLoader loader = new EntityMapAnnotationLoader(context);
         loader.loadClassMapping(MockAnnotatedBean1.class);
         loader.loadClassMapping(MockAnnotatedBean3.class);

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoaderTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoaderTest.java?rev=398724&r1=398723&r2=398724&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoaderTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapXMLLoaderTest.java Mon May  1 16:08:04 2006
@@ -33,7 +33,9 @@
 
     public void testSampleSchemaHeadersValidating() throws Exception {
 
-        EntityMapXMLLoader loader = new EntityMapXMLLoader(true);
+        EntityMapXMLLoader loader = new EntityMapXMLLoader(
+                getClass().getClassLoader(),
+                true);
 
         loader.getEntityMap(resourceLoader
                 .getResource("xml-samples/orm-schema-headers.xml"));
@@ -50,7 +52,9 @@
     }
 
     public void testDetails() throws Exception {
-        EntityMapXMLLoader loader = new EntityMapXMLLoader(true);
+        EntityMapXMLLoader loader = new EntityMapXMLLoader(
+                getClass().getClassLoader(),
+                true);
 
         // long t0 = System.currentTimeMillis();
         JpaEntityMap map = loader.getEntityMap(resourceLoader