package org.societies.webapp.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Future; import javax.validation.Valid; 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.identity.IIdentity; import org.societies.api.identity.InvalidFormatException; import org.societies.api.internal.css.management.ICSSLocalManager; import org.societies.api.internal.css.ICSSInternalManager; import org.societies.api.internal.servicelifecycle.IServiceDiscovery; import org.societies.api.schema.cis.directory.CisAdvertisementRecord; import org.societies.api.schema.css.directory.CssAdvertisementRecord; import org.societies.api.schema.cssmanagement.CssAdvertisementRecordDetailed; import org.societies.api.schema.cssmanagement.CssNode; import org.societies.api.schema.cssmanagement.CssRequest; import org.societies.api.schema.cssmanagement.CssRequestOrigin; import org.societies.api.schema.cssmanagement.CssRequestStatusType; import org.societies.cis.directory.client.CisDirectoryRemoteClient; //import org.societies.webapp.models.CISDirectoryForm; import org.societies.webapp.models.SuggestedFriendsForm; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Controller public class CssSuggestedFriendsController { private static Logger LOG = LoggerFactory.getLogger(CssSuggestedFriendsController.class); /** * OSGI service get auto injected */ @Autowired private ICSSInternalManager cssLocalManager; @Autowired private ICommManager commManager; @Autowired private IServiceDiscovery sdService; private FriendFilter friendfilter; public FriendFilter getfriendfilter(){ return friendfilter ; } public void setfriendfilter(FriendFilter filter){ LOG.info("set filter called with filter as : " +filter.getFilterFlag()); this.friendfilter=friendfilter; } public IServiceDiscovery getSDService() { return sdService; } public void getSDService(IServiceDiscovery sdService) { this.sdService = sdService; } 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; } @RequestMapping(value = "/suggestedfriends.html", method = RequestMethod.GET) public ModelAndView SuggestedFriends() { // CREATE A HASHMAP OF ALL OBJECTS REQUIRED TO PROCESS THIS PAGE Map<String, Object> model = new HashMap<String, Object>(); model.put("message", "Please input values and submit"); // ADD THE BEAN THAT CONTAINS ALL THE FORM DATA FOR THIS PAGE SuggestedFriendsForm sfForm = new SuggestedFriendsForm(); model.put("sfForm", sfForm); // ADD ALL THE SELECT BOX VALUES USED ON THE FORM Map<String, String> methods = new LinkedHashMap<String, String>(); methods.put("findFriends", "Find Friends"); methods.put("pendingfriendreq", "Find Pending Friend Request"); model.put("methods", methods); model.put("suggestedfriendsresult", "CSS Suggested Friends Result :"); return new ModelAndView("suggestedfriends", model); } @SuppressWarnings("unchecked") @RequestMapping(value = "/suggestedfriends.html", method = RequestMethod.POST) public ModelAndView SuggestedFriends(@Valid SuggestedFriendsForm sfForm, BindingResult result, Map model) { if (result.hasErrors()) { model.put("result", "CSS Suggested Friends form error"); return new ModelAndView("suggestedfriends", model); } if (getCssLocalManager() == null) { model.put("errormsg", "CSS Suggested Friends reference not avaiable"); return new ModelAndView("error", model); } String method = sfForm.getMethod(); String res = null; try { if (method.equalsIgnoreCase("findFriends")) { res = "CSS Suggested Friends Result "; //set the friend filter to return ALL until we switch over to the new webapp which should have a filter switch tp set correctly //FriendFilter filter = new FriendFilter(); //int filterFlag = 0x0000000000; FriendFilter filter = this.getfriendfilter(); int filterFlag = filter.getFilterFlag(); LOG.info("SuggestedFriends Controller filterflag to set is: " +filterFlag); filter.setFilterFlag(filterFlag); LOG.info("SuggestedFriends Controller filter flag is: " +filter.getFilterFlag()); Future<HashMap<IIdentity, Integer>> asynchcssfriends = getCssLocalManager() .getSuggestedFriends(filter); //suggestedFriends(); model.put("result", res); model.put("cssfriends", asynchcssfriends.get()); } else if (method.equalsIgnoreCase("pendingfriendreq")) { res = "All Pending Friend Requests"; Future<List<CssAdvertisementRecord>> asynchfriendrequests = cssLocalManager .getFriendRequests(); model.put("result", res); model.put("cssfriends", asynchfriendrequests.get()); } else { res = "error unknown metod"; } model.put("result", res); } catch (Exception e) { res = "Oops!!!!<br/>"; } ; return new ModelAndView("suggestedfriendsresult", model); } @RequestMapping(value = "/suggestedfriendspilot.html", method = RequestMethod.GET) public ModelAndView SuggestedFriendsPilot() { // CREATE A HASHMAP OF ALL OBJECTS REQUIRED TO PROCESS THIS PAGE Map<String, Object> model = new HashMap<String, Object>(); String res = null; try { //set the friend filter to return ALL until we switch over to the new webapp which should have a filter switch tp set correctly FriendFilter filter = new FriendFilter(); Integer filterFlag = 0x00000001111; filter = cssLocalManager.getFriendfilter(); if(filter==null){ filter = new FriendFilter(); filterFlag=0x00000011111; filter.setFilterFlag(filterFlag); }else{ filterFlag = filter.getFilterFlag(); filter.setFilterFlag(filterFlag ); } LOG.info("About to call the suggestedFriendDetails with filterflag: " +filter); Future<HashMap<CssAdvertisementRecord, Integer>> asynchSnsSuggestedFriends = getCssLocalManager().getSuggestedFriendsDetails(filter); //suggestedFriends(); HashMap<CssAdvertisementRecord,Integer> snsSuggestedFriends = asynchSnsSuggestedFriends.get(); LOG.info("Back from call the suggestedFriendDetails with result: " +snsSuggestedFriends); // Another Hack for the pilot!!!! DO Not copy!!! // CssManager should return complete and intelligent list, but since // ico not available this will have to do for the pilot Future<List<CssAdvertisementRecordDetailed>> asynchallcss = getCssLocalManager().getCssAdvertisementRecordsFull(); List<CssAdvertisementRecordDetailed> allcssDetails = asynchallcss.get(); List<CssAdvertisementRecordDetailed> otherFriends = new ArrayList<CssAdvertisementRecordDetailed>(); List<CssAdvertisementRecordDetailed> snsFriends = new ArrayList<CssAdvertisementRecordDetailed>(); Future<List<CssRequest>> asynchFR = getCssLocalManager().findAllCssRequests(); List<CssRequest> friendReq = asynchFR.get(); for (int index = 0; index < allcssDetails.size(); index++) { // ignore myself! if (!allcssDetails.get(index).getResultCssAdvertisementRecord().getId().contains(commManager.getIdManager().getThisNetworkNode().getBareJid())) { // skip people we are already friends with 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)) { // We have a pending FR from this people, change status. This should be done in the CssManager // but not for the pilot allcssDetails.get(index).setStatus(CssRequestStatusType.NEEDSRESP); indexFR = friendReq.size(); } } // } LOG.info("snsSuggestedFriends size is now : "+snsSuggestedFriends.size()); // for (int index = 0; index < allcssDetails.size(); index++) { for(Entry<CssAdvertisementRecord, Integer> entry : snsSuggestedFriends.entrySet()){ if(entry.getKey().getId().contains(allcssDetails.get(index).getResultCssAdvertisementRecord().getId())){ LOG.info("FOR LOOP entry is : "+entry.getKey().getName()); if(entry.getValue() == 0){ LOG.info("otherFriends entry is : "+entry.getKey().getName()); LOG.info("otherFriends entry value is : "+entry.getValue()); if(otherFriends.contains(entry.getKey())){ LOG.info("otherfriends already has this entry: " +entry.getKey()); }else { otherFriends.add(allcssDetails.get(index)); LOG.info("otherFriends size is now : "+otherFriends.size()); LOG.info("otherFriends adding : "+allcssDetails.get(index).getResultCssAdvertisementRecord().getName()); } }else { LOG.info("snsFriends entry value is : "+entry.getValue()); if(snsFriends.contains(entry.getKey())){ LOG.info("snsFriends already has this entry: " +entry.getKey()); }else { LOG.info("snsFriends entry is : "+entry.getKey().getName()); snsFriends.add(allcssDetails.get(index)); LOG.info("snsFriends size is now : "+snsFriends.size()); LOG.info("snsFriends adding : "+allcssDetails.get(index).getResultCssAdvertisementRecord().getName()); } } } } // Now we want to check , if we have a pending FR from this people // not friends yet, check that it's nt already in the // sns suggested friends /* boolean bAlreadySuggested = false; for(Entry<CssAdvertisementRecord, Integer> entry : snsSuggestedFriends.entrySet()){ if(entry.getKey().getId().contains(allcssDetails.get(index).getResultCssAdvertisementRecord().getId())){ bAlreadySuggested = true; if(snsFriends.contains(entry.getKey())){ }else { snsFriends.add(allcssDetails.get(index)); } } } if (bAlreadySuggested == false) { otherFriends.add(allcssDetails.get(index)); } */ } } } /* LOG.info("snsSuggestedFriends size is now : "+snsSuggestedFriends.size()); for (int index = 0; index < allcssDetails.size(); index++) { for(Entry<CssAdvertisementRecord, Integer> entry : snsSuggestedFriends.entrySet()){ if(entry.getValue() == 0){ LOG.info("otherFriends entry is : "+entry.getKey().getName()); otherFriends.add(allcssDetails.get(index)); LOG.info("otherFriends size is now : "+otherFriends.size()); }else { LOG.info("otherFriends entry is : "+entry.getKey().getName()); snsFriends.add(allcssDetails.get(index)); LOG.info("snsFriends size is now : "+snsFriends.size()); } } }*/ model.put("otherFriends", otherFriends); model.put("snsFriends", snsFriends); } catch (Exception e) { res = "Oops!!!!<br/>"; } ; return new ModelAndView("suggestedfriendspilot", model); } @SuppressWarnings("unchecked") @RequestMapping(value = "/suggestedfriendspilot.html", method = RequestMethod.POST) public ModelAndView SuggestedFriendsPilot( @Valid SuggestedFriendsForm sfForm, BindingResult result, Map model) { if (result.hasErrors()) { model.put("result", "CSS Suggested Friends form error"); return new ModelAndView("suggestedfriends", model); } if (getCssLocalManager() == null) { model.put("errormsg", "CSS Suggested Friends reference not avaiable"); return new ModelAndView("error", model); } if (sfForm.getMethod() != null) { if (sfForm.getMethod().contains("accept")) { // Accept the pending friend request CssRequest pendingFR = new CssRequest(); pendingFR.setCssIdentity(sfForm.getFriendId()); pendingFR.setRequestStatus(CssRequestStatusType.ACCEPTED); pendingFR.setOrigin(CssRequestOrigin.LOCAL); getCssLocalManager().acceptCssFriendRequest(pendingFR); /* try { getCssLocalManager().handleInternalFriendRequest(this.commManager.getIdManager().fromJid(pendingFR.getCssIdentity()), pendingFR.getRequestStatus()); } catch (InvalidFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ } else if (sfForm.getMethod().contains("cancel")) { // Cancel the pending friend request CssRequest pendingFR = new CssRequest(); pendingFR.setCssIdentity(sfForm.getFriendId()); pendingFR.setRequestStatus(CssRequestStatusType.CANCELLED); pendingFR.setOrigin(CssRequestOrigin.LOCAL); //getCssLocalManager().updateCssRequest(pendingFR); getCssLocalManager().updateCssFriendRequest(pendingFR); } else if (sfForm.getMethod().contains("denied")) { // Decline the pending friend request LOG.info("Webapp -> Decline Friend Requst Called: "); CssRequest pendingFR = new CssRequest(); pendingFR.setCssIdentity(sfForm.getFriendId()); pendingFR.setRequestStatus(CssRequestStatusType.DENIED); pendingFR.setOrigin(CssRequestOrigin.LOCAL); //getCssLocalManager().updateCssRequest(pendingFR); getCssLocalManager().declineCssFriendRequest(pendingFR); } else if (sfForm.getMethod().contains("delete")) { // Decline the pending friend request LOG.info("Webapp -> Delete Friend Called: "); CssRequest pendingFR = new CssRequest(); pendingFR.setCssIdentity(sfForm.getFriendId()); pendingFR.setRequestStatus(CssRequestStatusType.DELETEFRIEND); pendingFR.setOrigin(CssRequestOrigin.LOCAL); //getCssLocalManager().updateCssRequest(pendingFR); getCssLocalManager().updateCssFriendRequest(pendingFR); }else { // send fr getCssLocalManager().sendCssFriendRequest(sfForm.getFriendId()); } } String res = null; try { FriendFilter filter = new FriendFilter(); Integer filterFlag = 0x0000001111; filter.setFilterFlag(filterFlag ); Future<HashMap<IIdentity, Integer>> asynchSnsSuggestedFriends = getCssLocalManager().getSuggestedFriends(filter); //suggestedFriends(); HashMap<IIdentity, Integer> snsSuggestedFriends = asynchSnsSuggestedFriends.get(); // Another Hack for the pilot!!!! DO Not copy!!! // CssManager should return complete and intelligent list, but since // ico not available this will have to do for the pilot Future<List<CssAdvertisementRecordDetailed>> asynchallcss = getCssLocalManager().getCssAdvertisementRecordsFull(); List<CssAdvertisementRecordDetailed> allcssDetails = asynchallcss.get(); List<CssAdvertisementRecordDetailed> otherFriends = new ArrayList<CssAdvertisementRecordDetailed>(); List<CssAdvertisementRecordDetailed> snsFriends = new ArrayList<CssAdvertisementRecordDetailed>(); Future<List<CssRequest>> asynchFR = getCssLocalManager().findAllCssRequests(); List<CssRequest> friendReq = asynchFR.get(); for (int index = 0; index < allcssDetails.size(); index++) { // ignore myself! if (!allcssDetails.get(index).getResultCssAdvertisementRecord().getId().contains(commManager.getIdManager().getThisNetworkNode().getBareJid())) { //Put the check for DENIED here on the outside -> see if this works // skip people we are already friends with 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)) { // We have a pending FR from this people, change status. This should be done in the CssManager // but not for the pilot allcssDetails.get(index).setStatus(CssRequestStatusType.NEEDSRESP); indexFR = friendReq.size(); } } // Now we want to check , if we have a pending FR from this people // not friends yet, check that it's nt already in the // sns suggested friends boolean bAlreadySuggested = false; /* for (int snsIndex = 0; snsIndex < snsSuggestedFriends.size(); snsIndex++) { if (snsSuggestedFriends.get(snsIndex).getId().contains(allcssDetails.get(index).getResultCssAdvertisementRecord().getId())) { bAlreadySuggested = true; snsFriends.add(allcssDetails.get(index)); } }*/ if (bAlreadySuggested == false) { otherFriends.add(allcssDetails.get(index)); } } } } LOG.info("SuggestedFriendsController POST otherFriends: " +otherFriends +"size : " +otherFriends.size()); LOG.info("SuggestedFriendsController POST snsFriends: " +snsFriends +"size : " +snsFriends.size()); model.put("otherFriends", otherFriends); model.put("snsFriends", snsFriends); } catch (Exception e) { res = "Oops!!!!<br/>"; } ; return new ModelAndView("suggestedfriendspilot", model); } @RequestMapping(value = "/friendspilot.html", method = RequestMethod.GET) public ModelAndView FriendsPilot() { // CREATE A HASHMAP OF ALL OBJECTS REQUIRED TO PROCESS THIS PAGE Map<String, Object> model = new HashMap<String, Object>(); String res = null; try { res = "CSS Friends Result "; Future<List<CssAdvertisementRecord>> asynchcssfriends = getCssLocalManager() .getCssFriends(); model.put("cssfriends", asynchcssfriends.get()); model.put("result", res); } catch (Exception e) { res = "Oops!!!!<br/>"; } ; return new ModelAndView("friendsresult", model); } }