Author: ieb
Date: Mon Nov 10 10:11:53 2008
New Revision: 712713

URL: http://svn.apache.org/viewvc?rev=712713&view=rev
Log:
SHINDIG-686

     Patch from Ben Smith

     Adds in Hibernate JPA providers and aligns some minor issues between the 
two JPA implementations.

     Thank you!

Added:
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
    
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/SchemaHibernateTest.java
Modified:
    incubator/shindig/trunk/java/samples/pom.xml
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/OrganizationAddressDb.java
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonAddressDb.java
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonOrganizationDb.java
    
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PhotoDb.java
    
incubator/shindig/trunk/java/samples/src/main/resources/META-INF/persistence.xml
    
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java

Modified: incubator/shindig/trunk/java/samples/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/pom.xml?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- incubator/shindig/trunk/java/samples/pom.xml (original)
+++ incubator/shindig/trunk/java/samples/pom.xml Mon Nov 10 10:11:53 2008
@@ -100,5 +100,33 @@
         <artifactId>annotations</artifactId>
         <scope>compile</scope> 
     </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate</artifactId>
+      <version>3.2.2.ga</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-annotations</artifactId>
+      <version>3.2.1.ga</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-entitymanager</artifactId>
+      <version>3.2.1.ga</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-tools</artifactId>
+      <version>3.2.0.beta9a</version>
+    </dependency>
+    <dependency>
+      <groupId>hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <version>1.8.0.1</version>
+    </dependency>
   </dependencies>
 </project>

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/OrganizationAddressDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/OrganizationAddressDb.java?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/OrganizationAddressDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/OrganizationAddressDb.java
 Mon Nov 10 10:11:53 2008
@@ -24,6 +24,7 @@
 import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
 import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.persistence.ManyToOne;
 import static javax.persistence.CascadeType.PERSIST;
@@ -58,7 +59,7 @@
    * This address is associated with a single organization in this form.
    *
    */
-  @ManyToOne(targetEntity = OrganizationDb.class, cascade = { PERSIST, MERGE, 
REFRESH })
+  @OneToOne(targetEntity = OrganizationDb.class)
   @JoinColumn(name = "organization_id", referencedColumnName = "oid")
   private Organization organization;
 

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonAddressDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonAddressDb.java?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonAddressDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonAddressDb.java
 Mon Nov 10 10:11:53 2008
@@ -45,7 +45,7 @@
   @Column(name="primary_address")
   private Boolean primary;
   
-  @ManyToOne(targetEntity=PersonDb.class, cascade = { PERSIST, MERGE, REFRESH 
})
+  @ManyToOne(targetEntity=PersonDb.class)
   @JoinColumn(name="person_id", referencedColumnName="oid")
   private Person person;
   

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonOrganizationDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonOrganizationDb.java?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonOrganizationDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonOrganizationDb.java
 Mon Nov 10 10:11:53 2008
@@ -44,7 +44,7 @@
   public static final String PERSON_ORG_FINDBY_NAME = 
"q.personorganizationdb.findbyname";
 
   @Basic
-  @Column(name = "primary_organization", table = "person_organization")
+  @Column(name = "primary_organization")
   private Boolean primary;
 
   @ManyToOne(targetEntity = PersonDb.class)
@@ -52,7 +52,7 @@
   protected Person person;
 
   @Basic
-  @Column(name = "type", length = 255, table = "person_organization")
+  @Column(name = "type", length = 255)
   private String type;
 
   public PersonOrganizationDb() {

Modified: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PhotoDb.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PhotoDb.java?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PhotoDb.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PhotoDb.java
 Mon Nov 10 10:11:53 2008
@@ -22,6 +22,7 @@
 import javax.persistence.Entity;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
 import javax.persistence.PrimaryKeyJoinColumn;
 import javax.persistence.Table;
 
@@ -32,7 +33,18 @@
 @Entity
 @Table(name="photo")
 @PrimaryKeyJoinColumn(name="oid")
[EMAIL PROTECTED](name = PhotoDb.FINDBY_PHOTO, 
+    query = "select p from PhotoDb p where p.value = :photo ")
 public class PhotoDb extends ListFieldDb {
+  
+  /**
+   * The name of the JPA query to find phone numbers by phone number (bit odd)
+   */
+  public static final String FINDBY_PHOTO = "q.pphoto.findbyphoto";
+  /**
+   * The name of the phone number parameter in JPA queries
+   */
+  public static final String PARAM_PHOTO = "photo";
 
   /**
    * The person who is using this photo.

Added: 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java?rev=712713&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
 (added)
+++ 
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
 Mon Nov 10 10:11:53 2008
@@ -0,0 +1,91 @@
+/*
+ * 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.shindig.social.opensocial.jpa.hibernate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+/**
+ * 
+ */
+public class Bootstrap {
+
+  private static final String DB_DRIVER = "db.driver";
+  private static final String DB_URL = "db.url";
+  private static final String DB_USER = "db.user";
+  private static final String DB_PASSWORD = "db.password";
+  private static final String DB_MIN_WRITE = "db.write.min";
+  private static final String DB_MIN_NUM_READ = "db.read.min";
+  private static final Log LOG = LogFactory.getLog(Boolean.class);
+  private String minWrite;
+  private String minRead;
+  private String dbPassword;
+  private String dbUser;
+  private String dbUrl;
+  private String dbDriver;
+  private EntityManager entityManager;
+
+  @Inject
+  public Bootstrap(@Named(DB_DRIVER) String dbDriver,
+      @Named(DB_URL) String dbUrl, @Named(DB_USER) String dbUser,
+      @Named(DB_PASSWORD) String dbPassword,
+      @Named(DB_MIN_NUM_READ) String minRead,
+      @Named(DB_MIN_WRITE) String minWrite) {
+    this.dbDriver = dbDriver;
+    this.dbUrl = dbUrl;
+    this.dbUser = dbUser;
+    this.dbPassword = dbPassword == null || dbPassword.length() == 0 ? " "
+        : dbPassword;
+    this.minRead = minRead;
+    this.minWrite = minWrite;
+
+  }
+
+  public void init(String unitName) {
+
+    Map<String, String> properties = new HashMap<String, String>();
+
+    LOG.info("Starting connection manager with properties " + properties);
+
+    EntityManagerFactory emFactory = Persistence.createEntityManagerFactory(
+        unitName, properties);
+    entityManager = emFactory.createEntityManager();
+  }
+
+  /**
+   * @param string
+   * @return
+   */
+  public EntityManager getEntityManager(String unitName) {
+    if (entityManager == null) {
+      init(unitName);
+    }
+    return entityManager;
+  }
+}

Modified: 
incubator/shindig/trunk/java/samples/src/main/resources/META-INF/persistence.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/resources/META-INF/persistence.xml?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/main/resources/META-INF/persistence.xml
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/main/resources/META-INF/persistence.xml
 Mon Nov 10 10:11:53 2008
@@ -3,7 +3,22 @@
   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";
-  > 
+  >
+  
+  <persistence-unit name="hibernate" transaction-type="RESOURCE_LOCAL">
+       <provider>org.hibernate.ejb.HibernatePersistence</provider>
+
+     <properties>
+               <property name="hibernate.hbm2ddl.auto" value="create"/>
+               <property name="hibernate.show_sql" value="true"/>
+               <property name="hibernate.connection.driver_class" 
value="org.hsqldb.jdbcDriver"/>
+               <property name="hibernate.connection.password" value=""/>
+               <property name="hibernate.connection.url" 
value="jdbc:hsqldb:."/>
+               <property name="hibernate.connection.username" value="sa"/>
+               <property name="hibernate.dialect" 
value="org.hibernate.dialect.HSQLDialect"/>
+     </properties>
+  </persistence-unit>
+  
  <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
   <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
  

Modified: 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java?rev=712713&r1=712712&r2=712713&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java
 (original)
+++ 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java
 Mon Nov 10 10:11:53 2008
@@ -23,10 +23,13 @@
 import org.apache.shindig.social.opensocial.jpa.BodyTypeDb;
 import org.apache.shindig.social.opensocial.jpa.EmailDb;
 import org.apache.shindig.social.opensocial.jpa.NameDb;
+import org.apache.shindig.social.opensocial.jpa.OrganizationAddressDb;
 import org.apache.shindig.social.opensocial.jpa.OrganizationDb;
+import org.apache.shindig.social.opensocial.jpa.PersonAddressDb;
 import org.apache.shindig.social.opensocial.jpa.PersonDb;
 import org.apache.shindig.social.opensocial.jpa.PersonOrganizationDb;
 import org.apache.shindig.social.opensocial.jpa.PhoneDb;
+import org.apache.shindig.social.opensocial.jpa.PhotoDb;
 import org.apache.shindig.social.opensocial.jpa.UrlDb;
 import org.apache.shindig.social.opensocial.model.Address;
 import org.apache.shindig.social.opensocial.model.BodyType;
@@ -81,8 +84,8 @@
     c.add(Calendar.YEAR, -age);
     c.add(Calendar.MONTH, 12 - i % 12);
     List<Address> a = new ArrayList<Address>();
-    a.add(getNewAddress(i));
-    a.add(getNewAddress(i + 2));
+    a.add(getNewPersonAddress(i));
+    a.add(getNewPersonAddress(i + 2));
     person.setAddresses(a);
     person.setAge(random.nextInt(105));
     person.setBodyType(getNewBodyType(i));
@@ -147,7 +150,12 @@
     person.setSports(getList("Sports"));
     person.setStatus("Status");
     person.setTags(getList("tags"));
-    person.setThumbnailUrl("Thumbnail URL");
+    
+    List<ListField> photos = new ArrayList<ListField>();
+    photos.add(getNewPhoto(i));
+    photos.add(getNewPhoto(i * 3));
+
+    person.setPhotos(photos);
     person.setUtcOffset(1L);
     person.setTurnOffs(getList("TurnOff"));
     person.setTurnOns(getList("TurnOns"));
@@ -199,6 +207,18 @@
     }
     return phone;
   }
+  
+  private PhotoDb getNewPhoto(int i) {
+    String targetPhoto = String.valueOf(i % 33);
+    PhotoDb photo = findOne(PhotoDb.FINDBY_PHOTO,
+        new String[] { PhotoDb.PARAM_PHOTO }, new Object[] { targetPhoto });
+    if (photo == null) {
+      photo = new PhotoDb();
+      photo.setValue(targetPhoto);
+      photo.setType("Mobile");
+    }
+    return photo;
+  }
 
   private Name getNewName(int i) {
     String targetName = String.valueOf("FamilyName" + (i % 25));
@@ -232,7 +252,7 @@
 
     if (organization == null) {
       organization = new OrganizationDb();
-      organization.setAddress(getNewAddress(i * 3));
+      organization.setAddress(getNewOrganizationAddress(i * 3));
       organization.setName(targetOrg);
       organization.setSubField("SubField");
       organization.setTitle("Title");
@@ -250,7 +270,7 @@
       organization.setDescription("Description");
       organization.setEndDate(new Date(System.currentTimeMillis()
           + (24L * 3600L * 1000L * 365L * 2L)));
-      organization.setAddress(getNewAddress(i * 3));
+      organization.setAddress(getNewOrganizationAddress(i * 3));
       organization.setName(targetOrg);
       organization.setSalary(String.valueOf(i * 1000));
       organization.setStartDate(new Date(System.currentTimeMillis()
@@ -327,6 +347,46 @@
     }
     return address;
   }
+  
+  private Address getNewOrganizationAddress(int i) {
+    Address address = findOne(AddressDb.FINDBY_POSTCODE, new String[] { 
AddressDb.PARAM_POSTCODE },
+        new Object[] { String.valueOf(i % 10) });
+    if (address == null) {
+      address = new OrganizationAddressDb();
+      address.setCountry("UK");
+      address.setLatitude(new Float(0.5));
+      address.setLongitude(new Float(0.0));
+      address.setPostalCode(String.valueOf(i % 10));
+      address.setRegion("CAMBS");
+      address.setStreetAddress("High Street");
+      address.setType("sometype:");
+      address.setFormatted("formatted address");
+      address.setLocality("locality");
+      address.setPrimary(false);
+      address.setType("home");
+    }
+    return address;
+  }
+  
+  private Address getNewPersonAddress(int i) {
+    Address address = findOne(AddressDb.FINDBY_POSTCODE, new String[] { 
AddressDb.PARAM_POSTCODE },
+        new Object[] { String.valueOf(i % 10) });
+    if (address == null) {
+      address = new PersonAddressDb();
+      address.setCountry("UK");
+      address.setLatitude(new Float(0.5));
+      address.setLongitude(new Float(0.0));
+      address.setPostalCode(String.valueOf(i % 10));
+      address.setRegion("CAMBS");
+      address.setStreetAddress("High Street");
+      address.setType("sometype:");
+      address.setFormatted("formatted address");
+      address.setLocality("locality");
+      address.setPrimary(false);
+      address.setType("home");
+    }
+    return address;
+  }
 
   public void destroyPerson(int i, long key) {
     List<Person> people = find(PersonDb.FINDBY_LIKE_PERSONID,

Added: 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/SchemaHibernateTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/SchemaHibernateTest.java?rev=712713&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/SchemaHibernateTest.java
 (added)
+++ 
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/SchemaHibernateTest.java
 Mon Nov 10 10:11:53 2008
@@ -0,0 +1,97 @@
+/*
+ * 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.shindig.social.opensocial.jpa.test;
+
+import org.apache.shindig.social.opensocial.jpa.EmailDb;
+import org.apache.shindig.social.opensocial.jpa.hibernate.Bootstrap;
+import org.apache.shindig.social.opensocial.model.Person;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+
+import java.util.Random;
+
+/**
+ * 
+ */
+public class SchemaHibernateTest {
+
+  private static EntityManager entityManager;
+
+  @BeforeClass
+  public static void config() {
+    Bootstrap b = new Bootstrap("com.mysql.jdbc.Driver", 
"jdbc:mysql:localhost/opensocial", "opensocial", "opensocial", "1", "1");
+    // Bootstrap b = new
+    // Bootstrap("com.mysql.jdbc.Driver",
+    // 
"jdbc:mysql://localhost/sakaikernel?useUnicode=true&amp;characterEncoding=UTF-8",
+    // "sakaikernel","sakaikernel","1","1");
+    entityManager = b.getEntityManager("hibernate");
+  }
+
+  @AfterClass
+  public static void stop() {
+  }
+
+  @Test
+  public void checkSimpleInsert() throws Exception {
+    EntityTransaction transaction = entityManager.getTransaction();
+    transaction.begin();
+    EmailDb email = new EmailDb();
+    email.setType("email");
+    email.setValue("[EMAIL PROTECTED]");
+    entityManager.persist(email);
+    transaction.commit();
+  }
+
+  @Test
+  public void checkPersonCreate() throws Exception {
+    EntityTransaction transaction = entityManager.getTransaction();
+    transaction.begin();
+    PersonPopulate pp = new PersonPopulate(entityManager);
+    int i = 1;
+    long key = System.currentTimeMillis();
+    Random r = new Random();
+    Person p = pp.createPerson(i, key, r);
+    entityManager.persist(p);
+    transaction.commit();
+  }
+
+  @Test
+  public void fillDatbase() throws Exception {
+    EntityTransaction transaction = entityManager.getTransaction();
+    transaction.begin();
+    PersonPopulate pp = new PersonPopulate(entityManager);
+    long key = System.currentTimeMillis();
+    Random r = new Random();
+    for (int i = 0; i < 20; i++) {
+      Person p = pp.createPerson(i, key, r);
+      entityManager.persist(p);
+      if (i % 10 == 0) {
+        transaction.commit();
+        transaction = entityManager.getTransaction();
+        transaction.begin();
+      }
+    }
+    transaction.commit();
+  }
+
+}


Reply via email to