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());
}
}
}