Author: ieb
Date: Wed Jan 7 07:43:08 2009
New Revision: 732371
URL: http://svn.apache.org/viewvc?rev=732371&view=rev
Log:
SHINDIG-785
Patch by Chico Charlesworth
Fully implement samples implementation of PersonService, ActivityService and
AppDataService
Thanks
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/SPIUtils.java
incubator/shindig/trunk/java/samples/src/test/java/org/apache/shindig/social/opensocial/jpa/test/PersonPopulate.java
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ActivityDb.java
Wed Jan 7 07:43:08 2009
@@ -17,16 +17,15 @@
*/
package org.apache.shindig.social.opensocial.jpa;
-import com.google.common.collect.Lists;
-
import static javax.persistence.CascadeType.ALL;
import static javax.persistence.GenerationType.IDENTITY;
+import com.google.common.collect.Lists;
+
import org.apache.shindig.social.opensocial.jpa.api.DbObject;
import org.apache.shindig.social.opensocial.model.Activity;
import org.apache.shindig.social.opensocial.model.MediaItem;
-import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -42,6 +41,8 @@
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.MapKey;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
@@ -56,15 +57,23 @@
*/
@Entity
@Table(name = "activity")
+...@namedqueries(value = {
+ @NamedQuery(name = ActivityDb.FINDBY_ACTIVITY_ID,
+ query = "select activity from ActivityDb activity where
activity.userId = :userId and activity.id = :activityId")
+ })
public class ActivityDb implements Activity, DbObject {
- public static final String FINDBY_ACTIVITY_ID = null;
-
- public static final String PARAM_USERID = null;
-
- public static final String PARAM_ACTIVITYID = null;
+ public static final String FINDBY_ACTIVITY_ID =
"q.activity.findbyactivityid";
+ public static final String PARAM_USERID = "userId";
+
+ public static final String PARAM_ACTIVITYID = "activityId";
+
public static final String JPQL_FINDBY_ACTIVITIES = null;
+
+ public static final String JPQL_FINDACTIVITY = "select a from ActivityDb a
where ";
+
+ public static final String JPQL_FINDACTIVITY_BY_FRIENDS = "select a from
ActivityDb a where a.userId in (select p.id from PersonDb p where p.objectId in
(select f.friend.objectId from PersonDb p, FriendDb f where p.objectId =
f.person.objectId and ";
/**
* The internal object ID used for references to this object. Should be
@@ -610,31 +619,33 @@
*/
@PrePersist
public void populateDbFields() {
- // add new entries
- for (Entry<String, String> e : templateParams.entrySet()) {
- ActivityTemplateParamsDb a = templateParamsDb.get(e.getKey());
- if (a == null) {
- a = new ActivityTemplateParamsDb();
- a.name = e.getKey();
- a.value = e.getValue();
- a.activity = this;
- // a.activities = Lists.newArrayList();
- // a.activities.add(this);
- templateParamsDb.put(e.getKey(), a);
- } else {
- a.value = e.getValue();
+ if (templateParams != null) {
+ // add new entries
+ for (Entry<String, String> e : templateParams.entrySet()) {
+ ActivityTemplateParamsDb a = templateParamsDb.get(e.getKey());
+ if (a == null) {
+ a = new ActivityTemplateParamsDb();
+ a.name = e.getKey();
+ a.value = e.getValue();
+ a.activity = this;
+ // a.activities = Lists.newArrayList();
+ // a.activities.add(this);
+ templateParamsDb.put(e.getKey(), a);
+ } else {
+ a.value = e.getValue();
+ }
}
- }
- // remove old entries
- List<String> toRemove = Lists.newArrayList();
- for (Entry<String, ActivityTemplateParamsDb> e : templateParamsDb
- .entrySet()) {
- if (!templateParams.containsKey(e.getKey())) {
- toRemove.add(e.getKey());
+ // remove old entries
+ List<String> toRemove = Lists.newArrayList();
+ for (Entry<String, ActivityTemplateParamsDb> e : templateParamsDb
+ .entrySet()) {
+ if (!templateParams.containsKey(e.getKey())) {
+ toRemove.add(e.getKey());
+ }
+ }
+ for (String r : toRemove) {
+ templateParamsDb.remove(r);
}
- }
- for (String r : toRemove) {
- templateParamsDb.remove(r);
}
}
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/ApplicationDataMapDb.java
Wed Jan 7 07:43:08 2009
@@ -17,12 +17,17 @@
*/
package org.apache.shindig.social.opensocial.jpa;
+import static javax.persistence.CascadeType.ALL;
import static javax.persistence.GenerationType.IDENTITY;
import com.google.common.collect.Lists;
import org.apache.shindig.social.opensocial.jpa.api.DbObject;
-import org.apache.shindig.social.opensocial.model.Person;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import javax.persistence.Basic;
import javax.persistence.Column;
@@ -36,31 +41,28 @@
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.Table;
+import javax.persistence.Transient;
import javax.persistence.Version;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
/**
* An application data map is the map of data for a single key within an
application.
*/
@Entity
@Table(name="application_datamap")
-public class ApplicationDataMapDb extends ConcurrentHashMap<String, String>
implements DbObject {
+public class ApplicationDataMapDb implements DbObject {
/**
- * The object needs to be seializable (map)
+ * The object needs to be seializable (map).
*/
private static final long serialVersionUID = 8017568825925047318L;
public static final String FINDBY_ALL_GROUP = null;
- public static final String FINDBY_FRIENDS_GROUP = null;
+ public static final String FINDBY_FRIENDS_GROUP = "select am from
ApplicationDataMapDb am where am.personId in (select f.friend.id from PersonDb
p, FriendDb f where p.objectId = f.person.objectId and ";
public static final String FINDBY_GROUP_GROUP = null;
- public static final String FINDBY_SELF_GROUP = null;
+ public static final String FINDBY_SELF_GROUP = "select am from
ApplicationDataMapDb am where ";
/**
* The internal object ID used for references to this object. Should be
generated by the
@@ -85,15 +87,24 @@
@ManyToOne(targetEntity=ApplicationDb.class)
@JoinColumn(name="application_id", referencedColumnName="oid")
protected ApplicationDb application;
-
+
/**
- * A named application data map, contains as a map of values.
+ * Create map using ApplicationDataMapValueDb such that ApplicationDataMapDb
are joined on oid ->
+ * application_datamap_id and then the name value becomes the key, and the
value becomes the value
+ * unfortunately JPA wont do Map<String,String> so this is handled in the
prePersist and postLoad
+ * hook.
*/
- @OneToMany(targetEntity=ApplicationDataMapValueDb.class,
mappedBy="applicationDataMap")
+ @OneToMany(targetEntity=ApplicationDataMapValueDb.class,
mappedBy="applicationDataMap", cascade = ALL)
@MapKey(name="name")
- protected Map<String, ApplicationDataMapValueDb> valuesDb;
-
-
+ protected Map<String, ApplicationDataMapValueDb> valuesDb = new
ConcurrentHashMap<String, ApplicationDataMapValueDb>();
+
+ /**
+ * The transient store for values loaded by the postLoad hook and persisted
by the
+ * prePersist hook.
+ */
+ @Transient
+ protected Map<String, String> values;
+
@Basic
@Column(name="person_id", length=255)
protected String personId;
@@ -104,7 +115,7 @@
@PrePersist
public void prePersist() {
// add new entries
- for (Entry<String, String> e : this.entrySet()) {
+ for (Entry<String, String> e : values.entrySet()) {
ApplicationDataMapValueDb a = valuesDb.get(e.getKey());
if (a == null) {
a = new ApplicationDataMapValueDb();
@@ -119,7 +130,7 @@
// remove old entries
List<String> toRemove = Lists.newArrayList();
for (Entry<String, ApplicationDataMapValueDb> e : valuesDb.entrySet()) {
- if (!this.containsKey(e.getKey())) {
+ if (!values.containsKey(e.getKey())) {
toRemove.add(e.getKey());
}
}
@@ -133,9 +144,9 @@
*/
@PostLoad
public void postLoad() {
- this.clear();
+ values = new ConcurrentHashMap<String, String>();
for (Entry<String, ApplicationDataMapValueDb> e : valuesDb.entrySet()) {
- put(e.getKey(), e.getValue().value);
+ values.put(e.getKey(), e.getValue().value);
}
}
@@ -154,17 +165,17 @@
}
/**
- * @return the valuesDb
+ * @return the values
*/
- public Map<String, ApplicationDataMapValueDb> getValuesDb() {
- return valuesDb;
+ public Map<String, String> getValues() {
+ return values;
}
/**
- * @param valuesDb the valuesDb to set
+ * @param values the values to set
*/
- public void setValuesDb(Map<String, ApplicationDataMapValueDb> valuesDb) {
- this.valuesDb = valuesDb;
+ public void setValues(Map<String, String> values) {
+ this.values = values;
}
/**
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/PersonDb.java
Wed Jan 7 07:43:08 2009
@@ -17,14 +17,17 @@
*/
package org.apache.shindig.social.opensocial.jpa;
-import com.google.common.collect.Maps;
-
+import static javax.persistence.CascadeType.ALL;
+import static javax.persistence.CascadeType.MERGE;
+import static javax.persistence.CascadeType.PERSIST;
+import static javax.persistence.CascadeType.REFRESH;
import static javax.persistence.GenerationType.IDENTITY;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
-import org.apache.shindig.social.opensocial.jpa.api.FilterCapability;
import org.apache.shindig.social.opensocial.jpa.api.DbObject;
+import org.apache.shindig.social.opensocial.jpa.api.FilterCapability;
import org.apache.shindig.social.opensocial.jpa.api.FilterSpecification;
import org.apache.shindig.social.opensocial.model.Account;
import org.apache.shindig.social.opensocial.model.Address;
@@ -41,7 +44,11 @@
import org.apache.shindig.social.opensocial.model.Enum.Smoker;
import org.apache.shindig.social.opensocial.spi.PersonService.FilterOperation;
-import com.google.common.collect.Lists;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import javax.persistence.Basic;
import javax.persistence.Column;
@@ -63,26 +70,15 @@
import javax.persistence.Transient;
import javax.persistence.Version;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import static javax.persistence.CascadeType.ALL;
-import static javax.persistence.CascadeType.PERSIST;
-import static javax.persistence.CascadeType.REFRESH;
-import static javax.persistence.CascadeType.MERGE;
-
/**
* Default Implementation of the Person object in the
org.apache.shindig.social.opensocial.jpa.
*/
@Entity
@Table(name = "person")
@NamedQueries(value = {
- @NamedQuery(name = PersonDb.FINDBY_PERSONID,
+ @NamedQuery(name = PersonDb.FINDBY_PERSONID,
query = "select p from PersonDb p where p.id = :id "),
- @NamedQuery(name = PersonDb.FINDBY_LIKE_PERSONID,
+ @NamedQuery(name = PersonDb.FINDBY_LIKE_PERSONID,
query = "select p from PersonDb p where p.id like :id") })
public class PersonDb implements Person, DbObject {
@@ -124,7 +120,7 @@
private static final String TVSHOWS_PROPERTY = "tvshow";
- private static final Map<String, FilterSpecification> FILTER_COLUMNS =
+ private static final Map<String, FilterSpecification> FILTER_COLUMNS =
new HashMap<String, FilterSpecification>();
private static final FilterOperation[] ALL_FILTEROPTIONS = new
FilterOperation[] {
@@ -132,7 +128,7 @@
FilterOperation.startsWith };
private static final FilterOperation[] NUMERIC_FILTEROPTIONS = new
FilterOperation[] {
FilterOperation.equals, FilterOperation.present };
- private static final FilterOperation[] EQUALS_FILTEROPTIONS =
+ private static final FilterOperation[] EQUALS_FILTEROPTIONS =
new FilterOperation[] { FilterOperation.equals };
static {
@@ -189,7 +185,10 @@
public static final String JPQL_FINDALLPERSON = null;
- public static final String JPQL_FINDPERSON_BY_FRIENDS = null;
+ // TODO The commented out query supports sorting by friend.score but needs a
join with FriendDb which returns duplicates.
+ // Using 'group by' to avoid duplicates doesn't work in HSQLDB or Derby -
causes a "Not in aggregate function or group by clause" jdbc exception.
+ // public static final String JPQL_FINDPERSON_BY_FRIENDS = "select p from
PersonDb p join FriendDb f on p.objectId = f.friend.objectId where p.objectId
in (select f.friend.objectId from PersonDb p, FriendDb f where p.objectId =
f.person.objectId and ";
+ public static final String JPQL_FINDPERSON_BY_FRIENDS = "select p from
PersonDb p where p.objectId in (select f.friend.objectId from PersonDb p,
FriendDb f where p.objectId = f.person.objectId and ";
public static final Object JPQL_FINDPERSON_BY_GROUP = null;
@@ -205,7 +204,7 @@
private long objectId;
/**
- * An optimistic locking field
+ * An optimistic locking field.
*/
@Version
@Column(name = "version")
@@ -246,14 +245,14 @@
protected String children;
/**
- *
+ *
*/
@ManyToOne(targetEntity = AddressDb.class, cascade = { PERSIST, MERGE,
REFRESH })
@JoinColumn(name = "address_id", referencedColumnName = "oid")
protected Address currentLocation;
/**
- *
+ *
*/
@Basic
@Column(name = "birthday")
@@ -261,7 +260,7 @@
protected Date birthday;
/**
- *
+ *
*/
@Basic
@Column(name = "drinker", length = 255)
@@ -275,33 +274,33 @@
private String displayName;
/**
- *
+ *
*/
@OneToMany(targetEntity = EmailDb.class, mappedBy = "person", cascade = ALL)
protected List<ListField> emails;
/**
- *
+ *
*/
@Basic
@Column(name = "ethnicity", length = 255)
protected String ethnicity;
/**
- *
+ *
*/
@Basic
@Column(name = "fashion", length = 255)
protected String fashion;
/**
- *
+ *
*/
@Transient
protected List<String> food;
/**
- *
+ *
*/
@Basic
@Column(name = "gender", length = 255)
@@ -311,65 +310,65 @@
protected Gender gender;
/**
- *
+ *
*/
@Basic
@Column(name = "happiest_when", length = 255)
protected String happiestWhen;
/**
- *
+ *
*/
@Transient
protected Boolean hasApp;
/**
- *
+ *
*/
@Transient
protected List<String> heroes;
/**
- *
+ *
*/
@Basic
@Column(name = "humor", length = 255)
protected String humor;
/**
- *
+ *
*/
@Basic
@Column(name = "person_id", length = 255)
protected String id;
/**
- *
+ *
*/
@OneToMany(targetEntity = ImDb.class, mappedBy = "person", cascade = ALL)
protected List<ListField> ims;
/**
- *
+ *
*/
@Transient
protected List<String> interests;
/**
- *
+ *
*/
@Basic
@Column(name = "job_interests", length = 255)
protected String jobInterests;
/**
- *
+ *
*/
@Transient
protected List<String> languagesSpoken;
/**
- *
+ *
*/
@Basic
@Column(name = "updated")
@@ -377,40 +376,40 @@
protected Date updated;
/**
- *
+ *
*/
@Basic
@Column(name = "living_arrangement", length = 255)
protected String livingArrangement;
/**
- *
+ *
*/
@Transient
// stored as a property, processed on get,set
protected List<Enum<Enum.LookingFor>> lookingFor;
/**
- *
+ *
*/
@Transient
protected List<String> movies;
/**
- *
+ *
*/
@Transient
protected List<String> music;
/**
- *
+ *
*/
@ManyToOne(targetEntity = NameDb.class, cascade = ALL)
@JoinColumn(name = "name_id", referencedColumnName = "oid")
protected Name name;
/**
- *
+ *
*/
@Basic
@Column(name = "network_presence", length = 255)
@@ -421,34 +420,34 @@
NetworkPresence.XA);
/**
- *
+ *
*/
@Basic
@Column(name = "nickname", length = 255)
protected String nickname;
/**
- *
+ *
*/
@OneToMany(targetEntity = PersonOrganizationDb.class, mappedBy = "person",
cascade = { PERSIST,
MERGE, REFRESH })
protected List<Organization> organizations;
/**
- *
+ *
*/
@Basic
@Column(name = "pets", length = 255)
protected String pets;
/**
- *
+ *
*/
@OneToMany(targetEntity = PhoneDb.class, mappedBy = "person", cascade = ALL)
protected List<ListField> phoneNumbers;
/**
- *
+ *
*/
@OneToMany(targetEntity = PhotoDb.class, mappedBy = "person", cascade = ALL)
protected List<ListField> photos;
@@ -457,60 +456,60 @@
protected String politicalViews;
/**
- *
+ *
*/
@Transient
protected Url profileSong;
/**
- *
+ *
*/
@Transient
protected Url profileVideo;
/**
- *
+ *
*/
@Transient
protected List<String> quotes;
/**
- *
+ *
*/
@Basic
@Column(name = "relationship_status", length = 255)
protected String relationshipStatus;
/**
- *
+ *
*/
@Basic
@Column(name = "religion", length = 255)
protected String religion;
/**
- *
+ *
*/
@Basic
@Column(name = "romance", length = 255)
protected String romance;
/**
- *
+ *
*/
@Basic
@Column(name = "scared_of", length = 255)
protected String scaredOf;
/**
- *
+ *
*/
@Basic
@Column(name = "sexual_orientation", length = 255)
protected String sexualOrientation;
/**
- *
+ *
*/
@Basic
@Column(name = "smoker", length = 255)
@@ -520,51 +519,51 @@
protected Enum<Enum.Smoker> smoker;
/**
- *
+ *
*/
@Transient
protected List<String> sports;
/**
- *
+ *
*/
@Basic
@Column(name = "status", length = 255)
protected String status;
/**
- *
+ *
*/
@Transient
protected List<String> tags;
/**
- *
+ *
*/
@Basic
@Column(name = "utc_offset")
protected Long utcOffset;
/**
- *
+ *
*/
@Transient
protected List<String> turnOffs;
/**
- *
+ *
*/
@Transient
protected List<String> turnOns;
/**
- *
+ *
*/
@Transient
protected List<String> tvShows;
/**
- *
+ *
*/
@OneToMany(targetEntity = UrlDb.class, mappedBy = "person", cascade = ALL)
protected List<Url> urls;
@@ -583,8 +582,8 @@
* to application.oid.
*/
@ManyToMany(targetEntity = ApplicationDb.class)
- @JoinTable(name = "person_application",
- joinColumns = @JoinColumn(name = "person_id", referencedColumnName =
"oid"),
+ @JoinTable(name = "person_application",
+ joinColumns = @JoinColumn(name = "person_id", referencedColumnName =
"oid"),
inverseJoinColumns = @JoinColumn(name = "application_id",
referencedColumnName = "oid"))
protected List<ApplicationDb> applictions;
@@ -1262,7 +1261,7 @@
/*
* (non-Javadoc)
- *
+ *
* @see org.apache.shindig.social.opensocial.model.Person#getDisplayName()
*/
public String getDisplayName() {
@@ -1271,7 +1270,7 @@
/*
* (non-Javadoc)
- *
+ *
* @see
org.apache.shindig.social.opensocial.model.Person#setDisplayName(java.lang.String)
*/
public void setDisplayName(String displayName) {
@@ -1282,7 +1281,6 @@
return FILTER_CAPABILITY;
}
-
/**
* @return the applictions
*/
Modified:
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=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/hibernate/Bootstrap.java
Wed Jan 7 07:43:08 2009
@@ -19,22 +19,20 @@
package org.apache.shindig.social.opensocial.jpa.hibernate;
import com.google.common.collect.Maps;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
-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 {
@@ -68,9 +66,9 @@
this.minWrite = minWrite;
}
-
+
public Bootstrap() {
-
+
}
public void init(String unitName) {
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/ActivityServiceDb.java
Wed Jan 7 07:43:08 2009
@@ -17,28 +17,30 @@
*/
package org.apache.shindig.social.opensocial.jpa.spi;
+import com.google.inject.Inject;
+
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.common.util.ImmediateFuture;
import org.apache.shindig.social.ResponseError;
import org.apache.shindig.social.opensocial.jpa.ActivityDb;
-import org.apache.shindig.social.opensocial.jpa.ApplicationDataMapDb;
+import org.apache.shindig.social.opensocial.jpa.MediaItemDb;
import org.apache.shindig.social.opensocial.model.Activity;
+import org.apache.shindig.social.opensocial.model.MediaItem;
import org.apache.shindig.social.opensocial.spi.ActivityService;
import org.apache.shindig.social.opensocial.spi.GroupId;
import org.apache.shindig.social.opensocial.spi.RestfulCollection;
import org.apache.shindig.social.opensocial.spi.SocialSpiException;
import org.apache.shindig.social.opensocial.spi.UserId;
-import com.google.inject.Inject;
-
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Future;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
/**
*
*/
@@ -56,7 +58,54 @@
*/
public Future<Void> createActivity(UserId userId, GroupId groupId, String
appId,
Set<String> fields, Activity activity, SecurityToken token) throws
SocialSpiException {
- // TODO Auto-generated method stub
+ String uid = SPIUtils.getUserList(userId, token);
+
+ try {
+ // Map activity into a new ActivityDb instance
+ // TODO Could we use dozer to do this mapping instead, for
future-proofing reasons?
+ ActivityDb activityDb = new ActivityDb();
+ activityDb.setPostedTime(new Date().getTime());
+ activityDb.setAppId(appId);
+ activityDb.setUserId(uid);
+ activityDb.setId(activity.getId());
+ activityDb.setBodyId(activity.getBodyId());
+ activityDb.setBody(activity.getBody());
+ activityDb.setExternalId(activity.getExternalId());
+ activityDb.setTitleId(activity.getTitleId());
+ activityDb.setTitle(activity.getTitle());
+ activityDb.setUpdated(new Date());
+ activityDb.setPriority(activity.getPriority());
+ activityDb.setStreamFaviconUrl(activity.getStreamFaviconUrl());
+ activityDb.setStreamSourceUrl(activity.getStreamSourceUrl());
+ activityDb.setStreamTitle(activity.getStreamTitle());
+ activityDb.setStreamUrl(activity.getStreamUrl());
+ activityDb.setUrl(activity.getUrl());
+ if(activity.getMediaItems() != null) {
+ List<MediaItem> mediaItems = new ArrayList<MediaItem>();
+ for(MediaItem m : activity.getMediaItems()) {
+ MediaItemDb mediaItem = new MediaItemDb();
+ mediaItem.setMimeType(m.getMimeType());
+ mediaItem.setType(m.getType());
+ mediaItem.setUrl(m.getUrl());
+ mediaItems.add(mediaItem);
+ }
+ activityDb.setMediaItems(mediaItems);
+ }
+ if (activity.getTemplateParams() != null) {
+ activityDb.setTemplateParams(activity.getTemplateParams());
+ }
+
+ // TODO How should transactions be managed? Should samples be using
warp-persist instead?
+ if (!entityManager.getTransaction().isActive()) {
+ entityManager.getTransaction().begin();
+ }
+ entityManager.persist(activityDb);
+ entityManager.getTransaction().commit();
+
+ } catch (Exception e) {
+ throw new SocialSpiException(ResponseError.INTERNAL_ERROR, "Failed to
create activity", e);
+ }
+
return null;
}
@@ -74,8 +123,60 @@
*/
public Future<RestfulCollection<Activity>> getActivities(Set<UserId>
userIds, GroupId groupId,
String appId, Set<String> fields, SecurityToken token) throws
SocialSpiException {
- // TODO Auto-generated method stub
- return null;
+
+ // TODO currently the implementation of this method ignores the fields
variable. Is this correct?
+
+ List<Activity> plist = null;
+ int lastPos = 1;
+
+ StringBuilder sb = new StringBuilder();
+ // sanitize the list to get the uid's and remove duplicates
+ List<String> paramList = SPIUtils.getUserList(userIds, token);
+ // select the group Id as this will drive the query
+ switch (groupId.getType()) {
+ case all:
+ // select all contacts
+ sb.append("");
+ lastPos = JPQLUtils.addInClause(sb, "p", "id", lastPos,
paramList.size());
+ break;
+ case friends:
+ // select all friends (subset of contacts)
+ sb.append(ActivityDb.JPQL_FINDACTIVITY_BY_FRIENDS);
+ lastPos = JPQLUtils.addInClause(sb, "p", "id", lastPos,
paramList.size());
+ sb.append(")) ");
+ // TODO Group by doesn't work in HSQLDB or Derby - causes a "Not in
aggregate function or group by clause" jdbc exception
+ // sb.append(" group by p ");
+ break;
+ case groupId:
+ // select those in the group
+ // TODO Needs implementing and then have a unit test created to test it.
+ sb.append("");
+ lastPos = JPQLUtils.addInClause(sb, "p", "id", lastPos,
paramList.size());
+ sb.append(" and g.id = ?").append(lastPos);
+ lastPos++;
+ break;
+ case deleted:
+ // ???
+ break;
+ case self:
+ // select self
+ sb.append(ActivityDb.JPQL_FINDACTIVITY);
+ lastPos = JPQLUtils.addInClause(sb, "a", "userId", lastPos,
paramList.size());
+ break;
+ default:
+ throw new SocialSpiException(ResponseError.BAD_REQUEST, "Group ID not
recognized");
+
+ }
+
+ plist = JPQLUtils.getListQuery(entityManager, sb.toString(), paramList,
null);
+
+ if (plist == null) {
+ plist = new ArrayList<Activity>();
+ }
+
+ // all of the above could equally have been placed into a thread to
overlay the
+ // db wait times.
+ return ImmediateFuture.newInstance(new RestfulCollection<Activity>(plist));
}
/* (non-Javadoc)
@@ -99,7 +200,7 @@
throw new SocialSpiException(ResponseError.BAD_REQUEST,"Cant find
activity");
}
-
+
/**
* @param userId
* @param groupId
@@ -113,11 +214,11 @@
String uid = SPIUtils.getUserList(userId, token);
q.setParameter(ActivityDb.PARAM_USERID, uid);
q.setParameter(ActivityDb.PARAM_ACTIVITYID, activityId);
- q.setFirstResult(1);
+ q.setFirstResult(0);
q.setMaxResults(1);
List<?> activities = q.getResultList();
if ( activities != null && activities.size() > 0 ) {
- return (Activity) activities.get(1);
+ return (Activity) activities.get(0);
}
return null;
}
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/AppDataServiceDb.java
Wed Jan 7 07:43:08 2009
@@ -19,6 +19,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.inject.Inject;
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.common.util.ImmediateFuture;
@@ -29,19 +30,16 @@
import org.apache.shindig.social.opensocial.spi.SocialSpiException;
import org.apache.shindig.social.opensocial.spi.UserId;
-import com.google.inject.Inject;
-
-import javax.persistence.EntityManager;
-
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
+import javax.persistence.EntityManager;
+
/**
- *
+ *
*/
public class AppDataServiceDb implements AppDataService {
@@ -61,11 +59,16 @@
List<ApplicationDataMapDb> dataMaps = getDataMap(userId, groupId, appId,
token);
for (ApplicationDataMapDb adm : dataMaps) {
for (String f : fields) {
- adm.remove(f);
+ adm.getValues().remove(f);
}
}
+ // TODO How should transactions be managed? Should samples be using
warp-persist instead?
+ if (!entityManager.getTransaction().isActive()) {
+ entityManager.getTransaction().begin();
+ }
entityManager.flush();
+ entityManager.getTransaction().commit();
return ImmediateFuture.newInstance(null);
}
@@ -112,12 +115,12 @@
default: // including self
// userId is the user Id
sb.append(ApplicationDataMapDb.FINDBY_SELF_GROUP);
- sb.append(" and am.personId = ?").append(lastParam);
+ sb.append(" am.personId = ?").append(lastParam);
lastParam++;
break;
}
- sb.append(" and a.id = ?").append(lastParam);
+ sb.append(" and am.application.id = ?").append(lastParam);
lastParam++;
paramList.add(appId);
return JPQLUtils.getListQuery(entityManager, sb.toString(), paramList,
null);
@@ -144,7 +147,8 @@
break;
case friends:
sb.append(ApplicationDataMapDb.FINDBY_FRIENDS_GROUP);
- lastParam = JPQLUtils.addInClause(sb, "am", "personId", lastParam,
paramList.size());
+ lastParam = JPQLUtils.addInClause(sb, "p", "id", lastParam,
paramList.size());
+ sb.append(")");
// userId translates into all friends
break;
case groupId:
@@ -162,7 +166,7 @@
break;
}
- sb.append(" and a.id = ?").append(lastParam);
+ sb.append(" and am.application.id = ?").append(lastParam);
lastParam++;
paramList.add(appId);
@@ -174,13 +178,16 @@
// only add in the fields
if (fields == null || fields.size() == 0) {
for (ApplicationDataMapDb adm : dataMaps) {
- results.put(adm.getPersonId(), adm);
+ results.put(adm.getPersonId(), adm.getValues());
}
} else {
for (ApplicationDataMapDb adm : dataMaps) {
Map<String, String> m = Maps.newHashMap();
for (String f : fields) {
- m.put(f, adm.get(f));
+ String value = adm.getValues().get(f);
+ if (null != value) {
+ m.put(f, value);
+ }
}
results.put(adm.getPersonId(), m);
}
@@ -198,11 +205,16 @@
List<ApplicationDataMapDb> dataMaps = getDataMap(userId, groupId, appId,
token);
for (ApplicationDataMapDb adm : dataMaps) {
for (String f : fields) {
- adm.put(f, values.get(f));
+ adm.getValues().put(f, values.get(f));
}
}
+ // TODO How should transactions be managed? Should samples be using
warp-persist instead?
+ if (!entityManager.getTransaction().isActive()) {
+ entityManager.getTransaction().begin();
+ }
entityManager.flush();
+ entityManager.getTransaction().commit();
return ImmediateFuture.newInstance(null);
}
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/JPQLUtils.java
Wed Jan 7 07:43:08 2009
@@ -19,11 +19,11 @@
import org.apache.shindig.social.opensocial.spi.CollectionOptions;
+import java.util.List;
+
import javax.persistence.EntityManager;
import javax.persistence.Query;
-import java.util.List;
-
/**
*
*/
@@ -41,7 +41,10 @@
int nfields) {
sb.append(alias).append(".").append(inField).append(" in (");
for (int i = firstField; i < (firstField + nfields); i++) {
- sb.append(" ?").append(i).append(" ");
+ if (i != firstField) {
+ sb.append(", ");
+ }
+ sb.append("?").append(i);
}
sb.append(")");
return firstField + nfields;
@@ -67,7 +70,7 @@
}
if (collectionOptions != null) {
q.setFirstResult(collectionOptions.getFirst());
- q.setMaxResults(collectionOptions.getFirst() +
collectionOptions.getMax());
+ q.setMaxResults(collectionOptions.getMax());
}
return (List<T>) q.getResultList();
}
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/PersonServiceDb.java
Wed Jan 7 07:43:08 2009
@@ -17,6 +17,9 @@
*/
package org.apache.shindig.social.opensocial.jpa.spi;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.common.util.ImmediateFuture;
import org.apache.shindig.social.ResponseError;
@@ -31,17 +34,13 @@
import org.apache.shindig.social.opensocial.spi.SocialSpiException;
import org.apache.shindig.social.opensocial.spi.UserId;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
-import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Future;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
/**
* Implements the PersonService from the SPI binding to the JPA model and
providing queries to
* support the OpenSocial implementation.
@@ -94,6 +93,9 @@
// select all friends (subset of contacts)
sb.append(PersonDb.JPQL_FINDPERSON_BY_FRIENDS);
lastPos = JPQLUtils.addInClause(sb, "p", "id", lastPos,
paramList.size());
+ sb.append(") ");
+ // TODO Group by doesn't work in HSQLDB or Derby - causes a "Not in
aggregate function or group by clause" jdbc exception
+ // sb.append(" group by p ");
break;
case groupId:
// select those in the group
@@ -115,7 +117,6 @@
}
-
int filterPos = addFilterClause(sb, PersonDb.getFilterCapability(),
collectionOptions,
lastPos);
if (filterPos > 0) {
@@ -128,9 +129,10 @@
if (plist == null) {
plist = Lists.newArrayList();
}
+
// all of the above could equally have been placed into a thread to
overlay the
// db wait times.
- return ImmediateFuture.newInstance(new RestfulCollection<Person>(plist));
+ return ImmediateFuture.newInstance(new RestfulCollection<Person>(plist,
collectionOptions.getFirst(), plist.size()));
}
@@ -230,10 +232,17 @@
String sortBy = collectionOptions.getSortBy();
if (sortBy != null && sortBy.length() > 0) {
if (PersonService.TOP_FRIENDS_SORT.equals(sortBy)) {
+ // TODO sorting by friend.score doesn't work right now because of
group by issue (see above TODO)
// this assumes that the query is a join with the friends store.
sb.append(" order by f.score ");
} else {
- sb.append(" order by p.").append(sortBy);
+ if ("name".equals(sortBy)) {
+ // TODO Is this correct?
+ // If sortBy is name then order by p.name.familyName,
p.name.givenName.
+ sb.append(" order by p.name.familyName, p.name.givenName ");
+ } else {
+ sb.append(" order by p." + sortBy);
+ }
switch (collectionOptions.getSortOrder()) {
case ascending:
sb.append(" asc ");
Modified:
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/SPIUtils.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/SPIUtils.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/SPIUtils.java
(original)
+++
incubator/shindig/trunk/java/samples/src/main/java/org/apache/shindig/social/opensocial/jpa/spi/SPIUtils.java
Wed Jan 7 07:43:08 2009
@@ -39,6 +39,7 @@
* @return
*/
public static List<String> getUserList(Set<UserId> userIds, SecurityToken
token) {
+ // TODO What's the use of userIdMap?
HashMap<String, String> userIdMap = Maps.newHashMap();
List<String> paramList = Lists.newArrayList();
for (UserId u : userIds) {
@@ -63,7 +64,7 @@
public static String getUserList(UserId userId, SecurityToken token) {
return userId.getUserId(token);
}
-
+
public static <T> List<T> toList(Set<T> s) {
List<T> l = new ArrayList<T>();
l.addAll(s);
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=732371&r1=732370&r2=732371&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
Wed Jan 7 07:43:08 2009
@@ -45,25 +45,25 @@
import org.apache.shindig.social.opensocial.model.Enum.LookingFor;
import org.apache.shindig.social.opensocial.model.Enum.Smoker;
import org.apache.shindig.social.opensocial.model.Person.Gender;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
-import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
public class PersonPopulate {
private EntityManager entityManager;
/**
- *
+ *
*/
public PersonPopulate(EntityManager entityManager) {
this.entityManager = entityManager;
@@ -152,7 +152,7 @@
person.setSports(getList("Sports"));
person.setStatus("Status");
person.setTags(getList("tags"));
-
+
List<ListField> photos = Lists.newArrayList();
photos.add(getNewPhoto(i));
photos.add(getNewPhoto(i * 3));
@@ -185,7 +185,7 @@
private Url getNewUrl(int i) {
String targetUrl = "http://sdfsdfsd.sdfdsf/" + String.valueOf(i % 33);
- List<?> l = find(UrlDb.FINDBY_URL,
+ List<?> l = find(UrlDb.FINDBY_URL,
new String[] { UrlDb.PARAM_URL }, new Object[] { targetUrl });
if (l.size() == 0) {
Url url = new UrlDb();
@@ -209,7 +209,7 @@
}
return phone;
}
-
+
private PhotoDb getNewPhoto(int i) {
String targetPhoto = String.valueOf(i % 33);
PhotoDb photo = findOne(PhotoDb.FINDBY_PHOTO,
@@ -349,7 +349,7 @@
}
return address;
}
-
+
private Address getNewOrganizationAddress(int i) {
Address address = findOne(AddressDb.FINDBY_POSTCODE, new String[] {
AddressDb.PARAM_POSTCODE },
new Object[] { String.valueOf(i % 10) });
@@ -369,7 +369,7 @@
}
return address;
}
-
+
private Address getNewPersonAddress(int i) {
Address address = findOne(AddressDb.FINDBY_POSTCODE, new String[] {
AddressDb.PARAM_POSTCODE },
new Object[] { String.valueOf(i % 10) });
Modified:
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java?rev=732371&r1=732370&r2=732371&view=diff
==============================================================================
---
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
(original)
+++
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
Wed Jan 7 07:43:08 2009
@@ -19,7 +19,6 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-
import com.google.inject.Guice;
import com.google.inject.Injector;
@@ -30,7 +29,6 @@
import org.apache.shindig.social.core.util.BeanJsonConverter;
import org.apache.shindig.social.core.util.BeanXStreamAtomConverter;
import org.apache.shindig.social.core.util.BeanXStreamConverter;
-import org.apache.shindig.social.core.util.xstream.GuiceBeanProvider;
import org.apache.shindig.social.core.util.xstream.XStream081Configuration;
import org.apache.shindig.social.opensocial.service.DataServiceServlet;
import org.apache.shindig.social.opensocial.service.HandlerDispatcher;
@@ -45,8 +43,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
@@ -169,7 +165,7 @@
/**
* parse entry.content xml into a Map<> struct
- *
+ *
* @param str
* input content string
* @return the map<> of <name, value> pairs from the content xml
@@ -203,7 +199,7 @@
/**
* Converts a node which child nodes into a map keyed on element names
* containing the text inside each child node.
- *
+ *
* @param n
* the node to convert.
* @return a map keyed on element name, containing the contents of each
@@ -230,9 +226,9 @@
* Converts <entry> <key>k</key> <value> <entry> <key>count</key>
* <value>val</value> </entry> <entry> <key>lastUpdate</key>
* <value>val</value> </entry> </value> </entry>
- *
+ *
* To map.get("k").get("count")
- *
+ *
* @param result
* @return
*/