diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java index bfdebe3f9..57f73df40 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java @@ -49,21 +49,29 @@ public final class ContentType { private static final String APPLICATION = "application"; private static final String TEXT = "text"; private static final String MULTIPART = "multipart"; - + + public static final String PARAMETER_CHARSET = "charset"; + public static final String PARAMETER_IEEE754_COMPATIBLE = "IEEE754Compatible"; + public static final String PARAMETER_ODATA_METADATA = "odata.metadata"; + + public static final String VALUE_ODATA_METADATA_NONE = "none"; + public static final String VALUE_ODATA_METADATA_MINIMAL = "minimal"; + public static final String VALUE_ODATA_METADATA_FULL = "full"; + public static final ContentType APPLICATION_JSON = new ContentType(APPLICATION, "json", null); - public static final ContentType JSON = ContentType.create(ContentType.APPLICATION_JSON, "odata.metadata=minimal"); - public static final ContentType JSON_NO_METADATA = ContentType.create(ContentType.APPLICATION_JSON, - "odata.metadata=none"); - public static final ContentType JSON_FULL_METADATA = ContentType.create(ContentType.APPLICATION_JSON, - "odata.metadata=full"); - + public static final ContentType JSON = ContentType.create(ContentType.APPLICATION_JSON, + PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_MINIMAL); + public static final ContentType JSON_NO_METADATA = ContentType.create(ContentType.APPLICATION_JSON, + PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_NONE); + public static final ContentType JSON_FULL_METADATA = ContentType.create(ContentType.APPLICATION_JSON, + PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_FULL); + public static final ContentType APPLICATION_XML = new ContentType(APPLICATION, "xml", null); public static final ContentType APPLICATION_ATOM_XML = new ContentType(APPLICATION, "atom+xml", null); public static final ContentType APPLICATION_ATOM_XML_ENTRY = create(APPLICATION_ATOM_XML, "type=entry"); public static final ContentType APPLICATION_ATOM_XML_FEED = create(APPLICATION_ATOM_XML, "type=feed"); public static final ContentType APPLICATION_ATOM_SVC = new ContentType(APPLICATION, "atomsvc+xml", null); - public static final ContentType APPLICATION_OCTET_STREAM = new ContentType(APPLICATION, "octet-stream", null); public static final ContentType APPLICATION_XHTML_XML = new ContentType(APPLICATION, "xhtml+xml", null); @@ -81,14 +89,6 @@ public final class ContentType { public static final ContentType MULTIPART_MIXED = new ContentType(MULTIPART, "mixed", null); public static final ContentType MULTIPART_FORM_DATA = new ContentType(MULTIPART, "form-data", null); - public static final String PARAMETER_CHARSET = "charset"; - public static final String PARAMETER_IEEE754_COMPATIBLE = "IEEE754Compatible"; - public static final String PARAMETER_ODATA_METADATA = "odata.metadata"; - - public static final String VALUE_ODATA_METADATA_NONE = "none"; - public static final String VALUE_ODATA_METADATA_MINIMAL = "minimal"; - public static final String VALUE_ODATA_METADATA_FULL = "full"; - private final String type; private final String subtype; private final Map parameters; @@ -255,7 +255,7 @@ public final class ContentType { public Map getParameters() { return Collections.unmodifiableMap(parameters); } - + /** * Returns the value of a given parameter. * If the parameter does not exists the method returns null @@ -266,7 +266,7 @@ public final class ContentType { public String getParameter(final String name) { return parameters.get(name); } - + @Override public int hashCode() { return 1; @@ -323,7 +323,7 @@ public final class ContentType { public boolean isCompatible(final ContentType other) { return type.equalsIgnoreCase(other.type) && subtype.equalsIgnoreCase(other.subtype); } - + /** *

{@link ContentType}s are compatible * if type and subtype have the same value.

@@ -331,16 +331,16 @@ public final class ContentType { * (for compare with parameters see {@link #equals(Object)}).

* @return true if both instances are compatible (see definition above), otherwise false. */ - public boolean isCompatible(final ContentType...otherTypes) { - for(final ContentType otherType : otherTypes) { - if(isCompatible(otherType)) { + public boolean isCompatible(final ContentType... otherTypes) { + for (final ContentType otherType : otherTypes) { + if (isCompatible(otherType)) { return true; } } - + return false; } - + /** * Checks whether both strings are equal ignoring the case of the strings. * diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java index 8d4100557..b4c414b70 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java @@ -51,99 +51,92 @@ import org.apache.olingo.server.core.uri.UriHelperImpl; public class ODataImpl extends OData { - @Override - public ODataSerializer createSerializer(final ContentType contentType) - throws SerializerException { - ODataSerializer serializer; + @Override + public ODataSerializer createSerializer(final ContentType contentType) throws SerializerException { + ODataSerializer serializer = null; - // odata.metadata=none, odata.metadata=minimal, odata.metadata=full - if (contentType.isCompatible(ContentType.APPLICATION_JSON) - && ContentType.VALUE_ODATA_METADATA_MINIMAL - .equals(contentType.getParameter(ContentType.PARAMETER_ODATA_METADATA))) { - serializer = new ODataJsonSerializer(contentType); - } else if (contentType.isCompatible(ContentType.APPLICATION_XML)) { - serializer = new ODataXmlSerializerImpl(); - } else { - throw new SerializerException("Unsupported format: " - + contentType.toContentTypeString(), - SerializerException.MessageKeys.UNSUPPORTED_FORMAT, - contentType.toContentTypeString()); - } + if (contentType.isCompatible(ContentType.APPLICATION_JSON)) { + final String metadata = contentType.getParameter(ContentType.PARAMETER_ODATA_METADATA); + if (metadata == null + || ContentType.VALUE_ODATA_METADATA_MINIMAL.equals(metadata) + || ContentType.VALUE_ODATA_METADATA_NONE.equals(metadata)) { + serializer = new ODataJsonSerializer(contentType); + } + } else if (contentType.isCompatible(ContentType.APPLICATION_XML)) { + serializer = new ODataXmlSerializerImpl(); + } - return serializer; - } + if (serializer == null) { + throw new SerializerException("Unsupported format: " + contentType.toContentTypeString(), + SerializerException.MessageKeys.UNSUPPORTED_FORMAT, contentType.toContentTypeString()); + } else { + return serializer; + } + } - @Override - public FixedFormatSerializer createFixedFormatSerializer() { - return new FixedFormatSerializerImpl(); - } + @Override + public FixedFormatSerializer createFixedFormatSerializer() { + return new FixedFormatSerializerImpl(); + } - @Override - public ODataHttpHandler createHandler(final ServiceMetadata edm) { - return new ODataHttpHandlerImpl(this, edm); - } + @Override + public ODataHttpHandler createHandler(final ServiceMetadata edm) { + return new ODataHttpHandlerImpl(this, edm); + } - @Override - public ServiceMetadata createServiceMetadata( - final CsdlEdmProvider edmProvider, - final List references) { - return createServiceMetadata(edmProvider, references, null); - } + @Override + public ServiceMetadata createServiceMetadata(final CsdlEdmProvider edmProvider, + final List references) { + return createServiceMetadata(edmProvider, references, null); + } - @Override - public ServiceMetadata createServiceMetadata(CsdlEdmProvider edmProvider, - List references, - ServiceMetadataETagSupport serviceMetadataETagSupport) { - return new ServiceMetadataImpl(edmProvider, references, - serviceMetadataETagSupport); - } + @Override + public ServiceMetadata createServiceMetadata(final CsdlEdmProvider edmProvider, + final List references, final ServiceMetadataETagSupport serviceMetadataETagSupport) { + return new ServiceMetadataImpl(edmProvider, references, serviceMetadataETagSupport); + } - @Override - public FixedFormatDeserializer createFixedFormatDeserializer() { - return new FixedFormatDeserializerImpl(); - } + @Override + public FixedFormatDeserializer createFixedFormatDeserializer() { + return new FixedFormatDeserializerImpl(); + } - @Override - public UriHelper createUriHelper() { - return new UriHelperImpl(); - } + @Override + public UriHelper createUriHelper() { + return new UriHelperImpl(); + } - @Override - public ODataDeserializer createDeserializer(final ContentType contentType) - throws DeserializerException { - ODataDeserializer deserializer; + @Override + public ODataDeserializer createDeserializer(final ContentType contentType) throws DeserializerException { + ODataDeserializer deserializer; - // odata.metadata=none, odata.metadata=minimal, odata.metadata=full - if (contentType.isCompatible(ContentType.JSON)) { - deserializer = new ODataJsonDeserializer(contentType); - // } else if(contentType.isCompatible(ContentType.APPLICATION_XML)) - // We do not support XML deserialization right now so this must lead - // to an error. - // { - } else { - throw new DeserializerException("Unsupported format: " - + contentType.toContentTypeString(), - DeserializerException.MessageKeys.UNSUPPORTED_FORMAT, - contentType.toContentTypeString()); - } + if (contentType.isCompatible(ContentType.JSON)) { + deserializer = new ODataJsonDeserializer(contentType); + // } else if(contentType.isCompatible(ContentType.APPLICATION_XML)) + // We do not support XML deserialization right now so this must lead + // to an error. + // { + } else { + throw new DeserializerException("Unsupported format: " + contentType.toContentTypeString(), + DeserializerException.MessageKeys.UNSUPPORTED_FORMAT, contentType.toContentTypeString()); + } - return deserializer; - } + return deserializer; + } - @Override - public EdmPrimitiveType createPrimitiveTypeInstance( - final EdmPrimitiveTypeKind kind) { - return EdmPrimitiveTypeFactory.getInstance(kind); - } + @Override + public EdmPrimitiveType createPrimitiveTypeInstance(final EdmPrimitiveTypeKind kind) { + return EdmPrimitiveTypeFactory.getInstance(kind); + } - @Override - public ETagHelper createETagHelper() { - return new ETagHelperImpl(); - } + @Override + public ETagHelper createETagHelper() { + return new ETagHelperImpl(); + } - @Override - public Preferences createPreferences(final Collection preferHeaders) { - return new PreferencesImpl(preferHeaders); - } + @Override + public Preferences createPreferences(final Collection preferHeaders) { + return new PreferencesImpl(preferHeaders); + } } diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java index bc48de97d..87a6554b0 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java @@ -23,36 +23,35 @@ import static org.junit.Assert.assertNotNull; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.deserializer.DeserializerException; -import org.apache.olingo.server.api.deserializer.ODataDeserializer; -import org.apache.olingo.server.api.serializer.ODataSerializer; import org.apache.olingo.server.api.serializer.SerializerException; import org.junit.Test; public class ODataImplTest { - - private final OData odata = OData.newInstance(); - - @Test(expected=SerializerException.class) - public void testJsonSerializerForOdataMetadataNone() throws SerializerException { - odata.createSerializer(ContentType.JSON_NO_METADATA); - } - - @Test(expected=SerializerException.class) - public void testJsonSerializerForODataMetadataFull() throws SerializerException { - odata.createSerializer(ContentType.JSON_FULL_METADATA); - } - - @Test - public void testCreateJsonSerializerForODataMetadataMinimal() throws SerializerException { - final ODataSerializer serializer = odata.createSerializer(ContentType.JSON); - - assertNotNull(serializer); - } - - @Test - public void testCreateJsonDeserialierForODataMetadataMinimal() throws DeserializerException { - final ODataDeserializer deserializer = odata.createDeserializer(ContentType.JSON); - - assertNotNull(deserializer); - } + + private final OData odata = OData.newInstance(); + + @Test + public void serializerSupportedFormats() throws SerializerException { + assertNotNull(odata.createSerializer(ContentType.JSON_NO_METADATA)); + assertNotNull(odata.createSerializer(ContentType.JSON)); + assertNotNull(odata.createSerializer(ContentType.APPLICATION_JSON)); + } + + @Test(expected = SerializerException.class) + public void jsonSerializerForODataMetadataFull() throws SerializerException { + odata.createSerializer(ContentType.JSON_FULL_METADATA); + } + + @Test + public void deserializerSupportedFormats() throws DeserializerException { + assertNotNull(odata.createDeserializer(ContentType.JSON_NO_METADATA)); + assertNotNull(odata.createDeserializer(ContentType.JSON)); + assertNotNull(odata.createDeserializer(ContentType.JSON_FULL_METADATA)); + assertNotNull(odata.createDeserializer(ContentType.APPLICATION_JSON)); + } + + @Test(expected = DeserializerException.class) + public void xmlDeserializer() throws DeserializerException { + odata.createDeserializer(ContentType.APPLICATION_XML); + } }