package eu.lod2.rsine.service; import eu.lod2.rsine.feedback.DuplicateFeedbackException; import eu.lod2.rsine.feedback.FeedbackService; import eu.lod2.rsine.registrationservice.RegistrationService; import eu.lod2.rsine.registrationservice.SubscriptionNotFoundException; import eu.lod2.rsine.remotenotification.RemoteChangeSetService; import eu.lod2.util.ItemNotFoundException; import org.openrdf.OpenRDFException; import org.openrdf.model.Model; import org.openrdf.model.impl.TreeModel; import org.openrdf.model.impl.URIImpl; import org.openrdf.rio.*; import org.openrdf.rio.helpers.StatementCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.StringReader; @Controller public class RsineController { private final Logger logger = LoggerFactory.getLogger(RsineController.class); @Autowired private ChangeTripleService changeTripleService; @Autowired private RegistrationService registrationService; @Autowired private RemoteChangeSetService remoteChangeSetService; @Autowired private FeedbackService feedbackService; @RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody public void announceTriples(@RequestBody String announcedTriple, HttpServletResponse response) throws IOException { try { changeTripleService.handleAnnouncedTriple(announcedTriple); } catch (ItemNotFoundException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No triple or change type provided"); } catch (RDFParseException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Error parsing provided triple"); } catch (RDFHandlerException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } } @RequestMapping(value = "/register", method = RequestMethod.POST) @ResponseBody public void register(@RequestHeader("content-type") String contentType, @RequestBody String rdfRegistration, HttpServletResponse response) throws IOException { try { RDFFormat format = Rio.getParserFormatForMIMEType(contentType); RDFParser parser = Rio.createParser(format); Model model = new TreeModel(); StatementCollector handler = new StatementCollector(model); parser.setRDFHandler(handler); parser.parse(new StringReader(rdfRegistration), ""); registrationService.register(model); response.setStatus(HttpServletResponse.SC_CREATED); } catch (OpenRDFException ex) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not parse provided registration document"); } } @RequestMapping(value = "/unregister", method = RequestMethod.POST) @ResponseBody public void unregister(@RequestBody String resource, HttpServletResponse response) throws IOException { try { this.registrationService.unregister(new URIImpl(resource)); } catch (SubscriptionNotFoundException ex) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "Provided resource not registered"); } } @RequestMapping(value = "/remote", method = RequestMethod.POST) @ResponseBody public void remote(@RequestHeader("content-type") String contentType, @RequestBody String rdfChangeSet, HttpServletResponse response) throws IOException { try { remoteChangeSetService.handleChangeSet(rdfChangeSet, contentType); } catch (OpenRDFException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Could not parse provided changeset"); } } @RequestMapping(value = "/feedback", method = RequestMethod.GET) @ResponseBody public void feedback(HttpServletResponse response, @RequestParam String issueId, @RequestParam String rating, @RequestParam String msgId) throws IOException { try { feedbackService.handleFeedback(issueId, rating, msgId); response.setStatus(HttpServletResponse.SC_OK); } catch (IOException e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Could not access feedback file"); } catch (DuplicateFeedbackException e) { response.sendError(HttpServletResponse.SC_CONFLICT); } } }