[OLINGO-317] more translatable exceptions
Change-Id: I7cf9ad31b0aa2b136e75133a901516fb02dd11bb Signed-off-by: Christian Amend <chrisam@apache.org>
This commit is contained in:
parent
e4b7ef1a96
commit
633ef32216
|
@ -23,11 +23,12 @@ import org.apache.olingo.commons.api.edm.Edm;
|
||||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||||
import org.apache.olingo.server.api.edm.provider.EdmProvider;
|
import org.apache.olingo.server.api.edm.provider.EdmProvider;
|
||||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||||
|
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Root object for serving factory tasks and support loosely coupling of implementation (core) from the api. This is not
|
* Root object for serving factory tasks and support loosely coupling of implementation (core) from the api.
|
||||||
* a singleton (static variables) to avoid issues with synchronization, OSGi, hot deployment and so on. Each thread
|
* This is not a singleton (static variables) to avoid issues with synchronization, OSGi, hot deployment and so on.
|
||||||
* (request) should keep its own instance.
|
* Each thread (request) should keep its own instance.
|
||||||
*/
|
*/
|
||||||
public abstract class OData {
|
public abstract class OData {
|
||||||
|
|
||||||
|
@ -46,26 +47,25 @@ public abstract class OData {
|
||||||
return (OData) object;
|
return (OData) object;
|
||||||
|
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
// TODO: Change to ODataRuntimeExcfeption
|
|
||||||
throw new ODataRuntimeException(e);
|
throw new ODataRuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new serializer object for rendering content in the specified format. Serializers are used in Processor
|
* Creates a new serializer object for rendering content in the specified format.
|
||||||
* implementations.
|
* Serializers are used in Processor implementations.
|
||||||
* @param format - Any format supported by Olingo (XML, JSON ...)
|
* @param format - Any format supported by Olingo (XML, JSON ...)
|
||||||
*/
|
*/
|
||||||
public abstract ODataSerializer createSerializer(ODataFormat format);
|
public abstract ODataSerializer createSerializer(ODataFormat format) throws ODataSerializerException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ODataHttpHandler for handling OData requests in a http context.
|
* Creates a new ODataHttpHandler for handling OData requests in an HTTP context.
|
||||||
* @param edm - metadata object required to handle an OData request
|
* @param edm - metadata object required to handle an OData request
|
||||||
*/
|
*/
|
||||||
public abstract ODataHttpHandler createHandler(Edm edm);
|
public abstract ODataHttpHandler createHandler(Edm edm);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an metadata object.
|
* Creates an metadata object.
|
||||||
* @param edmProvider - A custom or default implementation for creating metadata
|
* @param edmProvider - A custom or default implementation for creating metadata
|
||||||
*/
|
*/
|
||||||
public abstract Edm createEdm(EdmProvider edmProvider);
|
public abstract Edm createEdm(EdmProvider edmProvider);
|
||||||
|
|
|
@ -36,22 +36,34 @@ public class ODataTranslatedException extends ODataException {
|
||||||
private static final String BUNDLE_NAME = "i18n";
|
private static final String BUNDLE_NAME = "i18n";
|
||||||
|
|
||||||
public static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
|
public static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
|
||||||
// MessageKeys
|
|
||||||
public static final String AMBIGUOUS_XHTTP_METHOD = "ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD";
|
|
||||||
public static final String HTTP_METHOD_NOT_IMPLEMENTED = "ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED";
|
|
||||||
public static final String PROCESSOR_NOT_IMPLEMENTED = "ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED";
|
|
||||||
public static final String ODATA_VERSION_NOT_SUPPORTED = "ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED";
|
|
||||||
|
|
||||||
private String messageKey;
|
protected static interface MessageKey {}
|
||||||
|
|
||||||
|
public static enum MessageKeys implements MessageKey {
|
||||||
|
AMBIGUOUS_XHTTP_METHOD,
|
||||||
|
HTTP_METHOD_NOT_IMPLEMENTED,
|
||||||
|
PROCESSOR_NOT_IMPLEMENTED,
|
||||||
|
FUNCTIONALITY_NOT_IMPLEMENTED,
|
||||||
|
ODATA_VERSION_NOT_SUPPORTED,
|
||||||
|
/** parameters: HTTP header name, HTTP header value */
|
||||||
|
WRONG_CHARSET_IN_HEADER,
|
||||||
|
/** parameter: list of content-type ranges */
|
||||||
|
UNSUPPORTED_CONTENT_TYPES,
|
||||||
|
/** parameter: content type */
|
||||||
|
UNSUPPORTED_CONTENT_TYPE
|
||||||
|
}
|
||||||
|
|
||||||
|
private MessageKey messageKey;
|
||||||
private Object[] parameters;
|
private Object[] parameters;
|
||||||
|
|
||||||
public ODataTranslatedException(String developmentMessage, String messageKey, String... parameters) {
|
public ODataTranslatedException(String developmentMessage, MessageKey messageKey, String... parameters) {
|
||||||
super(developmentMessage);
|
super(developmentMessage);
|
||||||
this.messageKey = messageKey;
|
this.messageKey = messageKey;
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ODataTranslatedException(String developmentMessage, Throwable cause, String messageKey, String... parameters) {
|
public ODataTranslatedException(String developmentMessage, Throwable cause, MessageKey messageKey,
|
||||||
|
String... parameters) {
|
||||||
super(developmentMessage, cause);
|
super(developmentMessage, cause);
|
||||||
this.messageKey = messageKey;
|
this.messageKey = messageKey;
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
|
@ -67,7 +79,7 @@ public class ODataTranslatedException extends ODataException {
|
||||||
return getMessage();
|
return getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMessageKey() {
|
public MessageKey getMessageKey() {
|
||||||
return messageKey;
|
return messageKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +113,7 @@ public class ODataTranslatedException extends ODataException {
|
||||||
String message = null;
|
String message = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
message = bundle.getString(messageKey);
|
message = bundle.getString(getClass().getSimpleName() + '.' + messageKey);
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
Formatter f = new Formatter(builder, locale);
|
Formatter f = new Formatter(builder, locale);
|
||||||
f.format(message, parameters);
|
f.format(message, parameters);
|
||||||
|
|
|
@ -59,10 +59,10 @@ public abstract class EdmProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method should return a {@link ComplexType} or <b>null</b> if nothing is found
|
* This method should return a {@link ComplexType} or <b>null</b> if nothing is found.
|
||||||
*
|
*
|
||||||
* @param complexTypeName
|
* @param complexTypeName
|
||||||
* @return {@link StructuralType} for the given name
|
* @return {@link ComplexType} for the given name
|
||||||
* @throws ODataException
|
* @throws ODataException
|
||||||
*/
|
*/
|
||||||
public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
|
public ComplexType getComplexType(final FullQualifiedName complexTypeName) throws ODataException {
|
||||||
|
@ -92,7 +92,12 @@ public abstract class EdmProvider {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: document
|
/**
|
||||||
|
* This method should return a {@link Term} for the FullQualifiedName or <b>null</b> if nothing is found.
|
||||||
|
* @param termName the name of the Term
|
||||||
|
* @return {@link Term} or null
|
||||||
|
* @throws ODataException
|
||||||
|
*/
|
||||||
public Term getTerm(final FullQualifiedName termName) throws ODataException {
|
public Term getTerm(final FullQualifiedName termName) throws ODataException {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,9 +52,8 @@ public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProce
|
||||||
@Override
|
@Override
|
||||||
public void readServiceDocument(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
|
public void readServiceDocument(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
|
||||||
final ContentType requestedContentType) {
|
final ContentType requestedContentType) {
|
||||||
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
||||||
response.setContent(serializer.serviceDocument(edm, request.getRawBaseUri()));
|
response.setContent(serializer.serviceDocument(edm, request.getRawBaseUri()));
|
||||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||||
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
||||||
|
@ -66,8 +65,8 @@ public class DefaultProcessor implements MetadataProcessor, ServiceDocumentProce
|
||||||
@Override
|
@Override
|
||||||
public void readMetadata(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
|
public void readMetadata(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
|
||||||
final ContentType requestedContentType) {
|
final ContentType requestedContentType) {
|
||||||
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
|
||||||
try {
|
try {
|
||||||
|
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
||||||
response.setContent(serializer.metadataDocument(edm));
|
response.setContent(serializer.metadataDocument(edm));
|
||||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||||
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
||||||
|
|
|
@ -24,27 +24,26 @@ public class ODataSerializerException extends ODataTranslatedException {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5358683245923127425L;
|
private static final long serialVersionUID = 5358683245923127425L;
|
||||||
|
|
||||||
// MessageKeys
|
public static enum MessageKeys implements MessageKey {
|
||||||
public static final String NOT_IMPLEMENTED = "ODataSerializerException.NOT_IMPLEMENTED";
|
NOT_IMPLEMENTED,
|
||||||
public static final String JSON_METADATA = "ODataSerializerException.JSON_METADATA";
|
/** parameter: format */ UNSUPPORTED_FORMAT,
|
||||||
public static final String IO_EXCEPTION = "ODataSerializerException.IO_EXCEPTION";
|
JSON_METADATA,
|
||||||
public static final String NO_CONTEXT_URL = "ODataSerializerException.NO_CONTEXT_URL";
|
IO_EXCEPTION,
|
||||||
/** parameter: property name */
|
NULL_INPUT,
|
||||||
public static final String UNSUPPORTED_PROPERTY_TYPE = "ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE";
|
NO_CONTEXT_URL,
|
||||||
/** parameter: property name */
|
/** parameter: property name */ UNSUPPORTED_PROPERTY_TYPE,
|
||||||
public static final String INCONSISTENT_PROPERTY_TYPE = "ODataSerializerException.INCONSISTENT_PROPERTY_TYPE";
|
/** parameter: property name */ INCONSISTENT_PROPERTY_TYPE,
|
||||||
/** parameter: property name */
|
/** parameter: property name */ MISSING_PROPERTY,
|
||||||
public static final String MISSING_PROPERTY = "ODataSerializerException.MISSING_PROPERTY";
|
/** parameters: property name, property value */ WRONG_PROPERTY_VALUE
|
||||||
/** parameters: property name, property value */
|
}
|
||||||
public static final String WRONG_PROPERTY_VALUE = "ODataSerializerException.WRONG_PROPERTY_VALUE";
|
|
||||||
|
|
||||||
public ODataSerializerException(final String developmentMessage,
|
public ODataSerializerException(final String developmentMessage,
|
||||||
final String messageKey, final String... parameters) {
|
final MessageKey messageKey, final String... parameters) {
|
||||||
super(developmentMessage, messageKey, parameters);
|
super(developmentMessage, messageKey, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ODataSerializerException(final String developmentMessage, final Throwable cause,
|
public ODataSerializerException(final String developmentMessage, final Throwable cause,
|
||||||
final String messageKey, final String... parameters) {
|
final MessageKey messageKey, final String... parameters) {
|
||||||
super(developmentMessage, cause, messageKey, parameters);
|
super(developmentMessage, cause, messageKey, parameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,13 +19,19 @@
|
||||||
# Basic Apache Olingo exception messages
|
# Basic Apache Olingo exception messages
|
||||||
#
|
#
|
||||||
ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD=x-http-method header '%1$s' and x-http-method-override header '%2$s' are not the same.
|
ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD=x-http-method header '%1$s' and x-http-method-override header '%2$s' are not the same.
|
||||||
ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED=Invalid http method given: '%1$s'.
|
ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED=Invalid HTTP method given: '%1$s'.
|
||||||
ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED=No processor for interface '%1$s' registered.
|
ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED=No processor for interface '%1$s' registered.
|
||||||
|
ODataTranslatedException.FUNCTIONALITY_NOT_IMPLEMENTED=The requested functionality has not been implemented (yet).
|
||||||
ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED=OData version '%1$s' is not supported.
|
ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED=OData version '%1$s' is not supported.
|
||||||
|
ODataTranslatedException.WRONG_CHARSET_IN_HEADER=The HTTP header '%1$s' with value '%2$s' contains an invalid character-set specification.
|
||||||
|
ODataTranslatedException.UNSUPPORTED_CONTENT_TYPES=The content-type range '%1$s' is not supported.
|
||||||
|
ODataTranslatedException.UNSUPPORTED_CONTENT_TYPE=The content type '%1$s' is not supported.
|
||||||
|
|
||||||
ODataSerializerException.NOT_IMPLEMENTED=The requested serialization method has not been implemented yet.
|
ODataSerializerException.NOT_IMPLEMENTED=The requested serialization method has not been implemented yet.
|
||||||
|
ODataSerializerException.UNSUPPORTED_FORMAT=The format '%1$s' is not supported.
|
||||||
ODataSerializerException.JSON_METADATA=The metadata document cannot be provided in JSON format.
|
ODataSerializerException.JSON_METADATA=The metadata document cannot be provided in JSON format.
|
||||||
ODataSerializerException.IO_EXCEPTION=An I/O exception occurred.
|
ODataSerializerException.IO_EXCEPTION=An I/O exception occurred.
|
||||||
|
ODataSerializerException.NULL_INPUT=The input 'null' is not allowed here.
|
||||||
ODataSerializerException.NO_CONTEXT_URL=No context URL has been provided.
|
ODataSerializerException.NO_CONTEXT_URL=No context URL has been provided.
|
||||||
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE=The type of the property '%1$s' is not yet supported.
|
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE=The type of the property '%1$s' is not yet supported.
|
||||||
ODataSerializerException.INCONSISTENT_PROPERTY_TYPE=An inconsistency has been detected in the type definition of property '%1$s'.
|
ODataSerializerException.INCONSISTENT_PROPERTY_TYPE=An inconsistency has been detected in the type definition of property '%1$s'.
|
||||||
|
|
|
@ -30,9 +30,9 @@ import org.junit.Test;
|
||||||
public class TranslatedExceptionsTest {
|
public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
private static final String DEV = "devMessage";
|
private static final String DEV = "devMessage";
|
||||||
private static final String BASIC = "BASIC";
|
private static enum Keys implements ODataTranslatedException.MessageKey {
|
||||||
private static final String ONEPARAM = "ONEPARAM";
|
BASIC, ONEPARAM, TWOPARAM, NOMESSAGE
|
||||||
private static final String TWOPARAM = "TWOPARAM";
|
}
|
||||||
|
|
||||||
public TranslatedExceptionsTest() {
|
public TranslatedExceptionsTest() {
|
||||||
// for test reason we assume a system with a default Locale.ENGLISH
|
// for test reason we assume a system with a default Locale.ENGLISH
|
||||||
|
@ -41,7 +41,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void basic() {
|
public void basic() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, BASIC);
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.BASIC);
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -70,7 +70,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void unusedParametersMustNotResultInAnException() {
|
public void unusedParametersMustNotResultInAnException() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, BASIC, "unusedParam1", "unusedParam2");
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.BASIC, "unusedParam1", "unusedParam2");
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -80,7 +80,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void useOneParameter() {
|
public void useOneParameter() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM, "usedParam1");
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.ONEPARAM, "usedParam1");
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -90,7 +90,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void useOneParameterExpectedButMultipleGiven() {
|
public void useOneParameterExpectedButMultipleGiven() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM, "usedParam1", "unusedParam2");
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.ONEPARAM, "usedParam1", "unusedParam2");
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -100,7 +100,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void useTwoParameter() {
|
public void useTwoParameter() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, TWOPARAM, "usedParam1", "usedParam2");
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.TWOPARAM, "usedParam1", "usedParam2");
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -110,7 +110,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void parametersNotGivenAltoughNeeded() {
|
public void parametersNotGivenAltoughNeeded() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, ONEPARAM);
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.ONEPARAM);
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -120,7 +120,7 @@ public class TranslatedExceptionsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noMessageForKey() {
|
public void noMessageForKey() {
|
||||||
ODataTranslatedException exp = new ODataTranslatedException(DEV, "NOMESSAGE");
|
ODataTranslatedException exp = new ODataTranslatedException(DEV, Keys.NOMESSAGE);
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(null);
|
||||||
|
@ -131,11 +131,11 @@ public class TranslatedExceptionsTest {
|
||||||
@Test
|
@Test
|
||||||
public void keyForRootBundleButNotPresentInDerivedBundle() {
|
public void keyForRootBundleButNotPresentInDerivedBundle() {
|
||||||
ODataTranslatedException exp =
|
ODataTranslatedException exp =
|
||||||
new ODataTranslatedException(DEV, ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED, "param1");
|
new ODataTranslatedException(DEV, ODataTranslatedException.MessageKeys.HTTP_METHOD_NOT_IMPLEMENTED, "param1");
|
||||||
assertEquals(DEV, exp.getMessage());
|
assertEquals(DEV, exp.getMessage());
|
||||||
|
|
||||||
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(Locale.GERMAN);
|
ODataErrorMessage translatedMessage = exp.getTranslatedMessage(Locale.GERMAN);
|
||||||
assertNotNull(translatedMessage);
|
assertNotNull(translatedMessage);
|
||||||
assertEquals("Invalid http method given: 'param1'.", translatedMessage.getMessage());
|
assertEquals("Invalid HTTP method given: 'param1'.", translatedMessage.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Licensed to the Apache Software Foundation (ASF) under one
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
# or more contributor license agreements. See the NOTICE file
|
# or more contributor license agreements. See the NOTICE file
|
||||||
# distributed with this work for additional information
|
# distributed with this work for additional information
|
||||||
# regarding copyright ownership. The ASF licenses this file
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
# to you under the Apache License, Version 2.0 (the
|
# to you under the Apache License, Version 2.0 (the
|
||||||
# "License"); you may not use this file except in compliance
|
# "License"); you may not use this file except in compliance
|
||||||
# with the License. You may obtain a copy of the License at
|
# with the License. You may obtain a copy of the License at
|
||||||
#
|
#
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
#
|
#
|
||||||
# Unless required by applicable law or agreed to in writing,
|
# Unless required by applicable law or agreed to in writing,
|
||||||
# software distributed under the License is distributed on an
|
# software distributed under the License is distributed on an
|
||||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
# KIND, either express or implied. See the License for the
|
# KIND, either express or implied. See the License for the
|
||||||
# specific language governing permissions and limitations
|
# specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
BASIC=Test DE
|
ODataTranslatedException.BASIC=Test DE
|
|
@ -1,23 +1,23 @@
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Licensed to the Apache Software Foundation (ASF) under one
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
# or more contributor license agreements. See the NOTICE file
|
# or more contributor license agreements. See the NOTICE file
|
||||||
# distributed with this work for additional information
|
# distributed with this work for additional information
|
||||||
# regarding copyright ownership. The ASF licenses this file
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
# to you under the Apache License, Version 2.0 (the
|
# to you under the Apache License, Version 2.0 (the
|
||||||
# "License"); you may not use this file except in compliance
|
# "License"); you may not use this file except in compliance
|
||||||
# with the License. You may obtain a copy of the License at
|
# with the License. You may obtain a copy of the License at
|
||||||
#
|
#
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
#
|
#
|
||||||
# Unless required by applicable law or agreed to in writing,
|
# Unless required by applicable law or agreed to in writing,
|
||||||
# software distributed under the License is distributed on an
|
# software distributed under the License is distributed on an
|
||||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
# KIND, either express or implied. See the License for the
|
# KIND, either express or implied. See the License for the
|
||||||
# specific language governing permissions and limitations
|
# specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Basic Apache Olingo exception messages
|
# Basic Apache Olingo exception messages
|
||||||
#
|
#
|
||||||
BASIC=Test Default
|
ODataTranslatedException.BASIC=Test Default
|
||||||
ONEPARAM=Param1: %1$s
|
ODataTranslatedException.ONEPARAM=Param1: %1$s
|
||||||
TWOPARAM=Param1: %1$s Param2: %2$s
|
ODataTranslatedException.TWOPARAM=Param1: %1$s Param2: %2$s
|
|
@ -18,13 +18,13 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.olingo.server.core;
|
package org.apache.olingo.server.core;
|
||||||
|
|
||||||
import org.apache.olingo.commons.api.ODataRuntimeException;
|
|
||||||
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
|
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
|
||||||
import org.apache.olingo.commons.api.format.AcceptType;
|
import org.apache.olingo.commons.api.format.AcceptType;
|
||||||
import org.apache.olingo.commons.api.format.ContentType;
|
import org.apache.olingo.commons.api.format.ContentType;
|
||||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||||
import org.apache.olingo.server.api.ODataRequest;
|
import org.apache.olingo.server.api.ODataRequest;
|
||||||
|
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||||
import org.apache.olingo.server.api.processor.CustomContentTypeSupportProcessor;
|
import org.apache.olingo.server.api.processor.CustomContentTypeSupportProcessor;
|
||||||
import org.apache.olingo.server.api.processor.FormatContentTypeMapping;
|
import org.apache.olingo.server.api.processor.FormatContentTypeMapping;
|
||||||
import org.apache.olingo.server.api.processor.MetadataProcessor;
|
import org.apache.olingo.server.api.processor.MetadataProcessor;
|
||||||
|
@ -71,7 +71,7 @@ public class ContentNegotiator {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ContentType doContentNegotiation(final FormatOption formatOption, final ODataRequest request,
|
public static ContentType doContentNegotiation(final FormatOption formatOption, final ODataRequest request,
|
||||||
final Processor processor, final Class<? extends Processor> processorClass) {
|
final Processor processor, final Class<? extends Processor> processorClass) throws ODataTranslatedException {
|
||||||
ContentType requestedContentType = null;
|
ContentType requestedContentType = null;
|
||||||
|
|
||||||
List<FormatContentTypeMapping> supportedContentTypes = getSupportedContentTypes(processor, processorClass);
|
List<FormatContentTypeMapping> supportedContentTypes = getSupportedContentTypes(processor, processorClass);
|
||||||
|
@ -119,7 +119,8 @@ public class ContentNegotiator {
|
||||||
if ("utf8".equalsIgnoreCase(value) || "utf-8".equalsIgnoreCase(value)) {
|
if ("utf8".equalsIgnoreCase(value) || "utf-8".equalsIgnoreCase(value)) {
|
||||||
ct = ContentType.create(ct, ContentType.PARAMETER_CHARSET_UTF8);
|
ct = ContentType.create(ct, ContentType.PARAMETER_CHARSET_UTF8);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataRuntimeException("charset in accept header not supported: " + acceptHeaderValue);
|
throw new ODataTranslatedException("charset in accept header not supported: " + acceptHeaderValue,
|
||||||
|
ODataTranslatedException.MessageKeys.WRONG_CHARSET_IN_HEADER, HttpHeader.ACCEPT, acceptHeaderValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,8 +136,9 @@ public class ContentNegotiator {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestedContentType == null) {
|
if (requestedContentType == null) {
|
||||||
throw new ODataRuntimeException("unsupported accept content type: " + acceptedContentTypes + " != "
|
throw new ODataTranslatedException(
|
||||||
+ supportedContentTypes);
|
"unsupported accept content type: " + acceptedContentTypes + " != " + supportedContentTypes,
|
||||||
|
ODataTranslatedException.MessageKeys.UNSUPPORTED_CONTENT_TYPES, acceptedContentTypes.toString());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -155,8 +157,9 @@ public class ContentNegotiator {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!supported) {
|
if (!supported) {
|
||||||
throw new ODataRuntimeException("unsupported accept content type: " + requestedContentType + " != "
|
throw new ODataTranslatedException(
|
||||||
+ supportedContentTypes);
|
"unsupported accept content type: " + requestedContentType + " != " + supportedContentTypes,
|
||||||
|
ODataTranslatedException.MessageKeys.UNSUPPORTED_CONTENT_TYPE, requestedContentType.toContentTypeString());
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.debug("requested content type: " + requestedContentType);
|
LOG.debug("requested content type: " + requestedContentType);
|
||||||
|
|
|
@ -45,8 +45,8 @@ public class ODataExceptionHandler {
|
||||||
error.setMessage(e.getMessage());
|
error.setMessage(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
ODataSerializer serializer = OData.newInstance().createSerializer(requestedFormat);
|
|
||||||
try {
|
try {
|
||||||
|
ODataSerializer serializer = OData.newInstance().createSerializer(requestedFormat);
|
||||||
resp.setContent(serializer.error(error));
|
resp.setContent(serializer.error(error));
|
||||||
} catch (final ODataSerializerException e1) {}
|
} catch (final ODataSerializerException e1) {}
|
||||||
// Set header
|
// Set header
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.apache.olingo.commons.api.format.ContentType;
|
||||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||||
import org.apache.olingo.commons.api.http.HttpMethod;
|
import org.apache.olingo.commons.api.http.HttpMethod;
|
||||||
|
import org.apache.olingo.commons.api.http.HttpStatusCode;
|
||||||
import org.apache.olingo.server.api.OData;
|
import org.apache.olingo.server.api.OData;
|
||||||
import org.apache.olingo.server.api.ODataApplicationException;
|
import org.apache.olingo.server.api.ODataApplicationException;
|
||||||
import org.apache.olingo.server.api.ODataRequest;
|
import org.apache.olingo.server.api.ODataRequest;
|
||||||
|
@ -105,7 +106,8 @@ public class ODataHandler {
|
||||||
handleResourceDispatching(request, response, uriInfo);
|
handleResourceDispatching(request, response, uriInfo);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
} catch (ODataTranslatedException e) {
|
} catch (ODataTranslatedException e) {
|
||||||
Locale requestedLocale = null;
|
Locale requestedLocale = null;
|
||||||
|
@ -130,8 +132,8 @@ public class ODataHandler {
|
||||||
requestedContentType = ODataFormat.JSON.getContentType(ODataServiceVersion.V40);
|
requestedContentType = ODataFormat.JSON.getContentType(ODataServiceVersion.V40);
|
||||||
}
|
}
|
||||||
exceptionProcessor.processException(request, response, serverError, requestedContentType);
|
exceptionProcessor.processException(request, response, serverError, requestedContentType);
|
||||||
} catch (ODataTranslatedException e1) {
|
} catch (ODataTranslatedException e) {
|
||||||
throw new ODataRuntimeException("Could not instanciate ExceptionProcessor");
|
throw new ODataRuntimeException("Could not instantiate ExceptionProcessor");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,9 +153,8 @@ public class ODataHandler {
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private void
|
private void handleResourceDispatching(final ODataRequest request, final ODataResponse response,
|
||||||
handleResourceDispatching(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo)
|
final UriInfo uriInfo) throws ODataTranslatedException {
|
||||||
throws ODataTranslatedException {
|
|
||||||
int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
|
int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
|
||||||
UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
|
UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
|
||||||
ContentType requestedContentType = null;
|
ContentType requestedContentType = null;
|
||||||
|
@ -169,7 +170,8 @@ public class ODataHandler {
|
||||||
|
|
||||||
cp.readCollection(request, response, uriInfo, requestedContentType);
|
cp.readCollection(request, response, uriInfo, requestedContentType);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (request.getMethod().equals(HttpMethod.GET)) {
|
if (request.getMethod().equals(HttpMethod.GET)) {
|
||||||
|
@ -180,7 +182,8 @@ public class ODataHandler {
|
||||||
|
|
||||||
ep.readEntity(request, response, uriInfo, requestedContentType);
|
ep.readEntity(request, response, uriInfo, requestedContentType);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -194,7 +197,8 @@ public class ODataHandler {
|
||||||
|
|
||||||
cp.readCollection(request, response, uriInfo, requestedContentType);
|
cp.readCollection(request, response, uriInfo, requestedContentType);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (request.getMethod().equals(HttpMethod.GET)) {
|
if (request.getMethod().equals(HttpMethod.GET)) {
|
||||||
|
@ -205,12 +209,14 @@ public class ODataHandler {
|
||||||
|
|
||||||
ep.readEntity(request, response, uriInfo, requestedContentType);
|
ep.readEntity(request, response, uriInfo, requestedContentType);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ODataRuntimeException("not implemented");
|
throw new ODataTranslatedException("not implemented",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,7 +229,7 @@ public class ODataHandler {
|
||||||
if (ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), maxVersion)) {
|
if (ODataServiceVersion.isBiggerThan(ODataServiceVersion.V40.toString(), maxVersion)) {
|
||||||
response.setStatusCode(400);
|
response.setStatusCode(400);
|
||||||
throw new ODataTranslatedException("ODataVersion not supported: " + maxVersion,
|
throw new ODataTranslatedException("ODataVersion not supported: " + maxVersion,
|
||||||
ODataTranslatedException.ODATA_VERSION_NOT_SUPPORTED, maxVersion);
|
ODataTranslatedException.MessageKeys.ODATA_VERSION_NOT_SUPPORTED, maxVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,9 +240,9 @@ public class ODataHandler {
|
||||||
T p = (T) processors.get(cls);
|
T p = (T) processors.get(cls);
|
||||||
|
|
||||||
if (p == null) {
|
if (p == null) {
|
||||||
response.setStatusCode(501);
|
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||||
throw new ODataTranslatedException("Processor: " + cls.getName() + " not registered.",
|
throw new ODataTranslatedException("Processor: " + cls.getName() + " not registered.",
|
||||||
ODataTranslatedException.PROCESSOR_NOT_IMPLEMENTED, cls.getName());
|
ODataTranslatedException.MessageKeys.PROCESSOR_NOT_IMPLEMENTED, cls.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
|
|
|
@ -29,11 +29,13 @@ import org.apache.olingo.server.api.ODataRequest;
|
||||||
import org.apache.olingo.server.api.ODataResponse;
|
import org.apache.olingo.server.api.ODataResponse;
|
||||||
import org.apache.olingo.server.api.ODataTranslatedException;
|
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||||
import org.apache.olingo.server.api.processor.Processor;
|
import org.apache.olingo.server.api.processor.Processor;
|
||||||
|
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
@ -77,9 +79,9 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
|
||||||
ODataResponse resp = new ODataResponse();
|
ODataResponse resp = new ODataResponse();
|
||||||
if (e instanceof ODataTranslatedException) {
|
if (e instanceof ODataTranslatedException) {
|
||||||
ODataTranslatedException exp = (ODataTranslatedException) e;
|
ODataTranslatedException exp = (ODataTranslatedException) e;
|
||||||
if (exp.getMessageKey() == ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD) {
|
if (exp.getMessageKey() == ODataTranslatedException.MessageKeys.AMBIGUOUS_XHTTP_METHOD) {
|
||||||
resp.setStatusCode(HttpStatusCode.BAD_REQUEST.getStatusCode());
|
resp.setStatusCode(HttpStatusCode.BAD_REQUEST.getStatusCode());
|
||||||
} else if (exp.getMessageKey() == ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED) {
|
} else if (exp.getMessageKey() == ODataTranslatedException.MessageKeys.HTTP_METHOD_NOT_IMPLEMENTED) {
|
||||||
resp.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
resp.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,8 +133,9 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
|
||||||
extractUri(odRequest, httpRequest, split);
|
extractUri(odRequest, httpRequest, split);
|
||||||
|
|
||||||
return odRequest;
|
return odRequest;
|
||||||
} catch (IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new ODataRuntimeException(e);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +157,7 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
|
||||||
} else {
|
} else {
|
||||||
if (!xHttpMethod.equalsIgnoreCase(xHttpMethodOverride)) {
|
if (!xHttpMethod.equalsIgnoreCase(xHttpMethodOverride)) {
|
||||||
throw new ODataTranslatedException("Ambiguous X-HTTP-Methods",
|
throw new ODataTranslatedException("Ambiguous X-HTTP-Methods",
|
||||||
ODataTranslatedException.AMBIGUOUS_XHTTP_METHOD, xHttpMethod, xHttpMethodOverride);
|
ODataTranslatedException.MessageKeys.AMBIGUOUS_XHTTP_METHOD, xHttpMethod, xHttpMethodOverride);
|
||||||
}
|
}
|
||||||
odRequest.setMethod(HttpMethod.valueOf(xHttpMethod));
|
odRequest.setMethod(HttpMethod.valueOf(xHttpMethod));
|
||||||
}
|
}
|
||||||
|
@ -163,7 +166,7 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
throw new ODataTranslatedException("Invalid http method" + httpRequest.getMethod(),
|
throw new ODataTranslatedException("Invalid http method" + httpRequest.getMethod(),
|
||||||
ODataTranslatedException.HTTP_METHOD_NOT_IMPLEMENTED, httpRequest.getMethod());
|
ODataTranslatedException.MessageKeys.HTTP_METHOD_NOT_IMPLEMENTED, httpRequest.getMethod());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,13 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.olingo.server.core;
|
package org.apache.olingo.server.core;
|
||||||
|
|
||||||
import org.apache.olingo.commons.api.ODataRuntimeException;
|
|
||||||
import org.apache.olingo.commons.api.edm.Edm;
|
import org.apache.olingo.commons.api.edm.Edm;
|
||||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||||
import org.apache.olingo.server.api.OData;
|
import org.apache.olingo.server.api.OData;
|
||||||
import org.apache.olingo.server.api.ODataHttpHandler;
|
import org.apache.olingo.server.api.ODataHttpHandler;
|
||||||
import org.apache.olingo.server.api.edm.provider.EdmProvider;
|
import org.apache.olingo.server.api.edm.provider.EdmProvider;
|
||||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||||
|
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
||||||
import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
|
import org.apache.olingo.server.core.edm.provider.EdmProviderImpl;
|
||||||
import org.apache.olingo.server.core.serializer.ODataXmlSerializerImpl;
|
import org.apache.olingo.server.core.serializer.ODataXmlSerializerImpl;
|
||||||
import org.apache.olingo.server.core.serializer.json.ODataJsonSerializer;
|
import org.apache.olingo.server.core.serializer.json.ODataJsonSerializer;
|
||||||
|
@ -32,7 +32,7 @@ import org.apache.olingo.server.core.serializer.json.ODataJsonSerializer;
|
||||||
public class ODataImpl extends OData {
|
public class ODataImpl extends OData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ODataSerializer createSerializer(final ODataFormat format) {
|
public ODataSerializer createSerializer(final ODataFormat format) throws ODataSerializerException {
|
||||||
ODataSerializer serializer;
|
ODataSerializer serializer;
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case JSON:
|
case JSON:
|
||||||
|
@ -44,7 +44,8 @@ public class ODataImpl extends OData {
|
||||||
serializer = new ODataXmlSerializerImpl();
|
serializer = new ODataXmlSerializerImpl();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ODataRuntimeException("Unsupported format: " + format);
|
throw new ODataSerializerException("Unsupported format: " + format,
|
||||||
|
ODataSerializerException.MessageKeys.UNSUPPORTED_FORMAT, format.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
|
||||||
@Override
|
@Override
|
||||||
public InputStream serviceDocument(final Edm edm, final String serviceRoot) throws ODataSerializerException {
|
public InputStream serviceDocument(final Edm edm, final String serviceRoot) throws ODataSerializerException {
|
||||||
throw new ODataSerializerException("Service Document not implemented for XML format",
|
throw new ODataSerializerException("Service Document not implemented for XML format",
|
||||||
ODataSerializerException.NOT_IMPLEMENTED);
|
ODataSerializerException.MessageKeys.NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -64,13 +64,15 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
|
||||||
return buffer.getInputStream();
|
return buffer.getInputStream();
|
||||||
} catch (final XMLStreamException e) {
|
} catch (final XMLStreamException e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
} finally {
|
} finally {
|
||||||
if (xmlStreamWriter != null) {
|
if (xmlStreamWriter != null) {
|
||||||
try {
|
try {
|
||||||
xmlStreamWriter.close();
|
xmlStreamWriter.close();
|
||||||
} catch (XMLStreamException e) {
|
} catch (XMLStreamException e) {
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,20 +82,20 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
|
||||||
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity, final ContextURL contextURL)
|
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity, final ContextURL contextURL)
|
||||||
throws ODataSerializerException {
|
throws ODataSerializerException {
|
||||||
throw new ODataSerializerException("Entity serialization not implemented for XML format",
|
throw new ODataSerializerException("Entity serialization not implemented for XML format",
|
||||||
ODataSerializerException.NOT_IMPLEMENTED);
|
ODataSerializerException.MessageKeys.NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream entitySet(final EdmEntitySet edmEntitySet, final EntitySet entitySet,
|
public InputStream entitySet(final EdmEntitySet edmEntitySet, final EntitySet entitySet,
|
||||||
final ContextURL contextURL) throws ODataSerializerException {
|
final ContextURL contextURL) throws ODataSerializerException {
|
||||||
throw new ODataSerializerException("Entityset serialization not implemented for XML format",
|
throw new ODataSerializerException("Entityset serialization not implemented for XML format",
|
||||||
ODataSerializerException.NOT_IMPLEMENTED);
|
ODataSerializerException.MessageKeys.NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream error(ODataServerError error) throws ODataSerializerException {
|
public InputStream error(ODataServerError error) throws ODataSerializerException {
|
||||||
throw new ODataSerializerException("error serialization not implemented for XML format",
|
throw new ODataSerializerException("error serialization not implemented for XML format",
|
||||||
ODataSerializerException.NOT_IMPLEMENTED);
|
ODataSerializerException.MessageKeys.NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,17 +21,19 @@ package org.apache.olingo.server.core.serializer.json;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.olingo.commons.api.Constants;
|
import org.apache.olingo.commons.api.Constants;
|
||||||
import org.apache.olingo.commons.api.ODataRuntimeException;
|
|
||||||
import org.apache.olingo.commons.api.domain.ODataError;
|
import org.apache.olingo.commons.api.domain.ODataError;
|
||||||
import org.apache.olingo.commons.api.domain.ODataErrorDetail;
|
import org.apache.olingo.commons.api.domain.ODataErrorDetail;
|
||||||
|
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonGenerator;
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
|
||||||
public class ODataErrorSerializer {
|
public class ODataErrorSerializer {
|
||||||
|
|
||||||
public void writeErrorDocument(JsonGenerator json, ODataError error) throws IOException {
|
public void writeErrorDocument(JsonGenerator json, final ODataError error)
|
||||||
|
throws IOException, ODataSerializerException {
|
||||||
if (error == null) {
|
if (error == null) {
|
||||||
throw new ODataRuntimeException("ODataError object MUST NOT be null!");
|
throw new ODataSerializerException("ODataError object MUST NOT be null!",
|
||||||
|
ODataSerializerException.MessageKeys.NULL_INPUT);
|
||||||
}
|
}
|
||||||
json.writeStartObject();
|
json.writeStartObject();
|
||||||
json.writeFieldName(Constants.JSON_ERROR);
|
json.writeFieldName(Constants.JSON_ERROR);
|
||||||
|
|
|
@ -83,13 +83,15 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
|
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
} finally {
|
} finally {
|
||||||
if (gen != null) {
|
if (gen != null) {
|
||||||
try {
|
try {
|
||||||
gen.close();
|
gen.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +100,7 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
@Override
|
@Override
|
||||||
public InputStream metadataDocument(final Edm edm) throws ODataSerializerException {
|
public InputStream metadataDocument(final Edm edm) throws ODataSerializerException {
|
||||||
throw new ODataSerializerException("Metadata in JSON format not supported!",
|
throw new ODataSerializerException("Metadata in JSON format not supported!",
|
||||||
ODataSerializerException.JSON_METADATA);
|
ODataSerializerException.MessageKeys.JSON_METADATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -109,7 +111,8 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
new ODataErrorSerializer().writeErrorDocument(json, error);
|
new ODataErrorSerializer().writeErrorDocument(json, error);
|
||||||
json.close();
|
json.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
return buffer.getInputStream();
|
return buffer.getInputStream();
|
||||||
}
|
}
|
||||||
|
@ -123,7 +126,8 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
json.writeStartObject();
|
json.writeStartObject();
|
||||||
if (format != ODataFormat.JSON_NO_METADATA) {
|
if (format != ODataFormat.JSON_NO_METADATA) {
|
||||||
if (contextURL == null) {
|
if (contextURL == null) {
|
||||||
throw new ODataSerializerException("ContextURL null!", ODataSerializerException.NO_CONTEXT_URL);
|
throw new ODataSerializerException("ContextURL null!",
|
||||||
|
ODataSerializerException.MessageKeys.NO_CONTEXT_URL);
|
||||||
} else {
|
} else {
|
||||||
json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
|
json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
|
||||||
}
|
}
|
||||||
|
@ -142,7 +146,8 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
}
|
}
|
||||||
json.close();
|
json.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
return buffer.getInputStream();
|
return buffer.getInputStream();
|
||||||
}
|
}
|
||||||
|
@ -151,7 +156,8 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity, final ContextURL contextURL)
|
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity, final ContextURL contextURL)
|
||||||
throws ODataSerializerException {
|
throws ODataSerializerException {
|
||||||
if (format != ODataFormat.JSON_NO_METADATA && contextURL == null) {
|
if (format != ODataFormat.JSON_NO_METADATA && contextURL == null) {
|
||||||
throw new ODataSerializerException("ContextURL null!", ODataSerializerException.NO_CONTEXT_URL);
|
throw new ODataSerializerException("ContextURL null!",
|
||||||
|
ODataSerializerException.MessageKeys.NO_CONTEXT_URL);
|
||||||
}
|
}
|
||||||
CircleStreamBuffer buffer = new CircleStreamBuffer();
|
CircleStreamBuffer buffer = new CircleStreamBuffer();
|
||||||
try {
|
try {
|
||||||
|
@ -159,7 +165,8 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
writeEntity(edmEntitySet, entity, contextURL, json);
|
writeEntity(edmEntitySet, entity, contextURL, json);
|
||||||
json.close();
|
json.close();
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
throw new ODataSerializerException("An I/O exception occurred.", e, ODataSerializerException.IO_EXCEPTION);
|
throw new ODataSerializerException("An I/O exception occurred.", e,
|
||||||
|
ODataSerializerException.MessageKeys.IO_EXCEPTION);
|
||||||
}
|
}
|
||||||
return buffer.getInputStream();
|
return buffer.getInputStream();
|
||||||
}
|
}
|
||||||
|
@ -198,7 +205,7 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
if (property == null || property.isNull()) {
|
if (property == null || property.isNull()) {
|
||||||
if (edmProperty.isNullable() == Boolean.FALSE) {
|
if (edmProperty.isNullable() == Boolean.FALSE) {
|
||||||
throw new ODataSerializerException("Non-nullable property not present!",
|
throw new ODataSerializerException("Non-nullable property not present!",
|
||||||
ODataSerializerException.MISSING_PROPERTY, edmProperty.getName());
|
ODataSerializerException.MessageKeys.MISSING_PROPERTY, edmProperty.getName());
|
||||||
} else {
|
} else {
|
||||||
json.writeNull();
|
json.writeNull();
|
||||||
}
|
}
|
||||||
|
@ -214,17 +221,18 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
writeComplexValue(edmProperty, property.asComplex(), json);
|
writeComplexValue(edmProperty, property.asComplex(), json);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataSerializerException("Property type not yet supported!",
|
throw new ODataSerializerException("Property type not yet supported!",
|
||||||
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
ODataSerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||||
}
|
}
|
||||||
} catch (final EdmPrimitiveTypeException e) {
|
} catch (final EdmPrimitiveTypeException e) {
|
||||||
throw new ODataSerializerException("Wrong value for property!", e,
|
throw new ODataSerializerException("Wrong value for property!", e,
|
||||||
ODataSerializerException.WRONG_PROPERTY_VALUE, edmProperty.getName(), property.getValue().toString());
|
ODataSerializerException.MessageKeys.WRONG_PROPERTY_VALUE,
|
||||||
|
edmProperty.getName(), property.getValue().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeCollection(EdmProperty edmProperty, Property property, JsonGenerator json)
|
private void writeCollection(EdmProperty edmProperty, Property property, JsonGenerator json)
|
||||||
throws IOException, EdmPrimitiveTypeException, ODataSerializerException {
|
throws IOException, EdmPrimitiveTypeException, ODataSerializerException {
|
||||||
json.writeStartArray();
|
json.writeStartArray();
|
||||||
for (Object value : property.asCollection()) {
|
for (Object value : property.asCollection()) {
|
||||||
switch (property.getValueType()) {
|
switch (property.getValueType()) {
|
||||||
|
@ -233,7 +241,7 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
break;
|
break;
|
||||||
case COLLECTION_GEOSPATIAL:
|
case COLLECTION_GEOSPATIAL:
|
||||||
throw new ODataSerializerException("Property type not yet supported!",
|
throw new ODataSerializerException("Property type not yet supported!",
|
||||||
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
ODataSerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||||
case COLLECTION_ENUM:
|
case COLLECTION_ENUM:
|
||||||
json.writeString(value.toString());
|
json.writeString(value.toString());
|
||||||
break;
|
break;
|
||||||
|
@ -245,24 +253,24 @@ public class ODataJsonSerializer implements ODataSerializer {
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ODataSerializerException("Property type not yet supported!",
|
throw new ODataSerializerException("Property type not yet supported!",
|
||||||
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
ODataSerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
json.writeEndArray();
|
json.writeEndArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writePrimitive(EdmProperty edmProperty, Property property, JsonGenerator json)
|
private void writePrimitive(EdmProperty edmProperty, Property property, JsonGenerator json)
|
||||||
throws EdmPrimitiveTypeException, IOException, ODataSerializerException {
|
throws EdmPrimitiveTypeException, IOException, ODataSerializerException {
|
||||||
if (property.isPrimitive()) {
|
if (property.isPrimitive()) {
|
||||||
writePrimitiveValue(edmProperty, property.asPrimitive(), json);
|
writePrimitiveValue(edmProperty, property.asPrimitive(), json);
|
||||||
} else if (property.isGeospatial()) {
|
} else if (property.isGeospatial()) {
|
||||||
throw new ODataSerializerException("Property type not yet supported!",
|
throw new ODataSerializerException("Property type not yet supported!",
|
||||||
ODataSerializerException.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
ODataSerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||||
} else if (property.isEnum()) {
|
} else if (property.isEnum()) {
|
||||||
writePrimitiveValue(edmProperty, property.asEnum(), json);
|
writePrimitiveValue(edmProperty, property.asEnum(), json);
|
||||||
} else {
|
} else {
|
||||||
throw new ODataSerializerException("Inconsistent property type!",
|
throw new ODataSerializerException("Inconsistent property type!",
|
||||||
ODataSerializerException.INCONSISTENT_PROPERTY_TYPE, edmProperty.getName());
|
ODataSerializerException.MessageKeys.INCONSISTENT_PROPERTY_TYPE, edmProperty.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.olingo.commons.api.http.HttpMethod;
|
||||||
import org.apache.olingo.server.api.OData;
|
import org.apache.olingo.server.api.OData;
|
||||||
import org.apache.olingo.server.api.ODataRequest;
|
import org.apache.olingo.server.api.ODataRequest;
|
||||||
import org.apache.olingo.server.api.ODataResponse;
|
import org.apache.olingo.server.api.ODataResponse;
|
||||||
|
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||||
import org.apache.olingo.server.api.processor.CollectionProcessor;
|
import org.apache.olingo.server.api.processor.CollectionProcessor;
|
||||||
import org.apache.olingo.server.api.processor.CustomContentTypeSupportProcessor;
|
import org.apache.olingo.server.api.processor.CustomContentTypeSupportProcessor;
|
||||||
import org.apache.olingo.server.api.processor.FormatContentTypeMapping;
|
import org.apache.olingo.server.api.processor.FormatContentTypeMapping;
|
||||||
|
@ -105,28 +106,28 @@ public class ContentNegotiatorTest {
|
||||||
private final static Logger LOG = LoggerFactory.getLogger(ContentNegotiatorTest.class);
|
private final static Logger LOG = LoggerFactory.getLogger(ContentNegotiatorTest.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testServiceDocumentSingleCase() {
|
public void testServiceDocumentSingleCase() throws Exception {
|
||||||
String[] useCase = { ACCEPT_CASE_MIN_UTF8, null, ACCEPT_CASE_MIN_UTF8, null, null };
|
String[] useCase = { ACCEPT_CASE_MIN_UTF8, null, ACCEPT_CASE_MIN_UTF8, null, null };
|
||||||
|
|
||||||
testContentNegotiation(useCase, ServiceDocumentProcessor.class);
|
testContentNegotiation(useCase, ServiceDocumentProcessor.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testServiceDocument() {
|
public void testServiceDocument() throws Exception {
|
||||||
for (String[] useCase : casesServiceDocument) {
|
for (String[] useCase : casesServiceDocument) {
|
||||||
testContentNegotiation(useCase, ServiceDocumentProcessor.class);
|
testContentNegotiation(useCase, ServiceDocumentProcessor.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMetadataSingleCase() {
|
public void testMetadataSingleCase() throws Exception {
|
||||||
String[] useCase = { "application/xml", null, null, null, null };
|
String[] useCase = { "application/xml", null, null, null, null };
|
||||||
|
|
||||||
testContentNegotiation(useCase, MetadataProcessor.class);
|
testContentNegotiation(useCase, MetadataProcessor.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMetadata() {
|
public void testMetadata() throws Exception {
|
||||||
for (String[] useCase : casesMetadata) {
|
for (String[] useCase : casesMetadata) {
|
||||||
testContentNegotiation(useCase, MetadataProcessor.class);
|
testContentNegotiation(useCase, MetadataProcessor.class);
|
||||||
}
|
}
|
||||||
|
@ -144,7 +145,8 @@ public class ContentNegotiatorTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testContentNegotiation(final String[] useCase, final Class<? extends Processor> processorClass) {
|
public void testContentNegotiation(final String[] useCase, final Class<? extends Processor> processorClass)
|
||||||
|
throws ODataTranslatedException {
|
||||||
|
|
||||||
LOG.debug(Arrays.asList(useCase).toString());
|
LOG.debug(Arrays.asList(useCase).toString());
|
||||||
|
|
||||||
|
|
|
@ -26,12 +26,12 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.olingo.commons.api.ODataRuntimeException;
|
|
||||||
import org.apache.olingo.commons.api.domain.ODataErrorDetail;
|
import org.apache.olingo.commons.api.domain.ODataErrorDetail;
|
||||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||||
import org.apache.olingo.server.api.OData;
|
import org.apache.olingo.server.api.OData;
|
||||||
import org.apache.olingo.server.api.ODataServerError;
|
import org.apache.olingo.server.api.ODataServerError;
|
||||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||||
|
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ public class ODataErrorSerializerTest {
|
||||||
ODataSerializer ser;
|
ODataSerializer ser;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() {
|
public void before() throws Exception {
|
||||||
ser = OData.newInstance().createSerializer(ODataFormat.JSON);
|
ser = OData.newInstance().createSerializer(ODataFormat.JSON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ public class ODataErrorSerializerTest {
|
||||||
assertEquals("{\"error\":{\"code\":\"Code\",\"message\":\"ErrorMessage\",\"target\":\"Target\"}}", jsonString);
|
assertEquals("{\"error\":{\"code\":\"Code\",\"message\":\"ErrorMessage\",\"target\":\"Target\"}}", jsonString);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = ODataRuntimeException.class)
|
@Test(expected = ODataSerializerException.class)
|
||||||
public void nullErrorResultsInException() throws Exception {
|
public void nullErrorResultsInException() throws Exception {
|
||||||
ser.error(null);
|
ser.error(null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,10 @@ import org.apache.olingo.commons.api.http.HttpStatusCode;
|
||||||
import org.apache.olingo.server.api.OData;
|
import org.apache.olingo.server.api.OData;
|
||||||
import org.apache.olingo.server.api.ODataRequest;
|
import org.apache.olingo.server.api.ODataRequest;
|
||||||
import org.apache.olingo.server.api.ODataResponse;
|
import org.apache.olingo.server.api.ODataResponse;
|
||||||
|
import org.apache.olingo.server.api.ODataTranslatedException;
|
||||||
import org.apache.olingo.server.api.processor.CollectionProcessor;
|
import org.apache.olingo.server.api.processor.CollectionProcessor;
|
||||||
import org.apache.olingo.server.api.processor.EntityProcessor;
|
import org.apache.olingo.server.api.processor.EntityProcessor;
|
||||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||||
import org.apache.olingo.server.api.serializer.ODataSerializerException;
|
|
||||||
import org.apache.olingo.server.api.uri.UriInfo;
|
import org.apache.olingo.server.api.uri.UriInfo;
|
||||||
import org.apache.olingo.server.api.uri.UriInfoResource;
|
import org.apache.olingo.server.api.uri.UriInfoResource;
|
||||||
import org.apache.olingo.server.api.uri.UriResource;
|
import org.apache.olingo.server.api.uri.UriResource;
|
||||||
|
@ -66,20 +66,20 @@ public class TechnicalProcessor implements CollectionProcessor, EntityProcessor
|
||||||
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
|
||||||
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
|
||||||
try {
|
try {
|
||||||
|
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
||||||
final EntitySet entitySet = readEntitySetInternal(edmEntitySet, request.getRawBaseUri());
|
final EntitySet entitySet = readEntitySetInternal(edmEntitySet, request.getRawBaseUri());
|
||||||
if (entitySet == null) {
|
if (entitySet == null) {
|
||||||
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
||||||
} else {
|
} else {
|
||||||
|
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
||||||
response.setContent(serializer.entitySet(edmEntitySet, entitySet, getContextUrl(edmEntitySet)));
|
response.setContent(serializer.entitySet(edmEntitySet, entitySet, getContextUrl(edmEntitySet)));
|
||||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||||
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
||||||
}
|
}
|
||||||
} catch (final DataProvider.DataProviderException e) {
|
} catch (final DataProvider.DataProviderException e) {
|
||||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||||
} catch (final ODataSerializerException e) {
|
} catch (final ODataTranslatedException e) {
|
||||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,20 +91,20 @@ public class TechnicalProcessor implements CollectionProcessor, EntityProcessor
|
||||||
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
|
||||||
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
|
||||||
try {
|
try {
|
||||||
|
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
||||||
final Entity entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
|
final Entity entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
|
||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
||||||
} else {
|
} else {
|
||||||
|
ODataSerializer serializer = odata.createSerializer(ODataFormat.fromContentType(requestedContentType));
|
||||||
response.setContent(serializer.entity(edmEntitySet, entity, getContextUrl(edmEntitySet)));
|
response.setContent(serializer.entity(edmEntitySet, entity, getContextUrl(edmEntitySet)));
|
||||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||||
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
|
||||||
}
|
}
|
||||||
} catch (final DataProvider.DataProviderException e) {
|
} catch (final DataProvider.DataProviderException e) {
|
||||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||||
} catch (final ODataSerializerException e) {
|
} catch (final ODataTranslatedException e) {
|
||||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,17 +136,20 @@ public class TechnicalProcessor implements CollectionProcessor, EntityProcessor
|
||||||
&& uriInfo.getTopOption() == null;
|
&& uriInfo.getTopOption() == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) {
|
private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataTranslatedException {
|
||||||
final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
|
final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
|
||||||
if (resourcePaths.size() != 1) {
|
if (resourcePaths.size() != 1) {
|
||||||
throw new RuntimeException("Invalid resource path.");
|
throw new ODataTranslatedException("Invalid resource path.",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) {
|
if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) {
|
||||||
throw new RuntimeException("Invalid resource type.");
|
throw new ODataTranslatedException("Invalid resource type.",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
final UriResourceEntitySet uriResource = (UriResourceEntitySet) resourcePaths.get(0);
|
final UriResourceEntitySet uriResource = (UriResourceEntitySet) resourcePaths.get(0);
|
||||||
if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry() != null) {
|
if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry() != null) {
|
||||||
throw new RuntimeException("Type filters are not supported.");
|
throw new ODataTranslatedException("Type filters are not supported.",
|
||||||
|
ODataTranslatedException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
return uriResource.getEntitySet();
|
return uriResource.getEntitySet();
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ public class ODataJsonSerializerTest {
|
||||||
ContextURL.Builder.create().entitySet(edmEntitySet).suffix(Suffix.ENTITY).build());
|
ContextURL.Builder.create().entitySet(edmEntitySet).suffix(Suffix.ENTITY).build());
|
||||||
Assert.fail("Expected exception not thrown!");
|
Assert.fail("Expected exception not thrown!");
|
||||||
} catch (final ODataSerializerException e) {
|
} catch (final ODataSerializerException e) {
|
||||||
Assert.assertEquals(ODataSerializerException.WRONG_PROPERTY_VALUE, e.getMessageKey());
|
Assert.assertEquals(ODataSerializerException.MessageKeys.WRONG_PROPERTY_VALUE, e.getMessageKey());
|
||||||
final String message = e.getLocalizedMessage();
|
final String message = e.getLocalizedMessage();
|
||||||
Assert.assertThat(message, CoreMatchers.containsString("PropertyInt16"));
|
Assert.assertThat(message, CoreMatchers.containsString("PropertyInt16"));
|
||||||
Assert.assertThat(message, CoreMatchers.containsString("false"));
|
Assert.assertThat(message, CoreMatchers.containsString("false"));
|
||||||
|
|
Loading…
Reference in New Issue