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