diff --git a/pom.xml b/pom.xml index 34b460d..e4a402b 100755 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 es.upm.fi.oeg wothive - 0.1.7 + 0.1.8 Directory for the Web of Things diff --git a/src/main/java/directory/things/ThingsController.java b/src/main/java/directory/things/ThingsController.java index ca87867..b05b200 100755 --- a/src/main/java/directory/things/ThingsController.java +++ b/src/main/java/directory/things/ThingsController.java @@ -90,13 +90,13 @@ private static final void prepareListingResponse(Response response, Integer limi public static final Route registrationUpdate = (Request request, Response response) -> { String graphId = buildGraphId(request); - + String id = request.params("id"); String td = hasValidBody(request.body()); RDFFormat format = hasValidMime(request.headers(Utils.HEADER_CONTENT_TYPE), true); Boolean exist = false; if(format.equals(RDFFormat.JSONLD_FRAME_FLAT)) { // Create/Update - exist = ThingsService.registerJsonThing(graphId, td); + exist = ThingsService.registerJsonThing(graphId, id, td); }else { exist = ThingsService.registerRDFThing(graphId, format, td); } @@ -110,9 +110,9 @@ private static final void prepareListingResponse(Response response, Integer limi public static final Route registrationAnonymous = (Request request, Response response) -> { String td = hasValidBody(request.body()); RDFFormat format = hasValidMime(request.headers(Utils.HEADER_CONTENT_TYPE), true); - + String graphID = buildGraphId(request); if(format.equals(RDFFormat.JSONLD_FRAME_FLAT)) { - String newUUID = ThingsService.registerJsonThingAnonymous(td); + String newUUID = ThingsService.registerJsonThingAnonymous(td, graphID); response.header(LOCATION_HEADER, newUUID); }else { throw new ThingRegistrationException("Things under a different form than application/td+json must be registered using PUT"); @@ -124,6 +124,8 @@ private static final void prepareListingResponse(Response response, Integer limi public static final Route partialUpdate = (Request request, Response response) -> { JsonObject tdJson = null; + String id = request.params("id"); + String graphId = buildGraphId(request); String td = hasValidBody(request.body()); if(!request.headers(Utils.HEADER_CONTENT_TYPE).equals("application/merge-patch+json")) @@ -133,7 +135,7 @@ private static final void prepareListingResponse(Response response, Integer limi }catch(Exception e) { throw new ThingRegistrationException("Partial updates are only supported for Things under the form of application/td+json, provided update document has syntax errors"); } - ThingsService.updateThingPartially(graphId, tdJson); + ThingsService.updateThingPartially(graphId, id, tdJson); response.status(204); return ""; @@ -189,8 +191,14 @@ private static final RDFFormat hasValidMime(String mime, boolean strict) { private static final String HTTP_CONSTANT = "http://"; private static final String buildGraphId(Request request) { - return Utils.buildMessage(HTTP_CONSTANT,request.host(),request.pathInfo(),request.params(":id")); + String id = request.params(":id"); + if(id!=null) { + return Utils.buildMessage(HTTP_CONSTANT,request.host(),request.pathInfo()); + }else { + return Utils.buildMessage(HTTP_CONSTANT,request.host(),request.pathInfo()); + } } + } diff --git a/src/main/java/directory/things/ThingsMapper.java b/src/main/java/directory/things/ThingsMapper.java index a1fdbc3..e05faf2 100755 --- a/src/main/java/directory/things/ThingsMapper.java +++ b/src/main/java/directory/things/ThingsMapper.java @@ -59,7 +59,7 @@ protected static byte[] thingToStringBytes(Thing thing, RDFFormat format) { } // -- JSON factory - public static Thing createJsonThing(String td) { + public static Thing createJsonThing(String td, String id) { Thing thing = null; try { JsonObject thingJson = JTD.parseJson(td); @@ -67,7 +67,11 @@ public static Thing createJsonThing(String td) { if (!thingJson.has(ID1) && !thingJson.has(ID2)) throw new ThingRegistrationException( "Things under the form application/td+json registered using PUT method must provide a valid 'id', otherwhise se the POST method for Things without 'id'"); + // todo check if the td id and id are the same thing = Thing.fromJson(thingJson); + //if(!thing.getId().equals(id)) + //throw new ThingRegistrationException("Provided Thing has an ID different from the one specified in the request"); + } catch (Exception e) { throw new ThingParsingException( Utils.buildMessage("Thing under the form application/td+json has errors, check:", e.toString())); diff --git a/src/main/java/directory/things/ThingsService.java b/src/main/java/directory/things/ThingsService.java index bce7384..fe935b9 100755 --- a/src/main/java/directory/things/ThingsService.java +++ b/src/main/java/directory/things/ThingsService.java @@ -38,16 +38,17 @@ protected static final Thing retrieveThing(String graphId) { return ThingsDAO.read(graphId); } - public static final String registerJsonThingAnonymous(String td) { + public static final String registerJsonThingAnonymous(String td, String graphId) { Thing thing = ThingsMapper.createJsonThingAnonymous(td); + graphId = Utils.buildMessage(graphId,"/",thing.getId()); enrichTD(thing); - ThingsDAO.create(thing, thing.getId(), false); + ThingsDAO.create(thing, graphId, false); return thing.getId(); } - protected static final Boolean registerJsonThing(String graphId, String td) { + protected static final Boolean registerJsonThing(String graphId, String id, String td) { Boolean exist = ThingsDAO.exist(graphId); - Thing thing = ThingsMapper.createJsonThing(td); + Thing thing = ThingsMapper.createJsonThing(td, id); if(exist) { ThingsDAO.delete(graphId); markModification(thing); @@ -78,12 +79,12 @@ protected static final Boolean registerRDFThing(String graphId, RDFFormat format } - public static void updateThingPartially(String graphId, JsonObject partialUpdate) { + public static void updateThingPartially(String graphId, String id, JsonObject partialUpdate) { Thing existingThing = ThingsService.retrieveThing(graphId); try { Thing updatedThing = JTD.updateJsonThingPartially(existingThing, partialUpdate); markModification(updatedThing); - ThingsService.registerJsonThing(graphId, updatedThing.toJson().toString()); + ThingsService.registerJsonThing(graphId, id, updatedThing.toJson().toString()); } catch (IOException e) { throw new ThingParsingException(e.toString()); } catch (JsonPatchException e) {