You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by me...@apache.org on 2006/11/06 22:24:21 UTC
svn commit: r471884 - in
/incubator/tuscany/java/sca/services/persistence/common/src:
main/java/org/apache/tuscany/service/persistence/common/
test/resources/META-INF/
Author: meerajk
Date: Mon Nov 6 13:24:20 2006
New Revision: 471884
URL: http://svn.apache.org/viewvc?view=rev&rev=471884
Log:
Initial cut.
Added:
incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/TuscanyPersistenceUnitInfo.java
- copied, changed from r471534, incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitMetadata.java
Modified:
incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/DefaultPersistenceUnitBuilder.java
incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitScanner.java
incubator/tuscany/java/sca/services/persistence/common/src/test/resources/META-INF/persistence.xml
Modified: incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/DefaultPersistenceUnitBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/DefaultPersistenceUnitBuilder.java?view=diff&rev=471884&r1=471883&r2=471884
==============================================================================
--- incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/DefaultPersistenceUnitBuilder.java (original)
+++ incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/DefaultPersistenceUnitBuilder.java Mon Nov 6 13:24:20 2006
@@ -18,7 +18,12 @@
*/
package org.apache.tuscany.service.persistence.common;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitInfo;
/**
* Default implementation of the persistence unit builder.
@@ -41,12 +46,19 @@
*/
public EntityManagerFactory newEntityManagerFactory(String unitName, ClassLoader classLoader) {
- PersistenceUnitMetadata info = scanner.getPersistenceUnitInfo(unitName, classLoader);
- if(info == null) {
- throw new IllegalArgumentException("Persistence unit not found: " + unitName);
+ PersistenceUnitInfo info = scanner.getPersistenceUnitInfo(unitName, classLoader);
+ String providerClass = info.getPersistenceProviderClassName();
+ try {
+ Map overrides = new HashMap();
+ PersistenceProvider provider = (PersistenceProvider) Class.forName(providerClass).newInstance();
+ return provider.createContainerEntityManagerFactory(info, overrides);
+ } catch (InstantiationException ex) {
+ throw new TuscanyJpaException(ex);
+ } catch (IllegalAccessException ex) {
+ throw new TuscanyJpaException(ex);
+ } catch (ClassNotFoundException ex) {
+ throw new TuscanyJpaException(ex);
}
-
- return null;
}
Modified: incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitScanner.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitScanner.java?view=diff&rev=471884&r1=471883&r2=471884
==============================================================================
--- incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitScanner.java (original)
+++ incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitScanner.java Mon Nov 6 13:24:20 2006
@@ -18,12 +18,38 @@
*/
package org.apache.tuscany.service.persistence.common;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
/**
* Scans the classloader for the specified persistence unit.
*
*/
class PersistenceUnitScanner {
+ /** Cache of persistence unit info */
+ private Map<String, PersistenceUnitInfo> persistenceUnitInfos = new HashMap<String, PersistenceUnitInfo>();
+
/**
* Scans the lassloader for the specified persistence unit and creates
* an immutable representation of the information present in the matching
@@ -33,8 +59,90 @@
* @param classLoader Classloader to scan.
* @return Persistence unit information.
*/
- PersistenceUnitMetadata getPersistenceUnitInfo(String unitName, ClassLoader classLoader) {
- return null;
+ PersistenceUnitInfo getPersistenceUnitInfo(String unitName, ClassLoader classLoader) {
+
+
+ synchronized (persistenceUnitInfos) {
+
+ try {
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+
+ XPathFactory xpathFactory = XPathFactory.newInstance();
+ XPath xpath = xpathFactory.newXPath();
+
+ Enumeration<URL> persistenceUnitUrls = classLoader.getResources("META-INF/persistence.xml");
+ while(persistenceUnitUrls.hasMoreElements()) {
+
+ URL persistenceUnitUrl = persistenceUnitUrls.nextElement();
+ Document root = db.parse(persistenceUnitUrl.openStream());
+
+ String name = getSingleValue(xpath, root, "//persistence-unit/@name");
+ if(!unitName.equals(name)) {
+ continue;
+ }
+
+ String transactionType = getSingleValue(xpath, root, "//persistence-unit/@transaction-type");
+ String provider = getSingleValue(xpath, root, "//persistence-unit/provider");
+ String jtaDsName = getSingleValue(xpath, root, "//persistence-unit/jta-data-source");
+ String nonJtaDsName = getSingleValue(xpath, root, "//persistence-unit/non-jta-data-source");
+ List<String> mappingFiles = getMultipleValues(xpath, root, "//persistence-unit/mapping-file");
+ List<String> jarFiles = getMultipleValues(xpath, root, "//persistence-unit/jar-file");
+ boolean exludeUnlistedClasses = getBooleanValue(xpath, root, "//persistence-unit/exclude-unlisted-classes");
+ List<String> managedClasses = getMultipleValues(xpath, root, "//persistence-unit/class");
+
+ // TODO load properties
+ Properties prop = new Properties();
+
+ PersistenceUnitInfo info = new TuscanyPersistenceUnitInfo(transactionType, prop, persistenceUnitUrl, unitName, provider, nonJtaDsName, null, mappingFiles, managedClasses, jtaDsName, jarFiles, classLoader, exludeUnlistedClasses);
+ persistenceUnitInfos.put(unitName, info);
+ return info;
+
+ }
+ } catch (IOException ex) {
+ throw new TuscanyJpaException(ex);
+ } catch (ParserConfigurationException ex) {
+ throw new TuscanyJpaException(ex);
+ } catch (SAXException ex) {
+ throw new TuscanyJpaException(ex);
+ } catch (XPathExpressionException ex) {
+ throw new TuscanyJpaException(ex);
+ }
+ }
+
+ throw new TuscanyJpaException("Unabel to find persistence unit: " + unitName);
+
+ }
+
+ /*
+ * Gets multiple values for the specified expression.
+ */
+ private List<String> getMultipleValues(XPath xpath, Node context, String expression) throws XPathExpressionException {
+
+ NodeList nodeList = (NodeList)xpath.evaluate(expression, context, XPathConstants.NODESET);
+ List<String> data = new LinkedList<String>();
+
+ for(int i = 0;i < nodeList.getLength();i++) {
+ data.add(nodeList.item(i).getTextContent());
+ }
+
+ return data;
+
+ }
+
+ /*
+ * Gets single value for the specified expression.
+ */
+ private String getSingleValue(XPath xpath, Node context, String expression) throws XPathExpressionException {
+ return xpath.evaluate(expression, context);
+ }
+
+ /*
+ * Gets single value for the specified expression.
+ */
+ private boolean getBooleanValue(XPath xpath, Node context, String expression) throws XPathExpressionException {
+ return Boolean.valueOf(xpath.evaluate(expression, context));
}
}
Copied: incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/TuscanyPersistenceUnitInfo.java (from r471534, incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitMetadata.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/TuscanyPersistenceUnitInfo.java?view=diff&rev=471884&p1=incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitMetadata.java&r1=471534&p2=incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/TuscanyPersistenceUnitInfo.java&r2=471884
==============================================================================
--- incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/PersistenceUnitMetadata.java (original)
+++ incubator/tuscany/java/sca/services/persistence/common/src/main/java/org/apache/tuscany/service/persistence/common/TuscanyPersistenceUnitInfo.java Mon Nov 6 13:24:20 2006
@@ -18,10 +18,15 @@
*/
package org.apache.tuscany.service.persistence.common;
+import java.net.MalformedURLException;
import java.net.URL;
+import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
import javax.persistence.spi.ClassTransformer;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
@@ -31,12 +36,12 @@
* Encpasulates the information in the persistence.xml file.
*
*/
-class PersistenceUnitMetadata implements PersistenceUnitInfo {
+class TuscanyPersistenceUnitInfo implements PersistenceUnitInfo {
/**
* Transaction type.
*/
- private PersistenceUnitTransactionType transactionType;
+ private String transactionType;
/**
* Configuration properties.
@@ -64,6 +69,11 @@
private DataSource nonJtaDataSource;
/**
+ * Non JTA Datasource name.
+ */
+ private String nonJtaDsName;
+
+ /**
* Temporary classloader.
*/
private ClassLoader tempClassLoader;
@@ -79,6 +89,11 @@
private List<String> managedClassNames;
/**
+ * JTA datasource name.
+ */
+ private String jtaDsName;
+
+ /**
* JTA datasource.
*/
private DataSource jtaDataSource;
@@ -86,7 +101,7 @@
/**
* JAR file URLs.
*/
- private List<URL> jarFileUrls;
+ private List<String> jarFileUrls;
/**
* Classloader.
@@ -116,18 +131,17 @@
* @param classLoader Classloader.
* @param unlistedClassesExcluded Whether unlisted classes in the DD are exluded.
*/
- public PersistenceUnitMetadata(PersistenceUnitTransactionType transactionType, Properties properties, URL rootUrl, String unitName, String providerClass, DataSource nonJtaDataSource, ClassLoader tempClassLoader, List<String> mappingFileNames, List<String> managedClassNames, DataSource jtaDataSource, List<URL> jarFileUrls, ClassLoader classLoader, boolean unlistedClassesExcluded) {
- super();
+ public TuscanyPersistenceUnitInfo(String transactionType, Properties properties, URL rootUrl, String unitName, String providerClass, String nonJtaDsName, ClassLoader tempClassLoader, List<String> mappingFileNames, List<String> managedClassNames, String jtaDsName, List<String> jarFileUrls, ClassLoader classLoader, boolean unlistedClassesExcluded) {
this.transactionType = transactionType;
this.properties = properties;
this.rootUrl = rootUrl;
this.unitName = unitName;
this.providerClass = providerClass;
- this.nonJtaDataSource = nonJtaDataSource;
+ this.nonJtaDsName = nonJtaDsName;
this.tempClassLoader = tempClassLoader;
this.mappingFileNames = mappingFileNames;
this.managedClassNames = managedClassNames;
- this.jtaDataSource = jtaDataSource;
+ this.jtaDsName = jtaDsName;
this.jarFileUrls = jarFileUrls;
this.classLoader = classLoader;
this.unlistedClassesExcluded = unlistedClassesExcluded;
@@ -157,14 +171,30 @@
* @see javax.persistence.spi.PersistenceUnitInfo#getJarFileUrls()
*/
public List<URL> getJarFileUrls() {
- return jarFileUrls;
+ try {
+ List<URL> jarFiles = new LinkedList<URL>();
+ for(String jarFileUrl : jarFileUrls) {
+ jarFiles.add(new URL(jarFileUrl));
+ }
+ return jarFiles;
+ } catch(MalformedURLException ex) {
+ throw new TuscanyJpaException(ex);
+ }
}
/* (non-Javadoc)
* @see javax.persistence.spi.PersistenceUnitInfo#getJtaDataSource()
*/
public DataSource getJtaDataSource() {
- return jtaDataSource;
+
+ if(jtaDataSource != null) {
+ return jtaDataSource;
+ }
+ if(jtaDsName == null || "".equals(jtaDsName)) {
+ return null;
+ }
+ return lookupDataSource(jtaDsName);
+
}
/* (non-Javadoc)
@@ -192,7 +222,15 @@
* @see javax.persistence.spi.PersistenceUnitInfo#getNonJtaDataSource()
*/
public DataSource getNonJtaDataSource() {
- return nonJtaDataSource;
+
+ if(nonJtaDataSource != null) {
+ return nonJtaDataSource;
+ }
+ if(nonJtaDsName == null || "".equals(nonJtaDsName)) {
+ return null;
+ }
+ return lookupDataSource(nonJtaDsName);
+
}
/* (non-Javadoc)
@@ -227,7 +265,28 @@
* @see javax.persistence.spi.PersistenceUnitInfo#getTransactionType()
*/
public PersistenceUnitTransactionType getTransactionType() {
- return transactionType;
+ return "JTA".equals(transactionType) ? PersistenceUnitTransactionType.JTA : PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+
+ /*
+ * Looks up datasource.
+ */
+ private DataSource lookupDataSource(String dsName) {
+ Context ctx = null;
+ try {
+ ctx = new InitialContext();
+ return (DataSource) ctx.lookup(dsName);
+ } catch(NamingException ex) {
+ throw new TuscanyJpaException(ex);
+ } finally {
+ if(ctx != null) {
+ try {
+ ctx.close();
+ } catch(NamingException ex) {
+ throw new TuscanyJpaException(ex);
+ }
+ }
+ }
}
}
Modified: incubator/tuscany/java/sca/services/persistence/common/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/services/persistence/common/src/test/resources/META-INF/persistence.xml?view=diff&rev=471884&r1=471883&r2=471884
==============================================================================
--- incubator/tuscany/java/sca/services/persistence/common/src/test/resources/META-INF/persistence.xml (original)
+++ incubator/tuscany/java/sca/services/persistence/common/src/test/resources/META-INF/persistence.xml Mon Nov 6 13:24:20 2006
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+ -->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="test" transaction-type="JTA">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <class>org.apache.tuscany.service.persistence.common.Employee</class>
+ <class>org.apache.tuscany.service.persistence.common.Department</class>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ </properties>
+ </persistence-unit>
+</persistence>
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org