001/* 002 * (C) Copyright 2006-2012 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * Thomas Roger <[email protected]> 018 */ 019 020package org.nuxeo.ecm.activity.operations; 021 022import static org.nuxeo.ecm.activity.ActivityHelper.getUsername; 023import static org.nuxeo.ecm.activity.ActivityMessageHelper.replaceURLsByLinks; 024 025import java.io.IOException; 026import java.io.StringWriter; 027import java.text.DateFormat; 028import java.util.Date; 029import java.util.HashMap; 030import java.util.Locale; 031import java.util.Map; 032 033import org.nuxeo.ecm.activity.ActivityHelper; 034import org.nuxeo.ecm.activity.ActivityLinkBuilder; 035import org.nuxeo.ecm.activity.ActivityReply; 036import org.nuxeo.ecm.activity.ActivityStreamService; 037import org.nuxeo.ecm.automation.core.Constants; 038import org.nuxeo.ecm.automation.core.annotations.Context; 039import org.nuxeo.ecm.automation.core.annotations.Operation; 040import org.nuxeo.ecm.automation.core.annotations.OperationMethod; 041import org.nuxeo.ecm.automation.core.annotations.Param; 042import org.nuxeo.ecm.core.api.Blob; 043import org.nuxeo.ecm.core.api.Blobs; 044import org.nuxeo.ecm.core.api.CoreSession; 045import org.nuxeo.runtime.api.Framework; 046 047import com.fasterxml.jackson.databind.ObjectMapper; 048 049/** 050 * Operation to add an activity reply. 051 * 052 * @author <a href="mailto:[email protected]">Thomas Roger</a> 053 * @since 5.6 054 */ 055@Operation(id = AddActivityReply.ID, category = Constants.CAT_SERVICES, label = "Add a reply to an existing activity", description = "Add a reply to an existing activity.") 056public class AddActivityReply { 057 058 public static final String ID = "Services.AddActivityReply"; 059 060 @Context 061 protected CoreSession session; 062 063 @Context 064 protected ActivityStreamService activityStreamService; 065 066 @Param(name = "language", required = false) 067 protected String language; 068 069 @Param(name = "activityId", required = true) 070 protected String activityId; 071 072 @Param(name = "message", required = true) 073 protected String message; 074 075 @Param(name = "activityLinkBuilderName", required = true) 076 protected String activityLinkBuilderName; 077 078 @OperationMethod 079 public Blob run() throws IOException { 080 String actor = ActivityHelper.createUserActivityObject(session.getPrincipal()); 081 String displayActor = ActivityHelper.generateDisplayName(session.getPrincipal()); 082 ActivityReply reply = new ActivityReply(actor, displayActor, message, new Date().getTime()); 083 reply = activityStreamService.addActivityReply(Long.valueOf(activityId), reply); 084 085 Locale locale = language != null && !language.isEmpty() ? new Locale(language) : Locale.ENGLISH; 086 DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale); 087 ActivityLinkBuilder activityLinkBuilder = Framework.getService(ActivityStreamService.class).getActivityLinkBuilder( 088 activityLinkBuilderName); 089 090 Map<String, Object> m = new HashMap<String, Object>(); 091 m.put("id", reply.getId()); 092 m.put("actor", reply.getActor()); 093 m.put("displayActor", reply.getDisplayActor()); 094 m.put("displayActorLink", getDisplayActorLink(reply.getActor(), reply.getDisplayActor(), activityLinkBuilder)); 095 m.put("actorAvatarURL", activityLinkBuilder.getUserAvatarURL(session, getUsername(reply.getActor()))); 096 m.put("message", replaceURLsByLinks(reply.getMessage())); 097 m.put("publishedDate", dateFormat.format(new Date(reply.getPublishedDate()))); 098 String username = ActivityHelper.getUsername(reply.getActor()); 099 m.put("allowDeletion", session.getPrincipal().getName().equals(username)); 100 101 ObjectMapper mapper = new ObjectMapper(); 102 StringWriter writer = new StringWriter(); 103 mapper.writeValue(writer, m); 104 105 return Blobs.createJSONBlob(writer.toString()); 106 } 107 108 protected String getDisplayActorLink(String actor, String displayActor, ActivityLinkBuilder activityLinkBuilder) { 109 return activityLinkBuilder.getUserProfileLink(actor, displayActor); 110 } 111 112}