/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.usergrid.persistence.entities; import java.util.Arrays; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.UUID; import javax.xml.bind.annotation.XmlRootElement; import org.apache.usergrid.persistence.Entity; import org.apache.usergrid.persistence.EntityRef; import org.apache.usergrid.persistence.TypedEntity; import org.apache.usergrid.persistence.annotations.EntityDictionary; import org.apache.usergrid.persistence.annotations.EntityProperty; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; import static org.apache.usergrid.utils.StringUtils.toStringFormat; /** * An entity type for representing activity stream actions. These are similar to the more generic message entity type * except provide the necessary properties for supporting activity stream implementations. * * @see http://activitystrea.ms/specs/json/1.0/ */ @XmlRootElement public class Activity extends TypedEntity { public static final String ENTITY_TYPE = "activity"; public static final String PROPERTY_OBJECT_NAME = "objectName"; public static final String PROPERTY_OBJECT_ENTITY_TYPE = "objectEntityType"; public static final String PROPERTY_ACTOR_NAME = "actorName"; public static final String PROPERTY_OBJECT = "object"; public static final String PROPERTY_ACTOR = "actor"; public static final String PROPERTY_TITLE = "title"; public static final String PROPERTY_CONTENT = "content"; public static final String PROPERTY_CATEGORY = "category"; public static final String PROPERTY_VERB = "verb"; public static final String PROPERTY_UUID = "uuid"; public static final String PROPERTY_ENTITY_TYPE = "entityType"; public static final String PROPERTY_OBJECT_TYPE = "objectType"; public static final String PROPERTY_DISPLAY_NAME = "displayName"; public static final String VERB_ADD = "add"; public static final String VERB_CANCEL = "cancel"; public static final String VERB_CHECKIN = "checkin"; public static final String VERB_DELETE = "delete"; public static final String VERB_FAVORITE = "favorite"; public static final String VERB_FOLLOW = "follow"; public static final String VERB_GIVE = "give"; public static final String VERB_IGNORE = "ignore"; public static final String VERB_INVITE = "invite"; public static final String VERB_JOIN = "join"; public static final String VERB_LEAVE = "leave"; public static final String VERB_LIKE = "like"; public static final String VERB_MAKE_FRIEND = "make-friend"; public static final String VERB_PLAY = "play"; public static final String VERB_POST = "post"; public static final String VERB_RECEIVE = "receive"; public static final String VERB_REMOVE = "remove"; public static final String VERB_REMOVE_FRIEND = "remove-friend"; public static final String VERB_REQUEST_FRIEND = "request-friend"; public static final String VERB_RSVP_MAYBE = "rsvp-maybe"; public static final String VERB_RSVP_NO = "rsvp-no"; public static final String VERB_RSVP_YES = "rsvp-yes"; public static final String VERB_SAVE = "save"; public static final String VERB_SHARE = "share"; public static final String VERB_STOP_FOLLOWING = "stop-following"; public static final String VERB_TAG = "tag"; public static final String VERB_UNFAVORITE = "unfavorite"; public static final String VERB_UNLIKE = "unlike"; public static final String VERB_UNSAVE = "unsave"; public static final String VERB_UPDATE = "update"; public static final String OBJECT_TYPE_ARTICLE = "article"; public static final String OBJECT_TYPE_AUDIO = "audio"; public static final String OBJECT_TYPE_BADGE = "badge"; public static final String OBJECT_TYPE_BOOKMARK = "bookmark"; public static final String OBJECT_TYPE_COLLECTION = "collection"; public static final String OBJECT_TYPE_COMMENT = "comment"; public static final String OBJECT_TYPE_EVENT = "event"; public static final String OBJECT_TYPE_FILE = "file"; public static final String OBJECT_TYPE_GROUP = "group"; public static final String OBJECT_TYPE_IMAGE = "image"; public static final String OBJECT_TYPE_NOTE = "note"; public static final String OBJECT_TYPE_PERSON = "person"; public static final String OBJECT_TYPE_PLACE = "place"; public static final String OBJECT_TYPE_PRODUCT = "product"; public static final String OBJECT_TYPE_QUESTION = "question"; public static final String OBJECT_TYPE_REVIEW = "review"; public static final String OBJECT_TYPE_SERVICE = "service"; public static final String OBJECT_TYPE_VIDEO = "video"; @EntityProperty(required = true, mutable = false, indexed = true) ActivityObject actor; @EntityProperty(indexed = true, fulltextIndexed = true, required = false, mutable = false) protected String content; ActivityObject generator; @EntityProperty(indexed = false, fulltextIndexed = false, required = false, mutable = false) protected MediaLink icon; @EntityProperty(fulltextIndexed = false, required = false, mutable = false, indexed = true) String category; @EntityProperty(fulltextIndexed = false, required = true, mutable = false, indexed = true) String verb; @EntityProperty(indexed = true, required = true, mutable = false, timestamp = true) protected Long published; @EntityProperty(indexed = false, required = false, mutable = false) ActivityObject object; @EntityProperty(indexed = true, fulltextIndexed = true, required = false, mutable = false) protected String title; @EntityDictionary(keyType = java.lang.String.class) protected Set<String> connections; public Activity() { // id = UUIDUtils.newTimeUUID(); } public Activity( UUID id ) { uuid = id; } public static Activity newActivity( String verb, String title, String content, String category, Entity user, EntityRef object, String objectType, String objectName, String objectContent ) throws Exception { Activity activity = new Activity(); activity.setVerb( verb ); activity.setCategory( category ); activity.setContent( content ); activity.setTitle( title ); ActivityObject actor = new ActivityObject(); actor.setObjectType( "person" ); if ( user != null ) { actor.setDisplayName( ( String ) user.getProperty( "name" ) ); actor.setEntityType( user.getType() ); actor.setUuid( user.getUuid() ); } activity.setActor( actor ); ActivityObject obj = new ActivityObject(); obj.setDisplayName( objectName ); obj.setObjectType( objectType ); if ( object != null ) { obj.setEntityType( object.getType() ); obj.setUuid( object.getUuid() ); } if ( objectContent != null ) { obj.setContent( objectContent ); } else { obj.setContent( content ); } activity.setObject( obj ); return activity; } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject getActor() { return actor; } public void setActor( ActivityObject actor ) { this.actor = actor; } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject getGenerator() { return generator; } public void setGenerator( ActivityObject generator ) { this.generator = generator; } @JsonSerialize(include = Inclusion.NON_NULL) public String getCategory() { return category; } public void setCategory( String category ) { this.category = category; } @JsonSerialize(include = Inclusion.NON_NULL) public String getVerb() { return verb; } public void setVerb( String verb ) { this.verb = verb; } @JsonSerialize(include = Inclusion.NON_NULL) public Long getPublished() { return published; } public void setPublished( Long published ) { this.published = published; } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject getObject() { return object; } public void setObject( ActivityObject object ) { this.object = object; } @JsonSerialize(include = Inclusion.NON_NULL) public String getTitle() { return title; } public void setTitle( String title ) { this.title = title; } @JsonSerialize(include = Inclusion.NON_NULL) public MediaLink getIcon() { return icon; } public void setIcon( MediaLink icon ) { this.icon = icon; } @JsonSerialize(include = Inclusion.NON_NULL) public String getContent() { return content; } public void setContent( String content ) { this.content = content; } @JsonSerialize(include = Inclusion.NON_NULL) public Set<String> getConnections() { return connections; } public void setConnections( Set<String> connections ) { this.connections = connections; } @XmlRootElement static public class MediaLink { int duration; int height; String url; int width; protected Map<String, Object> dynamic_properties = new TreeMap<String, Object>( String.CASE_INSENSITIVE_ORDER ); public MediaLink() { } @JsonSerialize(include = Inclusion.NON_NULL) public int getDuration() { return duration; } public void setDuration( int duration ) { this.duration = duration; } @JsonSerialize(include = Inclusion.NON_NULL) public int getHeight() { return height; } public void setHeight( int height ) { this.height = height; } @JsonSerialize(include = Inclusion.NON_NULL) public String getUrl() { return url; } public void setUrl( String url ) { this.url = url; } @JsonSerialize(include = Inclusion.NON_NULL) public int getWidth() { return width; } public void setWidth( int width ) { this.width = width; } @JsonAnySetter public void setDynamicProperty( String key, Object value ) { dynamic_properties.put( key, value ); } @JsonAnyGetter public Map<String, Object> getDynamicProperties() { return dynamic_properties; } @Override public String toString() { return "MediaLink [duration=" + duration + ", height=" + height + ", url=" + url + ", width=" + width + ", dynamic_properties=" + dynamic_properties + "]"; } } @XmlRootElement static public class ActivityObject { ActivityObject[] attachments; ActivityObject author; String content; String displayName; String[] downstreamDuplicates; String id; MediaLink image; String objectType; Date published; String summary; String updated; String upstreamDuplicates; String url; UUID uuid; String entityType; protected Map<String, Object> dynamic_properties = new TreeMap<String, Object>( String.CASE_INSENSITIVE_ORDER ); public ActivityObject() { } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject[] getAttachments() { return attachments; } public void setAttachments( ActivityObject[] attachments ) { this.attachments = attachments; } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject getAuthor() { return author; } public void setAuthor( ActivityObject author ) { this.author = author; } @JsonSerialize(include = Inclusion.NON_NULL) public String getContent() { return content; } public void setContent( String content ) { this.content = content; } @JsonSerialize(include = Inclusion.NON_NULL) public String getDisplayName() { return displayName; } public void setDisplayName( String displayName ) { this.displayName = displayName; } @JsonSerialize(include = Inclusion.NON_NULL) public String[] getDownstreamDuplicates() { return downstreamDuplicates; } public void setDownstreamDuplicates( String[] downstreamDuplicates ) { this.downstreamDuplicates = downstreamDuplicates; } @JsonSerialize(include = Inclusion.NON_NULL) public String getId() { return id; } public void setId( String id ) { this.id = id; } @JsonSerialize(include = Inclusion.NON_NULL) public MediaLink getImage() { return image; } public void setImage( MediaLink image ) { this.image = image; } @JsonSerialize(include = Inclusion.NON_NULL) public String getObjectType() { return objectType; } public void setObjectType( String objectType ) { this.objectType = objectType; } @JsonSerialize(include = Inclusion.NON_NULL) public Date getPublished() { return published; } public void setPublished( Date published ) { this.published = published; } @JsonSerialize(include = Inclusion.NON_NULL) public String getSummary() { return summary; } public void setSummary( String summary ) { this.summary = summary; } @JsonSerialize(include = Inclusion.NON_NULL) public String getUpdated() { return updated; } public void setUpdated( String updated ) { this.updated = updated; } @JsonSerialize(include = Inclusion.NON_NULL) public String getUpstreamDuplicates() { return upstreamDuplicates; } public void setUpstreamDuplicates( String upstreamDuplicates ) { this.upstreamDuplicates = upstreamDuplicates; } @JsonSerialize(include = Inclusion.NON_NULL) public String getUrl() { return url; } public void setUrl( String url ) { this.url = url; } @JsonSerialize(include = Inclusion.NON_NULL) public UUID getUuid() { return uuid; } public void setUuid( UUID uuid ) { this.uuid = uuid; } @JsonSerialize(include = Inclusion.NON_NULL) public String getEntityType() { return entityType; } public void setEntityType( String entityType ) { this.entityType = entityType; } @JsonAnySetter public void setDynamicProperty( String key, Object value ) { dynamic_properties.put( key, value ); } @JsonAnyGetter public Map<String, Object> getDynamicProperties() { return dynamic_properties; } @Override public String toString() { return "ActivityObject [" + toStringFormat( attachments, "attachments=%s, " ) + toStringFormat( author, "author=%s, " ) + toStringFormat( content, "content=%s, " ) + toStringFormat( displayName, "displayName=%s, " ) + toStringFormat( downstreamDuplicates, "downstreamDuplicates=%s, " ) + toStringFormat( id, "id=%s, " ) + toStringFormat( image, "image=%s, " ) + toStringFormat( objectType, "objectType=%s, " ) + toStringFormat( published, "published=%s, " ) + toStringFormat( summary, "summary=%s, " ) + toStringFormat( updated, "updated=%s, " ) + toStringFormat( upstreamDuplicates, "upstreamDuplicates=%s, " ) + toStringFormat( url, "url=%s, " ) + toStringFormat( uuid, "uuid=%s, " ) + toStringFormat( entityType, "entityType=%s, " ) + toStringFormat( dynamic_properties, "dynamic_properties=%s" ) + "]"; } } @XmlRootElement static public class ActivityCollection { int totalItems; ActivityObject[] items; String url; protected Map<String, Object> dynamic_properties = new TreeMap<String, Object>( String.CASE_INSENSITIVE_ORDER ); public ActivityCollection() { } @JsonSerialize(include = Inclusion.NON_NULL) public int getTotalItems() { return totalItems; } public void setTotalItems( int totalItems ) { this.totalItems = totalItems; } @JsonSerialize(include = Inclusion.NON_NULL) public ActivityObject[] getItems() { return items; } public void setItems( ActivityObject[] items ) { this.items = items; } @JsonSerialize(include = Inclusion.NON_NULL) public String getUrl() { return url; } public void setUrl( String url ) { this.url = url; } @JsonAnySetter public void setDynamicProperty( String key, Object value ) { dynamic_properties.put( key, value ); } @JsonAnyGetter public Map<String, Object> getDynamicProperties() { return dynamic_properties; } @Override public String toString() { return "ActivityCollection [totalItems=" + totalItems + ", items=" + Arrays.toString( items ) + ", url=" + url + ", dynamic_properties=" + dynamic_properties + "]"; } } }