Author: mfranklin
Date: Tue Oct 16 15:50:53 2012
New Revision: 1398855
URL: http://svn.apache.org/viewvc?rev=1398855&view=rev
Log:
Added person repository implementation
Added:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbPersonAssociation.java
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPersonRepository.java
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbUser.java
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbUserRepository.java
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoUserTemplate.java
Added:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbPersonAssociation.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbPersonAssociation.java?rev=1398855&view=auto
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbPersonAssociation.java
(added)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbPersonAssociation.java
Tue Oct 16 15:50:53 2012
@@ -0,0 +1,57 @@
+/*
+ * 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.rave.portal.model;
+
+/**
+ */
+public class MongoDbPersonAssociation {
+
+ public static enum Direction {
+ INCOMING, OUTGOING
+ }
+
+ private FriendRequestStatus requestStatus;
+ private Long personId;
+ private Direction requestDirection;
+
+ public MongoDbPersonAssociation() { }
+
+ public MongoDbPersonAssociation(Long personId, FriendRequestStatus status,
Direction direction) {
+ this.requestDirection = direction;
+ this.requestStatus = status;
+ this.personId = personId;
+ }
+
+ public FriendRequestStatus getRequestStatus() {
+ return requestStatus;
+ }
+
+ public void setRequestStatus(FriendRequestStatus requestStatus) {
+ this.requestStatus = requestStatus;
+ }
+
+ public Long getPersonId() {
+ return personId;
+ }
+
+ public void setPersonId(Long personId) {
+ this.personId = personId;
+ }
+}
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbUser.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbUser.java?rev=1398855&r1=1398854&r2=1398855&view=diff
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbUser.java
(original)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/model/MongoDbUser.java
Tue Oct 16 15:50:53 2012
@@ -32,6 +32,7 @@ import java.util.List;
public class MongoDbUser extends UserImpl {
private List<String> authorityCodes;
+ private List<MongoDbPersonAssociation> friends;
public MongoDbUser(long id) {
super(id);
@@ -48,6 +49,14 @@ public class MongoDbUser extends UserImp
this.authorityCodes = authorityCodes;
}
+ public List<MongoDbPersonAssociation> getFriends() {
+ return friends;
+ }
+
+ public void setFriends(List<MongoDbPersonAssociation> friends) {
+ this.friends = friends;
+ }
+
@Override
public Collection<GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> grantedAuthorities = Lists.newArrayList();
Added:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPersonRepository.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPersonRepository.java?rev=1398855&view=auto
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPersonRepository.java
(added)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbPersonRepository.java
Tue Oct 16 15:50:53 2012
@@ -0,0 +1,238 @@
+/*
+ * 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.rave.portal.repository.impl;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.rave.portal.model.*;
+import org.apache.rave.portal.repository.MongoModelOperations;
+import org.apache.rave.portal.repository.PersonRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Nullable;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+
+/**
+ */
+@Component
+public class MongoDbPersonRepository implements PersonRepository {
+
+ @Autowired
+ private MongoModelOperations.MongoUserOperations template;
+
+ @Override
+ public Person findByUsername(String username) {
+ return template.findOne(getUsernameQuery(username)).toPerson();
+ }
+
+ @Override
+ public List<Person> findAllConnectedPeople(String username) {
+ return findFriends(username); //TODO update when groups is implemented
+ }
+
+ @Override
+ public List<Person> findAllConnectedPeople(String username, String appId) {
+ throw new NotImplementedException(); //TODO build query
+ }
+
+ @Override
+ public List<Person> findAllConnectedPeopleWithFriend(String username,
String friendUsername) {
+ return findFriendsWithFriend(username, friendUsername); //TODO update
when groups is implemented
+ }
+
+ @Override
+ public List<Person> findFriends(String username) {
+ MongoDbUser user =
(MongoDbUser)template.find(getUsernameQuery(username));
+ return Lists.transform(user.getFriends(), new
Function<MongoDbPersonAssociation, Person>() {
+ @Override
+ public Person apply(@Nullable MongoDbPersonAssociation input) {
+ return input == null || input.getRequestStatus() !=
FriendRequestStatus.ACCEPTED ? null :
template.get(input.getPersonId()).toPerson();
+ }
+ });
+ }
+ @Override
+ public List<Person> findFriends(String username, String appId) {
+ throw new NotImplementedException(); //TODO build query
+ }
+
+ @Override
+ public List<Person> findFriendsWithFriend(String username, String
friendUsername) {
+ MongoDbUser follower =
(MongoDbUser)template.find(getUsernameQuery(username));
+ MongoDbUser followed =
(MongoDbUser)template.find(getUsernameQuery(friendUsername));
+ List<Long> commonFriends = getCommonFriends(follower, followed);
+ return Lists.transform(commonFriends, new Function<Long, Person>() {
+ @Override
+ public Person apply(@Nullable Long id) {
+ return id == null? null : template.get(id).toPerson();
+ }
+ });
+ }
+
+ @Override
+ public List<Person> findByGroup(String groupId) {
+ throw new NotImplementedException(); //TODO build query
+ }
+
+ @Override
+ public List<Person> findByGroup(String groupId, String appId) {
+ throw new NotImplementedException(); //TODO build query
+ }
+
+ @Override
+ public List<Person> findByGroupWithFriend(String groupId, String
friendUsername) {
+ throw new NotImplementedException(); //TODO build query
+ }
+
+ @Override
+ public boolean addFriend(String friendUsername, String username) {
+ MongoDbUser follower =
(MongoDbUser)template.find(getUsernameQuery(username));
+ MongoDbUser followed =
(MongoDbUser)template.find(getUsernameQuery(friendUsername));
+
+ MongoDbPersonAssociation outgoing = new
MongoDbPersonAssociation(followed.getId(), FriendRequestStatus.SENT,
MongoDbPersonAssociation.Direction.OUTGOING);
+ MongoDbPersonAssociation incoming = new
MongoDbPersonAssociation(follower.getId(), FriendRequestStatus.RECEIVED,
MongoDbPersonAssociation.Direction.INCOMING);
+
+ follower.getFriends().add(outgoing);
+ followed.getFriends().add(incoming);
+
+ template.save(followed);
+ template.save(follower);
+ return true;
+ }
+
+ @Override
+ public void removeFriend(String friendUsername, String username) {
+ MongoDbUser follower =
(MongoDbUser)template.find(getUsernameQuery(username));
+ MongoDbUser followed =
(MongoDbUser)template.find(getUsernameQuery(friendUsername));
+ removeAssociation(follower, followed);
+ removeAssociation(followed, follower);
+ template.save(follower);
+ template.save(followed);
+ }
+
+ @Override
+ public HashMap<String, List<Person>> findFriendsAndRequests(String
username) {
+ HashMap<String, List<Person>> friendsAndRequests = new HashMap<String,
List<Person>>();
+ friendsAndRequests.put(FriendRequestStatus.ACCEPTED.toString(),
findFriends(username));
+ friendsAndRequests.put(FriendRequestStatus.SENT.toString(),
findFriendRequestsSent(username));
+ friendsAndRequests.put(FriendRequestStatus.RECEIVED.toString(),
findFriendRequestsReceived(username));
+ return friendsAndRequests;
+ }
+
+ @Override
+ public boolean acceptFriendRequest(String friendUsername, String username)
{
+ MongoDbUser follower =
(MongoDbUser)template.find(getUsernameQuery(username));
+ MongoDbUser followed =
(MongoDbUser)template.find(getUsernameQuery(friendUsername));
+ setAccepted(follower, followed);
+ setAccepted(followed, follower);
+ template.save(follower);
+ template.save(followed);
+ return true;
+ }
+
+ @Override
+ public List<Person> findFriendRequestsReceived(String username) {
+ MongoDbUser followed =
(MongoDbUser)template.find(getUsernameQuery(username));
+ return Lists.transform(followed.getFriends(), new
Function<MongoDbPersonAssociation, Person>() {
+ @Override
+ public Person apply(@Nullable MongoDbPersonAssociation input) {
+ return input == null || input.getRequestStatus() !=
FriendRequestStatus.RECEIVED ? null :
template.get(input.getPersonId()).toPerson();
+ }
+ });
+ }
+
+ @Override
+ public List<Person> findFriendRequestsSent(String username) {
+ MongoDbUser follower =
(MongoDbUser)template.find(getUsernameQuery(username));
+ return Lists.transform(follower.getFriends(), new
Function<MongoDbPersonAssociation, Person>() {
+ @Override
+ public Person apply(@Nullable MongoDbPersonAssociation input) {
+ return input == null || input.getRequestStatus() !=
FriendRequestStatus.SENT ? null : template.get(input.getPersonId()).toPerson();
+ }
+ });
+ }
+
+ @Override
+ public Class<? extends Person> getType() {
+ return Person.class;
+ }
+
+ @Override
+ public Person get(long id) {
+ return template.get(id);
+ }
+
+ @Override
+ public Person save(Person item) {
+ //TODO Support saving people other than users
+ return item instanceof User ? template.save((User)item) : null;
+ }
+
+ @Override
+ public void delete(Person item) {
+ template.remove(getUsernameQuery(item.getUsername()));
+ }
+
+ private Query getUsernameQuery(String username) {
+ return query(where("username").is(username));
+ }
+
+
+ private Query query(Criteria criteria) {
+ return new Query(criteria);
+ }
+
+ private void removeAssociation(MongoDbUser friend, MongoDbUser person) {
+ for(MongoDbPersonAssociation association : person.getFriends()) {
+ if(association.getPersonId().equals(friend.getId())) {
+ person.getFriends().remove(association);
+ break;
+ }
+ }
+ }
+
+ private void setAccepted(MongoDbUser friend, MongoDbUser person) {
+ for(MongoDbPersonAssociation association : person.getFriends()) {
+ if(association.getPersonId().equals(friend.getId())) {
+ association.setRequestStatus(FriendRequestStatus.ACCEPTED);
+ }
+ }
+ }
+
+ private List<Long> getCommonFriends(MongoDbUser follower, MongoDbUser
followed) {
+ List<Long> ids= Lists.newArrayList();
+ for(MongoDbPersonAssociation association : follower.getFriends()) {
+ for(MongoDbPersonAssociation friendAssociation :
followed.getFriends()) {
+
if(association.getPersonId().equals(friendAssociation.getPersonId()) &&
+
association.getRequestStatus().equals(FriendRequestStatus.ACCEPTED) &&
+
friendAssociation.getRequestStatus().equals(FriendRequestStatus.ACCEPTED)) {
+ ids.add(friendAssociation.getPersonId());
+ }
+ }
+ }
+ return ids;
+ }
+}
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbUserRepository.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbUserRepository.java?rev=1398855&r1=1398854&r2=1398855&view=diff
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbUserRepository.java
(original)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoDbUserRepository.java
Tue Oct 16 15:50:53 2012
@@ -21,11 +21,9 @@ package org.apache.rave.portal.repositor
import org.apache.rave.portal.model.MongoDbUser;
import org.apache.rave.portal.model.User;
-import org.apache.rave.portal.model.conversion.HydratingConverterFactory;
+import org.apache.rave.portal.repository.MongoModelOperations;
import org.apache.rave.portal.repository.UserRepository;
-import org.apache.rave.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
@@ -40,49 +38,43 @@ import static org.springframework.data.m
@Repository
public class MongoDbUserRepository implements UserRepository {
- public static final String COLLECTION = "person";
- public static final Class<MongoDbUser> CLAZZ = MongoDbUser.class;
-
- @Autowired
- private MongoOperations template;
-
@Autowired
- private HydratingConverterFactory converter;
+ private MongoModelOperations.MongoUserOperations template;
@Override
public User getByUsername(String username) {
- return hydrate(template.findOne(query(where("username").is(username)),
CLAZZ, COLLECTION));
+ return template.findOne(query(where("username").is(username)));
}
@Override
public User getByUserEmail(String userEmail) {
- return hydrate(template.findOne(query(where("email").is(userEmail)),
CLAZZ, COLLECTION));
+ return template.findOne(query(where("email").is(userEmail)));
}
@Override
public User getByOpenId(String openId) {
- return hydrate(template.findOne(query(where("openId").is(openId)),
CLAZZ, COLLECTION));
+ return template.findOne(query(where("openId").is(openId)));
}
@Override
public List<User> getLimitedList(int offset, int pageSize) {
Query query = new Query().skip(offset).limit(pageSize);
- return hydrate(template.find(query, CLAZZ, COLLECTION));
+ return template.find(query);
}
@Override
public int getCountAll() {
- return (int)template.count(new Query(), COLLECTION);
+ return (int)template.count(new Query());
}
@Override
public List<User> findByUsernameOrEmail(String searchTerm, int offset, int
pageSize) {
- return
hydrate(template.find(getSearchQuery(searchTerm).skip(offset).limit(pageSize),
CLAZZ, COLLECTION));
+ return
template.find(getSearchQuery(searchTerm).skip(offset).limit(pageSize));
}
@Override
public int getCountByUsernameOrEmail(String searchTerm) {
- return (int)template.count(getSearchQuery(searchTerm), COLLECTION);
+ return (int)template.count(getSearchQuery(searchTerm));
}
@Override
@@ -92,7 +84,7 @@ public class MongoDbUserRepository imple
@Override
public User getByForgotPasswordHash(String hash) {
- return
hydrate(template.findOne(query(where("forgotPasswordHash").is(hash)), CLAZZ,
COLLECTION));
+ return template.findOne(query(where("forgotPasswordHash").is(hash)));
}
@Override
@@ -102,31 +94,17 @@ public class MongoDbUserRepository imple
@Override
public User get(long id) {
- return hydrate(template.findById(id, CLAZZ, COLLECTION));
+ return template.get(id);
}
@Override
public User save(User item) {
- MongoDbUser converted = converter.convert(item, User.class);
- template.save(converted, COLLECTION);
- return hydrate(converted);
+ return template.save(item);
}
@Override
public void delete(User item) {
- template.remove(get(item.getId()), COLLECTION);
- }
-
- private User hydrate(MongoDbUser user) {
- converter.hydrate(user, User.class);
- return user;
- }
-
- private List<User> hydrate(List<MongoDbUser> userList) {
- for(MongoDbUser user : userList) {
- converter.hydrate(user, User.class);
- }
- return CollectionUtils.<User>toBaseTypedList(userList);
+ template.remove(query(where("_id").is(item.getId())));
}
private Query query(Criteria criteria) {
Modified:
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoUserTemplate.java
URL:
http://svn.apache.org/viewvc/rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoUserTemplate.java?rev=1398855&r1=1398854&r2=1398855&view=diff
==============================================================================
---
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoUserTemplate.java
(original)
+++
rave/branches/mongo/rave-components/rave-mongodb/src/main/java/org/apache/rave/portal/repository/impl/MongoUserTemplate.java
Tue Oct 16 15:50:53 2012
@@ -22,7 +22,9 @@ package org.apache.rave.portal.repositor
import org.apache.rave.portal.model.MongoDbUser;
import org.apache.rave.portal.model.User;
import org.apache.rave.portal.repository.MongoModelOperations;
+import org.springframework.stereotype.Component;
+@Component
public class MongoUserTemplate extends MongoModelTemplate<User, MongoDbUser>
implements MongoModelOperations.MongoUserOperations {
public static final String COLLECTION = "person";