001 package org.deepamehta.plugins.review;
002
003 import de.deepamehta.core.Topic;
004 import de.deepamehta.core.TopicType;
005 import de.deepamehta.core.model.AssociationDefinitionModel;
006 import de.deepamehta.core.osgi.PluginActivator;
007 import de.deepamehta.core.service.ClientState;
008 import de.deepamehta.core.service.Directives;
009 import de.deepamehta.core.storage.spi.DeepaMehtaTransaction;
010 import java.util.Collection;
011 import java.util.logging.Logger;
012 import javax.ws.rs.*;
013 import org.deepamehta.plugins.review.service.ReviewService;
014
015
016
017 /**
018 * A very stupid plugin for counting likes/dislikes on any kind of topics in DeepaMehta.
019 *
020 * * Counting values seperately as "Good" and "So-so", depends on introducing Migration2 to your application model.
021 * * Counting values as one accumulate "Score", depends on introducing Migration1 to your application model.
022 *
023 * @author Malte Reißig (<malte@mikromedia.de>)
024 * @website https://github.com/mukil/org.deepamehta-reviews
025 * @version 0.3.6-SNAPSHOT
026 *
027 */
028
029 @Path("/review")
030 @Consumes("application/json")
031 @Produces("application/json")
032 public class ReviewPlugin extends PluginActivator implements ReviewService {
033
034 private Logger log = Logger.getLogger(getClass().getName());
035
036 public final static String SCORE_TYPE_URI = "org.deepamehta.reviews.score";
037 public final static String GOOD_TYPE_URI = "org.deepamehta.reviews.good";
038 public final static String SOSO_TYPE_URI = "org.deepamehta.reviews.soso";
039
040
041 /** Increments the number of supportive voices (yelling "Good!"). */
042
043 @GET
044 @Path("/good/{id}")
045 @Produces("application/json")
046 @Override
047 public Topic addToGood(@PathParam("id") long resourceId, @HeaderParam("Cookie") ClientState clientState) {
048
049 DeepaMehtaTransaction tx = dms.beginTx();
050 Topic topic = null;
051 try {
052 // fixme: check if SCORE_URI is part of given topics type definition
053 topic = dms.getTopic(resourceId, true);
054 TopicType typeDef = dms.getTopicType(topic.getTypeUri());
055 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs();
056 boolean hasScoreType = false;
057 for (AssociationDefinitionModel associationDefinitionModel : typeModel) {
058 if (associationDefinitionModel.getChildTypeUri().equals(GOOD_TYPE_URI)) hasScoreType = true;
059 }
060 if (hasScoreType) {
061 int score = topic.getCompositeValue().getModel().getInt(GOOD_TYPE_URI) + 1;
062 topic.getCompositeValue().set(GOOD_TYPE_URI, score, clientState, new Directives());
063 tx.success();
064 } else {
065 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic "
066 + "does not contain the \"org.deepamehta.reviews.good\"-type"));
067 }
068 } catch (Exception e) {
069 throw new WebApplicationException(new RuntimeException("something went wrong", e));
070 } finally {
071 tx.finish();
072 }
073 return topic;
074 }
075
076 @GET
077 @Path("/soso/{id}")
078 @Produces("application/json")
079 @Override
080 public Topic addToSoso(@PathParam("id") long resourceId, @HeaderParam("Cookie") ClientState clientState) {
081
082 DeepaMehtaTransaction tx = dms.beginTx();
083 Topic topic = null;
084 try {
085 // fixme: check if SCORE_URI is part of given topics type definition
086 topic = dms.getTopic(resourceId, true);
087 TopicType typeDef = dms.getTopicType(topic.getTypeUri());
088 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs();
089 boolean hasScoreType = false;
090 for (AssociationDefinitionModel associationDefinitionModel : typeModel) {
091 if (associationDefinitionModel.getChildTypeUri().equals(SOSO_TYPE_URI)) hasScoreType = true;
092 }
093 if (hasScoreType) {
094 int score = topic.getCompositeValue().getModel().getInt(SOSO_TYPE_URI) + 1;
095 topic.getCompositeValue().set(SOSO_TYPE_URI, score, clientState, new Directives());
096 tx.success();
097 } else {
098 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic "
099 + "does not contain the \"org.deepamehta.reviews.soso\"-type"));
100 }
101 } catch (Exception e) {
102 throw new WebApplicationException(new RuntimeException("something went wrong", e));
103 } finally {
104 tx.finish();
105 }
106 return topic;
107 }
108
109 /** Increments the score of any given topic. */
110
111 @GET
112 @Path("/upvote/{id}")
113 @Produces("application/json")
114 @Override
115 public Topic upvoteResourceById(@PathParam("id") long resourceId,
116 @HeaderParam("Cookie") ClientState clientState) {
117
118 DeepaMehtaTransaction tx = dms.beginTx();
119 Topic topic = null;
120 try {
121 // fixme: check if SCORE_URI is part of given topics type definition
122 topic = dms.getTopic(resourceId, true);
123 TopicType typeDef = dms.getTopicType(topic.getTypeUri());
124 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs();
125 boolean hasScoreType = false;
126 for (AssociationDefinitionModel associationDefinitionModel : typeModel) {
127 if (associationDefinitionModel.getChildTypeUri().equals(SCORE_TYPE_URI)) hasScoreType = true;
128 }
129 if (hasScoreType) {
130 int score = topic.getCompositeValue().getModel().getInt(SCORE_TYPE_URI) + 1;
131 topic.getCompositeValue().set(SCORE_TYPE_URI, score, clientState, new Directives());
132 tx.success();
133 } else {
134 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic "
135 + "does not contain the \"org.deepamehta.reviews.score\"-type"));
136 }
137 } catch (Exception e) {
138 throw new WebApplicationException(new RuntimeException("something went wrong", e));
139 } finally {
140 tx.finish();
141 }
142 return topic;
143 }
144
145 /** Decrements the score of any given topic. */
146
147 @GET
148 @Path("/downvote/{id}")
149 @Produces("application/json")
150 @Override
151 public Topic downvoteResourceById(@PathParam("id") long resourceId,
152 @HeaderParam("Cookie") ClientState clientState) {
153
154 DeepaMehtaTransaction tx = dms.beginTx();
155 Topic topic = null;
156 try {
157 // fixme: check if SCORE_URI is part of given topics type definition
158 topic = dms.getTopic(resourceId, true);
159 TopicType typeDef = dms.getTopicType(topic.getTypeUri());
160 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs();
161 boolean hasScoreType = false;
162 for (AssociationDefinitionModel associationDefinitionModel : typeModel) {
163 if (associationDefinitionModel.getChildTypeUri().equals(SCORE_TYPE_URI)) hasScoreType = true;
164 }
165 if (hasScoreType) {
166 int score = topic.getCompositeValue().getModel().getInt(SCORE_TYPE_URI) - 1;
167 topic.getCompositeValue().set(SCORE_TYPE_URI, score, clientState, new Directives());
168 tx.success();
169 } else {
170 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic "
171 + "does not contain the \"org.deepamehta.reviews.score\"-type"));
172 }
173 } catch (Exception e) {
174 throw new WebApplicationException(new RuntimeException("something went wrong", e));
175 } finally {
176 tx.finish();
177 }
178 return topic;
179 }
180
181 }