package org.societies.webapp.controller;
import org.societies.api.cis.directory.ICisDirectoryRemote;
import org.societies.api.comm.xmpp.interfaces.ICommManager;
import org.societies.api.css.FriendFilter;
import org.societies.api.internal.css.ICSSInternalManager;
import org.societies.api.schema.activity.MarshaledActivity;
import org.societies.api.schema.css.directory.CssAdvertisementRecord;
import org.societies.api.schema.cssmanagement.*;
import org.societies.webapp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Controller
@ManagedBean(name = "suggestedfriends")
@RequestScoped
public class SuggestedFriendsController extends BasePageController{
@ManagedProperty(value = "#{userService}")
private UserService userService;
@Autowired
//@ManagedProperty(value = "#{snsSuggestedFriends}")
@ManagedProperty(value = "#{cssLocalManager}")
private ICSSInternalManager cssLocalManager;
private HashMap<CssAdvertisementRecord,Integer> snsSuggestedFriends;
private List<CssAdvertisementRecord> snsFriends;
private Future<List<CssAdvertisementRecordDetailed>> asyncssdetails;
private List<CssAdvertisementRecordDetailed> allcssdetails;
private List<CssAdvertisementRecordDetailed> snsFriendes;
private List<CssAdvertisementRecord> otherFriends;
private List<CssAdvertisementRecordDetailed> otherFriendes;
private List<CssAdvertisementRecord> search;
private Future<List<CssRequest>> asynchFR;
private List<MarshaledActivity> activities;
private List<CssAdvertisementRecord> friends;
private String friendid;
private static String findfriend;
public String getFindfriend() {
return findfriend;
}
public void setFindfriend(String findfriend) {
this.findfriend = findfriend;
}
private static String filterstring = "None";
/**
* OSGI service get auto injected
*/
//@Autowired
//private ICSSInternalManager cssLocalManager;
@Autowired
private ICommManager commMngrRef;
private String name;
private String Id;
public ICSSInternalManager getCssLocalManager() {
return cssLocalManager;
}
public void setCssLocalManager(ICSSInternalManager cssLocalManager) {
this.cssLocalManager = cssLocalManager;
}
private ICisDirectoryRemote cisDirectoryRemote;
public ICisDirectoryRemote getCisDirectoryRemote() {
return cisDirectoryRemote;
}
public void setCisDirectoryRemote(ICisDirectoryRemote cisDirectoryRemote) {
this.cisDirectoryRemote = cisDirectoryRemote;
}
public ICommManager getCommManager() {
return commMngrRef;
}
public void setCommManager(ICommManager commManager) {
this.commMngrRef = commMngrRef;
}
@SuppressWarnings("UnusedDeclaration")
public UserService getUserService() {
return userService;
}
@SuppressWarnings("UnusedDeclaration")
public void setUserService(UserService userService) {
log.debug("setUserService() has been called with " + userService);
this.userService = userService;
}
public SuggestedFriendsController() {
log.info("SuggestedFriendsController constructor called");
}
public List<CssAdvertisementRecordDetailed> getsnsFriendes(){
log.debug("getsnsFriends method called");
snsSuggestedFriends = this.getSuggestedfriends();
log.debug("And we're BACK :-) ");
List<CssAdvertisementRecord> snsFriends = new ArrayList<CssAdvertisementRecord>();
List<CssAdvertisementRecord> otherFriends = new ArrayList<CssAdvertisementRecord>();
snsFriendes = new ArrayList<CssAdvertisementRecordDetailed>();
for(Entry<CssAdvertisementRecord, Integer> entry : snsSuggestedFriends.entrySet()){
log.debug("snsFriends ID " +entry.getKey().getId());
log.debug("snsFriends Name " +entry.getKey().getName());
log.debug("snsFriends Hashmap value " +entry.getValue());
if(entry.getValue() == 0){
otherFriends.add(entry.getKey());
log.debug("otherFriends SIZE is " +snsFriends.size());
}else {
snsFriends.add(entry.getKey());
log.debug("snsFriends SIZE is " +snsFriends.size());
}
}
this.setOtherFriends(otherFriends);
asyncssdetails = this.cssLocalManager.getCssAdvertisementRecordsFull();
try {
allcssdetails = asyncssdetails.get();
log.debug("allcssdetails SIZE is " +allcssdetails.size());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Future<List<CssRequest>> asynchFR = getCssLocalManager().findAllCssRequests();
try {
List<CssRequest> friendReq = asynchFR.get();
for(int index = 0; index < allcssdetails.size(); index++) {
if (allcssdetails.get(index).getStatus() != CssRequestStatusType.ACCEPTED)
{
for ( int indexFR = 0; indexFR < friendReq.size(); indexFR++)
{
if (allcssdetails.get(index).getResultCssAdvertisementRecord().getId().contains(friendReq.get(indexFR).getCssIdentity()) && (allcssdetails.get(index).getStatus() != CssRequestStatusType.DENIED))
{
allcssdetails.get(index).setStatus(CssRequestStatusType.NEEDSRESP);
indexFR = friendReq.size();
}
}
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i < allcssdetails.size(); i++){
for(CssAdvertisementRecord entry : snsFriends){
log.debug("entry id is " +entry.getId());
log.debug("allcssdetails ID is " +allcssdetails.get(i).getResultCssAdvertisementRecord().getId());
if(entry.getId().contains(allcssdetails.get(i).getResultCssAdvertisementRecord().getId())){
log.debug("ADDING record to list " +allcssdetails.get(i));
snsFriendes.add(allcssdetails.get(i));
}
}
}
return snsFriendes ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return Id;
}
public HashMap<CssAdvertisementRecord, Integer> getSuggestedfriends() {
log.debug("getSuggestedFriends method called");
HashMap<CssAdvertisementRecord,Integer> snsSuggestedFriends = null;
filterstring = this.getFilterstring();
log.debug("getSuggestedFriends filterstring has the value set to : " +filterstring);
int facebook = 0x0000000001;
int twitter = 0x0000000010;
int linkedin = 0x0000000100;
int foursquare = 0x0000001000;
int googleplus = 0x0000010000;
int all = 0x0000011111;
int CISMemeber = 0x0000100000;
int filterType = 0;
FriendFilter filter = new FriendFilter();
if (filterstring.equalsIgnoreCase("facebook")) {
filterType = facebook;
filter.setFilterFlag(facebook);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("twitter")) {
filterType = twitter;
filter.setFilterFlag(twitter);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("linkedin")) {
filterType = linkedin;
filter.setFilterFlag(linkedin);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("foursquare")) {
filterType = foursquare;
filter.setFilterFlag(foursquare);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("googleplus")) {
filterType = googleplus;
filter.setFilterFlag(googleplus);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("none")) {
filterType = all;
filter.setFilterFlag(all);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
if (filterstring.equalsIgnoreCase("CISMember")) {
filterType = CISMemeber;
filter.setFilterFlag(CISMemeber);
log.debug("getSuggestedFriends setting friend filter with filterflag as : " +filter.getFilterFlag());
}
try {
log.debug("getSuggestedFriends this call has returned " +filter + "with flag set to: " +filter.getFilterFlag());
log.debug("About to call the suggestedFriendDetails with filterflag: " +filter.getFilterFlag());
Future<HashMap<CssAdvertisementRecord, Integer>> asynchSnsSuggestedFriends = getCssLocalManager().getSuggestedFriendsDetails(filter); //suggestedFriends();
snsSuggestedFriends = asynchSnsSuggestedFriends.get();
log.debug("Back from call the suggestedFriendDetails with result: " +snsSuggestedFriends);
log.debug("snsSuggestedFriends contains" +snsSuggestedFriends);
for(Entry<CssAdvertisementRecord, Integer> entry : snsSuggestedFriends.entrySet()){
log.debug("snsSuggestedFriends ID " +entry.getKey().getId());
log.debug("snsSuggestedFriends Name " +entry.getKey().getName());
log.debug("snsSuggestedFriends Hashmap value " +entry.getValue());
}
} catch (Exception e) {
}
;
return snsSuggestedFriends;
}
public List<CssAdvertisementRecord> getfriends(){
log.debug("getfriendslist method called");
Future<List<CssAdvertisementRecord>> asynchFriends = getCssLocalManager().getCssFriends();
List<CssAdvertisementRecord> friends = new ArrayList<CssAdvertisementRecord>();
try {
friends = asynchFriends.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.debug("Friends SIZE is now " +friends.size());
return friends;
}
public void sendfriendrequest(String friendid){
log.debug("sendfriendrequest method called");
this.cssLocalManager.sendCssFriendRequest(friendid);
}
public void handlerequestaccept(String friendid){
log.debug("ACCEPT method called");
log.debug("ACCEPT method called friendid " +friendid);
CssRequest pendingFR = new CssRequest();
pendingFR.setCssIdentity(friendid);
pendingFR.setRequestStatus(CssRequestStatusType.ACCEPTED);
pendingFR.setOrigin(CssRequestOrigin.LOCAL);
getCssLocalManager().acceptCssFriendRequest(pendingFR);
}
public void handlerequestdecline(String friendid){
log.debug("DECLINE method called");
log.debug("DECLINE method called friendid " +friendid);
CssRequest pendingFR = new CssRequest();
pendingFR.setCssIdentity(friendid);
pendingFR.setRequestStatus(CssRequestStatusType.DENIED);
pendingFR.setOrigin(CssRequestOrigin.LOCAL);
getCssLocalManager().declineCssFriendRequest(pendingFR);
}
public void handlerequestcancelled(String friendid){
log.debug("CANCELLED method called");
log.debug("CANCELLED method called friendid " +friendid);
CssRequest pendingFR = new CssRequest();
pendingFR.setCssIdentity(friendid);
pendingFR.setRequestStatus(CssRequestStatusType.CANCELLED);
pendingFR.setOrigin(CssRequestOrigin.LOCAL);
getCssLocalManager().updateCssFriendRequest(pendingFR);
}
public String getFriendid() {
return friendid;
}
public void setFriendid(String friendid) {
this.friendid = friendid;
}
public List<MarshaledActivity> getactivities(){
log.debug("getActivities called");
Date date = new Date();
long longDate=date.getTime();
String timespan = "1262304000000 " + longDate;
List<MarshaledActivity> listSchemaActivities = new ArrayList<MarshaledActivity>();
List<MarshaledActivity> Result = new ArrayList<MarshaledActivity>();
Future<List<MarshaledActivity>> asyncActivitiesResult = this.cssLocalManager.getActivities(timespan, 20);
CssManagerResultActivities results = new CssManagerResultActivities();
try {
results.setMarshaledActivity(asyncActivitiesResult.get());
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e1) {
e1.printStackTrace();
}
log.debug("Activities : " +results);
log.debug("Activities Size: " +results.getMarshaledActivity().size());
for(MarshaledActivity result : results.getMarshaledActivity()){
log.debug("MarshaledActivity Published " +result.getPublished());
log.debug("MarshaledActivity Verb " +result.getVerb());
log.debug("MarshaledActivity Actor" +result.getActor());
Result.add(result);
}
return Result;
}
public List<CssAdvertisementRecordDetailed> getOtherFriendes() {
List<CssAdvertisementRecord> otherFriends = new ArrayList<CssAdvertisementRecord>();
List<CssAdvertisementRecordDetailed> otherFriendes = new ArrayList<CssAdvertisementRecordDetailed>();
log.debug("getOtherFriends is called");
log.debug("allcssdetails SIZE is " +allcssdetails.size());
otherFriends = this.getOtherFlist();
log.debug("otherFriends SIZE is " +otherFriends.size());
asynchFR = getCssLocalManager().findAllCssRequests();
try {
List<CssRequest> friendReq = asynchFR.get();
for(int index = 0; index < allcssdetails.size(); index++) {
if (allcssdetails.get(index).getStatus() != CssRequestStatusType.ACCEPTED)
{
for ( int indexFR = 0; indexFR < friendReq.size(); indexFR++)
{
if (allcssdetails.get(index).getResultCssAdvertisementRecord().getId().contains(friendReq.get(indexFR).getCssIdentity()) && (allcssdetails.get(index).getStatus() != CssRequestStatusType.DENIED))
{
allcssdetails.get(index).setStatus(CssRequestStatusType.NEEDSRESP);
indexFR = friendReq.size();
}
}
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i < allcssdetails.size(); i++){
for(CssAdvertisementRecord entry : otherFriends){
log.debug("entry id is " +entry.getId());
log.debug("allcssdetails ID is " +allcssdetails.get(i).getResultCssAdvertisementRecord().getId());
if(entry.getId().contains(allcssdetails.get(i).getResultCssAdvertisementRecord().getId())){
log.debug("ADDING record to list " +allcssdetails.get(i));
otherFriendes.add(allcssdetails.get(i));
}
}
}
return otherFriendes;
}
public List<CssAdvertisementRecord> getOtherFlist(){
log.debug("Called getOtherFlist to get-> OtherFriends list ");
return otherFriends;
}
public void setOtherFriends(List<CssAdvertisementRecord> otherFriends) {
log.debug("Setting OtherFriends list ");
this.otherFriends = otherFriends;
log.debug("List size is " +otherFriends.size());
}
public String getFilterstring() {
return filterstring;
}
public void setFilterstring(String filters) {
log.debug("setfilterstring called with string: " +filters);
SuggestedFriendsController.filterstring = filters;
}
public List<CssAdvertisementRecord> search(String name){
log.info("SuggestedFriendsController Search method called ");
List<CssAdvertisementRecord> cssadverts = new ArrayList<CssAdvertisementRecord>();
List<CssAdvertisementRecord> result = new ArrayList<CssAdvertisementRecord>();
//name = "John";
cssadverts = this.getfriends();
log.info("cssadverts size is : " +cssadverts.size());
log.info("now search through the cssadverts for the name : " +name);
if (name.isEmpty()) {
log.info("Search String is empty ");
return null;
}else {
for (CssAdvertisementRecord advert: cssadverts) {
log.info("advert name is: " +advert.getName());
if (advert.getName().toLowerCase().contains(name.toLowerCase())) {
log.info("this is the CssAdvertisement we are looking for " +advert.getId());
result.add(advert);
} else {
log.info("this is NOT the CssAdvertisement we are looking for keep going " +advert.getId() +" name is " +advert.getName());
}
}
}
return result;
}
}