You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/01/08 14:19:07 UTC
[2/2] olingo-odata4 git commit: [OLINGO-507] Split
'handleResourceDispatching' into several smaller methods
[OLINGO-507] Split 'handleResourceDispatching' into several smaller methods
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/df6ba28c
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/df6ba28c
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/df6ba28c
Branch: refs/heads/OLINGO-507-MinorRefactor
Commit: df6ba28c76e51e194105069accd21e233ace590d
Parents: b9a3382
Author: Michael Bolz <mi...@sap.com>
Authored: Thu Jan 8 10:42:27 2015 +0100
Committer: Michael Bolz <mi...@sap.com>
Committed: Thu Jan 8 14:16:50 2015 +0100
----------------------------------------------------------------------
.../olingo/fit/tecsvc/client/BasicITCase.java | 41 +++
.../olingo/server/core/ContentNegotiator.java | 13 +
.../server/core/ContentNegotiatorException.java | 1 +
.../apache/olingo/server/core/ODataHandler.java | 362 ++++++++++---------
.../server/core/ODataHandlerException.java | 3 +-
.../server-core-exceptions-i18n.properties | 1 +
6 files changed, 247 insertions(+), 174 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
index 023729c..f6a5520 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
@@ -34,11 +34,14 @@ import java.util.List;
import org.apache.olingo.client.api.CommonODataClient;
import org.apache.olingo.client.api.communication.ODataClientErrorException;
+import org.apache.olingo.client.api.communication.ODataServerErrorException;
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityCreateRequest;
import org.apache.olingo.client.api.communication.request.retrieve.EdmMetadataRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataServiceDocumentRequest;
import org.apache.olingo.client.api.communication.request.retrieve.XMLMetadataRequest;
+import org.apache.olingo.client.api.communication.response.ODataEntityCreateResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.edm.xml.XMLMetadata;
import org.apache.olingo.client.api.edm.xml.v4.Reference;
@@ -52,9 +55,11 @@ import org.apache.olingo.commons.api.domain.v4.ODataEntitySet;
import org.apache.olingo.commons.api.domain.v4.ODataProperty;
import org.apache.olingo.commons.api.domain.v4.ODataValue;
import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.http.HttpStatusCode;
+import org.apache.olingo.commons.core.domain.v4.ODataEntityImpl;
import org.apache.olingo.fit.AbstractBaseTestITCase;
import org.apache.olingo.fit.tecsvc.TecSvcConst;
import org.junit.Test;
@@ -188,6 +193,42 @@ public class BasicITCase extends AbstractBaseTestITCase {
assertEquals(30112, iterator.next().asPrimitive().toValue());
}
+ /**
+ * Actual an create request for an entity will lead to an "501 - Not Implemented" response
+ * and hence to an ODataServerErrorException
+ */
+ @Test(expected = ODataServerErrorException.class)
+ public void createEntity() throws IOException {
+ final ODataEntityRequest<ODataEntity> request = getClient().getRetrieveRequestFactory()
+ .getEntityRequest(getClient().newURIBuilder(SERVICE_URI)
+ .appendEntitySetSegment("ESCollAllPrim").appendKeySegment(1).build());
+ assertNotNull(request);
+
+ final ODataRetrieveResponse<ODataEntity> response = request.execute();
+ assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+ assertThat(response.getContentType(), containsString(ContentType.APPLICATION_JSON.toContentTypeString()));
+
+ final ODataEntity entity = response.getBody();
+ assertNotNull(entity);
+
+ final ODataEntityCreateRequest<ODataEntity> createRequest = getClient().getCUDRequestFactory()
+ .getEntityCreateRequest(getClient().newURIBuilder(SERVICE_URI)
+ .appendEntitySetSegment("ESCollAllPrim").build(), entity);
+ assertNotNull(createRequest);
+ ODataEntityCreateResponse<ODataEntity> createResponse = createRequest.execute();
+
+ final ODataEntity createdEntity = createResponse.getBody();
+ assertNotNull(createdEntity);
+ final ODataProperty property = createdEntity.getProperty("CollPropertyInt16");
+ assertNotNull(property);
+ assertNotNull(property.getCollectionValue());
+ assertEquals(3, property.getCollectionValue().size());
+ Iterator<ODataValue> iterator = property.getCollectionValue().iterator();
+ assertEquals(1000, iterator.next().asPrimitive().toValue());
+ assertEquals(2000, iterator.next().asPrimitive().toValue());
+ assertEquals(30112, iterator.next().asPrimitive().toValue());
+ }
+
@Override
protected CommonODataClient<?> getClient() {
ODataClient odata = ODataClientFactory.getV4();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
index e84c9c9..f0e3d2d 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
@@ -151,4 +151,17 @@ public class ContentNegotiator {
throw new ContentNegotiatorException("unsupported content type: " + contentType,
ContentNegotiatorException.MessageKeys.UNSUPPORTED_CONTENT_TYPE, contentType.toContentTypeString());
}
+
+ public static boolean isSupported(final ContentType contentType,
+ final CustomContentTypeSupport customContentTypeSupport,
+ final RepresentationType representationType) throws ContentNegotiatorException {
+
+ for (final ContentType supportedContentType :
+ getSupportedContentTypes(customContentTypeSupport, representationType)) {
+ if (AcceptType.fromContentType(supportedContentType).get(0).matches(contentType)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiatorException.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiatorException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiatorException.java
index efd597d..e2ee866 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiatorException.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiatorException.java
@@ -30,6 +30,7 @@ public class ContentNegotiatorException extends ODataTranslatedException {
UNSUPPORTED_CONTENT_TYPES,
/** parameter: content type */
UNSUPPORTED_CONTENT_TYPE,
+ /** no parameter */
NO_CONTENT_TYPE_SUPPORTED,
/** parameter: format string */
UNSUPPORTED_FORMAT_OPTION;
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
index 38f79b5..c367043 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandler.java
@@ -22,7 +22,6 @@ import java.util.LinkedList;
import java.util.List;
import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.api.format.ContentType;
@@ -136,64 +135,70 @@ public class ODataHandler {
}
private void processInternal(final ODataRequest request, final ODataResponse response)
- throws ODataHandlerException, UriParserException, UriValidationException, ContentNegotiatorException,
- ODataApplicationException, SerializerException, DeserializerException {
+ throws ODataHandlerException, UriParserException, UriValidationException, ContentNegotiatorException,
+ ODataApplicationException, SerializerException, DeserializerException {
validateODataVersion(request, response);
uriInfo = new Parser().parseUri(request.getRawODataPath(), request.getRawQueryPath(), null,
- serviceMetadata.getEdm());
+ serviceMetadata.getEdm());
final HttpMethod method = request.getMethod();
new UriValidator().validate(uriInfo, method);
switch (uriInfo.getKind()) {
- case metadata:
- if (method == HttpMethod.GET) {
- final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.METADATA);
- selectProcessor(MetadataProcessor.class)
- .readMetadata(request, response, uriInfo, requestedContentType);
- } else {
- throw new ODataHandlerException("HttpMethod " + method + " not allowed for metadata document",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
- }
- break;
- case service:
- if (method == HttpMethod.GET) {
- if ("".equals(request.getRawODataPath())) {
- selectProcessor(RedirectProcessor.class).redirect(request, response);
- } else {
+ case metadata:
+ if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.SERVICE);
+ request, customContentTypeSupport, RepresentationType.METADATA);
+ selectProcessor(MetadataProcessor.class)
+ .readMetadata(request, response, uriInfo, requestedContentType);
+ } else {
+ throw new ODataHandlerException("HttpMethod " + method + " not allowed for metadata document",
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ }
+ break;
+
+ case service:
+ if (method == HttpMethod.GET) {
+ if ("".equals(request.getRawODataPath())) {
+ selectProcessor(RedirectProcessor.class).redirect(request, response);
+ } else {
+ final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
+ request, customContentTypeSupport, RepresentationType.SERVICE);
+
+ selectProcessor(ServiceDocumentProcessor.class)
+ .readServiceDocument(request, response, uriInfo, requestedContentType);
+ }
+ } else {
+ throw new ODataHandlerException("HttpMethod " + method + " not allowed for service document",
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ }
+ break;
- selectProcessor(ServiceDocumentProcessor.class)
- .readServiceDocument(request, response, uriInfo, requestedContentType);
+ case resource:
+ handleResourceDispatching(request, response);
+ break;
+
+ case batch:
+ if (method == HttpMethod.POST) {
+ final BatchProcessor bp = selectProcessor(BatchProcessor.class);
+ final BatchHandler handler = new BatchHandler(this, bp);
+ handler.process(request, response, true);
+ } else {
+ throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
- } else {
- throw new ODataHandlerException("HttpMethod " + method + " not allowed for service document",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
- }
- break;
- case resource:
- handleResourceDispatching(request, response);
- break;
- case batch:
- if (method == HttpMethod.POST) {
- final BatchProcessor bp = selectProcessor(BatchProcessor.class);
- final BatchHandler handler = new BatchHandler(this, bp);
- handler.process(request, response, true);
- } else {
- throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
- }
- break;
- default:
- throw new ODataHandlerException("not implemented",
- ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
+ break;
+
+ default:
+ throw new ODataHandlerException("not implemented",
+ ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
}
}
- public void handleException(ODataRequest request, ODataResponse response, ODataServerError serverError) {
+ public void handleException(final ODataRequest request, final ODataResponse response,
+ final ODataServerError serverError) {
+
ErrorProcessor exceptionProcessor;
try {
exceptionProcessor = selectProcessor(ErrorProcessor.class);
@@ -204,8 +209,8 @@ public class ODataHandler {
ContentType requestedContentType;
try {
requestedContentType = ContentNegotiator.doContentNegotiation(
- uriInfo == null ? null : uriInfo.getFormatOption(), request, customContentTypeSupport,
- RepresentationType.ERROR);
+ uriInfo == null ? null : uriInfo.getFormatOption(), request, customContentTypeSupport,
+ RepresentationType.ERROR);
} catch (final ContentNegotiatorException e) {
requestedContentType = ODataFormat.JSON.getContentType(ODataServiceVersion.V40);
}
@@ -213,256 +218,260 @@ public class ODataHandler {
}
private void handleResourceDispatching(final ODataRequest request, final ODataResponse response)
- throws ODataHandlerException, ContentNegotiatorException, ODataApplicationException,
- SerializerException, DeserializerException {
+ throws ODataHandlerException, ContentNegotiatorException, ODataApplicationException,
+ SerializerException, DeserializerException {
+
final HttpMethod method = request.getMethod();
final int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
final UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
switch (lastPathSegment.getKind()) {
- case entitySet:
- case navigationProperty:
- handleEntityDispatching(request, response, method, lastPathSegment);
- break;
-
- case count:
- handleCountDispatching(request, response, method, lastPathSegmentIndex);
- break;
-
- case primitiveProperty:
- handlePrimitivePropertyDispatching(request, response, method, (UriResourceProperty) lastPathSegment);
- break;
-
- case complexProperty:
- handleComplexPropertyDispatching(request, response, method, (UriResourceProperty) lastPathSegment);
- break;
-
- case value:
- handleValueDispatching(request, response, method, lastPathSegmentIndex);
- break;
-
- case ref:
- handleReferenceDispatching(request, response, method, lastPathSegmentIndex);
- break;
-
- default:
- throw new ODataHandlerException("not implemented",
- ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
+ case entitySet:
+ case navigationProperty:
+ handleEntityDispatching(request, response, method, (UriResourcePartTyped) lastPathSegment);
+ break;
+
+ case count:
+ handleCountDispatching(request, response, method, lastPathSegmentIndex);
+ break;
+
+ case primitiveProperty:
+ handlePrimitivePropertyDispatching(request, response, method, (UriResourceProperty) lastPathSegment);
+ break;
+
+ case complexProperty:
+ handleComplexPropertyDispatching(request, response, method, (UriResourceProperty) lastPathSegment);
+ break;
+
+ case value:
+ handleValueDispatching(request, response, method, lastPathSegmentIndex);
+ break;
+
+ case ref:
+ handleReferenceDispatching(request, response, method, lastPathSegmentIndex);
+ break;
+
+ default:
+ throw new ODataHandlerException("not implemented",
+ ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
}
}
- private void handleReferenceDispatching(ODataRequest request, ODataResponse response, HttpMethod method, int
- lastPathSegmentIndex)
- throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException, DeserializerException {
+ private void handleReferenceDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method, final int lastPathSegmentIndex)
+ throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+ DeserializerException {
if (((UriResourcePartTyped) uriInfo.getUriResourceParts().get(lastPathSegmentIndex - 1)).isCollection()) {
if (method == HttpMethod.GET) {
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, RepresentationType.COLLECTION_REFERENCE);
selectProcessor(ReferenceCollectionProcessor.class)
- .readReferenceCollection(request, response, uriInfo, responseFormat);
+ .readReferenceCollection(request, response, uriInfo, responseFormat);
} else if (method == HttpMethod.POST) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, RepresentationType.REFERENCE);
+ checkContentTypeSupport(requestFormat, RepresentationType.REFERENCE);
selectProcessor(ReferenceProcessor.class)
- .createReference(request, response, uriInfo, requestFormat);
+ .createReference(request, response, uriInfo, requestFormat);
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
} else {
if (method == HttpMethod.GET) {
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.REFERENCE);
- selectProcessor(ReferenceProcessor.class)
- .readReference(request, response, uriInfo, responseFormat);
+ request, customContentTypeSupport, RepresentationType.REFERENCE);
+ selectProcessor(ReferenceProcessor.class).readReference(request, response, uriInfo, responseFormat);
} else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, RepresentationType.REFERENCE);
+ checkContentTypeSupport(requestFormat, RepresentationType.REFERENCE);
selectProcessor(ReferenceProcessor.class)
- .updateReference(request, response, uriInfo, requestFormat);
+ .updateReference(request, response, uriInfo, requestFormat);
} else if (method == HttpMethod.DELETE) {
selectProcessor(ReferenceProcessor.class)
- .deleteReference(request, response, uriInfo);
+ .deleteReference(request, response, uriInfo);
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
}
- private void handleValueDispatching(ODataRequest request, ODataResponse response, HttpMethod method, int
- lastPathSegmentIndex)
- throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException, DeserializerException {
+ private void handleValueDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method, final int lastPathSegmentIndex)
+ throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+ DeserializerException {
final UriResource resource = uriInfo.getUriResourceParts().get(lastPathSegmentIndex - 1);
if (resource instanceof UriResourceProperty) {
final RepresentationType valueRepresentationType =
- (EdmPrimitiveType) ((UriResourceProperty) resource).getType() ==
- EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary) ?
- RepresentationType.BINARY : RepresentationType.VALUE;
+ ((UriResourceProperty) resource).getType() ==
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary) ?
+ RepresentationType.BINARY : RepresentationType.VALUE;
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, valueRepresentationType);
selectProcessor(PrimitiveValueProcessor.class)
- .readPrimitiveValue(request, response, uriInfo, requestedContentType);
+ .readPrimitiveValue(request, response, uriInfo, requestedContentType);
} else if (method == HttpMethod.PUT) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, valueRepresentationType);
+ checkContentTypeSupport(requestFormat, valueRepresentationType);
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, valueRepresentationType);
+ request, customContentTypeSupport, valueRepresentationType);
selectProcessor(PrimitiveValueProcessor.class)
- .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat);
+ .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat);
} else if (method == HttpMethod.DELETE) {
- selectProcessor(PrimitiveValueProcessor.class)
- .deletePrimitive(request, response, uriInfo);
+ selectProcessor(PrimitiveValueProcessor.class).deletePrimitive(request, response, uriInfo);
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
} else {
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.MEDIA);
+ request, customContentTypeSupport, RepresentationType.MEDIA);
selectProcessor(MediaEntityProcessor.class)
- .readMediaEntity(request, response, uriInfo, requestedContentType);
+ .readMediaEntity(request, response, uriInfo, requestedContentType);
} else if (method == HttpMethod.PUT) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, RepresentationType.ENTITY);
selectProcessor(MediaEntityProcessor.class)
- .updateMediaEntity(request, response, uriInfo, requestFormat, responseFormat);
+ .updateMediaEntity(request, response, uriInfo, requestFormat, responseFormat);
} else if (method == HttpMethod.DELETE) {
- selectProcessor(MediaEntityProcessor.class)
- .deleteEntity(request, response, uriInfo);
+ selectProcessor(MediaEntityProcessor.class).deleteEntity(request, response, uriInfo);
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
}
- private void handleComplexPropertyDispatching(ODataRequest request, ODataResponse response,
- HttpMethod method, UriResourceProperty complexPropertyResource)
- throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException, DeserializerException {
+ private void handleComplexPropertyDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method,
+ final UriResourceProperty complexPropertyResource)
+ throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+ DeserializerException {
+
final RepresentationType complexRepresentationType = complexPropertyResource.isCollection() ?
- RepresentationType.COLLECTION_COMPLEX : RepresentationType.COMPLEX;
+ RepresentationType.COLLECTION_COMPLEX : RepresentationType.COMPLEX;
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, complexRepresentationType);
if (complexRepresentationType == RepresentationType.COMPLEX) {
selectProcessor(ComplexProcessor.class)
- .readComplex(request, response, uriInfo, requestedContentType);
+ .readComplex(request, response, uriInfo, requestedContentType);
} else {
selectProcessor(ComplexCollectionProcessor.class)
- .readComplexCollection(request, response, uriInfo, requestedContentType);
+ .readComplexCollection(request, response, uriInfo, requestedContentType);
}
} else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, complexRepresentationType);
+ checkContentTypeSupport(requestFormat, complexRepresentationType);
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, complexRepresentationType);
+ request, customContentTypeSupport, complexRepresentationType);
if (complexRepresentationType == RepresentationType.COMPLEX) {
selectProcessor(ComplexProcessor.class)
- .updateComplex(request, response, uriInfo, requestFormat, responseFormat);
+ .updateComplex(request, response, uriInfo, requestFormat, responseFormat);
} else {
selectProcessor(ComplexCollectionProcessor.class)
- .updateComplexCollection(request, response, uriInfo, requestFormat, responseFormat);
+ .updateComplexCollection(request, response, uriInfo, requestFormat, responseFormat);
}
} else if (method == HttpMethod.DELETE) {
if (complexRepresentationType == RepresentationType.COMPLEX) {
- selectProcessor(ComplexProcessor.class)
- .deleteComplex(request, response, uriInfo);
+ selectProcessor(ComplexProcessor.class).deleteComplex(request, response, uriInfo);
} else {
- selectProcessor(ComplexCollectionProcessor.class)
- .deleteComplexCollection(request, response, uriInfo);
+ selectProcessor(ComplexCollectionProcessor.class).deleteComplexCollection(request, response, uriInfo);
}
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
- private void handlePrimitivePropertyDispatching(ODataRequest request, ODataResponse response, HttpMethod method,
- UriResourceProperty propertyResource)
- throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException, DeserializerException {
+ private void handlePrimitivePropertyDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method, final UriResourceProperty propertyResource)
+ throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+ DeserializerException {
final RepresentationType representationType = propertyResource.isCollection() ?
- RepresentationType.COLLECTION_PRIMITIVE : RepresentationType.PRIMITIVE;
+ RepresentationType.COLLECTION_PRIMITIVE : RepresentationType.PRIMITIVE;
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, representationType);
if (representationType == RepresentationType.PRIMITIVE) {
- selectProcessor(PrimitiveProcessor.class)
- .readPrimitive(request, response, uriInfo, requestedContentType);
+ selectProcessor(PrimitiveProcessor.class).readPrimitive(request, response, uriInfo, requestedContentType);
} else {
selectProcessor(PrimitiveCollectionProcessor.class)
- .readPrimitiveCollection(request, response, uriInfo, requestedContentType);
+ .readPrimitiveCollection(request, response, uriInfo, requestedContentType);
}
} else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, representationType);
+ checkContentTypeSupport(requestFormat, representationType);
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, representationType);
+ request, customContentTypeSupport, representationType);
if (representationType == RepresentationType.PRIMITIVE) {
selectProcessor(PrimitiveProcessor.class)
- .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat);
+ .updatePrimitive(request, response, uriInfo, requestFormat, responseFormat);
} else {
selectProcessor(PrimitiveCollectionProcessor.class)
- .updatePrimitiveCollection(request, response, uriInfo, requestFormat, responseFormat);
+ .updatePrimitiveCollection(request, response, uriInfo, requestFormat, responseFormat);
}
- } else if (method == HttpMethod.DELETE) {
+ } else if (method == HttpMethod.DELETE) {
if (representationType == RepresentationType.PRIMITIVE) {
- selectProcessor(PrimitiveProcessor.class)
- .deletePrimitive(request, response, uriInfo);
+ selectProcessor(PrimitiveProcessor.class).deletePrimitive(request, response, uriInfo);
} else {
- selectProcessor(PrimitiveCollectionProcessor.class)
- .deletePrimitiveCollection(request, response, uriInfo);
+ selectProcessor(PrimitiveCollectionProcessor.class).deletePrimitiveCollection(request, response, uriInfo);
}
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
- private void handleCountDispatching(ODataRequest request, ODataResponse response, HttpMethod method, int
- lastPathSegmentIndex) throws ODataApplicationException, SerializerException, ODataHandlerException {
+ private void handleCountDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method, final int lastPathSegmentIndex)
+ throws ODataApplicationException, SerializerException, ODataHandlerException {
+
if (method == HttpMethod.GET) {
final UriResource resource = uriInfo.getUriResourceParts().get(lastPathSegmentIndex - 1);
if (resource instanceof UriResourceEntitySet || resource instanceof UriResourceNavigation) {
selectProcessor(CountEntityCollectionProcessor.class)
- .countEntityCollection(request, response, uriInfo);
+ .countEntityCollection(request, response, uriInfo);
} else if (resource instanceof UriResourcePrimitiveProperty) {
selectProcessor(CountPrimitiveCollectionProcessor.class)
- .countPrimitiveCollection(request, response, uriInfo);
+ .countPrimitiveCollection(request, response, uriInfo);
} else {
selectProcessor(CountComplexCollectionProcessor.class)
- .countComplexCollection(request, response, uriInfo);
+ .countComplexCollection(request, response, uriInfo);
}
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed for count.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
- private void handleEntityDispatching(ODataRequest request, ODataResponse response, HttpMethod method, UriResource
- lastPathSegment)
- throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException, DeserializerException {
- if (((UriResourcePartTyped) lastPathSegment).isCollection()) {
+ private void handleEntityDispatching(final ODataRequest request, final ODataResponse response,
+ final HttpMethod method,
+ final UriResourcePartTyped uriResourcePart)
+ throws ContentNegotiatorException, ODataApplicationException, SerializerException, ODataHandlerException,
+ DeserializerException {
+
+ if (uriResourcePart.isCollection()) {
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, RepresentationType.COLLECTION_ENTITY);
selectProcessor(EntityCollectionProcessor.class)
- .readEntityCollection(request, response, uriInfo, requestedContentType);
+ .readEntityCollection(request, response, uriInfo, requestedContentType);
} else if (method == HttpMethod.POST) {
- if (isMedia(lastPathSegment)) {
+ if (isMedia(uriResourcePart)) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, RepresentationType.ENTITY);
selectProcessor(MediaEntityProcessor.class)
- .createMediaEntity(request, response, uriInfo, requestFormat, responseFormat);
+ .createMediaEntity(request, response, uriInfo, requestFormat, responseFormat);
} else {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, RepresentationType.ENTITY);
+ checkContentTypeSupport(requestFormat, RepresentationType.ENTITY);
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
request, customContentTypeSupport, RepresentationType.ENTITY);
selectProcessor(EntityProcessor.class)
@@ -470,50 +479,57 @@ public class ODataHandler {
}
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
} else {
if (method == HttpMethod.GET) {
final ContentType requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.ENTITY);
+ request, customContentTypeSupport, RepresentationType.ENTITY);
- selectProcessor(EntityProcessor.class)
- .readEntity(request, response, uriInfo, requestedContentType);
+ selectProcessor(EntityProcessor.class).readEntity(request, response, uriInfo, requestedContentType);
} else if (method == HttpMethod.PUT || method == HttpMethod.PATCH) {
final ContentType requestFormat = ContentType.parse(request.getHeader(HttpHeader.CONTENT_TYPE));
- ContentNegotiator.checkSupport(requestFormat, customContentTypeSupport, RepresentationType.ENTITY);
+ checkContentTypeSupport(requestFormat, RepresentationType.ENTITY);
final ContentType responseFormat = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
- request, customContentTypeSupport, RepresentationType.ENTITY);
- selectProcessor(EntityProcessor.class)
- .updateEntity(request, response, uriInfo, requestFormat, responseFormat);
+ request, customContentTypeSupport, RepresentationType.ENTITY);
+ selectProcessor(EntityProcessor.class).updateEntity(request, response, uriInfo, requestFormat, responseFormat);
} else if (method == HttpMethod.DELETE) {
- selectProcessor(isMedia(lastPathSegment) ? MediaEntityProcessor.class : EntityProcessor.class)
- .deleteEntity(request, response, uriInfo);
+ selectProcessor(isMedia(uriResourcePart) ? MediaEntityProcessor.class : EntityProcessor.class)
+ .deleteEntity(request, response, uriInfo);
} else {
throw new ODataHandlerException("HTTP method " + method + " is not allowed.",
- ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
+ ODataHandlerException.MessageKeys.HTTP_METHOD_NOT_ALLOWED, method.toString());
}
}
}
+ private void checkContentTypeSupport(ContentType requestFormat, RepresentationType representationType)
+ throws ODataHandlerException, ContentNegotiatorException {
+ if (!ContentNegotiator.isSupported(requestFormat, customContentTypeSupport, representationType)) {
+ final String contentTypeString = requestFormat.toContentTypeString();
+ throw new ODataHandlerException("ContentType " + contentTypeString + " is not supported.",
+ ODataHandlerException.MessageKeys.UNSUPPORTED_CONTENT_TYPE, contentTypeString);
+ }
+ }
+
private void validateODataVersion(final ODataRequest request, final ODataResponse response)
- throws ODataHandlerException {
+ throws ODataHandlerException {
final String maxVersion = request.getHeader(HttpHeader.ODATA_MAX_VERSION);
response.setHeader(HttpHeader.ODATA_VERSION, ODataServiceVersion.V40.toString());
if (maxVersion != null) {
if (ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), maxVersion)) {
throw new ODataHandlerException("ODataVersion not supported: " + maxVersion,
- ODataHandlerException.MessageKeys.ODATA_VERSION_NOT_SUPPORTED, maxVersion);
+ ODataHandlerException.MessageKeys.ODATA_VERSION_NOT_SUPPORTED, maxVersion);
}
}
}
private boolean isMedia(final UriResource pathSegment) {
return pathSegment instanceof UriResourceEntitySet
- && ((UriResourceEntitySet) pathSegment).getEntityType().hasStream()
- || pathSegment instanceof UriResourceNavigation
- && ((EdmEntityType) ((UriResourceNavigation) pathSegment).getType()).hasStream();
+ && ((UriResourceEntitySet) pathSegment).getEntityType().hasStream()
+ || pathSegment instanceof UriResourceNavigation
+ && ((EdmEntityType) ((UriResourceNavigation) pathSegment).getType()).hasStream();
}
private <T extends Processor> T selectProcessor(final Class<T> cls) throws ODataHandlerException {
@@ -524,7 +540,7 @@ public class ODataHandler {
}
}
throw new ODataHandlerException("Processor: " + cls.getSimpleName() + " not registered.",
- ODataHandlerException.MessageKeys.PROCESSOR_NOT_IMPLEMENTED, cls.getSimpleName());
+ ODataHandlerException.MessageKeys.PROCESSOR_NOT_IMPLEMENTED, cls.getSimpleName());
}
public void register(final Processor processor) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerException.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerException.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerException.java
index cc4d662..8ebbc26 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerException.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHandlerException.java
@@ -29,7 +29,8 @@ public class ODataHandlerException extends ODataTranslatedException {
/** parameter: HTTP method */ INVALID_HTTP_METHOD,
/** parameter: HTTP method */ HTTP_METHOD_NOT_ALLOWED,
/** parameter: processor interface */ PROCESSOR_NOT_IMPLEMENTED,
- FUNCTIONALITY_NOT_IMPLEMENTED,
+ /** no parameter */ FUNCTIONALITY_NOT_IMPLEMENTED,
+ /** parameter: content type */ UNSUPPORTED_CONTENT_TYPE,
/** parameter: version */ ODATA_VERSION_NOT_SUPPORTED;
@Override
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/df6ba28c/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
index c61619d..034a6bd 100644
--- a/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
+++ b/lib/server-core/src/main/resources/server-core-exceptions-i18n.properties
@@ -24,6 +24,7 @@ ODataHandlerException.HTTP_METHOD_NOT_ALLOWED=HTTP method '%1$s' not allowed for
ODataHandlerException.PROCESSOR_NOT_IMPLEMENTED=No processor for interface '%1$s' registered.
ODataHandlerException.FUNCTIONALITY_NOT_IMPLEMENTED=The requested functionality has not been implemented (yet).
ODataHandlerException.ODATA_VERSION_NOT_SUPPORTED=OData version '%1$s' is not supported.
+ODataHandlerException.UNSUPPORTED_CONTENT_TYPE=The content type '%1$s' is not supported for this request.
UriParserSyntaxException.MUST_BE_LAST_SEGMENT=The segment '%1$s' must be the last segment.
UriParserSyntaxException.UNKNOWN_SYSTEM_QUERY_OPTION=The system query option '%1$s' is not defined.