public void processActionEntity()

in lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java [149:244]


  public void processActionEntity(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
      final ContentType requestFormat, final ContentType responseFormat)
      throws ODataApplicationException, ODataLibraryException {
    EdmAction action = null;
    Map<String, Parameter> parameters = new HashMap<String, Parameter>(); 
    EntityActionResult entityResult = null;
    
    final List<UriResource> resourcePaths = uriInfo.asUriInfoResource().getUriResourceParts();
    if (resourcePaths.size() > 1) {
      UriResourceEntitySet boundEntity = (UriResourceEntitySet) resourcePaths.get(0);
      EdmEntitySet entitySet = boundEntity.getEntitySet();
      if (resourcePaths.get(1) instanceof UriResourceNavigation) {
        UriResourceNavigation navEntity = (UriResourceNavigation) resourcePaths.get(1);
        action = ((UriResourceAction) resourcePaths.get(2))
            .getAction();
        parameters = readParameters(action, request.getBody(), requestFormat);
        if (navEntity.getTypeFilterOnEntry() != null) {
          EdmEntityType edmEntityType = (EdmEntityType) navEntity.
              getTypeFilterOnEntry();
          entitySet = getTypeCastedEntitySet(entitySet, edmEntityType);
          entityResult =
              dataProvider.processBoundActionEntity(action.getName(), parameters, boundEntity.getKeyPredicates(),
                  entitySet);
        } else {
          EdmNavigationProperty navProperty = navEntity.getProperty();
          entityResult =
              dataProvider.processBoundActionWithNavigationEntity(action.getName(), 
                  parameters, boundEntity.getKeyPredicates(),
                  entitySet, navProperty);
        }
      } else if (resourcePaths.get(0) instanceof UriResourceEntitySet) {
        UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0);
        action = ((UriResourceAction) resourcePaths.get(1))
            .getAction();
        if (uriResourceEntitySet.getTypeFilterOnEntry() != null) {
            EdmEntityType edmEntityType = (EdmEntityType) uriResourceEntitySet.
                getTypeFilterOnEntry();
            entitySet = getTypeCastedEntitySet(entitySet, edmEntityType);
          }
        parameters = readParameters(action, request.getBody(), requestFormat);
        entityResult =
            dataProvider.processBoundActionEntity(action.getName(), parameters, boundEntity.getKeyPredicates(),
                entitySet);
      }
    } else {
      action = ((UriResourceAction) uriInfo.asUriInfoResource().getUriResourceParts().get(0))
          .getAction();
      parameters = readParameters(action, request.getBody(), requestFormat);
      entityResult =
          dataProvider.processActionEntity(action.getName(), parameters);
    }
    final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
    final EdmEntityType type = (EdmEntityType) action.getReturnType().getType();

    if (entityResult == null || entityResult.getEntity() == null) {
      if (action.getReturnType().isNullable()) {
        response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
      } else {
        // Not nullable return type so we have to give back a 500
        throw new ODataApplicationException("The action could not be executed.",
            HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ROOT);
      }
    } else {
      final Return returnPreference = odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).getReturn();
      if (returnPreference == null || returnPreference == Return.REPRESENTATION) {
        response.setContent(odata.createSerializer(responseFormat).entity(
            serviceMetadata,
            type,
            entityResult.getEntity(),
            EntitySerializerOptions.with()
                .contextURL(isODataMetadataNone(responseFormat) ? null : getContextUrl(edmEntitySet, type, true))
                .build())
            .getContent());
        response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
        response.setStatusCode((entityResult.isCreated() ? HttpStatusCode.CREATED : HttpStatusCode.OK)
            .getStatusCode());
      } else {
        response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
      }
      if (returnPreference != null) {
        response.setHeader(HttpHeader.PREFERENCE_APPLIED,
            PreferencesApplied.with().returnRepresentation(returnPreference).build().toValueString());
      }
      if (entityResult.isCreated()) {
        final String location = request.getRawBaseUri() + '/'
            + odata.createUriHelper().buildCanonicalURL(edmEntitySet, entityResult.getEntity());
        response.setHeader(HttpHeader.LOCATION, location);
        if (returnPreference == Return.MINIMAL) {
          response.setHeader(HttpHeader.ODATA_ENTITY_ID, location);
        }
      }
      if (entityResult.getEntity().getETag() != null) {
        response.setHeader(HttpHeader.ETAG, entityResult.getEntity().getETag());
      }
    }
  }