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}