/** * Handle the request primitive delete ... TODO: Strategy for error handling ... TS0004 7.1.1.2 * * @param onem2mResponse response */ public void handleOperationDelete(ResponsePrimitive onem2mResponse) { // Use table TS0004: 7.1.1.1-1 to validate DELETE specific parameters that were not handled in // the calling routine String cf = getPrimitive(RequestPrimitive.CONTENT); if (cf != null) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.INVALID_ARGUMENTS, "CONTENT(" + RequestPrimitive.CONTENT + ") not permitted"); return; } // validate result content options for delete String rc = getPrimitive(RequestPrimitive.RESULT_CONTENT); if (rc != null) { if (!(rc.contentEquals(Onem2m.ResultContent.ATTRIBUTES) || rc.contentEquals(Onem2m.ResultContent.NOTHING) || rc.contentEquals(Onem2m.ResultContent.CHILD_RESOURCE_REFS) || rc.contentEquals(Onem2m.ResultContent.ATTRIBUTES_CHILD_RESOURCE_REFS))) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONTENTS_UNACCEPTABLE, "RESULT_CONTENT(" + RequestPrimitive.RESULT_CONTENT + ") not accepted (" + rc + ")"); return; } } /** Find the resource, fill in the response based on result content */ String to = this.getPrimitive(RequestPrimitive.TO); if (Onem2mDb.getInstance().findResourceUsingURI(to, this, onem2mResponse) == false) { // TODO: is it idempotent or not ... fail or succeed??? onem2mResponse.setRSC( Onem2m.ResponseStatusCode.NOT_FOUND, "Resource target URI not found: " + to); return; } String protocol = getPrimitive(RequestPrimitive.PROTOCOL); String rt = this.getOnem2mResource().getResourceType(); if (rt != null && rt.contentEquals(Onem2m.ResourceType.CSE_BASE) && !protocol.contentEquals(Onem2m.Protocol.NATIVEAPP)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.OPERATION_NOT_ALLOWED, "Not permitted to delete this resource: " + this.getPrimitive(RequestPrimitive.TO)); return; } ResourceContentProcessor.handleDelete(this, onem2mResponse); if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { return; } ResultContentProcessor.handleDelete(this, onem2mResponse); if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { return; } NotificationProcessor.handleDelete(this); // now delete the resource from the database // TODO: idempotent so who cares if cannot find the resource ... is this true? if (Onem2mDb.getInstance().deleteResourceUsingURI(this, onem2mResponse) == false) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.INTERNAL_SERVER_ERROR, "Resource target URI data store delete error: " + this.getPrimitive(RequestPrimitive.TO)); return; } // TODO: see TS0004 6.8 // if FOUND, and all went well, send back OK if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) == null) { onem2mResponse.setPrimitive( ResponsePrimitive.RESPONSE_STATUS_CODE, Onem2m.ResponseStatusCode.DELETED); } }
/** * Handle update * * @param onem2mResponse response */ public void handleOperationUpdate(ResponsePrimitive onem2mResponse) { // Use table TS0004: 7.1.1.1-1 to validate UPDATE specific parameters that were not handled in // the calling routine // ensure the update has content ... String cf = getPrimitive(RequestPrimitive.CONTENT_FORMAT); if (cf == null) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.INSUFFICIENT_ARGUMENTS, "CONTENT_FORMAT(" + RequestPrimitive.CONTENT_FORMAT + ") not specified"); return; } else if (!cf.contentEquals(Onem2m.ContentFormat.JSON) && !cf.contentEquals(Onem2m.ContentFormat.XML)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONTENTS_UNACCEPTABLE, "CONTENT_FORMAT(" + RequestPrimitive.CONTENT_FORMAT + ") not accepted (" + cf + ")"); return; } String cn = getPrimitive(RequestPrimitive.CONTENT); if (cn == null) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.INSUFFICIENT_ARGUMENTS, "CONTENT(" + RequestPrimitive.CONTENT_FORMAT + ") not specified"); return; } // validate result content options for Update String rc = getPrimitive(RequestPrimitive.RESULT_CONTENT); if (rc != null) { if (!(rc.contentEquals(Onem2m.ResultContent.ATTRIBUTES) || rc.contentEquals(Onem2m.ResultContent.NOTHING) || rc.contentEquals(Onem2m.ResultContent.CHILD_RESOURCE_REFS) || rc.contentEquals(Onem2m.ResultContent.ATTRIBUTES_CHILD_RESOURCE_REFS))) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONTENTS_UNACCEPTABLE, "RESULT_CONTENT(" + RequestPrimitive.RESULT_CONTENT + ") not accepted (" + rc + ")"); return; } } // now find the resource from the database String to = this.getPrimitive(RequestPrimitive.TO); if (Onem2mDb.getInstance().findResourceUsingURI(to, this, onem2mResponse) == false) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.NOT_FOUND, "Resource target URI not found: " + to); return; } // cannot update contentInstance resources so check resource type String rt = this.getOnem2mResource().getResourceType(); if (rt != null && rt.contentEquals(Onem2m.ResourceType.CONTENT_INSTANCE)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.OPERATION_NOT_ALLOWED, "Not permitted to update content instance: " + this.getPrimitive(RequestPrimitive.TO)); return; } ResourceContentProcessor.handleUpdate(this, onem2mResponse); if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { return; } ResultContentProcessor.handleUpdate(this, onem2mResponse); if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { return; } NotificationProcessor.handleUpdate(this); // TODO: see TS0004 6.8 // if FOUND, and all went well, send back CHANGED if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) == null) { onem2mResponse.setPrimitive( ResponsePrimitive.RESPONSE_STATUS_CODE, Onem2m.ResponseStatusCode.CHANGED); } }
/** * Handle the request primitive create ... TODO: Strategy for error handling ... TS0004 7.1.1.2 * * @param onem2mResponse response */ public void handleOperationCreate(ResponsePrimitive onem2mResponse) { // Use table TS0004: 7.1.1.1-1 to validate CREATE specific parameters that were not handled in // the // handleOperation // ensure the create has content ... String cf = getPrimitive(RequestPrimitive.CONTENT_FORMAT); if (cf == null) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.BAD_REQUEST, "CONTENT_FORMAT(" + RequestPrimitive.CONTENT_FORMAT + ") not specified"); return; } else if (!cf.contentEquals(Onem2m.ContentFormat.JSON) && !cf.contentEquals(Onem2m.ContentFormat.XML)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.BAD_REQUEST, "CONTENT_FORMAT(" + RequestPrimitive.CONTENT_FORMAT + ") not accepted (" + cf + ")"); return; } String cn = getPrimitive(RequestPrimitive.CONTENT); if (cn == null) { if (cf.contentEquals(Onem2m.ContentFormat.JSON)) { this.setPrimitive(RequestPrimitive.CONTENT, "{}"); } else { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.BAD_REQUEST, "CONTENT(" + RequestPrimitive.CONTENT_FORMAT + ") not specified"); return; } } // validate result content options for create String rc = getPrimitive(RequestPrimitive.RESULT_CONTENT); if (rc != null) { if (!(rc.contentEquals(Onem2m.ResultContent.ATTRIBUTES) || rc.contentEquals(Onem2m.ResultContent.NOTHING) || rc.contentEquals(Onem2m.ResultContent.HIERARCHICAL_ADDRESS) || rc.contentEquals(Onem2m.ResultContent.HIERARCHICAL_ADDRESS_ATTRIBUTES))) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONTENTS_UNACCEPTABLE, "RESULT_CONTENT(" + RequestPrimitive.RESULT_CONTENT + ") not accepted (" + rc + ")"); return; } } // lookup the resource ... this will be the parent where the new resource will be created String resourceType = getPrimitive(RequestPrimitive.RESOURCE_TYPE); if (!resourceType.contentEquals(Onem2m.ResourceType.CSE_BASE)) { String to = getPrimitive(RequestPrimitive.TO); if (!Onem2mDb.getInstance().findResourceUsingURI(to, this, onem2mResponse)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.NOT_FOUND, "Resource target URI not found: " + to); return; } // the Onem2mResource is now stored in the onem2mRequest ... as it has been read in from the // data store // special case for AE resources ... where resource name is derived from FROM parameter String resourceName = this.getPrimitive((RequestPrimitive.NAME)); // if (resourceName == null && resourceType.contentEquals(Onem2m.ResourceType.AE)) // { // String from = this.getPrimitive(RequestPrimitive.FROM); // if (from != null) { // resourceName = from; // } // } // if the a name is provided, ensure it is valid and unique at this hierarchical level if (resourceName != null) { // using the parent, see if this new resource name already exists under this parent resource if (Onem2mDb.getInstance() .findResourceUsingIdAndName(this.getOnem2mResource().getResourceId(), resourceName)) { // TS0004: 7.2.3.2 onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONFLICT, "Resource already exists: " + this.getPrimitive(RequestPrimitive.TO) + "/" + resourceName); return; } this.setResourceName(resourceName); } } else { String resourceName = this.getPrimitive((RequestPrimitive.NAME)); if (resourceName == null) { onem2mResponse.setRSC(Onem2m.ResponseStatusCode.BAD_REQUEST, "CSE name not specified"); return; } if (Onem2mDb.getInstance().findCseByName(resourceName)) { onem2mResponse.setRSC( Onem2m.ResponseStatusCode.CONFLICT, "CSE name already exists: " + resourceName); return; } this.setResourceName(resourceName); } // process the resource specific attributes ResourceContentProcessor.handleCreate(this, onem2mResponse); if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { return; } // CheckAccessControlProcessor.handleCreate(this, onem2mResponse); // if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) != null) { // return; // } // now format a response based on result content desired ResultContentProcessor.handleCreate(this, onem2mResponse); // not process notifications NotificationProcessor.handleCreate(this); // TODO: see TS0004 6.8 // if the create was successful, ie no error has already happened, set CREATED for status code // here if (onem2mResponse.getPrimitive(ResponsePrimitive.RESPONSE_STATUS_CODE) == null) { onem2mResponse.setPrimitive( ResponsePrimitive.RESPONSE_STATUS_CODE, Onem2m.ResponseStatusCode.CREATED); } }