[comment encoding = UTF-8 /]
[comment
/*******************************************************************************
 * Copyright (c) 2012 IBM Corporation and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 *
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *
 *     Michael Fiedler     - initial API and implementation for Bugzilla adapter
 *     Jad El-khoury       - initial implementation of code generator (https://bugs.eclipse.org/bugs/show_bug.cgi?id=422448)
 *     Jim Amsden          - Support for UI Preview (494303)
 *
 *******************************************************************************/
/]

[module generateResourceService('http://org.eclipse.lyo/oslc4j/adaptorInterface')]

[import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::jspServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::serviceServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::serviceProviderServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::resourcePropertyServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::serviceProviderCatalogServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateGetResourceJsp/]

[template public generateResourceService(aService : Service)]
[file (javaClassFullFileName(aService), false, 'UTF-8')]
[let anAdaptorInterface: AdaptorInterface = containingAdaptorInterface(aService)]
// [protected ('Copyright')]
/*******************************************************************************
 * Copyright (c) 2012 IBM Corporation and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 *
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *
 *     Michael Fiedler     - initial API and implementation for Bugzilla adapter
 *     Jad El-khoury       - initial implementation of code generator (https://bugs.eclipse.org/bugs/show_bug.cgi?id=422448)
 *     Jim Amsden          - Support for UI Preview (494303)
 *
 * This file is generated by org.eclipse.lyo.oslc4j.codegenerator
 *******************************************************************************/
// [/protected]

package [javaClassPackageName(aService) /];

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.servlet.RequestDispatcher;
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;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.UriBuilder;

import org.apache.wink.json4j.JSONObject;
import org.eclipse.lyo.oslc4j.provider.json4j.JsonHelper;
import org.eclipse.lyo.oslc4j.core.OSLC4JUtils;
import org.eclipse.lyo.oslc4j.core.annotation.OslcCreationFactory;
import org.eclipse.lyo.oslc4j.core.annotation.OslcDialog;
import org.eclipse.lyo.oslc4j.core.annotation.OslcDialogs;
import org.eclipse.lyo.oslc4j.core.annotation.OslcQueryCapability;
import org.eclipse.lyo.oslc4j.core.annotation.OslcService;
import org.eclipse.lyo.oslc4j.core.model.Compact;
import org.eclipse.lyo.oslc4j.core.model.OslcConstants;
import org.eclipse.lyo.oslc4j.core.model.OslcMediaType;
import org.eclipse.lyo.oslc4j.core.model.Preview;
import org.eclipse.lyo.oslc4j.core.model.ServiceProvider;
import org.eclipse.lyo.oslc4j.core.model.Link;
import org.eclipse.lyo.oslc4j.core.model.AbstractResource;

import [javaClassFullNameForAdaptorManager(anAdaptorInterface) /];
import [javaInterfaceFullNameForAdaptorConstants(anAdaptorInterface) /];
[for (aDomainSpecification: DomainSpecification | (aService.servicedResources().definingDomainSpecification()->union(Set{aService.domainSpecification}))->sortedBy(name)) separator(lineSeparator())]import [javaInterfaceFullNameForConstants(aDomainSpecification, anAdaptorInterface, null) /];[/for]
import [javaClassFullNameForSingleton(anAdaptorInterface.serviceProviderCatalog) /];
[for (aResource: Resource | aService.relevantResources()->sortedBy(name))]
import [javaClassFullName(aResource, anAdaptorInterface, null) /];
[/for]

// [protected ('imports')]
// [/protected]

// [protected ('pre_class_code')]
// [/protected]
@OslcService([javaInterfaceNameForConstants(aService.domainSpecification)/].[domainSpecificationConstantName(aService.domainSpecification)/])
[JAXRSPathAnnotation(aService.serviceBaseURI()) /]
public class [javaClassName(aService) /]
{
    @Context private HttpServletRequest httpServletRequest;
    @Context private HttpServletResponse httpServletResponse;
    @Context private UriInfo uriInfo;

    // [protected ('class_attributes')]
    // [/protected]

    // [protected ('class_methods')]
    // [/protected]

    public [javaClassName(aService) /]()
    {
        super();
    }

    [for (aQueryCapability: QueryCapability | aService.queryCapabilities)]
    @OslcQueryCapability
    (
        title = "[aQueryCapability.title /]",
        label = "[aQueryCapability.label /]",
        resourceShape = OslcConstants.PATH_RESOURCE_SHAPES + "/" + [javaInterfaceNameForConstants(aQueryCapability.resourceTypes->first().definingDomainSpecification())/].[resourcePathConstantName(aQueryCapability.resourceTypes->first()) /],
        resourceTypes = {[for (aResource: Resource | aQueryCapability.resourceTypes) separator(', ') ][javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /][/for]},
        usages = {[for (usage: String | aQueryCapability.usages) separator(', ') ]"[usage/]"[/for]}
    )
    @GET
    [JAXRSPathAnnotation(aQueryCapability.URISegment())/]
    @Produces({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON, OslcMediaType.TEXT_TURTLE})
    public [queryMethodReturnType(aQueryCapability, true)/] [queryMethodName(aQueryCapability, true)/](
                                                    [commaSeparate(queryMethodSignature(aQueryCapability, true), false, true) /]
                                                     @QueryParam("oslc.where") final String where,
                                                     @QueryParam("page") final String pageString,
                                                    @QueryParam("limit") final String limitString) throws IOException, ServletException
    {
        int page=0;
        int limit=20;
        if (null != pageString) {
            page = Integer.parseInt(pageString);
        }
        if (null != limitString) {
            limit = Integer.parseInt(limitString);
        }

        // [protected (queryMethodName(aQueryCapability, true))]
        // Here additional logic can be implemented that complements main action taken in [javaClassNameForAdaptorManager(anAdaptorInterface) /]
        // [/protected]

        final List<[queryMethodResourceType(aQueryCapability)/]> resources = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[queryMethodName(aQueryCapability, true)/](httpServletRequest[commaSeparate(queryMethodParameterList(aQueryCapability), true, false)/], where, page, limit);
        return resources.toArray(new [queryMethodResourceType(aQueryCapability) /] [ '[' /]resources.size()[ ']' /]);
    }

    @GET
    [JAXRSPathAnnotation(aQueryCapability.URISegment()) /]
    @Produces({ MediaType.TEXT_HTML })
    public [queryMethodReturnType(aQueryCapability, false)/] [queryMethodName(aQueryCapability, false)/](
                                    [commaSeparate(queryMethodSignature(aQueryCapability, true), false, true)/]
                                       @QueryParam("oslc.where") final String where,
                                       @QueryParam("page") final String pageString,
                                    @QueryParam("limit") final String limitString) throws ServletException, IOException
    {
        int page=0;
        int limit=20;
        if (null != pageString) {
            page = Integer.parseInt(pageString);
        }
        if (null != limitString) {
            limit = Integer.parseInt(limitString);
        }

        // [protected (queryMethodName(aQueryCapability, false))]
        // [/protected]

        final List<[queryMethodResourceType(aQueryCapability)/]> resources = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[queryMethodName(aQueryCapability, true)/](httpServletRequest[commaSeparate(queryMethodParameterList(aQueryCapability), true, false)/], where, page, limit);

        if (resources!= null) {
            httpServletRequest.setAttribute("resources", resources);
            // [protected (queryMethodName(aQueryCapability, false).concat('_setAttributes'))]
            // [/protected]

            httpServletRequest.setAttribute("queryUri",
                    uriInfo.getAbsolutePath().toString() + "?oslc.paging=true");
            if (resources.size() > limit) {
                resources.remove(resources.size() - 1);
                httpServletRequest.setAttribute("nextPageUri",
                        uriInfo.getAbsolutePath().toString() + "?oslc.paging=true&amp;page=" + (page + 1));
            }
            RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[resourceCollectionJspRelativeFileName(aQueryCapability) /]");
            rd.forward(httpServletRequest,httpServletResponse);
        }

        throw new WebApplicationException(Status.NOT_FOUND);
    }

    [/for]
    [for (aSelectionDialog: Dialog | aService.selectionDialogs)]
    @OslcDialog
    (
         title = "[aSelectionDialog.title/]",
         label = "[aSelectionDialog.label/]",
         uri = "[aSelectionDialog.URI(true)/]",
         hintWidth = "[aSelectionDialog.hintWidth /]px",
         hintHeight = "[aSelectionDialog.hintHeight /]px",
         resourceTypes = {[for (aResource: Resource | aSelectionDialog.resourceTypes) separator(', ') ][javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /][/for]},
         usages = {[for (usage: String | aSelectionDialog.usages) separator(', ') ]"[usage/]"[/for]}
    )
    @GET
    [JAXRSPathAnnotation(aSelectionDialog.URISegment(true)) /]
    @Consumes({ MediaType.TEXT_HTML, MediaType.WILDCARD })
    public [dialogMethodReturnType(aSelectionDialog, true)/] [dialogMethodName(aSelectionDialog, true)/](
        @QueryParam("terms") final String terms
        [commaSeparate(dialogMethodSignature(aSelectionDialog, true, true), true, false)/]
        ) throws ServletException, IOException
    {
        try {
            // [protected (dialogMethodName(aSelectionDialog, true).concat('_init'))]
            // [/protected]

            httpServletRequest.setAttribute("selectionUri",uriInfo.getAbsolutePath().toString());
            // [protected (dialogMethodName(aSelectionDialog, true).concat('_setAttributes'))]
            // [/protected]

            if (terms != null ) {
                httpServletRequest.setAttribute("terms", terms);
                final List<[dialogMethodResourceType(aSelectionDialog)/]> resources = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[dialogMethodName(aSelectionDialog, true)/](httpServletRequest[commaSeparate(dialogMethodParameterList(aSelectionDialog, true), true, false)/], terms);
                if (resources!= null) {
                            httpServletRequest.setAttribute("resources", resources);
                            RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[resourceSelectorResultsJspRelativeFileName(aSelectionDialog) /]");
                            rd.forward(httpServletRequest, httpServletResponse);
                }
                //a empty search should return an empty list and not NULL!
                throw new WebApplicationException(Status.NOT_FOUND);

            } else {
                try {
                    RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[resourceSelectorJspRelativeFileName(aSelectionDialog) /]");
                    rd.forward(httpServletRequest, httpServletResponse);
                } catch (Exception e) {
                    throw new ServletException(e);
                }
            }
        } catch (Exception e) {
            throw new WebApplicationException(e);
        }
    }

    [/for]
    [for (aCreationFactory: CreationFactory | aService.creationFactories)]
    /**
     * Create a single [creationMethodResourceType(aCreationFactory)/] via RDF/XML, XML or JSON POST
     *
     * @throws IOException
     * @throws ServletException
     */
    @OslcCreationFactory
    (
         title = "[aCreationFactory.title /]",
         label = "[aCreationFactory.label /]",
         resourceShapes = {[for (aResource: Resource | aCreationFactory.resourceTypes) separator(', ') ]OslcConstants.PATH_RESOURCE_SHAPES + "/" + [javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourcePathConstantName(aResource)/][/for]},
         resourceTypes = {[for (aResource: Resource | aCreationFactory.resourceTypes) separator(', ') ][javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /][/for]},
         usages = {[for (usage: String | aCreationFactory.usages) separator(', ') ]"[usage/]"[/for]}
    )
    @POST
    [JAXRSPathAnnotation(aCreationFactory.URISegment()) /]
    @Consumes({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON, OslcMediaType.TEXT_TURTLE})
    @Produces({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON, OslcMediaType.TEXT_TURTLE})
    public [creationMethodReturnType(aCreationFactory)/] [creationMethodName(aCreationFactory)/](
            [commaSeparate(creationMethodSignature(aCreationFactory, true), false, true)/]
            final [creationMethodResourceType(aCreationFactory)/] aResource
        ) throws IOException, ServletException
    {
        try {
            [creationMethodResourceType(aCreationFactory)/] newResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[creationMethodName(aCreationFactory)/](httpServletRequest, aResource[commaSeparate(creationMethodParameterList(aCreationFactory), true, false)/]);
            httpServletResponse.setHeader("ETag", [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceETagMethodName(aCreationFactory.resourceTypes)/](newResource));
            return Response.created(newResource.getAbout()).entity(newResource).header([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2).build();
        } catch (Exception e) {
            e.printStackTrace();
            throw new WebApplicationException(e);
        }
    }

    [/for]
    [for (aCreationDialog: Dialog | aService.creationDialogs)]
    /**
     * OSLC delegated creation dialog for a single resource
     *
     * @throws IOException
     * @throws ServletException
     */
    @GET
    [JAXRSPathAnnotation(aCreationDialog.URISegment(false)) /]
    @Consumes({MediaType.WILDCARD})
    public [dialogMethodReturnType (aCreationDialog, false)/] [dialogMethodName(aCreationDialog, false)/](
                [commaSeparate(dialogMethodSignature(aCreationDialog, false, true), false, false)/]
        ) throws IOException, ServletException
    {
        // [protected (dialogMethodName(aCreationDialog, false))]
        // [/protected]

        httpServletRequest.setAttribute("creatorUri", uriInfo.getAbsolutePath().toString());
        [for (aPathParameter: String | JAXRSPathParameters(aCreationDialog.URI(false)))]
        httpServletRequest.setAttribute("[aPathParameter/]", [aPathParameter/]);
        [/for]

        RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[resourceCreatorJspRelativeFileName(aCreationDialog) /]");
        rd.forward(httpServletRequest, httpServletResponse);
    }

    /**
     * Backend creator for the OSLC delegated creation dialog.
     *
     * Accepts the input in FormParams and returns a small JSON response
     */
    @OslcDialog
    (
         title = "[aCreationDialog.title /]",
         label = "[aCreationDialog.label /]",
         uri = "[aCreationDialog.URI(false)/]",
         hintWidth = "[aCreationDialog.hintWidth /]px",
         hintHeight = "[aCreationDialog.hintHeight /]px",
         resourceTypes = {[for (aResource: Resource | aCreationDialog.resourceTypes) separator(', ') ][javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /][/for]},
         usages = {[for (usage: String | aCreationDialog.usages) separator(', ') ]"[usage/]"[/for]}
    )
    @POST
    [JAXRSPathAnnotation(aCreationDialog.URISegment(false)) /]
    @Consumes({ MediaType.APPLICATION_FORM_URLENCODED})
    public [creationMethodReturnType(aCreationDialog)/] [creationMethodName(aCreationDialog)/](
            [commaSeparate(dialogMethodSignature(aCreationDialog, false, true), false, false)/]
        ) {
        try {
            [creationMethodResourceType(aCreationDialog)/] newResource = null;

            [if not (aCreationDialog.resourceTypes->size() = 1)]
            // [protected (creationMethodName(aCreationDialog))]
            // TODO Implement code to create the new resource. This method seems to be expected to handle more than a single type of resources.
            // [/protected]
            [else]
            [let aResource : Resource = aCreationDialog.resourceTypes->first()]
            [javaClassName(aResource) /] aResource = new [javaClassName(aResource) /]();

            String['[]'/] paramValues;

            [comment TODO: Check for valid parameters (1) that the oneOrMore, or oneOrMany are set. (2) things have right format. (3) Allow end_user to also add own checks
            In the Resource class, automtiacally generate a "propertyValidValue" (similar to propertyAsHtmlForCreation) for each of the properties.
            There you can add all automatic checks, as well as allow for end-user ones./]
            [for (propertiesCollection: Collection(ResourceProperty) | Sequence{aResource.resourceProperties, inheritedProperties(aResource), interfaceProperties(aResource)})]
            [for (aProperty: ResourceProperty | propertiesCollection)]
            paramValues = httpServletRequest.getParameterValues("[javaName(aProperty, false)/]");
            if (paramValues != null) {
                [if (Sequence{'zeroOrMany', 'oneOrMany'}->includes(aProperty.occurs.toString()))]
                    for(int i=0; i<paramValues.length; i++) {
                        aResource.add[javaAttributeName(aProperty, aResource).toUpperFirst()/]([javaAttributeBaseTypeCastFromString(aProperty, 'paramValues[i]') /]);
                    }
                [else]
                    if (paramValues.length == 1) {
                        if (paramValues['[0]'/].length() != 0)
                            aResource.set[javaAttributeName(aProperty, aResource).toUpperFirst() /]([javaAttributeBaseTypeCastFromString(aProperty, 'paramValues[0]') /]);
                        // else, there is an empty value for that parameter, and hence ignore since the parameter is not actually set.
                    }

                [/if]
            }
            [/for]
            [/for]

            newResource = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[creationMethodName(aCreationDialog)/](httpServletRequest, aResource[commaSeparate(dialogMethodParameterList(aCreationDialog, false), true, false)/]);
            [/let]
            [/if]

            if (newResource != null) {
                httpServletRequest.setAttribute("newResource", newResource);
                httpServletRequest.setAttribute("newResourceUri", newResource.getAbout().toString());

                // Send back to the form a small JSON response
                httpServletResponse.setContentType("application/json");
                httpServletResponse.setStatus(Status.CREATED.getStatusCode());
                httpServletResponse.addHeader("Location", newResource.getAbout().toString());
                PrintWriter out = httpServletResponse.getWriter();

                JSONObject oslcResponse = new JSONObject();
                JSONObject newResourceJson = new JSONObject();
                newResourceJson.put("rdf:resource", newResource.getAbout().toString());
                // [protected ('OSLC Resource Label')]
                newResourceJson.put("oslc:label", newResource.toString());
                // [/protected]
                oslcResponse.put("oslc:results", new Object['[]'/]{newResourceJson});

                out.print(oslcResponse.toString());
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new WebApplicationException(e);
        }
    }
    [/for]
    [for (aBasicCapability: BasicCapability | aService.basicCapabilities)]
    [if (aBasicCapability.read)]
    [for (aResource: Resource | aBasicCapability.resourceTypes)]
    @GET
    [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/]
    @Produces({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON, OslcMediaType.TEXT_TURTLE})
    public [getResourceMethodReturnType(aBasicCapability, aResource, true)/] [getResourceMethodName(aBasicCapability, aResource, true)/](
                [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, false)/]
        ) throws IOException, ServletException, URISyntaxException
    {
        // [protected ('getResource_init')]
        // [/protected]

        final [getResourceMethodResourceType(aBasicCapability, aResource)/] a[javaName(aResource, true)/] = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]);

        if (a[javaName(aResource, true)/] != null) {
            // [protected (getResourceMethodName(aBasicCapability, aResource, true))]
            // [/protected]
            httpServletResponse.addHeader([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2);
            return a[javaName(aResource, true)/];
        }

        throw new WebApplicationException(Status.NOT_FOUND);
    }

    @GET
    [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/]
    @Produces({ MediaType.TEXT_HTML })
    public [getResourceMethodReturnType(aBasicCapability, aResource, false)/] [getResourceMethodName(aBasicCapability, aResource, false)/](
        [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, false)/]
        ) throws ServletException, IOException, URISyntaxException
    {
        // [protected (getResourceMethodName(aBasicCapability, aResource, false).concat('_init'))]
        // [/protected]

        final [getResourceMethodResourceType(aBasicCapability, aResource)/] a[javaName(aResource, true)/] = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]);

        if (a[javaName(aResource, true)/] != null) {
            httpServletRequest.setAttribute("a[javaName(aResource, true)/]", a[javaName(aResource, true)/]);
            // [protected (getResourceMethodName(aBasicCapability, aResource, false).concat('_setAttributes'))]
            // [/protected]

            RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[getResourceJspRelativeFileName(aResource, anAdaptorInterface) /]");
            rd.forward(httpServletRequest,httpServletResponse);
        }

        throw new WebApplicationException(Status.NOT_FOUND);
    }

    @GET
    [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/]
    @Produces({OslcMediaType.APPLICATION_X_OSLC_COMPACT_XML})
    public Compact [getResourceCompactMethodName(aBasicCapability, aResource)/](
        [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, false)/]
        ) throws ServletException, IOException, URISyntaxException
    {
        String iconUri = OSLC4JUtils.getPublicURI() + "/images/ui_preview_icon.gif";
        String smallPreviewHintHeight = "10em";
        String smallPreviewHintWidth = "45em";
        String largePreviewHintHeight = "20em";
        String largePreviewHintWidth = "45em";

        // [protected (getResourceCompactMethodName(aBasicCapability, aResource).concat('_init'))]
        //TODO: adjust the preview height & width values from the default values provided above.
        // [/protected]

        final [getResourceMethodResourceType(aBasicCapability, aResource)/] a[javaName(aResource, true)/] = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]);

        if (a[javaName(aResource, true)/] != null) {
            final Compact compact = new Compact();

            compact.setAbout(a[javaName(aResource, true)/].getAbout());
            compact.setTitle(a[javaName(aResource, true)/].toString());

            compact.setIcon(new URI(iconUri));

            //Create and set attributes for OSLC preview resource
            final Preview smallPreview = new Preview();
            smallPreview.setHintHeight(smallPreviewHintHeight);
            smallPreview.setHintWidth(smallPreviewHintWidth);
            smallPreview.setDocument(UriBuilder.fromUri(a[javaName(aResource, true)/].getAbout()).path("smallPreview").build());
            compact.setSmallPreview(smallPreview);

            //Use the HTML representation of a change request as the large preview as well
            final Preview largePreview = new Preview();
            largePreview.setHintHeight(largePreviewHintHeight);
            largePreview.setHintWidth(largePreviewHintWidth);
            largePreview.setDocument(a[javaName(aResource, true)/].getAbout());
            compact.setLargePreview(largePreview);
            httpServletResponse.addHeader([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2);
            return compact;
        }
        throw new WebApplicationException(Status.NOT_FOUND);
    }

    @GET
    [JAXRSPathAnnotation(JAXRSConcatURISegments(aResource.instanceURISegment(aBasicCapability), 'smallPreview'))/]
    @Produces({ MediaType.TEXT_HTML })
    public void [getResourceSmallPreviewMethodName(aBasicCapability, aResource)/](
        [commaSeparate(instanceMethodSignature(aResource, aBasicCapability, true), false, false)/]
        ) throws ServletException, IOException, URISyntaxException
    {
        // [protected (getResourceSmallPreviewMethodName(aBasicCapability, aResource).concat('_init'))]
        // [/protected]

        final [getResourceMethodResourceType(aBasicCapability, aResource)/] a[javaName(aResource, true)/] = [javaClassNameForAdaptorManager(anAdaptorInterface) /].[getResourceMethodName(aBasicCapability, aResource, true)/](httpServletRequest[commaSeparate(instanceMethodParameterList(aResource, aBasicCapability), true, false)/]);

        if (a[javaName(aResource, true)/] != null) {
            httpServletRequest.setAttribute("a[javaName(aResource, true)/]", a[javaName(aResource, true)/]);
            // [protected (getResourceSmallPreviewMethodName(aBasicCapability, aResource).concat('_setAttributes'))]
            // [/protected]

            RequestDispatcher rd = httpServletRequest.getRequestDispatcher("[getResourceSmallPreviewJspRelativeFileName(aResource, anAdaptorInterface) /]");
            httpServletResponse.addHeader([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2);
            rd.forward(httpServletRequest, httpServletResponse);
        }

        throw new WebApplicationException(Status.NOT_FOUND);
    }
    [/for]
    [/if]
    [if (aBasicCapability.delete)]
    [for (aResource: Resource | aBasicCapability.resourceTypes)]
    @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().header([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2).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)]
    @PUT
    [JAXRSPathAnnotation(aResource.instanceURISegment(aBasicCapability))/]
    @Consumes({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON, OslcMediaType.TEXT_TURTLE})
    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().header([javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].HDR_OSLC_VERSION, [javaInterfaceNameForAdaptorConstants(anAdaptorInterface)/].OSLC_VERSION_V2).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]
[/file]
[/template]
