/* * Copyright (C) 2008-2022, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.www.api.activity.model; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.juick.www.api.activity.helpers.ContextTypeFilter; import com.juick.www.api.activity.helpers.LinkValueDeserializer; import com.juick.www.api.activity.model.activities.*; import com.juick.www.api.activity.model.objects.*; import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property="type", defaultImpl = Context.class) @JsonSubTypes({ @JsonSubTypes.Type(value = Create.class, name = "Create"), @JsonSubTypes.Type(value = Update.class, name = "Update"), @JsonSubTypes.Type(value = Delete.class, name = "Delete"), @JsonSubTypes.Type(value = Flag.class, name = "Flag"), @JsonSubTypes.Type(value = Follow.class, name = "Follow"), @JsonSubTypes.Type(value = Accept.class, name = "Accept"), @JsonSubTypes.Type(value = Undo.class, name = "Undo"), @JsonSubTypes.Type(value = Like.class, name = "Like"), @JsonSubTypes.Type(value = Block.class, name = "Block"), @JsonSubTypes.Type(value = Announce.class, name = "Announce"), @JsonSubTypes.Type(value = Activity.class, name = "Activity"), @JsonSubTypes.Type(value = Image.class, name = "Image"), @JsonSubTypes.Type(value = Key.class, name = "Key"), @JsonSubTypes.Type(value = Link.class, name = "Link"), @JsonSubTypes.Type(value = Hashtag.class, name = "Hashtag"), @JsonSubTypes.Type(value = Mention.class, name = "Mention"), @JsonSubTypes.Type(value = Emoji.class, name = "Emoji"), @JsonSubTypes.Type(value = Note.class, name = "Note"), @JsonSubTypes.Type(value = OrderedCollection.class, name = "OrderedCollection"), @JsonSubTypes.Type(value = OrderedCollectionPage.class, name = "OrderedCollectionPage"), @JsonSubTypes.Type(value = Person.class, name = "Person"), @JsonSubTypes.Type(value = Application.class, name = "Application"), @JsonSubTypes.Type(value = Service.class, name = "Service"), @JsonSubTypes.Type(value = Group.class, name = "Group"), @JsonSubTypes.Type(value = Organization.class, name = "Organization") }) public class Context implements Serializable { private List context; private String id; private String name; private Image icon; private Instant published; @JsonDeserialize(using = LinkValueDeserializer.class) private String url; private List to; private List tags; public String getId() { return id; } public void setId(String id) { this.id = id; } @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = ContextTypeFilter.class) public String getType() { return getClass().getSimpleName(); } @JsonProperty("@context") @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) public List getContext() { return context; } public final static String ACTIVITY_STREAMS_URI = "https://www.w3.org/ns/activitystreams"; public final static String SECURITY_URI = "https://w3id.org/security/v1"; public final static String LD_JSON_MEDIA_TYPE = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""; public final static String FALLBACK_JSON_MEDIA_TYPE = "application/json; profile=\"https://www.w3.org/ns/activitystreams\""; public final static String ACTIVITY_MEDIA_TYPE = "application/activity+json"; public final static String ACTIVITYSTREAMS_PROFILE_MEDIA_TYPE = ACTIVITY_MEDIA_TYPE + "; profile=\"https://www.w3.org/ns/activitystreams\""; public final static String ACTIVITYSTREAMS_PUBLIC = "https://www.w3.org/ns/activitystreams#Public"; public Instant getPublished() { return published; } public void setPublished(Instant published) { this.published = published; } @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) public List getTo() { return to; } public void setTo(List to) { this.to = to; } public static Context build(Context response) { response.context = new ArrayList<>(Arrays.asList(ACTIVITY_STREAMS_URI, SECURITY_URI)); response.context.add(Map.of("Hashtag", "as:Hashtag", "sensitive", "as:sensitive")); return response; } public Context() {} public Context(String id) { setId(id); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @JsonProperty("tag") public List getTags() { return tags; } public void setTags(List tags) { this.tags = tags; } public String getName() { return name; } public void setName(String name) { this.name = name; } @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) public Image getIcon() { return icon; } public void setIcon(Image icon) { this.icon = icon; } }