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/01 00:48:37 UTC

svn commit: r398457 - in /incubator/cayenne/jpa/trunk/cayenne-jpa/src: main/java/org/apache/cayenne/jpa/conf/ main/java/org/apache/cayenne/jpa/cspi/ main/java/org/apache/cayenne/jpa/spi/ test/java/org/apache/cayenne/jpa/spi/

Author: aadamchik
Date: Sun Apr 30 15:48:36 2006
New Revision: 398457

URL: http://svn.apache.org/viewcvs?rev=398457&view=rev
Log:
added an ability to specify the unit factory
this will allow to configure various class enhancement strategies

Added:
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoFactory.java
Modified:
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceDescriptorParser.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceUnitLoader.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/spi/JpaPersistenceProvider.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfo.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/PersistenceDescriptorParserTest.java

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceDescriptorParser.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceDescriptorParser.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceDescriptorParser.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceDescriptorParser.java Sun Apr 30 15:48:36 2006
@@ -31,6 +31,7 @@
 
 import org.apache.cayenne.jpa.spi.JpaPersistenceProvider;
 import org.apache.cayenne.jpa.spi.JpaPersistenceUnitInfo;
+import org.apache.cayenne.jpa.spi.JpaPersistenceUnitInfoFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -64,14 +65,18 @@
     static final String VALUE = "value";
 
     protected SAXParser parser;
+    protected JpaPersistenceUnitInfoFactory unitFactory;
 
     public PersistenceDescriptorParser() throws SAXException,
             ParserConfigurationException {
-        this(false);
+        this(null, false);
     }
 
-    public PersistenceDescriptorParser(boolean validatesAgainstSchema)
-            throws SAXException, ParserConfigurationException {
+    public PersistenceDescriptorParser(JpaPersistenceUnitInfoFactory unitFactory,
+            boolean validatesAgainstSchema) throws SAXException,
+            ParserConfigurationException {
+
+        this.unitFactory = unitFactory;
 
         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
         parserFactory.setNamespaceAware(true);
@@ -97,14 +102,6 @@
     }
 
     /**
-     * Factory method called during parsing that allows subclasses to customize unit info
-     * creation (as long as it is still JpaPersistenceUnitInfo).
-     */
-    protected JpaPersistenceUnitInfo newUnitInfo() {
-        return new JpaPersistenceUnitInfo();
-    }
-
-    /**
      * Loads and returns a Collection of PersistenceUnitInfos from the XML descriptor.
      */
     public synchronized Collection<JpaPersistenceUnitInfo> getPersistenceUnits(
@@ -137,7 +134,9 @@
                     String name = attributes.getValue("", NAME);
                     String transactionType = attributes.getValue("", TRANSACTION_TYPE);
 
-                    unit = newUnitInfo();
+                    unit = unitFactory != null
+                            ? unitFactory.newUnitInfo()
+                            : new JpaPersistenceUnitInfo();
                     unit.setPersistenceUnitName(name);
                     unit.setPersistenceUnitRootUrl(persistenceUnitRootUrl);
 
@@ -231,4 +230,5 @@
         });
         return unitInfos;
     }
+
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceUnitLoader.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceUnitLoader.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceUnitLoader.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/PersistenceUnitLoader.java Sun Apr 30 15:48:36 2006
@@ -20,6 +20,7 @@
 import java.util.Enumeration;
 
 import org.apache.cayenne.jpa.spi.JpaPersistenceUnitInfo;
+import org.apache.cayenne.jpa.spi.JpaPersistenceUnitInfoFactory;
 import org.xml.sax.InputSource;
 
 /**
@@ -33,9 +34,12 @@
 
     protected PersistenceDescriptorParser parser;
 
-    public PersistenceUnitLoader(boolean validateDescriptors) {
+    public PersistenceUnitLoader(JpaPersistenceUnitInfoFactory unitFactory,
+            boolean validateDescriptors) {
         try {
-            this.parser = new PersistenceDescriptorParser(validateDescriptors);
+            this.parser = new PersistenceDescriptorParser(
+                    unitFactory,
+                    validateDescriptors);
         }
         catch (Exception e) {
             throw new RuntimeException("Error creating XML parser", e);

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=398457&r1=398456&r2=398457&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 Sun Apr 30 15:48:36 2006
@@ -93,6 +93,8 @@
         DataDomain domain = configuration.getDomain(name);
 
         if (domain == null) {
+
+            long t0 = System.currentTimeMillis();
             domain = new DataDomain(name);
             configuration.addDomain(domain);
 
@@ -119,12 +121,22 @@
 
             domain.addNode(node);
 
+            long t1 = System.currentTimeMillis();
+
             // report conflicts...
             ValidationResult conflicts = loader.getContext().getConflicts();
             if (conflicts.hasFailures()) {
                 for (Object failure : conflicts.getFailures()) {
                     logger.info("*** mapping conflict: " + failure);
                 }
+            }
+
+            if (logger.isDebugEnabled()) {
+                logger.debug("loaded persistence unit '"
+                        + name
+                        + "' in "
+                        + (t1 - t0)
+                        + " ms.");
             }
         }
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceProvider.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceProvider.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceProvider.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceProvider.java Sun Apr 30 15:48:36 2006
@@ -23,6 +23,7 @@
 import javax.persistence.spi.PersistenceUnitInfo;
 import javax.persistence.spi.PersistenceUnitTransactionType;
 
+import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.conf.PersistenceUnitLoader;
 
 /**
@@ -41,7 +42,9 @@
 
     // provider-specific properties
     public static final String DATA_SOURCE_FACTORY_PROPERTY = "org.apache.cayenne.jpa.jpaDataSourceFactory";
+    public static final String PERSISTENCE_UNIT_INFO_FACTORY_PROPERTY = "org.apache.cayenne.jpa.jpaPersistenceUnitInfoFactory";
 
+    protected boolean validateDescriptors;
     protected PersistenceUnitLoader unitLoader;
     protected Properties defaultProperties;
 
@@ -58,8 +61,8 @@
      * against schema.
      */
     public JpaPersistenceProvider(boolean validateDescriptors) {
+        this.validateDescriptors = validateDescriptors;
         this.defaultProperties = new Properties();
-        this.unitLoader = new PersistenceUnitLoader(validateDescriptors);
 
         defaultProperties.put(
                 DATA_SOURCE_FACTORY_PROPERTY,
@@ -73,7 +76,7 @@
 
         // TODO: Andrus, 2/11/2006 - cache loaded units (or factories)...
 
-        JpaPersistenceUnitInfo ui = unitLoader.getInfo(emName);
+        JpaPersistenceUnitInfo ui = getUnitLoader().getInfo(emName);
 
         if (ui == null) {
             return null;
@@ -83,15 +86,14 @@
         if (map != null) {
             ui.addProperties(map);
         }
-        
+
         // set default properties if they are not set explicitly
         Properties properties = ui.getProperties();
-        for(Map.Entry property : defaultProperties.entrySet()) {
-            if(!properties.containsKey(property.getKey())) {
+        for (Map.Entry property : defaultProperties.entrySet()) {
+            if (!properties.containsKey(property.getKey())) {
                 properties.put(property.getKey(), property.getValue());
             }
         }
-        
 
         // check if we are allowed to handle this unit (JPA Spec, 7.2)
         String provider = ui.getPersistenceProviderClassName();
@@ -100,6 +102,37 @@
         }
 
         return createContainerManagerFactory(ui);
+    }
+
+    /**
+     * Returns unit loader, lazily creating it on first invocation.
+     */
+    protected PersistenceUnitLoader getUnitLoader() {
+        if (unitLoader == null) {
+
+            JpaPersistenceUnitInfoFactory factory = null;
+
+            String unitFactoryName = getDefaultProperty(PERSISTENCE_UNIT_INFO_FACTORY_PROPERTY);
+            if (unitFactoryName != null) {
+
+                try {
+                    Class factoryClass = Class.forName(unitFactoryName, true, Thread
+                            .currentThread()
+                            .getContextClassLoader());
+
+                    factory = (JpaPersistenceUnitInfoFactory) factoryClass.newInstance();
+                }
+                catch (Exception e) {
+                    throw new JpaProviderException("Error loading unit infor factory '"
+                            + unitFactoryName
+                            + "'", e);
+                }
+            }
+
+            this.unitLoader = new PersistenceUnitLoader(factory, validateDescriptors);
+        }
+
+        return unitLoader;
     }
 
     public abstract EntityManagerFactory createContainerManagerFactory(

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfo.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfo.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfo.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfo.java Sun Apr 30 15:48:36 2006
@@ -51,7 +51,6 @@
     protected String description;
 
     // properties not exposed directly
-    protected List<ClassTransformer> classTransformers;
     protected ClassLoader classLoader;
 
     public JpaPersistenceUnitInfo() {
@@ -60,7 +59,6 @@
         this.jarFileUrls = new ArrayList<URL>(2);
         this.managedClassNames = new ArrayList<String>(30);
         this.properties = new Properties();
-        this.classTransformers = new ArrayList<ClassTransformer>(2);
         this.classLoader = Thread.currentThread().getContextClassLoader();
     }
 
@@ -72,6 +70,26 @@
         return getProperty(JpaPersistenceProvider.PROVIDER_PROPERTY);
     }
 
+    /**
+     * Adds a {@link ClassTransformer} to the persistence unit. Default implementation
+     * does nothing, although a provider can defines a
+     * {@link JpaPersistenceUnitInfoFactory} to integrate with its own class loading
+     * mechanism.
+     * <h3>JPA Specification, 7.1.4:</h3>
+     * Add a transformer supplied by the provider that will be called for every new class
+     * definition or class redefinition that gets loaded by the loader returned by the
+     * PersistenceInfo.getClassLoader method. The transformer has no effect on the result
+     * returned by the PersistenceInfo.getTempClassLoader method. Classes are only
+     * transformed once within the same classloading scope, regardless of how many
+     * persistence units they may be a part of.
+     * 
+     * @param transformer A provider-supplied transformer that the Container invokes at
+     *            class-(re)definition time
+     */
+    public void addTransformer(ClassTransformer transformer) {
+        // noop
+    }
+
     public PersistenceUnitTransactionType getTransactionType() {
         String type = getProperty(JpaPersistenceProvider.TRANSACTION_TYPE_PROPERTY);
         return type != null
@@ -144,10 +162,6 @@
 
     public ClassLoader getClassLoader() {
         return classLoader;
-    }
-
-    public void addTransformer(ClassTransformer transformer) {
-        classTransformers.add(transformer);
     }
 
     /**

Added: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoFactory.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoFactory.java?rev=398457&view=auto
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoFactory.java (added)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoFactory.java Sun Apr 30 15:48:36 2006
@@ -0,0 +1,29 @@
+/*
+ *  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;
+
+/**
+ * A factory of JpaPersistenceUnitInfos.
+ * 
+ * @author Andrus Adamchik
+ */
+public interface JpaPersistenceUnitInfoFactory {
+
+    /**
+     * Creates a new instance of JpaPersistenceUnitInfo.
+     */
+    JpaPersistenceUnitInfo newUnitInfo();
+}

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoTest.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/JpaPersistenceUnitInfoTest.java Sun Apr 30 15:48:36 2006
@@ -26,6 +26,7 @@
 public class JpaPersistenceUnitInfoTest extends TestCase {
 
     public void testTransactionType() {
+
         JpaPersistenceUnitInfo info = new JpaPersistenceUnitInfo();
         info.addProperties(Collections.singletonMap(
                 JpaPersistenceProvider.TRANSACTION_TYPE_PROPERTY,

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/PersistenceDescriptorParserTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/PersistenceDescriptorParserTest.java?rev=398457&r1=398456&r2=398457&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/PersistenceDescriptorParserTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/spi/PersistenceDescriptorParserTest.java Sun Apr 30 15:48:36 2006
@@ -62,7 +62,7 @@
     }
 
     public void testSampleSchemaHeadersValidating() throws Exception {
-        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(true);
+        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(null, true);
 
         URL root = new URL("file:///xyz");
         InputStream in = Thread
@@ -182,7 +182,7 @@
     }
 
     public void testInvalidSample1() throws Exception {
-        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(true);
+        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(null, true);
 
         URL root = new URL("file:///xyz");
         InputStream in = Thread
@@ -201,7 +201,7 @@
     }
 
     public void testInvalidSample2() throws Exception {
-        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(true);
+        PersistenceDescriptorParser parser = new PersistenceDescriptorParser(null, true);
 
         URL root = new URL("file:///xyz");
         InputStream in = Thread