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&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();
+ }
+
+}