package org.societies.platform.socialdata; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.shindig.social.opensocial.model.Group; import org.apache.shindig.social.opensocial.model.Person; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.internal.sns.ISocialConnector; import org.societies.api.sns.SocialDataState; import org.societies.platform.socialdata.converters.ActivityConverter; import org.societies.platform.socialdata.converters.ActivityConveterFactory; import org.societies.platform.socialdata.converters.FriendsConverter; import org.societies.platform.socialdata.converters.FriendsConveterFactory; import org.societies.platform.socialdata.converters.GroupConverter; import org.societies.platform.socialdata.converters.GroupConveterFactory; import org.societies.platform.socialdata.converters.PersonConverter; import org.societies.platform.socialdata.converters.PersonConverterFactory; import org.springframework.scheduling.annotation.Async; public class PullDataFromSN { private static final Logger logger = LoggerFactory.getLogger(PullDataFromSN.class); SocialData sd; public PullDataFromSN(SocialData socialData){ this.sd = socialData; } @Async public void execute() { sd.setState(SocialDataState.DOWNLOADING_FROM_SN); HashMap<String, Object> allFriends = new HashMap<String, Object>(); HashMap<String, Object> allGroups = new HashMap<String, Object>(); HashMap<String, Object> allProfiles = new HashMap<String, Object>(); HashMap<String, Object> allFeeds = new HashMap<String, Object>(); logger.debug("Processing connectors...."); for (ISocialConnector connector : sd.connectors.values()){ logger.debug("Update " + connector.getConnectorName() + " data..."); // add a Feed for each connector allFeeds.put(connector.getID(), getActivities(connector)); // Add a new profile for each connector.... Person profile = updateProfile(connector); allProfiles.put(profile.getId(), profile); allGroups.putAll (updateGroups(connector)); allFriends.putAll(updateFriends(connector)); } // clone data... sd.socialActivities = (Map<String, Object>) allFeeds.clone(); sd.socialFriends = (Map<String, Object>) allFriends.clone(); sd.socialProfiles = (Map<String, Object>) allProfiles.clone(); sd.socialGroups = (Map<String, Object>) allGroups.clone(); sd.updateContextBroker(); logger.debug("Update Thread completed"); } /** * Read and parse ActivityFeed from connector * * @param {@link {@link ISocialConnector} * @return Map<ConnectorID, Feed> */ private List<?> getActivities(ISocialConnector connector) { logger.debug("Read " + connector.getSocialNetwork() + " feed ... "); ActivityConverter parser = ActivityConveterFactory.getConverter(connector); return parser.load(connector.getUserActivities()); } /** * Read Profile data * @param {@link ISocialConnector} * @return {@link Person} */ private Person updateProfile(ISocialConnector connector) { logger.debug("Update " + connector.getSocialNetwork() + " Profile ... "); PersonConverter parser = PersonConverterFactory.getConverter(connector); return parser.load(connector.getUserProfile()); } /** * Read Groups data * @param {@link ISocialConnector} * @return List{@link Group} */ private Map<String, ?> updateGroups(ISocialConnector connector) { logger.debug("Read " + connector.getSocialNetwork() + " groups ... "); GroupConverter parser = GroupConveterFactory.getConverter(connector); List<Group> groups = parser.load(connector.getUserGroups()); Map<String, Object> gMap= new HashMap<String, Object>(); for(Group g: groups){ gMap.put(g.getId().getGroupId(), g); } return gMap; } /** * Read Friends data * @param {@link ISocialConnector} * @return List < {@link Person } */ private Map<String, ?> updateFriends(ISocialConnector connector) { logger.debug("Read " + connector.getSocialNetwork() + " friends ... "); FriendsConverter parser = FriendsConveterFactory.getConverter(connector); List<Person> friends = parser.load(connector.getUserFriends()); Map<String, Object> fMap = new HashMap<String, Object>(); for(Person f: friends) fMap.put(f.getId(),f); return fMap; } }