Skip to content
This repository has been archived by the owner on Oct 12, 2021. It is now read-only.

Commit

Permalink
Bug 444239 - Extend the code generator to allow the designer to specify
Browse files Browse the repository at this point in the history
exactly which of the CRUD methods to be generated. 

Designer can now enable/disable Read/Update/Delete functions under
BasicCapability.
By default, only Read is enabled.


Change-Id: Ic0d79a43368b4dcee0716d5f21db8d315e2dc427
Signed-off-by: Jad El-khoury <jad@kth.se>
  • Loading branch information
jadelkhoury committed Mar 11, 2016
1 parent 5ca47ed commit e71c275
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 13 deletions.
Expand Up @@ -151,6 +151,12 @@
<eStructuralFeatures xsi:type="ecore:EAttribute" name="instanceID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="resourceTypes" upperBound="-1"
eType="#//Resource"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="read" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
defaultValueLiteral="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="delete" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
defaultValueLiteral="false"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="update" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
defaultValueLiteral="false"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Dialog">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="title" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
Expand Down
Expand Up @@ -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)/])
Expand All @@ -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)/])
{
Expand All @@ -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]
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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
*
Expand Down Expand Up @@ -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]
Expand Down
Expand Up @@ -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
Expand Down Expand Up @@ -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)
/]
Expand All @@ -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)
/]
Expand Down

0 comments on commit e71c275

Please sign in to comment.