001/*
002 * (C) Copyright 2011 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 <troger@nuxeo.com>
018 */
019
020package org.nuxeo.ecm.activity;
021
022import java.io.IOException;
023import java.io.StringWriter;
024import java.util.ArrayList;
025import java.util.Collections;
026import java.util.Date;
027import java.util.HashMap;
028import java.util.List;
029import java.util.Map;
030
031import javax.persistence.Column;
032import javax.persistence.Entity;
033import javax.persistence.GeneratedValue;
034import javax.persistence.GenerationType;
035import javax.persistence.Id;
036import javax.persistence.Lob;
037import javax.persistence.Table;
038import javax.persistence.Temporal;
039import javax.persistence.TemporalType;
040import javax.persistence.Transient;
041
042import org.apache.commons.lang.builder.EqualsBuilder;
043import org.apache.commons.lang.builder.HashCodeBuilder;
044import org.apache.commons.lang.builder.ToStringBuilder;
045import org.apache.commons.logging.Log;
046import org.apache.commons.logging.LogFactory;
047import org.codehaus.jackson.map.ObjectMapper;
048import org.codehaus.jackson.type.TypeReference;
049
050/**
051 * Default implementation of {@link Activity}.
052 *
053 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a>
054 * @since 5.5
055 */
056@Entity(name = "Activity")
057@Table(name = "nxp_activities")
058public class ActivityImpl implements Activity {
059
060    private static final Log log = LogFactory.getLog(ActivityImpl.class);
061
062    private Long id;
063
064    private String actor;
065
066    private String displayActor;
067
068    private String verb;
069
070    private String object;
071
072    private String displayObject;
073
074    private String target;
075
076    private String displayTarget;
077
078    private String context;
079
080    private Date publishedDate;
081
082    private Date lastUpdatedDate;
083
084    private String replies;
085
086    @Id
087    @GeneratedValue(strategy = GenerationType.AUTO)
088    @Column(nullable = false, columnDefinition = "integer")
089    @Override
090    public Long getId() {
091        return id;
092    }
093
094    public void setId(Long id) {
095        this.id = id;
096    }
097
098    @Column
099    @Override
100    public String getActor() {
101        return actor;
102    }
103
104    @Override
105    public void setActor(String actor) {
106        this.actor = actor;
107    }
108
109    @Column
110    @Override
111    public String getDisplayActor() {
112        return displayActor;
113    }
114
115    @Override
116    public void setDisplayActor(String displayActor) {
117        this.displayActor = displayActor;
118    }
119
120    @Column
121    @Override
122    public String getVerb() {
123        return verb;
124    }
125
126    @Override
127    public void setVerb(String verb) {
128        this.verb = verb;
129    }
130
131    @Column
132    @Override
133    public String getObject() {
134        return object;
135    }
136
137    @Override
138    public void setObject(String object) {
139        this.object = object;
140    }
141
142    @Column
143    @Override
144    public String getDisplayObject() {
145        return displayObject;
146    }
147
148    @Override
149    public void setDisplayObject(String displayObject) {
150        this.displayObject = displayObject;
151    }
152
153    @Column
154    @Override
155    public String getTarget() {
156        return target;
157    }
158
159    @Override
160    public void setTarget(String target) {
161        this.target = target;
162    }
163
164    @Column
165    @Override
166    public String getDisplayTarget() {
167        return displayTarget;
168    }
169
170    @Override
171    public void setDisplayTarget(String displayTarget) {
172        this.displayTarget = displayTarget;
173    }
174
175    @Column
176    @Override
177    public String getContext() {
178        return context;
179    }
180
181    @Override
182    public void setContext(String context) {
183        this.context = context;
184    }
185
186    @Temporal(TemporalType.TIMESTAMP)
187    @Column(nullable = false)
188    @Override
189    public Date getPublishedDate() {
190        return publishedDate;
191    }
192
193    @Override
194    public void setPublishedDate(Date publishedDate) {
195        this.publishedDate = publishedDate;
196    }
197
198    @Temporal(TemporalType.TIMESTAMP)
199    @Column
200    @Override
201    public Date getLastUpdatedDate() {
202        return lastUpdatedDate;
203    }
204
205    @Override
206    public void setLastUpdatedDate(Date lastUpdated) {
207        this.lastUpdatedDate = lastUpdated;
208    }
209
210    @Column
211    @Lob
212    @Override
213    public String getReplies() {
214        return replies;
215    }
216
217    @Override
218    public void setReplies(String replies) {
219        this.replies = replies;
220    }
221
222    @Transient
223    @Override
224    public List<ActivityReply> getActivityReplies() {
225        if (replies == null) {
226            return new ArrayList<ActivityReply>();
227        }
228
229        try {
230            ObjectMapper mapper = new ObjectMapper();
231            return mapper.readValue(replies, new TypeReference<List<ActivityReply>>() {
232            });
233        } catch (IOException e) {
234            log.warn(String.format("Unable to convert replies to ActivityReply: %s", e.getMessage()));
235            log.debug(e, e);
236            return new ArrayList<ActivityReply>();
237        }
238    }
239
240    @Override
241    public void setActivityReplies(List<ActivityReply> activityReplies) {
242        try {
243            ObjectMapper mapper = new ObjectMapper();
244            StringWriter writer = new StringWriter();
245            mapper.writeValue(writer, activityReplies);
246            replies = writer.toString();
247        } catch (IOException e) {
248            log.warn(String.format("Unable to convert replies to ActivityReply: %s", e.getMessage()));
249            log.debug(e, e);
250        }
251    }
252
253    @Override
254    public Map<String, String> toMap() {
255        Map<String, String> m = new HashMap<String, String>();
256        m.put("id", String.valueOf(id));
257        m.put("actor", actor);
258        m.put("displayActor", displayActor);
259        m.put("object", object);
260        m.put("displayObject", displayObject);
261        m.put("target", target);
262        m.put("displayTarget", displayTarget);
263        m.put("verb", verb);
264        m.put("context", context);
265        m.put("publishedDate", publishedDate.toString());
266        m.put("lastUpdatedDate", lastUpdatedDate != null ? lastUpdatedDate.toString() : null);
267        m.put("replies", replies);
268        return Collections.unmodifiableMap(m);
269    }
270
271    @Override
272    public boolean equals(Object obj) {
273        return EqualsBuilder.reflectionEquals(this, obj);
274    }
275
276    @Override
277    public int hashCode() {
278        return HashCodeBuilder.reflectionHashCode(this);
279    }
280
281    @Override
282    public String toString() {
283        return ToStringBuilder.reflectionToString(this);
284    }
285
286}