You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ri...@apache.org on 2007/11/22 09:48:15 UTC

svn commit: r597334 - in /maven/continuum/branches/continuum-jpa/continuum-model-jpa: ./ src/main/java/org/apache/maven/continuum/model/project/ src/main/java/org/apache/maven/continuum/model/scm/ src/main/java/org/apache/maven/continuum/store/api/ src...

Author: rinku
Date: Thu Nov 22 00:48:11 2007
New Revision: 597334

URL: http://svn.apache.org/viewvc?rev=597334&view=rev
Log:
o  Moved around some resources
o  Started adding some unit test for store and related updates to impl.

Added:
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java   (with props)
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java   (with props)
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java   (with props)
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java   (with props)
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java   (with props)
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/resources/
Removed:
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/resources/META-INF/
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/resources/jdbc.properties
Modified:
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/pom.xml
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/project/BuildResult.java
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/scm/ScmResult.java
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/api/Store.java
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectGroupStore.java
    maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectStore.java

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/pom.xml
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/pom.xml?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/pom.xml (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/pom.xml Thu Nov 22 00:48:11 2007
@@ -20,5 +20,41 @@
       <artifactId>openjpa</artifactId>
       <version>1.0.0</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+      <version>10.3.1.4</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
+  <!-- build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>process-sources</phase>
+            <configuration>
+              <tasks>                  
+                <property name="compile_classpath"
+                  refid="maven.compile.classpath" />
+                <property name="runtime_classpath"
+                  refid="maven.runtime.classpath" />
+                <property name="test_classpath"
+                  refid="maven.test.classpath" />
+                <property name="plugin_classpath"
+                  refid="maven.plugin.classpath" />
+                <ant antfile="${basedir}/build.xml">
+                  <target name="refresh" />
+                </ant>
+              </tasks>
+            </configuration>
+            <goals>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build -->
 </project>

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/project/BuildResult.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/project/BuildResult.java?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/project/BuildResult.java (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/project/BuildResult.java Thu Nov 22 00:48:11 2007
@@ -8,7 +8,10 @@
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
 import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
@@ -121,7 +124,9 @@
      * Field modifiedDependencies
      */
     @OneToMany( cascade = CascadeType.ALL )
-    @JoinColumn( name = "ID_PROJECT_DEPENDENCY" )
+    @JoinTable( name = "PROJECT_DEPENDENCY", 
+                joinColumns = @JoinColumn( name = "BUILD_ID" ), 
+                inverseJoinColumns = @JoinColumn( name = "ID_PROJECT_DEPENDENCY" ) )
     private List<ProjectDependency> modifiedDependencies;
 
     /**

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/scm/ScmResult.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/scm/ScmResult.java?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/scm/ScmResult.java (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/model/scm/ScmResult.java Thu Nov 22 00:48:11 2007
@@ -12,7 +12,7 @@
 
 /**
  * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
- * @version $Id$
+ * @version $Id$ 
  */
 @Entity
 @Table( name = "SCM_RESULT" )
@@ -49,9 +49,10 @@
 
     /**
      * Field exception
+     * XXX: Renamed from 'EXCEPTION' to 'EXCEPTION_MSG'
      */
     @Basic
-    @Column( name = "EXCEPTION" )
+    @Column( name = "EXCEPTION_MSG" )
     private String exception;
 
     /**

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/api/Store.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/api/Store.java?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/api/Store.java (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/api/Store.java Thu Nov 22 00:48:11 2007
@@ -7,7 +7,8 @@
 
 /**
  * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
- * 
+ * @version $Id$
+ * @since 1.2
  */
 public interface Store<T>
 {

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectGroupStore.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectGroupStore.java?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectGroupStore.java (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectGroupStore.java Thu Nov 22 00:48:11 2007
@@ -13,7 +13,8 @@
 
 /**
  * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
- * 
+ * @version $Id$
+ * @since 1.2
  */
 public class JpaProjectGroupStore implements Store<ProjectGroup>
 {

Modified: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectStore.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectStore.java?rev=597334&r1=597333&r2=597334&view=diff
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectStore.java (original)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/main/java/org/apache/maven/continuum/store/jpa/JpaProjectStore.java Thu Nov 22 00:48:11 2007
@@ -13,7 +13,8 @@
 
 /**
  * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
- * 
+ * @version $Id$
+ * @since 1.2
  */
 public class JpaProjectStore implements Store<Project>
 {

Added: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java?rev=597334&view=auto
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java (added)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java Thu Nov 22 00:48:11 2007
@@ -0,0 +1,61 @@
+/**
+ * 
+ */
+package org.apache.maven.continuum.store.jpa;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.openjpa.persistence.OpenJPAQuery;
+import org.apache.openjpa.persistence.test.SingleEMTestCase;
+
+/**
+ * @author <a href='mailto:rahul.thakur.xdev@gmail.com'>Rahul Thakur</a>
+ * @since 1.2
+ * @version $Id$
+ * @see {@linkplain http://mail-archives.apache.org/mod_mbox/openjpa-users/200706.mbox/%3CBF2B99E3-7EF3-4E99-91E1-8AEB940524C7@apache.org%3E}
+ */
+public class JpaProjectStoreTest extends SingleEMTestCase
+{
+    private static final String PERSITENT_UNIT_CONTINUUM_STORE = "continuum-store";
+
+    @Override
+    public void setUp()
+    {
+        Properties propMap = new Properties();
+        setUp( propMap );
+    }
+
+    /**
+     * Returns the name of the persistent-unit setup in <code>persistence.xml</code>.
+     */
+    @Override
+    protected String getPersistenceUnitName()
+    {
+        return PERSITENT_UNIT_CONTINUUM_STORE;
+    }
+
+    public void testContinuumJPAStoreActions()
+    {
+        OpenJPAQuery q = em.createQuery( "select p from Project p" );
+        String[] sql = q.getDataStoreActions( null );
+        assertEquals( 1, sql.length );
+        assertTrue( sql[0].startsWith( "SELECT" ) );
+        // TODO: Uncomment following!
+        //List results = q.getResultList();
+        //assertNotNull( results );
+        //assertEquals( 0, results.size() );
+    }
+
+    /**
+     * TODO: Investigate {@link org.apache.openjpa.persistence.PersistenceException} attempting to clear tables from
+     * schema.
+     */
+    @Override
+    public void tearDown() throws Exception
+    {
+        // super.tearDown();
+        // do nothing
+    }
+
+}

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/maven/continuum/store/jpa/JpaProjectStoreTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java?rev=597334&view=auto
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java (added)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java Thu Nov 22 00:48:11 2007
@@ -0,0 +1,205 @@
+/*
+ * 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.    
+ */
+package org.apache.openjpa.persistence.test;
+
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import junit.framework.TestCase;
+import org.apache.openjpa.kernel.AbstractBrokerFactory;
+import org.apache.openjpa.kernel.Broker;
+import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.JPAFacadeHelper;
+
+/**
+ * Base test class providing persistence utilities.
+ */
+public abstract class PersistenceTestCase
+    extends TestCase {
+
+    /**
+     * Marker object you an pass to {@link #setUp} to indicate that the
+     * database tables should be cleared.
+     */
+    protected static final Object CLEAR_TABLES = new Object();
+
+    /**
+     * Create an entity manager factory. Put {@link #CLEAR_TABLES} in
+     * this list to tell the test framework to delete all table contents
+     * before running the tests.
+     *
+     * @param props list of persistent types used in testing and/or
+     * configuration values in the form key,value,key,value...
+     */
+    protected OpenJPAEntityManagerFactorySPI createEMF(Object... props) {
+        return createNamedEMF(getPersistenceUnitName(), props);
+    }
+
+    /**
+     * The name of the persistence unit that this test class should use
+     * by default. This defaults to "test".
+     */
+    protected String getPersistenceUnitName() {
+        return "test";
+    }
+
+    /**
+     * Create an entity manager factory for persistence unit <code>pu</code>.
+     * Put {@link #CLEAR_TABLES} in
+     * this list to tell the test framework to delete all table contents
+     * before running the tests.
+     *
+     * @param props list of persistent types used in testing and/or
+     * configuration values in the form key,value,key,value...
+     */
+    protected OpenJPAEntityManagerFactorySPI createNamedEMF(String pu,
+        Object... props) {
+        Map map = new HashMap(System.getProperties());
+        List<Class> types = new ArrayList<Class>();
+        boolean prop = false;
+        for (int i = 0; i < props.length; i++) {
+            if (prop) {
+                map.put(props[i - 1], props[i]);
+                prop = false;
+            } else if (props[i] == CLEAR_TABLES) {
+                map.put("openjpa.jdbc.SynchronizeMappings",
+                    "buildSchema(ForeignKeys=true," 
+                    + "SchemaAction='add,deleteTableContents')");
+            } else if (props[i] instanceof Class)
+                types.add((Class) props[i]);
+            else if (props[i] != null)
+                prop = true;
+        }
+
+        if (!types.isEmpty()) {
+            StringBuffer buf = new StringBuffer();
+            for (Class c : types) {
+                if (buf.length() > 0)
+                    buf.append(";");
+                buf.append(c.getName());
+            }
+            map.put("openjpa.MetaDataFactory",
+                "jpa(Types=" + buf.toString() + ")");
+        }
+
+        return (OpenJPAEntityManagerFactorySPI) Persistence.
+            createEntityManagerFactory(pu, map);
+    }
+
+    public void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Safely close the given factory.
+     */
+    protected boolean closeEMF(EntityManagerFactory emf) {
+        if (emf == null)
+            return false;
+        if (!emf.isOpen())
+            return false;
+
+        for (Iterator iter = ((AbstractBrokerFactory) JPAFacadeHelper
+            .toBrokerFactory(emf)).getOpenBrokers().iterator();
+            iter.hasNext(); ) {
+            Broker b = (Broker) iter.next();
+            if (b != null && !b.isClosed()) {
+                EntityManager em = JPAFacadeHelper.toEntityManager(b);
+                if (em.getTransaction().isActive())
+                    em.getTransaction().rollback();
+                em.close();
+            }
+        }
+
+        emf.close();
+        return !emf.isOpen();
+    }
+
+    /**
+     * Delete all instances of the given types using bulk delete queries.
+     */
+    protected void clear(EntityManagerFactory emf, Class... types) {
+        if (emf == null || types.length == 0)
+            return;
+
+        List<ClassMetaData> metas = new ArrayList<ClassMetaData>(types.length);
+        for (Class c : types) {
+            ClassMetaData meta = JPAFacadeHelper.getMetaData(emf, c);
+            if (meta != null)
+                metas.add(meta);
+        }
+        clear(emf, metas.toArray(new ClassMetaData[metas.size()]));
+    }
+
+    /**
+     * Delete all instances of the persistent types registered with the given
+     * factory using bulk delete queries.
+     */
+    protected void clear(EntityManagerFactory emf) {
+        if (emf == null)
+            return;
+        clear(emf, ((OpenJPAEntityManagerFactorySPI) emf).getConfiguration().
+            getMetaDataRepositoryInstance().getMetaDatas());
+    }
+
+    /**
+     * Delete all instances of the given types using bulk delete queries.
+     */
+    private void clear(EntityManagerFactory emf, ClassMetaData... types) {
+        if (emf == null || types.length == 0)
+            return;
+
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        for (ClassMetaData meta : types) {
+            if (!meta.isMapped() || meta.isEmbeddedOnly() 
+                || Modifier.isAbstract(meta.getDescribedType().getModifiers()))
+                continue;
+            em.createQuery("DELETE FROM " + meta.getTypeAlias() + " o").
+                executeUpdate();
+        }
+        em.getTransaction().commit();
+        em.close();
+    }
+
+    /**
+     * Return the entity name for the given type.   
+     */
+    protected String entityName(EntityManagerFactory emf, Class c) {
+        ClassMetaData meta = JPAFacadeHelper.getMetaData(emf, c);
+        return (meta == null) ? null : meta.getTypeAlias();
+    }
+
+    public static void assertNotEquals(Object o1, Object o2) {
+        if (o1 == o2)
+            fail("expected args to be different; were the same instance.");
+        else if (o1 == null || o2 == null)
+            return;
+        else if (o1.equals(o2))
+            fail("expected args to be different; compared equal.");
+    }
+}

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java?rev=597334&view=auto
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java (added)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java Thu Nov 22 00:48:11 2007
@@ -0,0 +1,125 @@
+/*
+ * 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.    
+ */
+package org.apache.openjpa.persistence.test;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
+import org.apache.openjpa.lib.jdbc.JDBCEvent;
+import org.apache.openjpa.lib.jdbc.JDBCListener;
+
+/**
+ * Base class for tests that need to check generated SQL.
+ *
+ * @author Patrick Linskey
+ */
+public abstract class SQLListenerTestCase
+    extends SingleEMFTestCase {
+
+    protected List<String> sql = new ArrayList<String>();
+    protected int sqlCount;
+    
+    @Override
+    public void setUp(Object... props) {
+        Object[] copy = new Object[props.length + 2];
+        System.arraycopy(props, 0, copy, 0, props.length);
+        copy[copy.length - 2] = "openjpa.jdbc.JDBCListeners";
+        copy[copy.length - 1] = new JDBCListener[] { new Listener() };
+        super.setUp(copy); 
+    }
+
+    /**
+     * Confirm that the specified SQL has been executed.
+     *
+     * @param sqlExp the SQL expression. E.g., "SELECT FOO .*"
+     */
+    public void assertSQL(String sqlExp) {
+        for (String statement : sql) {
+            if (statement.matches(sqlExp))
+                return;
+        }
+
+        fail("Expected regular expression <" + sqlExp + "> to have"
+            + " existed in SQL statements: " + sql);
+    }
+
+    /**
+     * Confirm that the specified SQL has not been executed.
+     *
+     * @param sqlExp the SQL expression. E.g., "SELECT BADCOLUMN .*"
+     */
+    public void assertNotSQL(String sqlExp) {
+        boolean failed = false;
+
+        for (String statement : sql) {
+            if (statement.matches(sqlExp))
+                failed = true;
+        }
+
+        if (failed)
+            fail("Regular expression <" + sqlExp + ">"
+                + " should not have been executed in SQL statements: " + sql);
+    }
+
+    /**
+     * Confirm that the executed SQL String contains the specified sqlExp.
+     *
+     * @param sqlExp the SQL expression. E.g., "SELECT BADCOLUMN .*"
+     */
+    public void assertContainsSQL(String sqlExp) {
+        for (String statement : sql) {
+            if (statement.contains(sqlExp))
+                return;
+        }
+
+        fail("Expected regular expression <" + sqlExp + "> to be"
+            + " contained in SQL statements: " + sql);
+    }
+    
+    /**
+     * Gets the number of SQL issued since last reset.
+     */
+    public int getSQLCount() {
+    	return sqlCount;
+    }
+    
+    /**
+     * Resets SQL count.
+     * @return number of SQL counted since last reset.
+     */
+    public int resetSQLCount() {
+    	int tmp = sqlCount;
+    	sqlCount = 0;
+    	return tmp;
+    }
+
+    public class Listener
+        extends AbstractJDBCListener {
+
+        @Override
+        public void beforeExecuteStatement(JDBCEvent event) {
+            if (event.getSQL() != null && sql != null) {
+                sql.add(event.getSQL());
+                sqlCount++;
+            }
+		}
+	}
+}

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SQLListenerTestCase.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java?rev=597334&view=auto
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java (added)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java Thu Nov 22 00:48:11 2007
@@ -0,0 +1,71 @@
+/*
+ * 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.    
+ */
+package org.apache.openjpa.persistence.test;
+
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+
+public abstract class SingleEMFTestCase
+    extends PersistenceTestCase {
+
+    protected OpenJPAEntityManagerFactorySPI emf;
+
+    /**
+     * Call {@link #setUp(Object...)} with no arguments so that the emf
+     * set-up happens even if <code>setUp()</code> is not called from the
+     * subclass.
+     */
+    public void setUp() throws Exception {
+        setUp(new Object[0]);
+    }
+
+    /**
+     * Initialize entity manager factory. Put {@link #CLEAR_TABLES} in
+     * this list to tell the test framework to delete all table contents
+     * before running the tests.
+     *
+     * @param props list of persistent types used in testing and/or 
+     * configuration values in the form key,value,key,value...
+     */
+    protected void setUp(Object... props) {
+        emf = createEMF(props);
+    }
+
+    /**
+     * Closes the entity manager factory.
+     */
+    public void tearDown() throws Exception {
+        super.tearDown();
+
+        if (emf == null)
+            return;
+
+        try {
+            clear(emf);
+        } finally {
+            closeEMF(emf);
+        }
+    }
+    
+    protected ClassMapping getMapping(String name) {
+        return (ClassMapping) emf.getConfiguration()
+                .getMetaDataRepositoryInstance().getMetaData(name,
+                        getClass().getClassLoader(), true);
+    }
+}

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMFTestCase.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java
URL: http://svn.apache.org/viewvc/maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java?rev=597334&view=auto
==============================================================================
--- maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java (added)
+++ maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java Thu Nov 22 00:48:11 2007
@@ -0,0 +1,194 @@
+/*
+ * 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.    
+ */
+package org.apache.openjpa.persistence.test;
+
+import java.util.Collections;
+import java.util.List;
+import javax.persistence.EntityTransaction;
+
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.OpenJPAQuery;
+
+/**
+ * A base test case that can be used to easily test scenarios where there
+ * is only a single EntityManager at any given time.
+ *
+ * @author Marc Prud'hommeaux
+ */
+public abstract class SingleEMTestCase 
+    extends SingleEMFTestCase {
+
+    protected OpenJPAEntityManager em;
+
+    @Override
+    public void setUp() {
+        setUp(new Object[0]);
+    }
+
+    @Override
+    public void setUp(Object... props) {
+        super.setUp(props);
+        em = emf.createEntityManager(); 
+    }
+
+    /** 
+     * Clear the current EntityManager and re-initialize it.
+     */
+    protected void reset() {
+        close();
+        em = emf.createEntityManager(); 
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        rollback();
+        close();
+        super.tearDown();
+    }
+
+    /** 
+     * Start a new transaction if there isn't currently one active. 
+     * @return  true if a transaction was started, false if one already existed
+     */
+    protected boolean begin() {
+        EntityTransaction tx = em.getTransaction();
+        if (tx.isActive())
+            return false;
+
+        tx.begin();
+        return true;
+    }
+
+    /** 
+     * Commit the current transaction, if it is active. 
+     * @return true if the transaction was committed
+     */
+    protected boolean commit() {
+        EntityTransaction tx = em.getTransaction();
+        if (!tx.isActive())
+            return false;
+
+        tx.commit();
+        return true;
+    }
+
+    /** 
+     * Rollback the current transaction, if it is active. 
+     * @return true if the transaction was rolled back
+     */
+    protected boolean rollback() {
+        EntityTransaction tx = em.getTransaction();
+        if (!tx.isActive())
+            return false;
+
+        tx.rollback();
+        return true;
+    }
+
+    /** 
+     * Closes the current EntityManager if it is open. 
+     * @return false if the EntityManager was already closed.
+     */
+    protected boolean close() {
+        if (em == null)
+            return false;
+
+        rollback();
+
+        if (!em.isOpen())
+            return false;
+
+        em.close();
+        return !em.isOpen();
+    }
+
+    /** 
+     * Delete all of the instances.
+     *
+     * If no transaction is running, then one will be started and committed.
+     * Otherwise, the operation will take place in the current transaction.
+     */
+    protected void remove(Object... obs) {
+        boolean tx = begin();
+        for (Object ob : obs)
+            em.remove(ob);
+        if (tx) 
+            commit();
+    }
+
+    /** 
+     * Persist all of the instances.
+     *
+     * If no transaction is running, then one will be started and committed.
+     * Otherwise, the operation will take place in the current transaction.
+     */
+    protected void persist(Object... obs) {
+        boolean tx = begin();
+        for (Object ob : obs)
+            em.persist(ob);
+        if (tx) 
+            commit();
+    }
+
+    /** 
+     * Creates a query in the current EntityManager with the specified string. 
+     */
+    protected OpenJPAQuery query(String str) {
+        return em.createQuery(str);
+    }
+
+    /** 
+     * Create a query against the specified class, which will be aliased
+     * as "x". For example, query(Person.class, "where x.age = 21") will
+     * create the query "select x from Person x where x.age = 21".
+     *  
+     * @param  c  the class to query against
+     * @param  str  the query suffix
+     * @param  params  the parameters, if any
+     * @return the Query object
+     */
+    protected OpenJPAQuery query(Class c, String str, Object... params) {
+        String query = "select x from " + entityName(emf, c) + " x "
+            + (str == null ? "" : str);
+        OpenJPAQuery q = em.createQuery(query);
+        for (int i = 0; params != null && i < params.length; i++)
+            q.setParameter(i + 1, params[i]);
+        return q;
+    }
+
+    /** 
+     * Returns a list of all instances of the specific class in the database. 
+     *
+     * @param c the class to find
+     * @param q the query string suffix to use
+     * @param params the positional parameter list value
+     *
+     * @see #query(java.lang.Class,java.lang.String)
+     */
+    protected <E> List<E> find(Class<E> c, String q, Object... params) {
+        return Collections.checkedList(query(c, q, params).getResultList(), c);
+    }
+
+    /** 
+     * Returns a list of all instances of the specific class in the database. 
+     */
+    protected <E> List<E> find(Class<E> c) {
+        return find(c, null);
+    }
+}

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/branches/continuum-jpa/continuum-model-jpa/src/test/java/org/apache/openjpa/persistence/test/SingleEMTestCase.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"