* @return Populated instance of the {@link ActivityDTO} after being persisted.
*/
@Override
public Serializable execute(final TaskHandlerActionContext<PrincipalActionContext> inActionContext)
{
ActivityDTO inActivityDTO = ((PostActivityRequest) inActionContext.getActionContext().getParams())
.getActivityDTO();
ActivityDTO persistedActivityDTO;
Activity newActivity = convertDTOToActivity(inActivityDTO, inActionContext.getUserActionRequests());
List<UserActionRequest> queueRequests = new ArrayList<UserActionRequest>();
String actorAccountName = inActionContext.getActionContext().getPrincipal().getAccountId();
newActivity.setPostedTime(new Date());
newActivity.setActorId(actorAccountName);
newActivity.setActorType(EntityType.PERSON);
long actorId = 0;
long destinationId = 0;
EntityType destinationType;
// Persist to long term storage.
insertMapper.execute(new PersistenceRequest<Activity>(newActivity));
insertMapper.flush();
// Force the cache to load the activityDTO in from the db.
List<ActivityDTO> activityResults = activitiesMapper.execute(Arrays.asList(newActivity.getId()));
persistedActivityDTO = activityResults.get(0);
actorId = persistedActivityDTO.getActor().getId();
destinationId = persistedActivityDTO.getDestinationStream().getDestinationEntityId();
destinationType = persistedActivityDTO.getDestinationStream().getType();
// add activity to destination entity streams
updateStreamsByActorMapper.execute(persistedActivityDTO);
// Insert the comment that was posted with a shared post.
if (inActivityDTO.getFirstComment() != null && inActivityDTO.getVerb().equals(ActivityVerb.SHARE))
{
insertCommentDAO.execute(new InsertActivityCommentRequest(actorId, persistedActivityDTO.getId(),
inActivityDTO.getFirstComment().getBody()));
}
RequestType requestType = null;
// Sends notifications for new personal stream posts.
if (destinationType == EntityType.PERSON)
{
requestType = RequestType.POST_PERSON_STREAM;
}
// Sends notifications for new group stream posts.
else if (destinationType == EntityType.GROUP)
{
requestType = RequestType.POST_GROUP_STREAM;
}
// Setup the queued requests.
if (requestType != null)
{
CreateNotificationsRequest notificationRequest = new ActivityNotificationsRequest(requestType, actorId,
destinationId, persistedActivityDTO.getEntityId());
queueRequests
.add(new UserActionRequest(CreateNotificationsRequest.ACTION_NAME, null, notificationRequest));
}
// TODO: fix this so activityDTO fields related to specific user
// are not saved in cache.