@RequestMapping(
      value = ROOT_APPLICATION_COLLECTION_FOR_USER_REQUEST,
      method = {RequestMethod.POST})
  public void rootApplicationCollectionRequest(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, ROOT_APPLICATION_COLLECTION_FOR_USER_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.GetRootApplicationCollectionForUserRequest
        rootApplicationCollectionForUserRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer
                .GetRootApplicationCollectionForUserRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    CatalogCollection rootAplicationCollection =
        catalogService.getRootApplicationCollectionForUser(
            rootApplicationCollectionForUserRequest.getUserId(),
            rootApplicationCollectionForUserRequest.getPartitionId(),
            rootApplicationCollectionForUserRequest.getApplicationName());

    CatalogGPBUtils.generateCatalogCollectionResponseProtoBuf(
            com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS,
            "",
            rootAplicationCollection)
        .build()
        .writeTo(response.getOutputStream());
    return;
  }
  @RequestMapping(
      value = SHARE_REFERENCE_REQUEST,
      method = {RequestMethod.POST})
  public void shareReference(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, SHARE_REFERENCE_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ShareReferenceRequest
        shareReferenceRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ShareReferenceRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      catalogService.shareReference(
          shareReferenceRequest.getUserId(),
          shareReferenceRequest.getPartitionId(),
          shareReferenceRequest.getReferenceToShareUniqueId(),
          shareReferenceRequest.getApplicationName(),
          createNewMap(shareReferenceRequest.getUsersAndPartitionsToShareWithList()),
          createPermissionListFromProtoBufEnumList(shareReferenceRequest.getPermissionsList()));

      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceNotFoundException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.REFERENCE_NOT_FOUND,
              "The reference can not be found with unique id : "
                  + shareReferenceRequest.getReferenceToShareUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceSharingException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .REFERENCE_CAN_NOT_BE_SHARED,
              "The reference can not be shared.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (InvalidCatalogNameException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .CATALOG_NAME_INVALID,
              "Invalid catalog name.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = ADD_DOCUMENT_REQUEST,
      method = {RequestMethod.POST})
  public void addDocument(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, ADD_DOCUMENT_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.AddDocumentRequest addNewDocumentRequest =
        com.c9a.buffers.CatalogServiceRequestProtocalBuffer.AddDocumentRequest.parseFrom(
            GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {

      Reference ref =
          catalogService.addDocument(
              addNewDocumentRequest.getUserId(),
              addNewDocumentRequest.getPartitionId(),
              addNewDocumentRequest.getDocument().getName(),
              addNewDocumentRequest.getParentCatalogCollectionId(),
              addNewDocumentRequest.getDocument().getContent().toByteArray(),
              createPermissionListFromProtoBufEnumList(addNewDocumentRequest.getPermissionsList()),
              createNewMap(addNewDocumentRequest.getAttributesList()));

      CatalogGPBUtils.generateReferenceResponseProtoBuf(
              ref, com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;

    } catch (CollectionNotFoundException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_NOT_FOUND,
              "The collection can not be found with unique id : "
                  + addNewDocumentRequest.getParentCatalogCollectionId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionModificationException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_CAN_NOT_BE_MODIFIED,
              "The parent collection can not be modified : "
                  + addNewDocumentRequest.getParentCatalogCollectionId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = DELETE_REFERENCE_REQUEST,
      method = {RequestMethod.POST})
  public void deleteReference(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, DELETE_REFERENCE_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.DeleteReferenceRequest
        deleteReferenceRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer.DeleteReferenceRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      catalogService.deleteReferenceFromCollection(
          deleteReferenceRequest.getUserId(),
          deleteReferenceRequest.getPartitionId(),
          deleteReferenceRequest.getReferenceUniqueId(),
          false);
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionModificationException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_CAN_NOT_BE_MODIFIED,
              "You do not have the needed permissions to modify the collection that holds this reference.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceNotFoundException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.REFERENCE_NOT_FOUND,
              "The reference can not be found with unique id : "
                  + deleteReferenceRequest.getReferenceUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = GET_COLLECTION_REQUEST,
      method = {RequestMethod.POST})
  public void getCollection(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, GET_COLLECTION_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.GetCollectionRequest collectionRequest =
        com.c9a.buffers.CatalogServiceRequestProtocalBuffer.GetCollectionRequest.parseFrom(
            GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      CatalogCollection catalogCollection =
          catalogService.getCollection(
              collectionRequest.getUserId(),
              collectionRequest.getPartitionId(),
              collectionRequest.getUniqueId());
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS,
              "",
              catalogCollection)
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionNotFoundException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_NOT_FOUND,
              "The collection was not found with the give unique id : "
                  + collectionRequest.getUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = GET_REFERENCE_REQUEST,
      method = {RequestMethod.POST})
  public void getReference(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, GET_REFERENCE_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.GetReferenceRequest getReferenceRequest =
        com.c9a.buffers.CatalogServiceRequestProtocalBuffer.GetReferenceRequest.parseFrom(
            GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      Reference ref =
          catalogService.getReference(
              getReferenceRequest.getUserId(),
              getReferenceRequest.getPartitionId(),
              getReferenceRequest.getUniqueId());
      CatalogGPBUtils.generateReferenceResponseProtoBuf(
              ref, com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceNotFoundException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.REFERENCE_NOT_FOUND,
              "The reference can not be found with unique id : "
                  + getReferenceRequest.getUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = MODIFY_REFERENCE_REQUEST,
      method = {RequestMethod.POST})
  public void modifyREFERENCE(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, MODIFY_REFERENCE_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ModifyReferenceRequest
        modifyReferenceRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ModifyReferenceRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      Reference ref =
          catalogService.modifyReference(
              modifyReferenceRequest.getUserId(),
              modifyReferenceRequest.getPartitionId(),
              modifyReferenceRequest.getReferenceUniqueId(),
              modifyReferenceRequest.getReferenceName(),
              createPermissionListFromProtoBufEnumList(modifyReferenceRequest.getPermissionsList()),
              createNewMap(modifyReferenceRequest.getAttributesList()));

      CatalogGPBUtils.generateReferenceResponseProtoBuf(
              ref, com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionNotFoundException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_NOT_FOUND,
              "The collection can not be found with unique id : "
                  + modifyReferenceRequest.getParentCollectionUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceModificationException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .REFERENCE_CAN_NOT_BE_MODIFIED,
              "You do not have the needed permissions to modify this reference.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (ReferenceNotFoundException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.REFERENCE_NOT_FOUND,
              "The reference can not be found with unique id : "
                  + modifyReferenceRequest.getReferenceUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (InvalidCatalogNameException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .CATALOG_NAME_INVALID,
              "You can not store the name \""
                  + modifyReferenceRequest.getReferenceName()
                  + "\" int he catalog.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = SHARE_COLLECTION_REQUEST,
      method = {RequestMethod.POST})
  public void shareCollection(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, SHARE_COLLECTION_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ShareCollectionRequest
        shareCollectionForUserRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer.ShareCollectionRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      Map<String, String> userAndPartitionsToShareWith =
          createNewMap(shareCollectionForUserRequest.getUsersAndPartitionsToShareWithList());
      Set<Long> sharePermissionIds =
          createPermissionListFromProtoBufEnumList(
              shareCollectionForUserRequest.getPermissionsList());
      catalogService.shareCollection(
          shareCollectionForUserRequest.getUserId(),
          shareCollectionForUserRequest.getPartitionId(),
          shareCollectionForUserRequest.getApplicationName(),
          shareCollectionForUserRequest.getCollectionUniqueId(),
          userAndPartitionsToShareWith,
          sharePermissionIds);
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS, "")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionNotFoundException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_NOT_FOUND,
              "The collection was not found with the give unique id : "
                  + shareCollectionForUserRequest.getCollectionUniqueId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionSharingException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_CAN_NOT_BE_SHARED,
              "The collection does not have the needed permissions to be shared.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (InvalidCatalogNameException e) {
      CatalogGPBUtils.generateResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .CATALOG_NAME_INVALID,
              "Invalid catalog name.")
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }
  @RequestMapping(
      value = ADD_COLLECTION_REQUEST,
      method = {RequestMethod.POST})
  public void addCollection(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestParam(value = "api", required = false) boolean api)
      throws IOException {

    if (apiRequested(response, api, ADD_COLLECTION_REQUEST)) return;

    com.c9a.buffers.CatalogServiceRequestProtocalBuffer.AddCollectionRequest
        addNewCollectionRequest =
            com.c9a.buffers.CatalogServiceRequestProtocalBuffer.AddCollectionRequest.parseFrom(
                GoogleProtoclBufferRequestContentUtils.getContentForRequest(request));

    try {
      Set<Long> permissions =
          createPermissionListFromProtoBufEnumList(addNewCollectionRequest.getPermissionsList());
      Map<String, String> attributes = createNewMap(addNewCollectionRequest.getAttributesList());
      CatalogCollection catalogCollection =
          catalogService.addCollection(
              addNewCollectionRequest.getUserId(),
              addNewCollectionRequest.getPartitionId(),
              addNewCollectionRequest.getCollectionName(),
              addNewCollectionRequest.getParentCatalogCollectionId(),
              permissions,
              attributes);
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBuf(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode.SUCCESS,
              "",
              catalogCollection)
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionNotFoundException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_NOT_FOUND,
              "The parent collection was not found with the give unique id : "
                  + addNewCollectionRequest.getParentCatalogCollectionId())
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (CollectionModificationException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .COLLECTION_CAN_NOT_BE_MODIFIED,
              "The parent collection with unique id : "
                  + addNewCollectionRequest.getParentCatalogCollectionId()
                  + " can not be modified : ")
          .build()
          .writeTo(response.getOutputStream());
      return;
    } catch (InvalidCatalogNameException e) {
      CatalogGPBUtils.generateCatalogCollectionResponseProtoBufError(
              com.c9a.buffers.CatalogServiceResponseProtocalBuffer.ResponseCode
                  .CATALOG_NAME_INVALID,
              "The supplied name is not valid for the catalog")
          .build()
          .writeTo(response.getOutputStream());
      return;
    }
  }