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";
 


Reply via email to