Author: ieb Date: Sun Feb 15 10:37:30 2009 New Revision: 744650 URL: http://svn.apache.org/viewvc?rev=744650&view=rev Log: SHINDIG-918 Patch by Ben Smith Fixes protocol handling on /people/@me/@self so that the collection options work correctly and allow fitlering of the current users friends.
Thanks Modified: 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/spi/PersonServiceDb.java incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/PersonHandler.java incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java 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=744650&r1=744649&r2=744650&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 Sun Feb 15 10:37:30 2009 @@ -192,7 +192,7 @@ public static final Object JPQL_FINDPERSON_BY_GROUP = null; - public static final Object JPQL_FINDPERSON = null; + public static final Object JPQL_FINDPERSON = "select p from PersonDb p where "; /** * The internal object ID used for references to this object. Should be generated by the 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=744650&r1=744649&r2=744650&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 Sun Feb 15 10:37:30 2009 @@ -78,6 +78,7 @@ // either lazy or at no extra costs, the consumer will either access the properties or not List<Person> plist = null; int lastPos = 1; + Long totalResults = null; StringBuilder sb = new StringBuilder(); // sanitize the list to get the uid's and remove duplicates @@ -117,23 +118,31 @@ } - int filterPos = addFilterClause(sb, PersonDb.getFilterCapability(), collectionOptions, - lastPos); - if (filterPos > 0) { - paramList.add(collectionOptions.getFilterValue()); - } - - // Get total results, that is count the total number of rows for this query - Long totalResults = JPQLUtils.getTotalResults(entiyManager, sb.toString(), paramList); - - // Execute ordered and paginated query - if (totalResults > 0) { - addOrderClause(sb, collectionOptions); + if (GroupId.Type.self.equals(groupId.getType())) { plist = JPQLUtils.getListQuery(entiyManager, sb.toString(), paramList, collectionOptions); - } + totalResults = Long.valueOf(1); + if (0 == plist.size()) { + throw new SocialSpiException(ResponseError.BAD_REQUEST, "Person not found"); + } + } else { + int filterPos = addFilterClause(sb, PersonDb.getFilterCapability(), collectionOptions, + lastPos); + if (filterPos > 0) { + paramList.add(collectionOptions.getFilterValue()); + } - if (plist == null) { - plist = Lists.newArrayList(); + // Get total results, that is count the total number of rows for this query + totalResults = JPQLUtils.getTotalResults(entiyManager, sb.toString(), paramList); + + // Execute ordered and paginated query + if (totalResults > 0) { + addOrderClause(sb, collectionOptions); + plist = JPQLUtils.getListQuery(entiyManager, sb.toString(), paramList, collectionOptions); + } + + if (plist == null) { + plist = Lists.newArrayList(); + } } // all of the above could equally have been placed into a thread to overlay the Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/PersonHandler.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/PersonHandler.java?rev=744650&r1=744649&r2=744650&view=diff ============================================================================== --- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/PersonHandler.java (original) +++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/opensocial/service/PersonHandler.java Sun Feb 15 10:37:30 2009 @@ -17,10 +17,12 @@ */ package org.apache.shindig.social.opensocial.service; +import org.apache.shindig.common.util.FutureUtil; import org.apache.shindig.config.ContainerConfig; import org.apache.shindig.protocol.HandlerPreconditions; import org.apache.shindig.protocol.Operation; import org.apache.shindig.protocol.RequestItem; +import org.apache.shindig.protocol.RestfulCollection; import org.apache.shindig.protocol.Service; import org.apache.shindig.social.opensocial.model.Person; import org.apache.shindig.social.opensocial.spi.CollectionOptions; @@ -72,15 +74,21 @@ if (userIds.size() == 1) { if (optionalPersonId.isEmpty()) { if (groupId.getType() == GroupId.Type.self) { - return personService.getPerson(userIds.iterator().next(), fields, request.getToken()); + Future<RestfulCollection<Person>> people = personService.getPeople( + userIds, groupId, options, fields, request.getToken()); + return FutureUtil.getFirstFromCollection(people); } else { return personService.getPeople(userIds, groupId, options, fields, request.getToken()); } } else if (optionalPersonId.size() == 1) { // TODO: Add some crazy concept to handle the userId? - return personService.getPerson(new UserId(UserId.Type.userId, - optionalPersonId.iterator().next()), - fields, request.getToken()); + Set<UserId> optionalUserIds = Sets.newHashSet( + new UserId(UserId.Type.userId, optionalPersonId.iterator().next())); + + Future<RestfulCollection<Person>> people = personService.getPeople( + optionalUserIds, new GroupId(GroupId.Type.self, null), + options, fields, request.getToken()); + return FutureUtil.getFirstFromCollection(people); } else { Set<UserId> personIds = Sets.newLinkedHashSet(); for (String pid : optionalPersonId) { Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java?rev=744650&r1=744649&r2=744650&view=diff ============================================================================== --- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java (original) +++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/sample/spi/JsonDbOpensocialService.java Sun Feb 15 10:37:30 2009 @@ -252,6 +252,10 @@ result.add(filterFields(person, fields, Person.class)); } + if (GroupId.Type.self.equals(groupId.getType()) && 0 == result.size()) { + throw new SocialSpiException(ResponseError.BAD_REQUEST, "Person not found"); + } + // We can pretend that by default the people are in top friends order if (options.getSortBy().equals(Person.Field.NAME.toString())) { Collections.sort(result, NAME_COMPARATOR); Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java?rev=744650&r1=744649&r2=744650&view=diff ============================================================================== --- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java (original) +++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java Sun Feb 15 10:37:30 2009 @@ -40,6 +40,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -176,13 +177,18 @@ String path = "/people/john.doe/@friends/jane.doe"; RestHandler operation = registry.getRestHandler(path, "GET"); - Person data = new PersonImpl(); + Person person = new PersonImpl(); + List<Person> people = Lists.newArrayList(person); + RestfulCollection<Person> data = new RestfulCollection<Person>(people); // TODO: We aren't passing john.doe to the service yet. - expect(personService.getPerson(eq(new UserId(UserId.Type.userId, "jane.doe")), - eq(DEFAULT_FIELDS), eq(token))).andReturn(ImmediateFuture.newInstance(data)); + expect(personService.getPeople( + eq(Sets.newHashSet(new UserId(UserId.Type.userId, "jane.doe"))), + eq(new GroupId(GroupId.Type.self, null)), eq(DEFAULT_OPTIONS), + eq(DEFAULT_FIELDS), eq(token))) + .andReturn(ImmediateFuture.newInstance(data)); replay(); - assertEquals(data, operation.execute(Maps.<String, String[]>newHashMap(), + assertEquals(person, operation.execute(Maps.<String, String[]>newHashMap(), null, token, converter).get()); verify(); } @@ -191,12 +197,17 @@ String path = "/people/john.doe/@self"; RestHandler operation = registry.getRestHandler(path, "GET"); - Person data = new PersonImpl(); - expect(personService.getPerson(eq(JOHN_DOE.iterator().next()), - eq(DEFAULT_FIELDS), eq(token))).andReturn(ImmediateFuture.newInstance(data)); + Person person = new PersonImpl(); + List<Person> people = Lists.newArrayList(person); + RestfulCollection<Person> data = new RestfulCollection<Person>(people); + expect(personService.getPeople( + eq(JOHN_DOE), + eq(new GroupId(GroupId.Type.self, null)), eq(DEFAULT_OPTIONS), + eq(DEFAULT_FIELDS), eq(token))) + .andReturn(ImmediateFuture.newInstance(data)); replay(); - assertEquals(data, operation.execute(Maps.<String, String[]>newHashMap(), + assertEquals(person, operation.execute(Maps.<String, String[]>newHashMap(), null, token, converter).get()); verify(); }