diff --git a/org.eclipse.lyo.oslc4j.adaptormodel/model/adaptorInterface.ecore b/org.eclipse.lyo.oslc4j.adaptormodel/model/adaptorInterface.ecore index 827088c..e3b3104 100644 --- a/org.eclipse.lyo.oslc4j.adaptormodel/model/adaptorInterface.ecore +++ b/org.eclipse.lyo.oslc4j.adaptormodel/model/adaptorInterface.ecore @@ -151,6 +151,12 @@ + + + diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorManager.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorManager.mtl index e243cc6..c623c1b 100644 --- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorManager.mtl +++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorManager.mtl @@ -153,16 +153,8 @@ public class [javaClassNameForAdaptorManager(anAdaptorInterface) /] { // [/protected] return newResource; } - - public static String [creationETagMethodName(aCreationFactory)/](final [creationMethodResourceType(aCreationFactory)/] aResource) - { - String eTag = null; - // TODO Implement code to return an ETag for a particular resource - // [protected (creationETagMethodName(aCreationFactory))] - // [/protected] - return eTag; - } [/for] + [for (aCreationDialog: Dialog | aService.creationDialogs)] [if (aService.creationFactories->select(f: CreationFactory | f.resourceTypes = aCreationDialog.resourceTypes)->isEmpty())] public static [creationMethodResourceType(aCreationDialog)/] [creationMethodName(aCreationDialog)/](HttpServletRequest httpServletRequest, final [creationMethodResourceType(aCreationDialog)/] aResource[commaSeparate(dialogMethodSignature(aCreationDialog, false, false), true, false)/]) @@ -176,7 +168,9 @@ public class [javaClassNameForAdaptorManager(anAdaptorInterface) /] { } [/if] [/for] + [for (aBasicCapability: BasicCapability | aService.basicCapabilities)] + [if (aBasicCapability.read)] [for (aResource: Resource | aBasicCapability.resourceTypes)] public static [getResourceMethodResourceType(aBasicCapability, aResource)/] [getResourceMethodName(aBasicCapability, aResource, true)/](HttpServletRequest httpServletRequest[commaSeparate(instanceMethodSignature(aResource, aBasicCapability, false), true, false)/]) { @@ -188,7 +182,45 @@ public class [javaClassNameForAdaptorManager(anAdaptorInterface) /] { return aResource; } [/for] + [/if] + + [if (aBasicCapability.delete)] + [for (aResource: Resource | aBasicCapability.resourceTypes)] + public static Boolean [deleteResourceMethodName(aBasicCapability, aResource)/](HttpServletRequest httpServletRequest[commaSeparate(instanceMethodSignature(aResource, aBasicCapability, false), true, false)/]) + { + Boolean deleted = false; + // TODO Implement code to delete a resource + // [protected (deleteResourceMethodName(aBasicCapability, aResource))] + // [/protected] + return deleted; + } + [/for] + [/if] + + [if (aBasicCapability.update)] + [for (aResource: Resource | aBasicCapability.resourceTypes)] + public static [updateResourceMethodResourceType(aBasicCapability, aResource)/] [updateResourceMethodName(aBasicCapability, aResource)/](HttpServletRequest httpServletRequest, final [updateResourceMethodResourceType(aBasicCapability, aResource)/] aResource[commaSeparate(instanceMethodSignature(aResource, aBasicCapability, false), true, false)/]) { + [updateResourceMethodResourceType(aBasicCapability, aResource)/] updatedResource = null; + // TODO Implement code to update and return a resource + // [protected (updateResourceMethodName(aBasicCapability, aResource))] + // [/protected] + return updatedResource; + } + [/for] + [/if] + [/for] + [/for] + + [for (aResource: Resource | servicedResources(anAdaptorInterface))] + public static String [getResourceETagMethodName(aResource)/](final [javaClassName(aResource)/] aResource) + { + String eTag = null; + // TODO Implement code to return an ETag for a particular resource + // [protected (getResourceETagMethodName(aResource))] + // [/protected] + return eTag; + } [/for] } [/file] diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceService.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceService.mtl index 74ca163..3ac284d 100644 --- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceService.mtl +++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceService.mtl @@ -73,6 +73,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; @@ -332,7 +333,7 @@ public class [javaClassName(aService) /] { try { [creationMethodResourceType(aCreationFactory)/] newResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[creationMethodName(aCreationFactory)/](httpServletRequest, aResource[commaSeparate(creationMethodParameterList(aCreationFactory), true, false)/]); - httpServletResponse.setHeader("ETag", [javaClassNameForAdaptorManager(anAdaptorInterface) /].[creationETagMethodName(aCreationFactory)/](newResource)); + httpServletResponse.setHeader("ETag", [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceETagMethodName(aCreationFactory.resourceTypes)/](newResource)); return Response.created(newResource.getAbout()).entity(aResource).build(); } catch (Exception e) { e.printStackTrace(); @@ -456,9 +457,10 @@ public class [javaClassName(aService) /] } } [/for] - [for (aBasicCapability: BasicCapability | aService.basicCapabilities)] + [if (aBasicCapability.read)] [for (aResource: Resource | aBasicCapability.resourceTypes)] + /** * RDF/XML, XML and JSON representation of a single change request * @@ -524,6 +526,92 @@ public class [javaClassName(aService) /] throw new WebApplicationException(Status.NOT_FOUND); } [/for] + [/if] + [if (aBasicCapability.delete)] + [for (aResource: Resource | aBasicCapability.resourceTypes)] + /** + * Delete a single change request + * + * @param productId + * @param changeRequestId + * @return + * @throws IOException + * @throws ServletException + * @throws URISyntaxException + */ + @DELETE + [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/] + public [deleteResourceMethodReturnType(aBasicCapability, aResource)/] [deleteResourceMethodName(aBasicCapability, aResource)/]( + [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, false)/] + ) throws IOException, ServletException, URISyntaxException + { + // [protected (deleteResourceMethodName(aBasicCapability, aResource).concat('_init'))] + // [/protected] + final [deleteResourceMethodResourceType(aBasicCapability, aResource)/] aResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]); + + if (aResource != null) { + // [protected (deleteResourceMethodName(aBasicCapability, aResource))] + // [/protected] + boolean deleted = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[deleteResourceMethodName(aBasicCapability, aResource)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]); + if (deleted) + return Response.ok().build(); + else + throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR); + } + throw new WebApplicationException(Status.NOT_FOUND); + } + [/for] + [/if] + + [if (aBasicCapability.update)] + [for (aResource: Resource | aBasicCapability.resourceTypes)] + /** + * Update a single resource via RDF/XML, XML or JSON POST + * @param serviceProviderId + * @param resourceId + * @throws IOException + * @throws ServletException + */ + @PUT + [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/] + @Consumes({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON}) + public [updateResourceMethodReturnType(aBasicCapability, aResource)/] [updateResourceMethodName(aBasicCapability, aResource)/]( + @HeaderParam("If-Match") final String eTagHeader, + [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, true)/] + final [getResourceMethodResourceType(aBasicCapability, aResource)/] aResource + ) throws IOException, ServletException + { + // [protected (updateResourceMethodName(aBasicCapability, aResource).concat('_init'))] + // [/protected] + final [updateResourceMethodResourceType(aBasicCapability, aResource)/] originalResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]); + + if (originalResource != null) { + try { + final String originalETag = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceETagMethodName(aResource)/](originalResource); + + if ((eTagHeader == null) || (originalETag.equals(eTagHeader))) { + // [protected (updateResourceMethodName(aBasicCapability, aResource))] + // [/protected] + final [updateResourceMethodResourceType(aBasicCapability, aResource)/] updatedResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[updateResourceMethodName(aBasicCapability, aResource)/](httpServletRequest, aResource[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]); + httpServletResponse.setHeader("ETag", [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceETagMethodName(aResource)/](updatedResource)); + return Response.ok().build(); + } + else { + throw new WebApplicationException(Status.PRECONDITION_FAILED); + } + + } catch (Exception e) { + e.printStackTrace(); + throw new WebApplicationException(e); + } + + } + else { + throw new WebApplicationException(Status.NOT_FOUND); + } + } + [/for] + [/if] [/for] } [/let] diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceServices.mtl index 0fd6393..759fa2f 100644 --- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceServices.mtl +++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceServices.mtl @@ -180,11 +180,15 @@ methodSignature(JAXRSPathParameters(aCreationFactory.URI()), forJAXRSMethod) methodParameterList(JAXRSPathParameters(aCreationFactory.URI())) /] -[query public creationETagMethodName(aCreationFactory: CreationFactory) : String = -concatenate(aCreationFactory.resourceTypes.javaName(true)->sep('getETagFrom', 'And', '').oclAsType(String)) +[query public getResourceETagMethodName(resources : Set(Resource)) : String = +concatenate(resources.javaName(true)->sep('getETagFrom', 'And', '').oclAsType(String)) .concat('') /] +[query public getResourceETagMethodName(aResource: Resource) : String = +getResourceETagMethodName(Set{aResource}) +/] + [comment Dialog /] [query public URISegment (aDialog: Dialog, selectionDialog : Boolean) : String = if (aDialog.dialogURI.oclIsUndefined())._or (aDialog.dialogURI.equalsIgnoreCase('')) then @@ -269,6 +273,14 @@ JAXRSPathParameters(aResource.instanceURI(aBasicCapability)) .concat((if forRDF then '' else 'AsHtml' endif)) /] +[query public deleteResourceMethodName(aBasicCapability: BasicCapability, aResource: Resource) : String = +'delete'.concat(javaName(aResource, true)) +/] + +[query public updateResourceMethodName(aBasicCapability: BasicCapability, aResource: Resource) : String = +'update'.concat(javaName(aResource, true)) +/] + [query public getResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = javaClassName(aResource) /] @@ -281,6 +293,22 @@ else endif /] +[query public updateResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = +javaClassName(aResource) +/] + +[query public updateResourceMethodReturnType(aBasicCapability: BasicCapability, aResource: Resource) : String = +'Response' +/] + +[query public deleteResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = +javaClassName(aResource) +/] + +[query public deleteResourceMethodReturnType(aBasicCapability: BasicCapability, aResource: Resource) : String = +'Response' +/] + [query public instanceMethodSignature(aResource: Resource, aBasicCapability: BasicCapability, forJAXRSMethod : Boolean) : String = methodSignature(instanceCompositeID(aResource, aBasicCapability), forJAXRSMethod) /]