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/dm4-reviews 025 * @version 0.3.6 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 * @param resourceId 043 * @param clientState */ 044 045 @GET 046 @Path("/good/{id}") 047 @Produces("application/json") 048 @Override 049 public Topic addToGood(@PathParam("id") long resourceId, 050 @HeaderParam("Cookie") ClientState clientState) { 051 052 DeepaMehtaTransaction tx = dms.beginTx(); 053 Topic topic = null; 054 try { 055 // fixme: check if SCORE_URI is part of given topics type definition 056 topic = dms.getTopic(resourceId, true); 057 TopicType typeDef = dms.getTopicType(topic.getTypeUri()); 058 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs(); 059 boolean hasScoreType = false; 060 for (AssociationDefinitionModel associationDefinitionModel : typeModel) { 061 if (associationDefinitionModel.getChildTypeUri().equals(GOOD_TYPE_URI)) hasScoreType = true; 062 } 063 if (hasScoreType) { 064 int score = topic.getCompositeValue().getModel().getInt(GOOD_TYPE_URI) + 1; 065 topic.getCompositeValue().set(GOOD_TYPE_URI, score, clientState, new Directives()); 066 tx.success(); 067 } else { 068 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic " 069 + "does not contain the \"org.deepamehta.reviews.good\"-type")); 070 } 071 } catch (Exception e) { 072 throw new RuntimeException("something went wrong", e); 073 } finally { 074 tx.finish(); 075 } 076 return topic; 077 } 078 079 080 /** Increments the number of supportive voices (yelling "Well, so so."). 081 * @param resourceId 082 * @param clientState */ 083 084 @GET 085 @Path("/soso/{id}") 086 @Produces("application/json") 087 @Override 088 public Topic addToSoso(@PathParam("id") long resourceId, 089 @HeaderParam("Cookie") ClientState clientState) { 090 091 DeepaMehtaTransaction tx = dms.beginTx(); 092 Topic topic = null; 093 try { 094 // fixme: check if SCORE_URI is part of given topics type definition 095 topic = dms.getTopic(resourceId, true); 096 TopicType typeDef = dms.getTopicType(topic.getTypeUri()); 097 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs(); 098 boolean hasScoreType = false; 099 for (AssociationDefinitionModel associationDefinitionModel : typeModel) { 100 if (associationDefinitionModel.getChildTypeUri().equals(SOSO_TYPE_URI)) hasScoreType = true; 101 } 102 if (hasScoreType) { 103 int score = topic.getCompositeValue().getModel().getInt(SOSO_TYPE_URI) + 1; 104 topic.getCompositeValue().set(SOSO_TYPE_URI, score, clientState, new Directives()); 105 tx.success(); 106 } else { 107 throw new WebApplicationException(new RuntimeException("The TypeDefinition (model) of the given topic " 108 + "does not contain the \"org.deepamehta.reviews.soso\"-type")); 109 } 110 } catch (Exception e) { 111 throw new RuntimeException("something went wrong", e); 112 } finally { 113 tx.finish(); 114 } 115 return topic; 116 } 117 118 /** Increments the score of any given topic. 119 * @param resourceId 120 * @param clientState */ 121 122 @GET 123 @Path("/upvote/{id}") 124 @Produces("application/json") 125 @Override 126 public Topic upvoteResourceById(@PathParam("id") long resourceId, 127 @HeaderParam("Cookie") ClientState clientState) { 128 129 DeepaMehtaTransaction tx = dms.beginTx(); 130 Topic topic = null; 131 try { 132 // fixme: check if SCORE_URI is part of given topics type definition 133 topic = dms.getTopic(resourceId, true); 134 TopicType typeDef = dms.getTopicType(topic.getTypeUri()); 135 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs(); 136 boolean hasScoreType = false; 137 for (AssociationDefinitionModel associationDefinitionModel : typeModel) { 138 if (associationDefinitionModel.getChildTypeUri().equals(SCORE_TYPE_URI)) hasScoreType = true; 139 } 140 if (hasScoreType) { 141 int score = topic.getCompositeValue().getModel().getInt(SCORE_TYPE_URI) + 1; 142 topic.getCompositeValue().set(SCORE_TYPE_URI, score, clientState, new Directives()); 143 tx.success(); 144 } else { 145 throw new RuntimeException("The TypeDefinition (model) of the given topic " 146 + "does not contain the \"org.deepamehta.reviews.score\"-type"); 147 } 148 } catch (Exception e) { 149 throw new RuntimeException("something went wrong", e); 150 } finally { 151 tx.finish(); 152 } 153 return topic; 154 } 155 156 /** Decrements the score of any given topic. 157 * @param resourceId 158 * @param clientState */ 159 160 @GET 161 @Path("/downvote/{id}") 162 @Produces("application/json") 163 @Override 164 public Topic downvoteResourceById(@PathParam("id") long resourceId, 165 @HeaderParam("Cookie") ClientState clientState) { 166 167 DeepaMehtaTransaction tx = dms.beginTx(); 168 Topic topic = null; 169 try { 170 // fixme: check if SCORE_URI is part of given topics type definition 171 topic = dms.getTopic(resourceId, true); 172 TopicType typeDef = dms.getTopicType(topic.getTypeUri()); 173 Collection<AssociationDefinitionModel> typeModel = typeDef.getModel().getAssocDefs(); 174 boolean hasScoreType = false; 175 for (AssociationDefinitionModel associationDefinitionModel : typeModel) { 176 if (associationDefinitionModel.getChildTypeUri().equals(SCORE_TYPE_URI)) hasScoreType = true; 177 } 178 if (hasScoreType) { 179 int score = topic.getCompositeValue().getModel().getInt(SCORE_TYPE_URI) - 1; 180 topic.getCompositeValue().set(SCORE_TYPE_URI, score, clientState, new Directives()); 181 tx.success(); 182 } else { 183 throw new RuntimeException("The TypeDefinition (model) of the given topic " 184 + "does not contain the \"org.deepamehta.reviews.score\"-type"); 185 } 186 } catch (Exception e) { 187 throw new RuntimeException("something went wrong", e); 188 } finally { 189 tx.finish(); 190 } 191 return topic; 192 } 193 194 }