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