Package org.wso2.carbon.registry.social.impl.activity

Source Code of org.wso2.carbon.registry.social.impl.activity.ActivityManagerImpl

/*
* Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.wso2.carbon.registry.social.impl.activity;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.registry.core.Collection;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.social.api.SocialDataException;
import org.wso2.carbon.registry.social.api.activity.Activity;
import org.wso2.carbon.registry.social.api.activity.ActivityManager;
import org.wso2.carbon.registry.social.api.activity.MediaItem;
import org.wso2.carbon.registry.social.api.people.relationship.RelationshipManager;
import org.wso2.carbon.registry.social.api.utils.FilterOptions;
import org.wso2.carbon.registry.social.impl.SocialImplConstants;
import org.wso2.carbon.registry.social.impl.internal.SocialDSComponent;
import org.wso2.carbon.registry.social.impl.people.relationship.RelationshipManagerImpl;
import org.wso2.carbon.registry.social.impl.utils.FilterOptionsImpl;

import java.io.Serializable;
import java.util.*;

/**
* An implementation of the {@link org.wso2.carbon.registry.social.api.activity.ActivityManager} interface
* <p>
* This implementation uses the {@link org.wso2.carbon.registry.core.Registry} to store social {@link org.wso2.carbon.registry.social.api.activity.Activity} data
* </p>
* <p>
* An activity is stored as a {@link org.wso2.carbon.registry.core.Registry}  {@link org.wso2.carbon.registry.core.Resource}
* and the attributes of that activity are stored as properties of that registry resource
* </p>
* <p>
* <p/>
* Each Activity is grouped according to the appId of it
* </p>
* <p>
* Resource path : users/{userId}/{appId}/{activityId}
* </p>
*/

public class ActivityManagerImpl implements ActivityManager {
    private static Log log = LogFactory.getLog(ActivityManagerImpl.class);

    /* The Registry object used throughout */
    private Registry registry = null;

    /* Setting the Registry object */

    public void setRegistry(Registry reg) {
        this.registry = reg;
    }
    /* Getting the Registry object for this manager */

    public Registry getRegistry() throws RegistryException {
        if (this.registry != null) {
            return this.registry;
        } else {
            return SocialDSComponent.getRegistry();
        }
    }

    /**
     * Persists the activity for the given userId
     *
     * @param userId       The userId of the person whose activity to be stored
     * @param userActivity The Activity object of the user to be stored
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public void saveActivity(String userId, Activity userActivity) throws SocialDataException {


        try {

            saveActivity(userId, userActivity, false);

        } catch (RegistryException e) {
            log.error(e.getMessage(), e);
            throw new SocialDataException("Error while saving activity for person " + userId +
                    " with activityId " + userActivity.getId(), e);
        }

    }

    /**
     * Removes the activity of the given userId
     *
     * @param userId     The userId of the person whose activity to be removed
     * @param activityId The id of the activity to be removed
     * @param appId      The appId of the activity
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public void deleteActivity(String userId, String activityId, String appId)
            throws SocialDataException {

        String activityResourcePath = SocialImplConstants.USER_REGISTRY_ROOT + userId +
                SocialImplConstants.ACTIVITY_PATH + appId +
                SocialImplConstants.SEPARATOR + activityId;
        try {
            registry = getRegistry();
            if (registry.resourceExists(activityResourcePath)) {
                registry.delete(activityResourcePath);
            } else {
                throw new SocialDataException
                        ("Activity with specified activityId " + activityId + " doesn't exist");
            }
        } catch (RegistryException e) {
            log.error(e.getMessage(), e);
            throw new SocialDataException("Error while deleting activity for person " + userId +
                    " for activityId " + activityId, e);
        }

    }

    /**
     * Updates the activity of the given userId
     *
     * @param userId       The userId of the person whose activity to be modified
     * @param userActivity The activity to be modified
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public void updateActivity(String userId, Activity userActivity) throws SocialDataException {
        try {
            saveActivity(userId, userActivity, true);

        } catch (RegistryException e) {
            log.error(e.getMessage(), e);
            throw new SocialDataException(e);
        }
    }

    /**
     * Returns an array of Activity objects to the passed parameters
     *
     * @param userIds The set of userIds for which activities to be fetched
     * @param groupId The groupId
     * @param appId   The appId of the activities to be fetched
     * @param fields  The fields to return. Empty set implies all
     * @param options The sorting/filtering/pagination options
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public Activity[] getActivities(String[] userIds, String groupId, String appId,
                                    Set<String> fields, FilterOptions options)
            throws SocialDataException {

        RelationshipManager relationshipManager=new RelationshipManagerImpl();
        List<Activity> activityList = new ArrayList<Activity>();
        List<String> userIdsToFetch=new ArrayList<String>();
        String[] userIdArray=null;
        // Handle GroupId
        if(groupId.equals(SocialImplConstants.GROUP_ID_SELF)){
            userIdArray=userIds;
        }
        else if(groupId.equals(SocialImplConstants.GROUP_ID_FRIENDS)){
            for(String id:userIds){
                if(relationshipManager.getRelationshipList(id)!=null){
                    for(String friend:relationshipManager.getRelationshipList(id)){
                        userIdsToFetch.add(friend);
                    }
                }
            }
            userIdArray=new String[userIdsToFetch.size()];
            userIdArray=userIdsToFetch.toArray(userIdArray);
        } else {
            return new ActivityImpl[0];
        }
        for (String userId : userIdArray) {    /*for each userId */
            try {
                registry = getRegistry();
                String resourcePath = SocialImplConstants.USER_REGISTRY_ROOT + userId +
                        SocialImplConstants.ACTIVITY_PATH + appId;
                Collection activityCollection;
                if (options == null) {
                    options = new FilterOptionsImpl();
                    options.setMax(0);
                    options.setFirst(0);
                }
                if (registry.resourceExists(resourcePath)) {
                    int max = options.getMax() == 0 ? SocialImplConstants.DEFAULT_RETURN_ARRAY_SIZE : options.getMax();
                    activityCollection = registry.get(resourcePath,
                            options.getFirst(),
                            max);

                    String[] activityResourcePaths = activityCollection.getChildren();
                    for (String path : activityResourcePaths) {   /* for each activity resource */
                        // ../activities/{appId}/<activityId>
                        String activityId = path.substring(
                                path.lastIndexOf(SocialImplConstants.SEPARATOR) + 1);
                        // Checks whether the path is the of the nextActivityId resource
                        if ((!activityId.equalsIgnoreCase(SocialImplConstants.NEXT_ACTIVITY_ID)) &&
                                getUserActivity(userId, appId, activityId) != null) {
                            activityList.add(getUserActivity(userId, appId, activityId));

                        }
                    }
                }
            } catch (RegistryException e) {
                log.error(e.getMessage(), e);
                throw new SocialDataException(
                        "Error while retrieving activities for user " + userId, e);
            }

        }
        Activity[] activities = new ActivityImpl[activityList.size()];
        return activityList.toArray(activities);
    }

    /**
     * Returns an array of Activity objects to the passed parameters  , sorted according to the posted time
     *
     * @param userIds The set of userIds for which activities to be fetched
     * @param groupId The groupId
     * @param appId   The appId of the activities to be fetched
     * @param fields  The fields to return. Empty set implies all
     * @param options The sorting/filtering/pagination options
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public Activity[] getSortedActivities(String[] userIds, String groupId, String appId,
                                          Set<String> fields, FilterOptions options)
            throws SocialDataException {
        Activity[] activities = getActivities(userIds, groupId, appId, fields, options);
        Arrays.sort(activities, new ActivityComparator());
        return activities;
    }

    /**
     * Returns an array of Activity objects to the passed activityIds
     *
     * @param userId      The userId of the  person whose activity to be fetched
     * @param groupId     The groupId
     * @param appId       The appId of the activities to be fetched
     * @param fields      The fields to return. Empty set implies all
     * @param options     The sorting/filtering/pagination options
     * @param activityIds The ids of the activities to be fetched
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public Activity[] getActivities(String userId, String groupId, String appId, Set<String> fields,
                                    FilterOptions options, String[] activityIds)
            throws SocialDataException {
        if (activityIds == null) {
            throw new SocialDataException("Invalid activity ids");
        }
        if (activityIds.length <= 0) {
            getActivities(new String[]{userId}, groupId, appId, fields, options);
        }
         //TODO: GroupID
        //TODO: FilterOptions is not used
        // Max size of returned activity array - default value

        Activity[] activities = new ActivityImpl[activityIds.length];
        for (int index = 0; index < activityIds.length; index++) {
            if (activityIds[index] != null) {
                activities[index] = getActivity(userId, groupId, appId, fields, activityIds[index]);
            }
        }
       
        return activities;
    }

    /**
     * Returns an array of Activity objects to the passed activityIds
     *
     * @param userId      The userId of the  person whose activity to be fetched
     * @param groupId     The groupId
     * @param appId       The appId of the activities to be fetched
     * @param fields      The fields to return. Empty set implies all
     * @param options     The sorting/filtering/pagination options
     * @param activityIds The ids of the activities to be fetched
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public Activity[] getSortedActivities(String userId, String groupId, String appId, Set<String> fields,
                                          FilterOptions options, String[] activityIds)
            throws SocialDataException {
        Activity[] activities = getActivities(userId, groupId, appId, fields, options, activityIds);
        Arrays.sort(activities, new ActivityComparator());
        return activities;
    }

    /**
     * Returns the Activity object for the given user
     *
     * @param userId     The userId of the  person whose activity to be fetched
     * @param groupId    The groupId
     * @param appId      The appId of the activity
     * @param fields     The fields to return. Empty set implies all
     * @param activityId The activityId of the activity to be fetched
     * @return A Activity object for the given parameters
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public Activity getActivity(String userId, String groupId, String appId, Set<String> fields,
                                String activityId) throws SocialDataException {
        //TODO: Set<String> fields is not currently used -- all fields are retrieved
        Activity userActivity = null;
        if ((userId == null || userId.trim().equals("") || appId == null ||
                appId.trim().equals("") || activityId == null || activityId.trim().equals(""))) {
            throw new SocialDataException("Invalid parameters provided. " +
                    "One or more of the parameter is either null or empty");
        }
        try {
            registry = getRegistry();
            if (groupId == null || groupId.equals(SocialImplConstants.GROUP_ID_SELF)) {
                // retrieve activity for user {userId}
                userActivity = getUserActivity(userId, appId, activityId);

            }
            //TODO: Handle GroupID= @friends, @topfriends etc
        }
        catch (RegistryException e) {
            log.error(e.getMessage(), e);
            throw new SocialDataException("Error while retrieving activity of user " +
                    userId + " with activityId " + activityId, e);
        }

        return userActivity;
    }

    /**
     * Deletes the activities for the given activityIds
     *
     * @param userId      The userId of the person whose activities to be deleted
     * @param groupId     The groupId
     * @param appId       The appId
     * @param activityIds The activityIds to be deleted
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public void deleteActivities(String userId, String groupId, String appId,
                                 Set<String> activityIds) throws SocialDataException {
        //TODO: Handle groupId
        for (String activityId : activityIds) {
            deleteActivity(userId, activityId, appId);
        }

    }

    /**
     * Creates an Activity object for the given person using the given details
     *
     * @param userId   The userId of the person to create the activity for
     * @param groupId  The groupId
     * @param appId    The appId of the activity
     * @param fields   Fields of the activity to be created
     * @param activity The activity to create
     * @throws org.wso2.carbon.registry.social.api.SocialDataException
     *
     */
    public void createActivity(String userId, String groupId, String appId, Set<String> fields,
                               Activity activity)
            throws SocialDataException {
        // Should save the activity according to given parameters
        if (activity == null) {
            String errorMsg = "Cannot create activity. Passed Activity argument is null";
            log.error(errorMsg);
            throw new SocialDataException(errorMsg);
        }
        //if the posted time is not set, set system time as posted time
        if (activity.getPostedTime() == null || activity.getPostedTime() == 0) {
            activity.setPostedTime(System.currentTimeMillis());
        }
        activity.setAppId(appId);
        activity.setUserId(userId);
        //TODO: Handle Set<String> fields - All fields are retrieved currently
        saveActivity(userId, activity);

    }

    /**
     * Adds or update the attributes of the Activity as properties for the Activity registry resource
     *
     * @param userActivity     The Activity object from which to retrieve the attributes
     * @param activityResource The registry Resource object to add/update properties
     * @param isUpdate         true - if required to update the properties
     *                         false - if required to add the properties
     * @return The registry resource passed as method parameter added/updated with its properties
     */
    private Resource getPropertiesAddedActivityResourceObj(Activity userActivity,
                                                           Resource activityResource,
                                                           boolean isUpdate) {
        if (userActivity == null || activityResource == null) {
            return null;
        }
        /* Retrieves attributes of the Activity and adds it to a Map */
        Map<String, String> properties = new HashMap<String, String>();
        if (userActivity.getAppId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_APP_ID, userActivity.getAppId());
        }
        if (userActivity.getBody() != null) {
            properties.put(SocialImplConstants.ACTIVITY_BODY, userActivity.getBody());
        }
        if (userActivity.getBodyId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_BODY_ID, userActivity.getBodyId());
        }
        if (userActivity.getExternalId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_EXTERNAL_ID, userActivity.getExternalId());
        }
        if (userActivity.getId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_ID, userActivity.getId());
        }
        if (userActivity.getPostedTime() != null) {
            properties.put(SocialImplConstants.ACTIVITY_POSTED_TIME,
                    userActivity.getPostedTime().toString());
        }
        if (userActivity.getPriority() != null) {
            properties.put(SocialImplConstants.ACTIVITY_PRIORITY,
                    userActivity.getPriority().toString());
        }
        if (userActivity.getStreamFaviconUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_STREAM_FAVICON_URL,
                    userActivity.getStreamFaviconUrl());
        }
        if (userActivity.getStreamSourceUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_STREAM_SOURCE_URL,
                    userActivity.getStreamSourceUrl());
        }
        if (userActivity.getStreamTitle() != null) {
            properties.put(SocialImplConstants.ACTIVITY_STREAM_TITLE,
                    userActivity.getStreamTitle());
        }
        if (userActivity.getStreamUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_STREAM_URL, userActivity.getStreamUrl());
        }
        if (userActivity.getTitle() != null) {
            properties.put(SocialImplConstants.ACTIVITY_TITLE, userActivity.getTitle());
        }
        if (userActivity.getTitleId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_TITLE_ID, userActivity.getTitleId());
        }
        if (userActivity.getUpdated() != null) {
            properties.put(SocialImplConstants.ACTIVITY_UPDATED,
                    userActivity.getUpdated().getTime() + "");
        }
        if (userActivity.getUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_URL, userActivity.getUrl());
        }
        if (userActivity.getUserId() != null) {
            properties.put(SocialImplConstants.ACTIVITY_USER_ID, userActivity.getUserId());
        }
        /* Attach the property map to the registry resource */
        attachPropertyToResource(activityResource, properties, isUpdate);
        return activityResource;

    }

    /**
     * Add/ edit a property value for the given Registry resource
     *
     * @param activityResource Registry resource to add/set property
     * @param properties       A Map consisting properties and it's values
     * @param isUpdate         True, if it is an update. False, if it is an addition
     */
    private void attachPropertyToResource(Resource activityResource, Map<String, String> properties,
                                          boolean isUpdate) {


        for (Map.Entry<String, String> e : properties.entrySet()) {
            if (e.getValue() != null) {
                if (isUpdate) {
                    String oldValue = activityResource.getProperty(e.getKey());
                    activityResource.editPropertyValue(e.getKey(), oldValue, e.getValue());
                } else {
                    activityResource.addProperty(e.getKey(), e.getValue());
                }
            }
        }

    }

    /**
     * Adds or update the attributes of the MediaItem as properties for the Media tem registry resource
     *
     * @param activityMediaItem The MediaItem object to retrieve properties
     * @param mediaItemResource The mediaitem registry  resource to add properties
     * @param isUpdate          true- if required to update the properties
     *                          false- if required to add the properties
     * @return The passed in registry resource with propteries added
     */
    private Resource getPropertyAddedMediaItemResourceObj(MediaItem activityMediaItem,
                                                          Resource mediaItemResource,
                                                          boolean isUpdate) {
        if (mediaItemResource == null || activityMediaItem == null) {
            return null;
        }
        Map<String, String> properties = new HashMap<String, String>();

        if (activityMediaItem.getMimeType() != null) {
            properties.put(SocialImplConstants.ACTIVITY_MEDIA_ITEM_MIME_TYPE,
                    activityMediaItem.getMimeType());
        }
        if (activityMediaItem.getType() != null) {
            properties.put(SocialImplConstants.ACTIVITY_MEDIA_ITEM_TYPE,
                    activityMediaItem.getType().name());
        }
        if (activityMediaItem.getThumbnailUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_MEDIA_ITEM_THUMBNAIL_URL,
                    activityMediaItem.getThumbnailUrl());
        }
        if (activityMediaItem.getUrl() != null) {
            properties.put(SocialImplConstants.ACTIVITY_MEDIA_ITEM_URL,
                    activityMediaItem.getUrl());
        }
        attachPropertyToResource(mediaItemResource, properties, isUpdate);
        return mediaItemResource;
    }

    /**
     * Adds the properties of the activity resource as attributes to a Activity object and returns that Activity object
     *
     * @param activityResource The registry resource to retrieve properties from
     * @return An Activity object with the its attributes added
     */
    private Activity getPropertyAddedActivityObj(Resource activityResource) {
        Activity activityObj = new ActivityImpl();
        String value;
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_APP_ID)) != null) {
            activityObj.setAppId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_BODY)) != null) {
            activityObj.setBody(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_BODY_ID)) != null) {
            activityObj.setBodyId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_EXTERNAL_ID)) != null) {
            activityObj.setExternalId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_ID)) != null) {
            activityObj.setId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_UPDATED)) != null) {
            // this property holds the date in long (ms)
            Date updatedDate = new Date(Long.valueOf(value));
            activityObj.setUpdated(updatedDate);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_POSTED_TIME)) != null) {
            activityObj.setPostedTime(Long.valueOf(value));
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_PRIORITY)) != null) {
            activityObj.setPriority(Float.valueOf(value));
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_STREAM_FAVICON_URL)) != null) {
            activityObj.setStreamFaviconUrl(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_STREAM_SOURCE_URL)) != null) {
            activityObj.setStreamSourceUrl(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_STREAM_TITLE)) != null) {
            activityObj.setStreamTitle(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_STREAM_URL)) != null) {
            activityObj.setStreamUrl(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_TITLE)) != null) {
            activityObj.setTitle(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_TITLE_ID)) != null) {
            activityObj.setTitleId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_USER_ID)) != null) {
            activityObj.setUserId(value);
        }
        if ((value = activityResource.getProperty(
                SocialImplConstants.ACTIVITY_URL)) != null) {
            activityObj.setUrl(value);
        }
        return activityObj;
    }

    /**
     * Adds the properties of the mediaitem resource as attributes to a MediaItem object and returns that MediaItem object
     *
     * @param itemResource The registry resource to retrieve the mediaitem properties
     * @return A MediaItem object with its attributes added
     */
    private MediaItem getPropertiesAddedMediaItemObj(Resource itemResource) {
        MediaItem item = new MediaItemImpl();
        String value;
        if ((value = itemResource.getProperty(
                SocialImplConstants.ACTIVITY_MEDIA_ITEM_MIME_TYPE)) != null) {
            item.setMimeType(value);
        }
        if ((value = itemResource.getProperty(
                SocialImplConstants.ACTIVITY_MEDIA_ITEM_THUMBNAIL_URL)) != null) {
            item.setThumbnailUrl(value);
        }
        if ((value = itemResource.getProperty(
                SocialImplConstants.ACTIVITY_MEDIA_ITEM_URL)) != null) {
            item.setUrl(value);
        }
        if ((value = itemResource.getProperty(
                SocialImplConstants.ACTIVITY_MEDIA_ITEM_TYPE)) != null) {
            item.setType(MediaItem.Type.valueOf(value));   //TODO:?
        }
        return item;
    }

    /**
     * Retrieves the Activity object for the given userId,appId,activityId combination
     *
     * @param userId     The id of the person
     * @param appId      The id of the application
     * @param activityId The ide of the activity
     * @return An Activiy object for the passed in userId,appId,activityId combination
     * @throws RegistryException
     */

    private Activity getUserActivity(String userId, String appId, String activityId)
            throws RegistryException {
        registry = getRegistry();
        Activity userActivity;
        // retrieve activity for user {userId}

        String selfActivityResourcePath = SocialImplConstants.USER_REGISTRY_ROOT + userId +
                SocialImplConstants.ACTIVITY_PATH + appId +
                SocialImplConstants.SEPARATOR + activityId;
        Resource selfActivityResource;
        if (registry.resourceExists(selfActivityResourcePath)) {
            // requested activity exists
            selfActivityResource = registry.get(selfActivityResourcePath);
            userActivity = getPropertyAddedActivityObj(selfActivityResource);

            /* Handle media items */
            String mediaItemResourcePath = selfActivityResourcePath +
                    SocialImplConstants.ACTIVITY_MEDIA_ITEM_PATH;
            int noOfMediaItems;
            if (registry.resourceExists(mediaItemResourcePath) &&
                    registry.get(mediaItemResourcePath).getProperty(
                            SocialImplConstants.ACTIVITY_MEDIA_ITEM_NOS) != null) {
                noOfMediaItems = Integer.valueOf(registry.get(mediaItemResourcePath).
                        getProperty(SocialImplConstants.ACTIVITY_MEDIA_ITEM_NOS));
                String itemResourcePath;
                List<MediaItem> mediaItemList = new ArrayList<MediaItem>();
                for (int index = 0; index < noOfMediaItems; index++) {
                    itemResourcePath = mediaItemResourcePath +
                            SocialImplConstants.SEPARATOR + index;
                    Resource mediaItemResource;
                    if (registry.resourceExists(itemResourcePath)) {
                        mediaItemResource = registry.get(itemResourcePath);
                        // retrieve mediaItem properties
                        // add to mediaItems list
                        mediaItemList.add(getPropertiesAddedMediaItemObj(mediaItemResource));
                    }
                }
                // add the mediaItem list to the activity object
                userActivity.setMediaItems(mediaItemList);
            }


            /* Handle Template Params */
            String templateParamResourcePath = selfActivityResourcePath +
                    SocialImplConstants.
                            ACTIVITY_TEMPLATE_PARAMS_PATH;
            Resource templateParamResource;
            if (registry.resourceExists(templateParamResourcePath)) {
                templateParamResource = registry.get(templateParamResourcePath);
                Properties props = templateParamResource.getProperties();
                userActivity.setTemplateParams(new HashMap<String, String>((Map) props));
            }

        } else {
            //requested activity doesn't exist
            log.error("No activity found with id " + activityId);
            return null;

        }
        return userActivity;
    }

    /**
     * Persists/updates the Activity object as a registry resource
     *
     * @param userId       The id of the person
     * @param userActivity The Activity object to persist/update
     * @param isUpdate     true- if required to update &persist
     *                     false- if required to persist
     * @throws RegistryException
     */
    private void saveActivity(String userId, Activity userActivity, boolean isUpdate)
            throws RegistryException {
        registry = getRegistry();
        String nextActivityPath = SocialImplConstants.USER_REGISTRY_ROOT +
                userId +
                SocialImplConstants.ACTIVITY_PATH +
                userActivity.getAppId() +
                SocialImplConstants.NEXT_ACTIVITY_ID_PATH;
        /* Check for null activity id  */
        if (userActivity.getId() == null) {
            // No activity Id specified

            Resource nextActivityIdResource;
            int nextActivityId;
            if (registry.resourceExists(nextActivityPath)) {
                nextActivityIdResource = registry.get(nextActivityPath);
                if (nextActivityIdResource.getProperty(SocialImplConstants.NEXT_ACTIVITY_ID) != null) {
                    nextActivityId = Integer.valueOf(nextActivityIdResource.getProperty(SocialImplConstants.NEXT_ACTIVITY_ID));
                } else {
                    nextActivityId = 0;
                }

            } else {
                // there's no nextActivityId Resource
                nextActivityId = 0;
                nextActivityIdResource = registry.newCollection();
            }
            nextActivityIdResource.setProperty(SocialImplConstants.NEXT_ACTIVITY_ID, (nextActivityId + 1) + "");
            registry.put(nextActivityPath, nextActivityIdResource);
            userActivity.setId(nextActivityId + "");
        } else {
            // There's an activityId specified
            Resource nextActivityIdResource = null;
            int nextActivityId = -1;
            if (registry.resourceExists(nextActivityPath)) {
                nextActivityIdResource = registry.get(nextActivityPath);
                if (nextActivityIdResource.getProperty(SocialImplConstants.NEXT_ACTIVITY_ID) != null) {
                    nextActivityId = Integer.valueOf(nextActivityIdResource.getProperty(SocialImplConstants.NEXT_ACTIVITY_ID));
                }

            }

            String userActivityId = userActivity.getId();
            boolean isIntegerId = false;
            int userActivityIdInteger = 0;
            try {
                userActivityIdInteger = Integer.parseInt(userActivityId);
                isIntegerId = true;

            } catch (NumberFormatException e) {
                isIntegerId = false;
            }
            if (nextActivityId > 0 && isIntegerId && nextActivityIdResource != null) {
                if (nextActivityId == userActivityIdInteger) {
                    // The new activity Id is same as the next ActivityId, So increase the nextActivityId
                    userActivity.setId(nextActivityId + "");
                    nextActivityIdResource.setProperty(SocialImplConstants.NEXT_ACTIVITY_ID,
                            (nextActivityId + 1) + "");
                    registry.put(nextActivityPath, nextActivityIdResource);
                }


                /*else if (nextActivityId > userActivityIdInteger) {
                    // This userActivity's Id possibly exists
                    // So check for it
                    String activityResourcePath = SocialImplConstants.USER_REGISTRY_ROOT +
                                                  userId +
                                                  SocialImplConstants.ACTIVITY_PATH +
                                                  userActivity.getAppId();
                    Collection activityResource = null;
                    if (registry.resourceExists(activityResourcePath)) {
                       activityResource=registry.get(activityResourcePath);
                      
                    }
                }*/


            }
        }
        /* Recording Activities */
        String newActivityPath = SocialImplConstants.USER_REGISTRY_ROOT +
                userId +
                SocialImplConstants.ACTIVITY_PATH +
                userActivity.getAppId() +
                SocialImplConstants.SEPARATOR +
                userActivity.getId();
        Resource newActivityResource;
        if (registry.resourceExists(newActivityPath)) {
            newActivityResource = registry.get(newActivityPath);
        } else {
            newActivityResource = registry.newCollection();
        }

        newActivityResource = getPropertiesAddedActivityResourceObj(userActivity,
                newActivityResource, isUpdate);
        registry.put(newActivityPath, newActivityResource);
        /* Handling MediaItems */
        if (userActivity.getMediaItems() != null) {
            String resourcePath = newActivityPath +
                    SocialImplConstants.ACTIVITY_MEDIA_ITEM_PATH;
            Resource mediaResource;
            if (registry.resourceExists(resourcePath)) {
                mediaResource = registry.get(resourcePath);
            } else {
                mediaResource = registry.newCollection();
            }
            // Add the no. of mediaItems as a property to this resource
            mediaResource.addProperty(SocialImplConstants.ACTIVITY_MEDIA_ITEM_NOS,
                    userActivity.getMediaItems().size() + "");
            registry.put(resourcePath, mediaResource);
            // Add all mediaItems as resources in the path /activityId/{mediaItem}/{mediaItemId}/...
            Resource mediaItemResource;
            int index = 0;
            String itemResourcePath;
            for (MediaItem item : userActivity.getMediaItems()) {
                itemResourcePath = resourcePath + SocialImplConstants.SEPARATOR + index;

                if (registry.resourceExists(itemResourcePath)) {
                    mediaItemResource = registry.get(itemResourcePath);
                } else {
                    mediaItemResource = registry.newCollection();
                }
                mediaItemResource = getPropertyAddedMediaItemResourceObj(
                        item, mediaItemResource, isUpdate);
                registry.put(itemResourcePath, mediaItemResource);
                index++;
            }
        }
        /* Handling TemplateParams */
        if (userActivity.getTemplateParams() != null) {
            String templateParamResourcePath = newActivityPath +
                    SocialImplConstants.ACTIVITY_TEMPLATE_PARAMS_PATH;
            Resource templateParamResource;
            if (registry.resourceExists(templateParamResourcePath)) {
                templateParamResource = registry.get(templateParamResourcePath);
            } else {
                templateParamResource = registry.newCollection();
            }
            for (String param : userActivity.getTemplateParams().keySet()) {
                if (isUpdate) {
                    String oldValue = templateParamResource.getProperty(param);
                    templateParamResource.editPropertyValue(
                            param, oldValue, userActivity.getTemplateParams().get(param));
                } else {
                    templateParamResource.addProperty(param,
                            userActivity.getTemplateParams().get(param));
                }
            }
            registry.put(templateParamResourcePath, templateParamResource);
        }


    }

    /**
     * A Comparator to sort activities according to posted time
     */
    static class ActivityComparator implements Comparator<Activity>, Serializable {

        public int compare(Activity activity1, Activity activity2) {
            if (activity1.getPostedTime() == null) {
                activity1.setPostedTime(System.currentTimeMillis());
            }
            if (activity2.getPostedTime() == null) {
                activity2.setPostedTime(System.currentTimeMillis());
            }

            if (activity1.getPostedTime() < activity2.getPostedTime()) {
                return 1;
            } else if (activity1.getPostedTime() > activity2.getPostedTime()) {
                return -1;
            }
            return 0;
        }

    }
}
TOP

Related Classes of org.wso2.carbon.registry.social.impl.activity.ActivityManagerImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.