001 package de.deepamehta.plugins.webservice;
002
003 import de.deepamehta.core.Association;
004 import de.deepamehta.core.AssociationType;
005 import de.deepamehta.core.DeepaMehtaObject;
006 import de.deepamehta.core.RelatedTopic;
007 import de.deepamehta.core.Topic;
008 import de.deepamehta.core.TopicType;
009 import de.deepamehta.core.model.AssociationModel;
010 import de.deepamehta.core.model.AssociationTypeModel;
011 import de.deepamehta.core.model.SimpleValue;
012 import de.deepamehta.core.model.TopicModel;
013 import de.deepamehta.core.model.TopicTypeModel;
014 import de.deepamehta.core.osgi.PluginActivator;
015 import de.deepamehta.core.service.ClientState;
016 import de.deepamehta.core.service.Directives;
017 import de.deepamehta.core.service.PluginInfo;
018 import de.deepamehta.core.service.ResultList;
019
020 import javax.ws.rs.GET;
021 import javax.ws.rs.POST;
022 import javax.ws.rs.PUT;
023 import javax.ws.rs.DELETE;
024 import javax.ws.rs.Consumes;
025 import javax.ws.rs.DefaultValue;
026 import javax.ws.rs.HeaderParam;
027 import javax.ws.rs.Path;
028 import javax.ws.rs.PathParam;
029 import javax.ws.rs.Produces;
030 import javax.ws.rs.QueryParam;
031
032 import java.util.List;
033 import java.util.logging.Logger;
034
035
036
037 @Path("/core")
038 @Consumes("application/json")
039 @Produces("application/json")
040 public class WebservicePlugin extends PluginActivator {
041
042 // ---------------------------------------------------------------------------------------------- Instance Variables
043
044 private Logger logger = Logger.getLogger(getClass().getName());
045
046 // -------------------------------------------------------------------------------------------------- Public Methods
047
048
049
050 // === Topics ===
051
052 @GET
053 @Path("/topic/{id}")
054 public Topic getTopic(@PathParam("id") long topicId,
055 @QueryParam("fetch_composite") @DefaultValue("true") boolean fetchComposite) {
056 return dms.getTopic(topicId, fetchComposite);
057 }
058
059 @GET
060 @Path("/topic/by_value/{key}/{value}")
061 public Topic getTopic(@PathParam("key") String key, @PathParam("value") SimpleValue value,
062 @QueryParam("fetch_composite") @DefaultValue("true") boolean fetchComposite) {
063 return dms.getTopic(key, value, fetchComposite);
064 }
065
066 @GET
067 @Path("/topic/multi/by_value/{key}/{value}")
068 public List<Topic> getTopics(@PathParam("key") String key, @PathParam("value") SimpleValue value,
069 @QueryParam("fetch_composite") @DefaultValue("false") boolean fetchComposite) {
070 return dms.getTopics(key, value, fetchComposite);
071 }
072
073 @GET
074 @Path("/topic/by_type/{type_uri}")
075 public ResultList<RelatedTopic> getTopics(@PathParam("type_uri") String typeUri,
076 @QueryParam("fetch_composite") @DefaultValue("false") boolean fetchComposite,
077 @QueryParam("max_result_size") int maxResultSize) {
078 return dms.getTopics(typeUri, fetchComposite, maxResultSize);
079 }
080
081 @GET
082 @Path("/topic")
083 public List<Topic> searchTopics(@QueryParam("search") String searchTerm, @QueryParam("field") String fieldUri) {
084 return dms.searchTopics(searchTerm, fieldUri);
085 }
086
087 @POST
088 @Path("/topic")
089 public Topic createTopic(TopicModel model, @HeaderParam("Cookie") ClientState clientState) {
090 return dms.createTopic(model, clientState);
091 }
092
093 @PUT
094 @Path("/topic/{id}")
095 public Directives updateTopic(@PathParam("id") long topicId, TopicModel model,
096 @HeaderParam("Cookie") ClientState clientState) {
097 if (model.getId() != -1 && topicId != model.getId()) {
098 throw new RuntimeException("ID mismatch in update request");
099 }
100 model.setId(topicId);
101 return dms.updateTopic(model, clientState);
102 }
103
104 @DELETE
105 @Path("/topic/{id}")
106 public Directives deleteTopic(@PathParam("id") long topicId) {
107 return dms.deleteTopic(topicId);
108 }
109
110
111
112 // === Associations ===
113
114 @GET
115 @Path("/association/{id}")
116 public Association getAssociation(@PathParam("id") long assocId,
117 @QueryParam("fetch_composite") @DefaultValue("true") boolean fetchComposite) {
118 return dms.getAssociation(assocId, fetchComposite);
119 }
120
121 @GET
122 @Path("/association/{assoc_type_uri}/{topic1_id}/{topic2_id}/{role_type1_uri}/{role_type2_uri}")
123 public Association getAssociation(@PathParam("assoc_type_uri") String assocTypeUri,
124 @PathParam("topic1_id") long topic1Id, @PathParam("topic2_id") long topic2Id,
125 @PathParam("role_type1_uri") String roleTypeUri1, @PathParam("role_type2_uri") String roleTypeUri2,
126 @QueryParam("fetch_composite") @DefaultValue("true") boolean fetchComposite) {
127 return dms.getAssociation(assocTypeUri, topic1Id, topic2Id, roleTypeUri1, roleTypeUri2, fetchComposite);
128 }
129
130 // ---
131
132 @GET
133 @Path("/association/multiple/{topic1_id}/{topic2_id}")
134 public List<Association> getAssociations(@PathParam("topic1_id") long topic1Id,
135 @PathParam("topic2_id") long topic2Id) {
136 return dms.getAssociations(topic1Id, topic2Id);
137 }
138
139 @GET
140 @Path("/association/multiple/{topic1_id}/{topic2_id}/{assoc_type_uri}")
141 public List<Association> getAssociations(@PathParam("topic1_id") long topic1Id,
142 @PathParam("topic2_id") long topic2Id,
143 @PathParam("assoc_type_uri") String assocTypeUri) {
144 return dms.getAssociations(topic1Id, topic2Id, assocTypeUri);
145 }
146
147 // ---
148
149 @POST
150 @Path("/association")
151 public Association createAssociation(AssociationModel model, @HeaderParam("Cookie") ClientState clientState) {
152 return dms.createAssociation(model, clientState);
153 }
154
155 @PUT
156 @Path("/association/{id}")
157 public Directives updateAssociation(@PathParam("id") long assocId, AssociationModel model,
158 @HeaderParam("Cookie") ClientState clientState) {
159 if (model.getId() != -1 && assocId != model.getId()) {
160 throw new RuntimeException("ID mismatch in update request");
161 }
162 model.setId(assocId);
163 return dms.updateAssociation(model, clientState);
164 }
165
166 @DELETE
167 @Path("/association/{id}")
168 public Directives deleteAssociation(@PathParam("id") long assocId) {
169 return dms.deleteAssociation(assocId);
170 }
171
172
173
174 // === Topic Types ===
175
176 @GET
177 @Path("/topictype")
178 public List<String> getTopicTypeUris() {
179 return dms.getTopicTypeUris();
180 }
181
182 @GET
183 @Path("/topictype/{uri}")
184 public TopicType getTopicType(@PathParam("uri") String uri) {
185 return dms.getTopicType(uri);
186 }
187
188 @GET
189 @Path("/topictype/all")
190 public List<TopicType> getAllTopicTypes() {
191 return dms.getAllTopicTypes();
192 }
193
194 @POST
195 @Path("/topictype")
196 public TopicType createTopicType(TopicTypeModel topicTypeModel, @HeaderParam("Cookie") ClientState clientState) {
197 return dms.createTopicType(topicTypeModel, clientState);
198 }
199
200 @PUT
201 @Path("/topictype")
202 public Directives updateTopicType(TopicTypeModel model, @HeaderParam("Cookie") ClientState clientState) {
203 return dms.updateTopicType(model, clientState);
204 }
205
206 @DELETE
207 @Path("/topictype/{uri}")
208 public Directives deleteTopicType(@PathParam("uri") String uri) {
209 return dms.deleteTopicType(uri);
210 }
211
212
213
214 // === Association Types ===
215
216 @GET
217 @Path("/assoctype")
218 public List<String> getAssociationTypeUris() {
219 return dms.getAssociationTypeUris();
220 }
221
222 @GET
223 @Path("/assoctype/{uri}")
224 public AssociationType getAssociationType(@PathParam("uri") String uri) {
225 return dms.getAssociationType(uri);
226 }
227
228 @GET
229 @Path("/assoctype/all")
230 public List<AssociationType> getAssociationAllTypes() {
231 return dms.getAllAssociationTypes();
232 }
233
234 @POST
235 @Path("/assoctype")
236 public AssociationType createAssociationType(AssociationTypeModel assocTypeModel,
237 @HeaderParam("Cookie") ClientState clientState) {
238 return dms.createAssociationType(assocTypeModel, clientState);
239 }
240
241 @PUT
242 @Path("/assoctype")
243 public Directives updateAssociationType(AssociationTypeModel model,
244 @HeaderParam("Cookie") ClientState clientState) {
245 return dms.updateAssociationType(model, clientState);
246 }
247
248 @DELETE
249 @Path("/assoctype/{uri}")
250 public Directives deleteAssociationType(@PathParam("uri") String uri) {
251 return dms.deleteAssociationType(uri);
252 }
253
254
255
256 // === Plugins ===
257
258 @GET
259 @Path("/plugin")
260 public List<PluginInfo> getPluginInfo() {
261 return dms.getPluginInfo();
262 }
263
264
265
266 // **********************
267 // *** Topic REST API ***
268 // **********************
269
270
271
272 @GET
273 @Path("/topic/{id}/related_topics")
274 public ResultList<RelatedTopic> getTopicRelatedTopics(@PathParam("id") long topicId,
275 @QueryParam("assoc_type_uri") String assocTypeUri,
276 @QueryParam("my_role_type_uri") String myRoleTypeUri,
277 @QueryParam("others_role_type_uri") String othersRoleTypeUri,
278 @QueryParam("others_topic_type_uri") String othersTopicTypeUri,
279 @QueryParam("max_result_size") int maxResultSize) {
280 Topic topic = dms.getTopic(topicId, false);
281 return getRelatedTopics(topic, "topic", assocTypeUri, myRoleTypeUri, othersRoleTypeUri,
282 othersTopicTypeUri, maxResultSize);
283 }
284
285
286
287 // ****************************
288 // *** Association REST API ***
289 // ****************************
290
291
292
293 @GET
294 @Path("/association/{id}/related_topics")
295 public ResultList<RelatedTopic> getAssociationRelatedTopics(@PathParam("id") long assocId,
296 @QueryParam("assoc_type_uri") String assocTypeUri,
297 @QueryParam("my_role_type_uri") String myRoleTypeUri,
298 @QueryParam("others_role_type_uri") String othersRoleTypeUri,
299 @QueryParam("others_topic_type_uri") String othersTopicTypeUri,
300 @QueryParam("max_result_size") int maxResultSize) {
301 Association assoc = dms.getAssociation(assocId, false);
302 return getRelatedTopics(assoc, "association", assocTypeUri, myRoleTypeUri, othersRoleTypeUri,
303 othersTopicTypeUri, maxResultSize);
304 }
305
306
307
308 // ------------------------------------------------------------------------------------------------- Private Methods
309
310 private ResultList<RelatedTopic> getRelatedTopics(DeepaMehtaObject object, String objectInfo, String assocTypeUri,
311 String myRoleTypeUri, String othersRoleTypeUri,
312 String othersTopicTypeUri, int maxResultSize) {
313 String operation = "Fetching related topics of " + objectInfo + " " + object.getId();
314 String paramInfo = "(assocTypeUri=\"" + assocTypeUri + "\", myRoleTypeUri=\"" + myRoleTypeUri +
315 "\", othersRoleTypeUri=\"" + othersRoleTypeUri + "\", othersTopicTypeUri=\"" + othersTopicTypeUri +
316 "\", maxResultSize=" + maxResultSize + ")";
317 try {
318 logger.info(operation + " " + paramInfo);
319 return object.getRelatedTopics(assocTypeUri, myRoleTypeUri, othersRoleTypeUri, othersTopicTypeUri,
320 false, false, maxResultSize);
321 } catch (Exception e) {
322 throw new RuntimeException(operation + " failed " + paramInfo, e);
323 }
324 }
325 }