Some initial testing
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/.classpath b/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
index cdaadb8..9db7c81 100644
--- a/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/.classpath
@@ -1,13 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry excluding="**/.svn/**" kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
- <classpathentry combineaccessrules="false" kind="src" path="/JPA-RS"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.antlr"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.asm"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.core"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.moxy"/>
<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.oracle"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.jpa"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/JPA-RS"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/javax.persistence 2.0.0"/>
<classpathentry kind="output" path="classes"/>
</classpath>
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/bootstrap/TestBootstrap.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/bootstrap/TestBootstrap.java
new file mode 100644
index 0000000..a34c74f
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/bootstrap/TestBootstrap.java
@@ -0,0 +1,56 @@
+package jpars.test.bootstrap;
+
+import static org.junit.Assert.*;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import jpars.test.util.ExamplePropertiesLoader;
+
+import org.eclipse.persistence.jaxb.JAXBContext;
+import org.eclipse.persistence.jpa.JpaHelper;
+import org.eclipse.persistence.jpa.rs.PersistenceContext;
+import org.eclipse.persistence.jpa.rs.PersistenceFactory;
+import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.Session;
+import org.eclipse.persistence.sessions.server.ServerSession;
+import org.junit.Test;
+
+/**
+ * Test bootstrapping of a dynamically created persistence context
+ * @author tware
+ *
+ */
+public class TestBootstrap {
+
+ @Test
+ public void testBootstrap() {
+ Map<String, Object> properties = new HashMap<String, Object>();
+ ExamplePropertiesLoader.loadProperties(properties);
+ PersistenceFactory factory = null;
+ try{
+ factory = new PersistenceFactory();
+ factory.bootstrapPersistenceContext(new URL("file:///C:/EclipseLinkView2/incubator/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml"), properties);
+ } catch (Exception e){
+ fail(e.toString());
+ }
+
+ PersistenceContext context = factory.getPersistenceContext("auction");
+
+ assertTrue(context.getEmf() != null);
+ assertTrue(context.getJAXBContext() != null);
+
+ Session session = (ServerSession)JpaHelper.getServerSession(context.getEmf());
+ assertTrue("JPA Session did not contain Auction.", session.getProject().getAliasDescriptors().containsKey("Auction"));
+ assertTrue("JPA Session did not contain Bid.", session.getProject().getAliasDescriptors().containsKey("Bid"));
+ assertTrue("JPA Session did not contain User.", session.getProject().getAliasDescriptors().containsKey("User"));
+
+ session = (DatabaseSession)((JAXBContext)context.getJAXBContext()).getXMLContext().getSession(0);
+ assertTrue("JAXB Session did not contain Auction.", session.getProject().getAliasDescriptors().containsKey("Auction"));
+ assertTrue("JAXB Session did not contain Bid.", session.getProject().getAliasDescriptors().containsKey("Bid"));
+ assertTrue("JAXB Session did not contain User.", session.getProject().getAliasDescriptors().containsKey("User"));
+
+ }
+
+}
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java
new file mode 100644
index 0000000..3ef9328
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/crud/CRUDTests.java
@@ -0,0 +1,93 @@
+package jpars.test.crud;
+
+import static org.junit.Assert.*;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+
+import jpars.test.util.ExamplePropertiesLoader;
+
+import org.eclipse.persistence.dynamic.DynamicEntity;
+import org.eclipse.persistence.jpa.rs.PersistenceContext;
+import org.eclipse.persistence.jpa.rs.PersistenceFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test basic CRUD operations on a dynamically created PersistenceContext
+ * @author tware
+ *
+ */
+public class CRUDTests {
+
+ private static PersistenceContext persistenceContext;
+ private static PersistenceFactory factory;
+
+ @BeforeClass
+ public static void setup(){
+ Map<String, Object> properties = new HashMap<String, Object>();
+ ExamplePropertiesLoader.loadProperties(properties);
+ factory = null;
+ try{
+ factory = new PersistenceFactory();
+ factory.bootstrapPersistenceContext(new URL("file:///C:/EclipseLinkView2/incubator/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml"), properties);
+ } catch (Exception e){
+ fail(e.toString());
+ }
+
+ persistenceContext = factory.getPersistenceContext("auction");
+ }
+
+ @AfterClass
+ public static void tearDown(){
+ EntityManager em = persistenceContext.getEmf().createEntityManager();
+ em.getTransaction().begin();
+ em.createQuery("delete from Bid b").executeUpdate();
+ em.createQuery("delete from Auction a").executeUpdate();
+ em.createQuery("delete from User u").executeUpdate();
+ em.getTransaction().commit();
+ factory.closePersistenceContext("auction");
+ }
+
+ @Test
+ public void testCreateAndDelete() {
+ DynamicEntity entity = persistenceContext.newEntity("User");
+ entity.set("name", "Jim");
+ persistenceContext.create(null, entity);
+ entity = persistenceContext.find("User", entity.get("id"));
+
+ assertNotNull("Entity was note persisted", entity);
+ assertTrue("Entity Name was incorrect", entity.get("name").equals("Jim"));
+
+ persistenceContext.delete(null, "User", entity.get("id"));
+
+ entity = persistenceContext.find("User", entity.get("id"));
+
+ assertNull("Entity was note deleted", entity);
+ }
+
+
+ @Test
+ public void testQuery(){
+ DynamicEntity entity = persistenceContext.newEntity("User");
+ entity.set("name", "Jill");
+ persistenceContext.create(null, entity);
+
+ entity = persistenceContext.newEntity("User");
+ entity.set("name", "Arthur");
+ persistenceContext.create(null, entity);
+
+ entity = persistenceContext.newEntity("User");
+ entity.set("name", "Judy");
+ persistenceContext.create(null, entity);
+
+ List<DynamicEntity> users = (List<DynamicEntity>)persistenceContext.query("User.all", null);
+ assertTrue(users.size() == 3);
+ }
+
+}
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/ExamplePropertiesLoader.java b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/ExamplePropertiesLoader.java
new file mode 100644
index 0000000..84e017c
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/jpars/test/util/ExamplePropertiesLoader.java
@@ -0,0 +1,75 @@
+/******************************************************************************
+ * ORACLE CONFIDENTIAL
+ * Copyright (c) 2011 Oracle. All rights reserved.
+ *
+ * Contributors:
+ * -
+ ******************************************************************************/
+package jpars.test.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Helper class that will load persistence unit overrides from a properties file
+ * in both the current running folder and the current user's home folder. The
+ * goal is to enable developers and users of the example to customize its
+ * behaviour without having to modify the source of the example.
+ */
+public class ExamplePropertiesLoader {
+
+ public static final String DEFAULT_FILENAME = "jpars.properties";
+
+ /**
+ *
+ * @param properties
+ */
+ public static void loadProperties(Map<String, Object> properties) {
+ loadProperties(properties, DEFAULT_FILENAME);
+ }
+
+ /**
+ *
+ * @param properties
+ */
+ public static void loadProperties(Map<String, Object> properties, String filename) {
+ loadProperties(properties, new File(filename));
+
+ String home = System.getProperty("user.home");
+ loadProperties(properties, new File(home + System.getProperty("file.separator") + filename));
+
+ for (Object key : System.getProperties().keySet()) {
+ String keyName = (String) key;
+
+ if (keyName.startsWith("javax.persistence") || keyName.startsWith("eclipselink")) {
+ String value = System.getProperty(keyName);
+ properties.put(keyName, value);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param properties
+ * @param filePath
+ */
+ public static void loadProperties(Map<String, Object> properties, File file) {
+ try {
+ if (file.exists()) {
+ Properties exampleProps = new Properties();
+ InputStream in = new FileInputStream(file);
+ exampleProps.load(in);
+ in.close();
+
+ for (Map.Entry<Object, Object> entry : exampleProps.entrySet()) {
+ properties.put((String) entry.getKey(), entry.getValue());
+ }
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+}
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-orm.xml b/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-orm.xml
new file mode 100644
index 0000000..a957ac6
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-orm.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="2.1"
+ xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+ <package>jpars.app.auction.model</package>
+
+ <named-query name="Auction.all">
+ <query>SELECT a FROM Auction a</query>
+ </named-query>
+
+ <named-query name="Auction.open">
+ <query>SELECT a FROM Auction a where a.sold = false</query>
+ </named-query>
+
+ <named-query name="Auction.photo">
+ <query>SELECT a.image FROM Auction a where a.id = :auctionId</query>
+ </named-query>
+
+ <named-query name="Bid.All">
+ <query>SELECT b FROM Bid b ORDER BY b.time</query>
+ </named-query>
+
+ <named-query name="Bid.forAuctionId">
+ <query>SELECT b FROM Bid b WHERE b.auction.id =:auctionId ORDER BY b.time</query>
+ </named-query>
+
+ <named-query name="Bid.maxForAuctionId">
+ <query>SELECT MAX(b.bid) FROM Bid b WHERE b.auction.id =:auctionId</query>
+ </named-query>
+
+ <named-query name="Bid.forUserId">
+ <query>SELECT b FROM Bid b WHERE b.user.id =:userId ORDER BY b.time</query>
+ </named-query>
+
+ <named-query name="User.all">
+ <query>SELECT u from User u</query>
+ </named-query>
+
+ <entity class="User" access="VIRTUAL">
+ <table name="AUCTION_USER" />
+ <attributes>
+ <id name="id" attribute-type="Integer">
+ <column name="ID" />
+ <generated-value/>
+ </id>
+ <basic name="name" attribute-type="String" />
+ </attributes>
+ </entity>
+
+ <entity class="Auction" access="VIRTUAL">
+ <table name="AUCTION_AUCTION" />
+ <attributes>
+ <id name="id" attribute-type="Integer">
+ <column name="ID" />
+ <generated-value/>
+ </id>
+ <basic name="name" attribute-type="String" />
+ <basic name="image" attribute-type="String"/>
+ <basic name="description" attribute-type="String">
+ <column column-definition="CLOB"/>
+ </basic>
+ <basic name="startPrice" attribute-type="Double"/>
+ <basic name="endPrice" attribute-type="Double"/>
+ <basic name="sold" attribute-type="boolean"/>
+ </attributes>
+ </entity>
+
+ <entity class="Bid" access="VIRTUAL">
+ <table name="AUCTION_BID" />
+ <attributes>
+ <id name="id" attribute-type="Integer">
+ <column name="ID" />
+ <generated-value/>
+ </id>
+ <basic name="bid" attribute-type="Double" />
+ <basic name="time" attribute-type="Long"/>
+ <one-to-one name="user" fetch="EAGER" target-entity="User">
+ <join-column name="USER_ID" />
+ </one-to-one>
+ <one-to-one name="auction" fetch="EAGER" target-entity="Auction">
+ <join-column name="AUCTION_ID" />
+ </one-to-one>
+ </attributes>
+ </entity>
+
+</entity-mappings>
\ No newline at end of file
diff --git a/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml b/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml
new file mode 100644
index 0000000..0a1298d
--- /dev/null
+++ b/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-persistence.xml
@@ -0,0 +1,16 @@
+<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 persistence_1_0.xsd" version="1.0">
+ <persistence-unit name="auction" transaction-type="RESOURCE_LOCAL">
+
+ <provider>
+ org.eclipse.persistence.jpa.PersistenceProvider
+ </provider>
+
+ <class>jpars.app.auction.model.User</class>
+ <class>jpars.app.auction.model.Auction</class>
+ <class>jpars.app.auction.model.Bid</class>
+ <properties>
+ <property name="eclipselink.metadata-source" value="XML"/>
+ <property name="eclipselink.metadata-source.xml.url" value="file:///C:/EclipseLinkView2/incubator/JPA-RS Incubator/tests/JPA-RS Tests/src/xmldocs/auction-orm.xml"/>
+ </properties>
+ </persistence-unit>
+</persistence>
\ No newline at end of file