From 05935a0c3d9141995cdf6547aefc0517360ee94d Mon Sep 17 00:00:00 2001 From: Christian Amend Date: Tue, 7 Apr 2015 13:47:26 +0200 Subject: [PATCH] [OLINGO-603] Delete core dependecies in Tec Scenario --- .../apache/olingo/fit/AbstractServices.java | 34 ++- .../org/apache/olingo/fit/V4Services.java | 115 +++++----- .../core/serialization/ODataBinderImpl.java | 30 ++- .../olingo/client/core/v4/JSONTest.java | 2 +- .../api}/data/AbstractODataObject.java | 15 +- .../olingo/commons/api/data/Annotatable.java | 29 ++- .../olingo/commons/api/data/Annotation.java | 12 +- .../olingo/commons/api/data/ComplexValue.java | 9 +- .../commons/api/data/DeletedEntity.java | 22 +- .../apache/olingo/commons/api/data/Delta.java | 19 +- .../olingo/commons/api/data/DeltaLink.java | 30 ++- .../olingo/commons/api/data/Entity.java | 150 ++++++++----- .../olingo/commons/api/data/EntitySet.java | 63 +++--- .../apache/olingo/commons/api/data/Link.java | 145 ++++++++----- .../olingo/commons/api/data/Linked.java | 43 +++- .../olingo/commons/api/data/Parameter.java | 41 +++- .../olingo/commons/api/data/Property.java | 29 ++- .../olingo/commons/api/data/Valuable.java | 144 ++++++++++--- .../core/data/AbstractAnnotatedObject.java | 54 ----- .../commons/core/data/AbstractValuable.java | 166 -------------- .../commons/core/data/AnnotationImpl.java | 36 ---- .../commons/core/data/ComplexValueImpl.java | 88 -------- .../commons/core/data/DeletedEntityImpl.java | 48 ----- .../olingo/commons/core/data/DeltaImpl.java | 48 ----- .../commons/core/data/DeltaLinkImpl.java | 61 ------ .../olingo/commons/core/data/EntityImpl.java | 204 ------------------ .../commons/core/data/EntitySetImpl.java | 73 ------- .../olingo/commons/core/data/LinkImpl.java | 129 ----------- .../commons/core/data/ParameterImpl.java | 47 ---- .../commons/core/data/PropertyImpl.java | 54 ----- .../core/serialization/AtomDeserializer.java | 44 ++-- .../core/serialization/AtomSerializer.java | 21 +- .../serialization/JsonDeltaDeserializer.java | 13 +- .../core/serialization/JsonDeserializer.java | 26 +-- .../serialization/JsonEntityDeserializer.java | 13 +- .../JsonEntitySetDeserializer.java | 6 +- .../JsonPropertyDeserializer.java | 6 +- .../core/serialization/JsonSerializer.java | 24 +-- .../org/apache/olingo/server/api/OData.java | 14 ++ .../apache/olingo/server/core/ODataImpl.java | 8 + .../json/ODataJsonDeserializer.java | 66 +++--- .../json/ODataJsonSerializerTest.java | 10 +- lib/server-tecsvc/pom.xml | 1 + .../apache/olingo/server/tecsvc/Encoder.java | 132 ++++++++++++ .../server/tecsvc/data/DataCreator.java | 131 ++++++----- .../server/tecsvc/data/DataProvider.java | 23 +- .../server/tecsvc/data/FunctionData.java | 24 +-- .../processor/TechnicalEntityProcessor.java | 8 +- .../TechnicalPrimitiveComplexProcessor.java | 14 +- .../tecsvc/processor/TechnicalProcessor.java | 5 + .../ExpandSystemQueryOptionHandler.java | 11 +- .../expression/operand/TypedOperand.java | 58 +++-- .../expression/operand/UntypedOperand.java | 70 +++--- .../expression/operand/VisitorOperand.java | 57 +++-- .../expression/operation/BinaryOperator.java | 124 ++++++----- .../operation/MethodCallOperator.java | 91 +++++--- .../expression/operation/UnaryOperator.java | 20 +- .../expression/primitive/EdmNull.java | 112 +++++++++- .../queryoptions/options/FilterHandler.java | 32 ++- .../options/ServerSidePagingHandler.java | 2 +- .../json/ODataJsonSerializerTest.java | 3 +- .../server/sample/data/DataProvider.java | 25 +-- 62 files changed, 1367 insertions(+), 1767 deletions(-) rename lib/{commons-core/src/main/java/org/apache/olingo/commons/core => commons-api/src/main/java/org/apache/olingo/commons/api}/data/AbstractODataObject.java (87%) delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractAnnotatedObject.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractValuable.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AnnotationImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ComplexValueImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeletedEntityImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaLinkImpl.java delete mode 100755 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntityImpl.java delete mode 100755 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntitySetImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/LinkImpl.java delete mode 100644 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ParameterImpl.java delete mode 100755 lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/PropertyImpl.java create mode 100644 lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/Encoder.java diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java index de8c10eaf..a57f11b34 100644 --- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java +++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java @@ -81,10 +81,6 @@ import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataSerializer; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.commons.core.serialization.AtomSerializer; import org.apache.olingo.commons.core.serialization.JsonDeserializer; @@ -231,14 +227,14 @@ public abstract class AbstractServices { @GET @Path("/StoredPIs(1000)") public Response getStoredPI(@Context final UriInfo uriInfo) { - final Entity entity = new EntityImpl(); + final Entity entity = new Entity(); entity.setType("Microsoft.Test.OData.Services.ODataWCFService.StoredPI"); - final Property id = new PropertyImpl(); + final Property id = new Property(); id.setType("Edm.Int32"); id.setName("StoredPIID"); id.setValue(ValueType.PRIMITIVE, 1000); entity.getProperties().add(id); - final Link edit = new LinkImpl(); + final Link edit = new Link(); edit.setHref(uriInfo.getRequestUri().toASCIIString()); edit.setRel("edit"); edit.setTitle("StoredPI"); @@ -622,7 +618,7 @@ public abstract class AbstractServices { final Entity entry; final String entityKey; if (xml.isMediaContent(entitySetName)) { - entry = new EntityImpl(); + entry = new Entity(); entry.setMediaContentType(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString()); entry.setType(entitySet.getType()); @@ -632,7 +628,7 @@ public abstract class AbstractServices { final Pair id = Commons.getMediaContent().get(entitySetName); if (id != null) { - final Property prop = new PropertyImpl(); + final Property prop = new Property(); prop.setName(id.getKey()); prop.setType(id.getValue().toString()); prop.setValue(ValueType.PRIMITIVE, @@ -644,7 +640,7 @@ public abstract class AbstractServices { entry.getProperties().add(prop); } - final Link editLink = new LinkImpl(); + final Link editLink = new Link(); editLink.setHref(Commons.getEntityURI(entitySetName, entityKey)); editLink.setRel("edit"); editLink.setTitle(entitySetName); @@ -691,7 +687,7 @@ public abstract class AbstractServices { if ((this instanceof V4KeyAsSegment)) { location = uriInfo.getRequestUri().toASCIIString() + "/" + entityKey; - final Link editLink = new LinkImpl(); + final Link editLink = new Link(); editLink.setRel("edit"); editLink.setTitle(entitySetName); editLink.setHref(location); @@ -1207,7 +1203,7 @@ public abstract class AbstractServices { final Entity entry = container.getPayload(); if ((this instanceof V4KeyAsSegment)) { - final Link editLink = new LinkImpl(); + final Link editLink = new Link(); editLink.setRel("edit"); editLink.setTitle(entitySetName); editLink.setHref(Constants.get(ConstantKey.DEFAULT_SERVICE_URL) + entitySetName + "/" + entityId); @@ -1248,7 +1244,7 @@ public abstract class AbstractServices { for (Link link : entry.getNavigationLinks()) { if (links.contains(link.getTitle())) { // expand link - final Link rep = new LinkImpl(); + final Link rep = new Link(); rep.setHref(link.getHref()); rep.setRel(link.getRel()); rep.setTitle(link.getTitle()); @@ -1904,7 +1900,7 @@ public abstract class AbstractServices { for (Property property : entity.getProperties()) { if (navProperties.containsKey(property.getName())) { - Link alink = new LinkImpl(); + Link alink = new Link(); alink.setTitle(property.getName()); alink.getAnnotations().addAll(property.getAnnotations()); @@ -1915,9 +1911,9 @@ public abstract class AbstractServices { alink.setRel(Constants.get(ConstantKey.ATOM_LINK_REL) + property.getName()); if (property.isCollection()) { - EntitySet inline = new EntitySetImpl(); + EntitySet inline = new EntitySet(); for (Object value : property.asCollection()) { - Entity inlineEntity = new EntityImpl(); + Entity inlineEntity = new Entity(); inlineEntity.setType(navProperties.get(property.getName()).getType()); for (Property prop : ((ComplexValue) value).getValue()) { inlineEntity.getProperties().add(prop); @@ -1926,7 +1922,7 @@ public abstract class AbstractServices { } alink.setInlineEntitySet(inline); } else if (property.isComplex()) { - Entity inline = new EntityImpl(); + Entity inline = new Entity(); inline.setType(navProperties.get(property.getName()).getType()); for (Property prop : property.asComplex().getValue()) { inline.getProperties().add(prop); @@ -1946,7 +1942,7 @@ public abstract class AbstractServices { final EntityType entityType = metadata.getEntityOrComplexType(entitySet.getType()); for (Map.Entry property : entityType.getPropertyMap().entrySet()) { if (entry.getProperty(property.getKey()) == null && property.getValue().isNullable()) { - final PropertyImpl prop = new PropertyImpl(); + final Property prop = new Property(); prop.setName(property.getKey()); prop.setValue(ValueType.PRIMITIVE, null); entry.getProperties().add(prop); @@ -1962,7 +1958,7 @@ public abstract class AbstractServices { } if (!found) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(property.getKey()); link.setType(property.getValue().isEntitySet() ? Constants.get(ConstantKey.ATOM_LINK_FEED) diff --git a/fit/src/main/java/org/apache/olingo/fit/V4Services.java b/fit/src/main/java/org/apache/olingo/fit/V4Services.java index fe9465e7f..6c1038ddd 100644 --- a/fit/src/main/java/org/apache/olingo/fit/V4Services.java +++ b/fit/src/main/java/org/apache/olingo/fit/V4Services.java @@ -18,42 +18,25 @@ */ package org.apache.olingo.fit; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.apache.cxf.interceptor.InInterceptors; -import org.apache.cxf.jaxrs.ext.multipart.Attachment; -import org.apache.cxf.jaxrs.ext.multipart.Multipart; -import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ResWrap; -import org.apache.olingo.commons.api.data.ValueType; -import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; -import org.apache.olingo.commons.api.format.ContentType; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; -import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; -import org.apache.olingo.fit.metadata.Metadata; -import org.apache.olingo.fit.methods.PATCH; -import org.apache.olingo.fit.rest.ResolvingReferencesInterceptor; -import org.apache.olingo.fit.rest.XHTTPMethodInterceptor; -import org.apache.olingo.fit.utils.AbstractUtilities; -import org.apache.olingo.fit.utils.Accept; -import org.apache.olingo.fit.utils.Commons; -import org.apache.olingo.fit.utils.ConstantKey; -import org.apache.olingo.fit.utils.Constants; -import org.apache.olingo.fit.utils.FSManager; -import org.apache.olingo.fit.utils.LinkInfo; -import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Pattern; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; +import javax.ws.rs.BadRequestException; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; @@ -72,23 +55,35 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.regex.Pattern; - -import javax.ws.rs.BadRequestException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.cxf.interceptor.InInterceptors; +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.Multipart; +import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; +import org.apache.olingo.commons.api.data.Entity; +import org.apache.olingo.commons.api.data.EntitySet; +import org.apache.olingo.commons.api.data.Link; +import org.apache.olingo.commons.api.data.Property; +import org.apache.olingo.commons.api.data.ResWrap; +import org.apache.olingo.commons.api.data.ValueType; +import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; +import org.apache.olingo.commons.api.format.ContentType; +import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; +import org.apache.olingo.fit.metadata.Metadata; +import org.apache.olingo.fit.methods.PATCH; +import org.apache.olingo.fit.rest.ResolvingReferencesInterceptor; +import org.apache.olingo.fit.rest.XHTTPMethodInterceptor; +import org.apache.olingo.fit.utils.AbstractUtilities; +import org.apache.olingo.fit.utils.Accept; +import org.apache.olingo.fit.utils.Commons; +import org.apache.olingo.fit.utils.ConstantKey; +import org.apache.olingo.fit.utils.Constants; +import org.apache.olingo.fit.utils.FSManager; +import org.apache.olingo.fit.utils.LinkInfo; +import org.springframework.stereotype.Service; @Service @Path("/V40/Static.svc") @@ -504,7 +499,7 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final Property property = new PropertyImpl(); + final Property property = new Property(); property.setType("Edm.Int32"); property.setValue(ValueType.PRIMITIVE, 2); final ResWrap container = new ResWrap( @@ -565,27 +560,27 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final EntityImpl entry = new EntityImpl(); + final Entity entry = new Entity(); entry.setType("Microsoft.Test.OData.Services.ODataWCFService.ProductDetail"); - final Property productId = new PropertyImpl(); + final Property productId = new Property(); productId.setName("ProductID"); productId.setType("Edm.Int32"); productId.setValue(ValueType.PRIMITIVE, Integer.valueOf(entityId)); entry.getProperties().add(productId); - final Property productDetailId = new PropertyImpl(); + final Property productDetailId = new Property(); productDetailId.setName("ProductDetailID"); productDetailId.setType("Edm.Int32"); productDetailId.setValue(ValueType.PRIMITIVE, 2); entry.getProperties().add(productDetailId); - final Link link = new LinkImpl(); + final Link link = new Link(); link.setRel("edit"); link.setHref(URI.create( Constants.get(ConstantKey.DEFAULT_SERVICE_URL) + "ProductDetails(ProductID=6,ProductDetailID=1)").toASCIIString()); entry.setEditLink(link); - final EntitySetImpl feed = new EntitySetImpl(); + final EntitySet feed = new EntitySet(); feed.getEntities().add(entry); final ResWrap container = new ResWrap( @@ -736,7 +731,7 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final Property property = new PropertyImpl(); + final Property property = new Property(); property.setType("Edm.Double"); property.setValue(ValueType.PRIMITIVE, 41.79); @@ -1144,7 +1139,7 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); property.setType("Microsoft.Test.OData.Services.ODataWCFService.Color"); property.setValue(ValueType.ENUM, "Red"); final ResWrap container = new ResWrap( @@ -1236,7 +1231,7 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); property.setType("Collection(String)"); final List value = Arrays.asList("Cheetos", "Mushrooms", "Apple", "Car", "Computer"); property.setValue(ValueType.COLLECTION_PRIMITIVE, value); @@ -1268,7 +1263,7 @@ public class V4Services extends AbstractServices { acceptType = Accept.parse(accept); } - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); property.setType("Collection(Edm.String)"); property.setValue(ValueType.COLLECTION_PRIMITIVE, Arrays.asList("first@olingo.apache.org", "second@olingo.apache.org")); diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java index 2ae47f1a7..54823e0c4 100644 --- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java +++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java @@ -87,12 +87,6 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.geo.Geospatial; import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.serialization.ODataSerializerException; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.domain.ODataAnnotationImpl; import org.apache.olingo.commons.core.domain.ODataDeletedEntityImpl; import org.apache.olingo.commons.core.domain.ODataDeltaLinkImpl; @@ -187,7 +181,7 @@ public class ODataBinderImpl implements ODataBinder { private void annotations(final ODataAnnotatable odataAnnotatable, final Annotatable annotatable) { for (ODataAnnotation odataAnnotation : odataAnnotatable.getAnnotations()) { - final Annotation annotation = new AnnotationImpl(); + final Annotation annotation = new Annotation(); annotation.setTerm(odataAnnotation.getTerm()); annotation.setType(odataAnnotation.getValue().getTypeName()); @@ -199,7 +193,7 @@ public class ODataBinderImpl implements ODataBinder { @Override public EntitySet getEntitySet(final ODataEntitySet odataEntitySet) { - final EntitySet entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); entitySet.setCount(odataEntitySet.getCount()); @@ -248,7 +242,7 @@ public class ODataBinderImpl implements ODataBinder { @Override public Entity getEntity(final ODataEntity odataEntity) { - final Entity entity = new EntityImpl(); + final Entity entity = new Entity(); entity.setType(odataEntity.getTypeName() == null ? null : odataEntity.getTypeName().toString()); @@ -257,7 +251,7 @@ public class ODataBinderImpl implements ODataBinder { // ------------------------------------------------------------- final URI odataEditLink = odataEntity.getEditLink(); if (odataEditLink != null) { - final LinkImpl editLink = new LinkImpl(); + final Link editLink = new Link(); editLink.setTitle(entity.getType()); editLink.setHref(odataEditLink.toASCIIString()); editLink.setRel(Constants.EDIT_LINK_REL); @@ -265,7 +259,7 @@ public class ODataBinderImpl implements ODataBinder { } if (odataEntity.isReadOnly()) { - final LinkImpl selfLink = new LinkImpl(); + final Link selfLink = new Link(); selfLink.setTitle(entity.getType()); selfLink.setHref(odataEntity.getLink().toASCIIString()); selfLink.setRel(Constants.SELF_LINK_REL); @@ -301,7 +295,7 @@ public class ODataBinderImpl implements ODataBinder { @Override public Link getLink(final ODataLink link) { - final Link linkResource = new LinkImpl(); + final Link linkResource = new Link(); linkResource.setRel(link.getRel()); linkResource.setTitle(link.getName()); linkResource.setHref(link.getLink() == null ? null : link.getLink().toASCIIString()); @@ -328,7 +322,7 @@ public class ODataBinderImpl implements ODataBinder { @Override public Property getProperty(final ODataProperty property) { - final Property propertyResource = new PropertyImpl(); + final Property propertyResource = new Property(); propertyResource.setName(property.getName()); updateValuable(propertyResource, property); annotations(property, propertyResource); @@ -350,7 +344,7 @@ public class ODataBinderImpl implements ODataBinder { for (final ODataProperty propertyValue : value.asComplex()) { complexProperties.add(getProperty(propertyValue)); } - final ComplexValue lcValueResource = new ComplexValueImpl(); + final ComplexValue lcValueResource = new ComplexValue(); lcValueResource.getValue().addAll(complexProperties); annotations(value.asComplex(), lcValueResource); links(value.asComplex(), lcValueResource); @@ -573,16 +567,16 @@ public class ODataBinderImpl implements ODataBinder { private ODataLink createLinkFromNavigationProperty(final Property property, final String propertyTypeName) { if (property.isCollection()) { - EntitySet inlineEntitySet = new EntitySetImpl(); + EntitySet inlineEntitySet = new EntitySet(); for (final Object inlined : property.asCollection()) { - Entity inlineEntity = new EntityImpl(); + Entity inlineEntity = new Entity(); inlineEntity.setType(propertyTypeName); inlineEntity.getProperties().addAll(((ComplexValue) inlined).getValue()); inlineEntitySet.getEntities().add(inlineEntity); } return createODataInlineEntitySet(inlineEntitySet, null, property.getName(), null); } else { - Entity inlineEntity = new EntityImpl(); + Entity inlineEntity = new Entity(); inlineEntity.setType(propertyTypeName); inlineEntity.getProperties().addAll(property.asComplex().getValue()); return createODataInlineEntity(inlineEntity, null, property.getName(), null); @@ -751,7 +745,7 @@ public class ODataBinderImpl implements ODataBinder { value = client.getObjectFactory().newCollectionValue(type == null ? null : "Collection(" + type.toString() + ")"); for (Object _value : valuable.asCollection()) { - final Property fake = new PropertyImpl(); + final Property fake = new Property(); fake.setValue(valuable.getValueType().getBaseType(), _value); value.asCollection().add(getODataValue(type, fake, contextURL, metadataETag)); } diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java index 19f39e6b7..0f6cb195c 100644 --- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java +++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java @@ -146,7 +146,7 @@ public class JSONTest extends AbstractTest { final StringWriter writer = new StringWriter(); getClient().getSerializer(format).write(writer, getClient().getDeserializer(format).toEntity( getClass().getResourceAsStream(filename + "." + getSuffix(format))).getPayload()); - + assertSimilar(filename + "." + getSuffix(format), writer.toString()); } diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractODataObject.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/AbstractODataObject.java similarity index 87% rename from lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractODataObject.java rename to lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/AbstractODataObject.java index 6a3c46ff6..2904bfd2e 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractODataObject.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/AbstractODataObject.java @@ -16,17 +16,22 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.olingo.commons.core.data; +package org.apache.olingo.commons.api.data; import java.net.URI; import java.text.ParseException; -public abstract class AbstractODataObject extends AbstractAnnotatedObject { +public abstract class AbstractODataObject extends Annotatable { private URI baseURI; private URI id; private String title; + /** + * Gets base URI. + * + * @return base URI. + */ public URI getBaseURI() { return baseURI; } @@ -35,6 +40,12 @@ public abstract class AbstractODataObject extends AbstractAnnotatedObject { this.baseURI = baseURI == null ? null : URI.create(baseURI); } + + /** + * Gest ID. + * + * @return ID. + */ public URI getId() { return id; } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotatable.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotatable.java index b2e358328..b43002f4f 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotatable.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotatable.java @@ -18,12 +18,37 @@ */ package org.apache.olingo.commons.api.data; +import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + /** * An element with instance annotations. */ -public interface Annotatable { +public abstract class Annotatable { - List getAnnotations(); + private final List annotations = new ArrayList(); + + public List getAnnotations() { + return annotations; + } + + @Override + public boolean equals(final Object obj) { + return EqualsBuilder.reflectionEquals(this, obj); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotation.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotation.java index f4e9d90ba..1b1741a59 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotation.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Annotation.java @@ -21,9 +21,15 @@ package org.apache.olingo.commons.api.data; /** * Represents an instance annotation. */ -public interface Annotation extends Valuable { +public class Annotation extends Valuable { - String getTerm(); + private String term; - void setTerm(String term); + public String getTerm() { + return term; + } + + public void setTerm(final String term) { + this.term = term; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ComplexValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ComplexValue.java index ea5b528f3..d2611b343 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ComplexValue.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/ComplexValue.java @@ -18,9 +18,14 @@ */ package org.apache.olingo.commons.api.data; +import java.util.ArrayList; import java.util.List; -public interface ComplexValue extends Linked, Annotatable { +public class ComplexValue extends Linked { - List getValue(); + private final List value = new ArrayList(); + + public List getValue() { + return value; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeletedEntity.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeletedEntity.java index 77993c0ca..e51abfc36 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeletedEntity.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeletedEntity.java @@ -20,17 +20,31 @@ package org.apache.olingo.commons.api.data; import java.net.URI; -public interface DeletedEntity { +public class DeletedEntity { - enum Reason { + public enum Reason { deleted, changed } - URI getId(); + private URI id; + private Reason reason; - Reason getReason(); + public URI getId() { + return id; + } + public void setId(final URI id) { + this.id = id; + } + + public Reason getReason() { + return reason; + } + + public void setReason(final Reason reason) { + this.reason = reason; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Delta.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Delta.java index 430932576..5fe36f7e0 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Delta.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Delta.java @@ -18,14 +18,25 @@ */ package org.apache.olingo.commons.api.data; +import java.util.ArrayList; import java.util.List; -public interface Delta extends EntitySet { +public class Delta extends EntitySet { - List getDeletedEntities(); + private final List deletedEntities = new ArrayList(); + private final List addedLinks = new ArrayList(); + private final List deletedLinks = new ArrayList(); - List getAddedLinks(); + public List getDeletedEntities() { + return deletedEntities; + } - List getDeletedLinks(); + public List getAddedLinks() { + return addedLinks; + } + + public List getDeletedLinks() { + return deletedLinks; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeltaLink.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeltaLink.java index 6c09fc819..335863ed7 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeltaLink.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/DeltaLink.java @@ -20,17 +20,33 @@ package org.apache.olingo.commons.api.data; import java.net.URI; -public interface DeltaLink extends Annotatable { +public class DeltaLink extends Annotatable { - URI getSource(); + private URI source; + private String relationship; + private URI target; - void setSource(URI source); + public URI getSource() { + return source; + } - String getRelationship(); + public void setSource(final URI source) { + this.source = source; + } - void setRelationship(String relationship); + public String getRelationship() { + return relationship; + } - URI getTarget(); + public void setRelationship(final String relationship) { + this.relationship = relationship; + } - void setTarget(URI target); + public URI getTarget() { + return target; + } + + public void setTarget(final URI target) { + this.target = target; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Entity.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Entity.java index 4029cc3c4..acd30225a 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Entity.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Entity.java @@ -21,93 +21,110 @@ package org.apache.olingo.commons.api.data; import org.apache.olingo.commons.api.domain.ODataOperation; import java.net.URI; +import java.util.ArrayList; import java.util.List; -public interface Entity extends Linked, Annotatable { +public class Entity extends Linked { + + private String eTag; + private String type; + + private Link readLink; + private Link editLink; + + private final List mediaEditLinks = new ArrayList(); + private final List operations = new ArrayList(); + + private final List properties = new ArrayList(); + + private URI mediaContentSource; + private String mediaContentType; + private String mediaETag; /** * Gets ETag. * * @return ETag. */ - String getETag(); + public String getETag() { + return eTag; + } - /** - * Gets base URI. - * - * @return base URI. - */ - URI getBaseURI(); + public void setETag(final String eTag) { + this.eTag = eTag; + } /** * Gets entity type. * * @return entity type. */ - String getType(); + public String getType() { + return type; + } /** * Sets entity type. * * @param type entity type. */ - void setType(String type); - - /** - * Gets entity ID. - * - * @return entity ID. - */ - URI getId(); - - /** - * Sets entity ID. - * - * @param id entity ID. - */ - void setId(URI id); + public void setType(final String type) { + this.type = type; + } /** * Gets entity self link. * * @return self link. */ - Link getSelfLink(); + public Link getSelfLink() { + return readLink; + } /** * Sets entity self link. * * @param selfLink self link. */ - void setSelfLink(Link selfLink); + public void setSelfLink(final Link selfLink) { + this.readLink = selfLink; + } /** * Gets entity edit link. * * @return edit link. */ - Link getEditLink(); + public Link getEditLink() { + return editLink; + } /** * Sets entity edit link. * * @param editLink edit link. */ - void setEditLink(Link editLink); + public void setEditLink(final Link editLink) { + this.editLink = editLink; + } /** * Gets media entity links. * * @return links. */ - List getMediaEditLinks(); + public List getMediaEditLinks() { + return mediaEditLinks; + } /** * Gets operations. * * @return operations. */ - List getOperations(); + public List getOperations() { + return operations; + } /** * Add property to this Entity. @@ -115,14 +132,19 @@ public interface Entity extends Linked, Annotatable { * @param property property which is added * @return this Entity for fluid/flow adding */ - Entity addProperty(Property property); + public Entity addProperty(final Property property) { + properties.add(property); + return this; + } /** * Gets properties. * * @return properties. */ - List getProperties(); + public List getProperties() { + return properties; + } /** * Gets property with given name. @@ -130,54 +152,78 @@ public interface Entity extends Linked, Annotatable { * @param name property name * @return property with given name if found, null otherwise */ - Property getProperty(String name); + public Property getProperty(final String name) { + Property result = null; + + for (Property property : properties) { + if (name.equals(property.getName())) { + result = property; + } + } + + return result; + } /** * Gets media content type. * * @return media content type. */ - String getMediaContentType(); - - /** - * Gets media content resource. - * - * @return media content resource. - */ - URI getMediaContentSource(); - - /** - * Set media content source. - * - * @param mediaContentSource media content source. - */ - void setMediaContentSource(URI mediaContentSource); + public String getMediaContentType() { + return mediaContentType; + } /** * Set media content type. * * @param mediaContentType media content type. */ - void setMediaContentType(String mediaContentType); + public void setMediaContentType(final String mediaContentType) { + this.mediaContentType = mediaContentType; + } + + /** + * Gets media content resource. + * + * @return media content resource. + */ + public URI getMediaContentSource() { + return mediaContentSource; + } + + /** + * Set media content source. + * + * @param mediaContentSource media content source. + */ + public void setMediaContentSource(final URI mediaContentSource) { + this.mediaContentSource = mediaContentSource; + } /** * ETag of the binary stream represented by this media entity or named stream property. * * @return media ETag value */ - String getMediaETag(); + public String getMediaETag() { + return mediaETag; + } /** * Set media ETag. * * @param eTag media ETag value */ - void setMediaETag(String eTag); + public void setMediaETag(final String eTag) { + mediaETag = eTag; + } /** * Checks if the current entity is a media entity. * * @return 'TRUE' if is a media entity; 'FALSE' otherwise. */ - boolean isMediaEntity(); + public boolean isMediaEntity() { + return mediaContentSource != null; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntitySet.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntitySet.java index ad7e4fbb7..8f2cfb7b0 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntitySet.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntitySet.java @@ -19,70 +19,79 @@ package org.apache.olingo.commons.api.data; import java.net.URI; +import java.util.ArrayList; import java.util.List; -public interface EntitySet extends Annotatable { +public class EntitySet extends AbstractODataObject { - /** - * Gets base URI. - * - * @return base URI. - */ - URI getBaseURI(); + private Integer count; + + private final List entities = new ArrayList(); + + private URI next; + + private URI deltaLink; /** * Sets number of entries. * * @param count number of entries */ - void setCount(Integer count); + public void setCount(final Integer count) { + this.count = count; + } /** * Gets number of entries - if it was required. * * @return number of entries into the entity set. */ - Integer getCount(); - - /** - * Gest ID. - * - * @return ID. - */ - URI getId(); + public Integer getCount() { + return count; + } /** * Gets entities. * * @return entries. */ - List getEntities(); - - /** - * Gets next link if exists. - * - * @return next link if exists; null otherwise. - */ - URI getNext(); + public List getEntities() { + return entities; + } /** * Sets next link. * * @param next next link. */ - void setNext(URI next); + public void setNext(final URI next) { + this.next = next; + } + + /** + * Gets next link if exists. + * + * @return next link if exists; null otherwise. + */ + public URI getNext() { + return next; + } /** * Gets delta link if exists. * * @return delta link if exists; null otherwise. */ - URI getDeltaLink(); + public URI getDeltaLink() { + return deltaLink; + } /** * Sets delta link. * * @param deltaLink delta link. */ - void setDeltaLink(URI deltaLink); + public void setDeltaLink(final URI deltaLink) { + this.deltaLink = deltaLink; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Link.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Link.java index 88742f549..dff1069eb 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Link.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Link.java @@ -18,130 +18,177 @@ */ package org.apache.olingo.commons.api.data; +import java.util.ArrayList; import java.util.List; -public interface Link extends Annotatable { +public class Link extends Annotatable { - /** - * Gets rel info. - * - * @return rel info. - */ - String getRel(); - - /** - * Sets rel info. - * - * @param rel rel info. - */ - void setRel(String rel); - - /** - * Gets type. - * - * @return type. - */ - String getType(); - - /** - * Sets type. - * - * @param type type. - */ - void setType(String type); + private String title; + private String rel; + private String href; + private String type; + private String mediaETag; + private Entity entity; + private EntitySet entitySet; + private String bindingLink; + private List bindingLinks = new ArrayList(); /** * Gets title. * * @return title. */ - String getTitle(); + public String getTitle() { + return title; + } /** * Sets title. * * @param title title. */ - void setTitle(String title); + public void setTitle(final String title) { + this.title = title; + } + + /** + * Gets rel info. + * + * @return rel info. + */ + public String getRel() { + return rel; + } + + /** + * Sets rel info. + * + * @param rel rel info. + */ + public void setRel(final String rel) { + this.rel = rel; + } /** * Gets href. * * @return href. */ - String getHref(); + public String getHref() { + return href; + } /** * Sets href. * * @param href href. */ - void setHref(String href); + public void setHref(final String href) { + this.href = href; + } + + /** + * Gets type. + * + * @return type. + */ + public String getType() { + return type; + } + + /** + * Sets type. + * + * @param type type. + */ + public void setType(final String type) { + this.type = type; + } /** * Gets Media ETag. * * @return media ETag */ - String getMediaETag(); + public String getMediaETag() { + return mediaETag; + } /** * Sets Media ETag. * - * @param etag media ETag + * @param mediaETag media ETag */ - void setMediaETag(String etag); + public void setMediaETag(final String mediaETag) { + this.mediaETag = mediaETag; + } /** * Gets in-line entity. * * @return in-line entity. */ - Entity getInlineEntity(); + public Entity getInlineEntity() { + return entity; + } /** * Sets in-line entity. * * @param entity entity. */ - void setInlineEntity(Entity entity); + public void setInlineEntity(final Entity entity) { + this.entity = entity; + } + /** * Gets in-line entity set. * * @return in-line entity set. */ - EntitySet getInlineEntitySet(); + public EntitySet getInlineEntitySet() { + return entitySet; + } /** * Sets in-line entity set. * * @param entitySet entity set. */ - void setInlineEntitySet(EntitySet entitySet); + public void setInlineEntitySet(final EntitySet entitySet) { + this.entitySet = entitySet; + } /** * If this is a "toOne" relationship this method delivers the binding link or null if not set. * @return String the binding link. */ - String getBindingLink(); - - /** - * Sets the binding link. - * @param bindingLink - */ - void setBindingLink(String bindingLink); + public String getBindingLink() { + return bindingLink; + } /** * If this is a "toMany" relationship this method delivers the binding links or emptyList if not set. * @return a list of binding links. */ - List getBindingLinks(); + public List getBindingLinks() { + return bindingLinks; + } + + /** + * Sets the binding link. + * @param bindingLink + */ + public void setBindingLink(String bindingLink) { + this.bindingLink = bindingLink; + } /** * Sets the binding links. List MUST NOT be null. * @param bindingLinks */ - void setBindingLinks(List bindingLinks); - + public void setBindingLinks(List bindingLinks) { + this.bindingLinks = bindingLinks; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Linked.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Linked.java index 1c28507a7..c136d55db 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Linked.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Linked.java @@ -18,9 +18,26 @@ */ package org.apache.olingo.commons.api.data; +import java.util.ArrayList; import java.util.List; -public interface Linked { +public abstract class Linked extends AbstractODataObject { + + private final List associationLinks = new ArrayList(); + private final List navigationLinks = new ArrayList(); + private final List bindingLinks = new ArrayList(); + + protected Link getOneByTitle(final String name, final List links) { + Link result = null; + + for (Link link : links) { + if (name.equals(link.getTitle())) { + result = link; + } + } + + return result; + } /** * Gets association link with given name, if available, otherwise null. @@ -28,14 +45,18 @@ public interface Linked { * @param name candidate link name * @return association link with given name, if available, otherwise null */ - Link getAssociationLink(String name); + public Link getAssociationLink(final String name) { + return getOneByTitle(name, associationLinks); + } /** * Gets association links. * * @return association links. */ - List getAssociationLinks(); + public List getAssociationLinks() { + return associationLinks; + } /** * Gets navigation link with given name, if available, otherwise null. @@ -43,26 +64,34 @@ public interface Linked { * @param name candidate link name * @return navigation link with given name, if available, otherwise null */ - Link getNavigationLink(String name); + public Link getNavigationLink(final String name) { + return getOneByTitle(name, navigationLinks); + } /** * Gets navigation links. * * @return links. */ - List getNavigationLinks(); + public List getNavigationLinks() { + return navigationLinks; + } /** * Gets binding link with given name, if available, otherwise null. * @param name candidate link name * @return binding link with given name, if available, otherwise null */ - Link getNavigationBinding(String name); + public Link getNavigationBinding(String name) { + return getOneByTitle(name, bindingLinks); + } /** * Gets binding links. * * @return links. */ - List getNavigationBindings(); + public List getNavigationBindings() { + return bindingLinks; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Parameter.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Parameter.java index 87058ec5f..a5443c757 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Parameter.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Parameter.java @@ -18,15 +18,46 @@ */ package org.apache.olingo.commons.api.data; -public interface Parameter extends Valuable { +public class Parameter extends Valuable { + + String name; /** * @return name of the parameter */ - String getName(); + public String getName() { + return name; + } - boolean isEntity(); - - Entity asEntity(); + /** + * @param name of the parameter + */ + public void setName(String name) { + this.name = name; + } + + /** + * Check if Valuable contains a ENTITY or COLLECTION_ENTITY ValueType + * + * @return true if ValueType is a ENTITY or COLLECTION_ENTITY, otherwise false + */ + public boolean isEntity() { + if (isCollection()) { + return getValueType().getBaseType() == ValueType.ENTITY; + } + return getValueType() == ValueType.ENTITY; + } + + /** + * Get the value in its entity representation or null if it is not based on an entity ValueType + * + * @return entity representation or null if it is not based on an entity ValueType + */ + public Entity asEntity() { + if (isCollection()) { + return null; + } + return isEntity() ? (Entity) getValue() : null; + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Property.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Property.java index 28163dd8b..ef0adbd09 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Property.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Property.java @@ -18,9 +18,32 @@ */ package org.apache.olingo.commons.api.data; -public interface Property extends Valuable, Annotatable { +public class Property extends Valuable { - String getName(); + private String name; - void setName(String name); + public Property() {} + + public Property(final String type, final String name) { + this.name = name; + super.setType(type); + } + + public Property(String type, String name, ValueType valueType, Object value) { + this(type, name); + setValue(valueType, value); + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public boolean isNull() { + return getValue() == null || "Edm.Null".equals(getType()); + } } diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Valuable.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Valuable.java index 78989b3bf..f982aabf6 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Valuable.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/Valuable.java @@ -18,96 +18,178 @@ */ package org.apache.olingo.commons.api.data; -import org.apache.olingo.commons.api.edm.geo.Geospatial; - import java.util.List; -public interface Valuable { +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.olingo.commons.api.edm.geo.Geospatial; - String getType(); +public abstract class Valuable extends Annotatable { - void setType(String type); + private ValueType valueType = null; + private Object value = null; + private String type; - boolean isNull(); + public boolean isNull() { + return value == null; + } + public String getType() { + return type; + } + + public void setType(final String type) { + this.type = type; + } + /** * Check if Valuable contains a PRIMITIVE or COLLECTION_PRIMITIVE ValueType * * @return true if ValueType is a PRIMITIVE or COLLECTION_PRIMITIVE, otherwise false */ - boolean isPrimitive(); + public boolean isPrimitive() { + if(isCollection()) { + return valueType.getBaseType() == ValueType.PRIMITIVE; + } + return valueType == ValueType.PRIMITIVE; + } /** * Check if Valuable contains a GEOSPATIAL or COLLECTION_GEOSPATIAL ValueType * * @return true if ValueType is a GEOSPATIAL or COLLECTION_GEOSPATIAL, otherwise false */ - boolean isGeospatial(); + public boolean isGeospatial() { + if(isCollection()) { + return valueType.getBaseType() == ValueType.GEOSPATIAL; + } + return valueType == ValueType.GEOSPATIAL; + } + /** * Check if Valuable contains a ENUM or COLLECTION_ENUM ValueType * * @return true if ValueType is a ENUM or COLLECTION_ENUM, otherwise false */ - boolean isEnum(); + public boolean isEnum() { + if(isCollection()) { + return valueType.getBaseType() == ValueType.ENUM; + } + return valueType == ValueType.ENUM; + } /** * Check if Valuable contains a COMPLEX or COLLECTION_COMPLEX ValueType * * @return true if ValueType is a COMPLEX or COLLECTION_COMPLEX, otherwise false */ - boolean isComplex(); + public boolean isComplex() { + if(isCollection()) { + return valueType.getBaseType() == ValueType.COMPLEX; + } + return valueType == ValueType.COMPLEX; + } /** * Check if Valuable contains a COLLECTION_* ValueType * * @return true if ValueType is a COLLECTION_*, otherwise false */ - boolean isCollection(); - - /** - * Get the value - * - * @return the value - */ - Object getValue(); + public boolean isCollection() { + return valueType != null && valueType != valueType.getBaseType(); + } /** * Get the value in its primitive representation or null if it is not based on a primitive ValueType * * @return primitive representation or null if it is not based on a primitive ValueType */ - Object asPrimitive(); - - /** - * Get the value in its enum representation or null if it is not based on a enum ValueType - * - * @return enum representation or null if it is not based on a enum ValueType - */ - Object asEnum(); + public Object asPrimitive() { + if(isCollection()) { + return null; + } + return isPrimitive() ? value : null; + } /** * Get the value in its geospatial representation or null if it is not based on a geospatial ValueType * * @return geospatial representation or null if it is not based on a geospatial ValueType */ - Geospatial asGeospatial(); + public Geospatial asGeospatial() { + if(isCollection()) { + return null; + } + return isGeospatial() ? (Geospatial) value : null; + } + + /** + * Get the value in its enum representation or null if it is not based on a enum ValueType + * + * @return enum representation or null if it is not based on a enum ValueType + */ + public Object asEnum() { + if(isCollection()) { + return null; + } + return isEnum() ? value : null; + } /** * Get the value in its complex representation or null if it is not based on a complex ValueType * * @return primitive complex or null if it is not based on a complex ValueType */ - ComplexValue asComplex(); + public ComplexValue asComplex() { + if(isCollection()) { + return null; + } + return isComplex() ? (ComplexValue) value : null; + } /** * Get the value as collection or null if it is not a collection ValueType * * @return collection or null if it is not a collection ValueType */ - List asCollection(); + public List asCollection() { + return isCollection() ? (List) value : null; + } - void setValue(ValueType valuetype, Object value); + /** + * Get the value + * + * @return the value + */ + public Object getValue() { + return value; + } - ValueType getValueType(); + public void setValue(final ValueType valueType, final Object value) { + this.valueType = valueType; + this.value = value; + } + + public ValueType getValueType() { + return valueType; + } + + + @Override + public boolean equals(final Object obj) { + return EqualsBuilder.reflectionEquals(this, obj); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); + } } diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractAnnotatedObject.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractAnnotatedObject.java deleted file mode 100644 index d8cdf051b..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractAnnotatedObject.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import org.apache.olingo.commons.api.data.Annotatable; -import org.apache.olingo.commons.api.data.Annotation; - -import java.util.ArrayList; -import java.util.List; - -public abstract class AbstractAnnotatedObject implements Annotatable { - - private final List annotations = new ArrayList(); - - @Override - public List getAnnotations() { - return annotations; - } - - @Override - public boolean equals(final Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); - } - - @Override - public int hashCode() { - return HashCodeBuilder.reflectionHashCode(this); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractValuable.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractValuable.java deleted file mode 100644 index 3a0651165..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AbstractValuable.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import org.apache.olingo.commons.api.data.Annotatable; -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.ComplexValue; -import org.apache.olingo.commons.api.data.Valuable; -import org.apache.olingo.commons.api.data.ValueType; -import org.apache.olingo.commons.api.edm.geo.Geospatial; - -public abstract class AbstractValuable implements Valuable, Annotatable { - - private ValueType valueType = null; - private Object value = null; - private final List annotations = new ArrayList(); - private String type; - - @Override - public boolean isNull() { - return value == null; - } - - @Override - public String getType() { - return type; - } - - @Override - public void setType(final String type) { - this.type = type; - } - - @Override - public boolean isPrimitive() { - if(isCollection()) { - return valueType.getBaseType() == ValueType.PRIMITIVE; - } - return valueType == ValueType.PRIMITIVE; - } - - @Override - public boolean isGeospatial() { - if(isCollection()) { - return valueType.getBaseType() == ValueType.GEOSPATIAL; - } - return valueType == ValueType.GEOSPATIAL; - } - - @Override - public boolean isEnum() { - if(isCollection()) { - return valueType.getBaseType() == ValueType.ENUM; - } - return valueType == ValueType.ENUM; - } - - @Override - public boolean isComplex() { - if(isCollection()) { - return valueType.getBaseType() == ValueType.COMPLEX; - } - return valueType == ValueType.COMPLEX; - } - - @Override - public boolean isCollection() { - return valueType != null && valueType != valueType.getBaseType(); - } - - @Override - public Object asPrimitive() { - if(isCollection()) { - return null; - } - return isPrimitive() ? value : null; - } - - @Override - public Geospatial asGeospatial() { - if(isCollection()) { - return null; - } - return isGeospatial() ? (Geospatial) value : null; - } - - @Override - public Object asEnum() { - if(isCollection()) { - return null; - } - return isEnum() ? value : null; - } - - @Override - public ComplexValue asComplex() { - if(isCollection()) { - return null; - } - return isComplex() ? (ComplexValue) value : null; - } - - @Override - public List asCollection() { - return isCollection() ? (List) value : null; - } - - @Override - public Object getValue() { - return value; - } - - @Override - public void setValue(final ValueType valueType, final Object value) { - this.valueType = valueType; - this.value = value; - } - - @Override - public ValueType getValueType() { - return valueType; - } - - @Override - public List getAnnotations() { - return annotations; - } - - @Override - public boolean equals(final Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); - } - - @Override - public int hashCode() { - return HashCodeBuilder.reflectionHashCode(this); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE); - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AnnotationImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AnnotationImpl.java deleted file mode 100644 index 4e9953b47..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/AnnotationImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Annotation; - -public class AnnotationImpl extends AbstractValuable implements Annotation { - - private String term; - - @Override - public String getTerm() { - return term; - } - - @Override - public void setTerm(final String term) { - this.term = term; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ComplexValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ComplexValueImpl.java deleted file mode 100644 index c50f51aeb..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ComplexValueImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Annotation; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.ComplexValue; -import org.apache.olingo.commons.api.data.Property; - -import java.util.ArrayList; -import java.util.List; - -public class ComplexValueImpl implements ComplexValue { - - private final List value = new ArrayList(); - private final List associationLinks = new ArrayList(); - private final List navigationLinks = new ArrayList(); - private final List bindingLinks = new ArrayList(); - private final List annotations = new ArrayList(); - - @Override - public List getValue() { - return value; - } - - private Link getOneByTitle(final String name, final List links) { - Link result = null; - - for (Link link : links) { - if (name.equals(link.getTitle())) { - result = link; - } - } - - return result; - } - - @Override - public Link getAssociationLink(final String name) { - return getOneByTitle(name, associationLinks); - } - - @Override - public List getAssociationLinks() { - return associationLinks; - } - - @Override - public Link getNavigationLink(final String name) { - return getOneByTitle(name, navigationLinks); - } - - @Override - public List getNavigationLinks() { - return navigationLinks; - } - - @Override - public List getAnnotations() { - return annotations; - } - - @Override - public Link getNavigationBinding(String name) { - return getOneByTitle(name, bindingLinks); - } - - @Override - public List getNavigationBindings() { - return bindingLinks; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeletedEntityImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeletedEntityImpl.java deleted file mode 100644 index 657e652c1..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeletedEntityImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.DeletedEntity; - -import java.net.URI; - -public class DeletedEntityImpl extends AbstractAnnotatedObject implements DeletedEntity { - - private URI id; - private Reason reason; - - @Override - public URI getId() { - return id; - } - - public void setId(final URI id) { - this.id = id; - } - - @Override - public Reason getReason() { - return reason; - } - - public void setReason(final Reason reason) { - this.reason = reason; - } - -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaImpl.java deleted file mode 100644 index 3165bd4a9..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.DeletedEntity; -import org.apache.olingo.commons.api.data.Delta; -import org.apache.olingo.commons.api.data.DeltaLink; - -import java.util.ArrayList; -import java.util.List; - -public class DeltaImpl extends EntitySetImpl implements Delta { - - private final List deletedEntities = new ArrayList(); - private final List addedLinks = new ArrayList(); - private final List deletedLinks = new ArrayList(); - - @Override - public List getDeletedEntities() { - return deletedEntities; - } - - @Override - public List getAddedLinks() { - return addedLinks; - } - - @Override - public List getDeletedLinks() { - return deletedLinks; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaLinkImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaLinkImpl.java deleted file mode 100644 index 91a1569af..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/DeltaLinkImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.DeltaLink; - -import java.net.URI; - -public class DeltaLinkImpl extends AbstractAnnotatedObject implements DeltaLink { - - private URI source; - private String relationship; - private URI target; - - @Override - public URI getSource() { - return source; - } - - @Override - public void setSource(final URI source) { - this.source = source; - } - - @Override - public String getRelationship() { - return relationship; - } - - @Override - public void setRelationship(final String relationship) { - this.relationship = relationship; - } - - @Override - public URI getTarget() { - return target; - } - - @Override - public void setTarget(final URI target) { - this.target = target; - } - -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntityImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntityImpl.java deleted file mode 100755 index 38dd7484b..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntityImpl.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.Link; -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.domain.ODataOperation; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -/** - * Class implementing an OData entity. - */ -public class EntityImpl extends AbstractODataObject implements Entity { - - private String eTag; - - private String type; - - private Link readLink; - private Link editLink; - - private final List associationLinks = new ArrayList(); - private final List navigationLinks = new ArrayList(); - private final List mediaEditLinks = new ArrayList(); - private final List bindingLinks = new ArrayList(); - - private final List operations = new ArrayList(); - - private final List properties = new ArrayList(); - - private URI mediaContentSource; - private String mediaContentType; - private String mediaETag; - - @Override - public String getETag() { - return eTag; - } - - public void setETag(final String eTag) { - this.eTag = eTag; - } - - @Override - public String getType() { - return type; - } - - @Override - public void setType(final String type) { - this.type = type; - } - - @Override - public Link getSelfLink() { - return readLink; - } - - @Override - public void setSelfLink(final Link readLink) { - this.readLink = readLink; - } - - @Override - public Link getEditLink() { - return editLink; - } - - @Override - public void setEditLink(final Link editLink) { - this.editLink = editLink; - } - - private Link getOneByTitle(final String name, final List links) { - Link result = null; - - for (Link link : links) { - if (name.equals(link.getTitle())) { - result = link; - } - } - - return result; - } - - @Override - public Link getAssociationLink(final String name) { - return getOneByTitle(name, associationLinks); - } - - @Override - public List getAssociationLinks() { - return associationLinks; - } - - @Override - public Link getNavigationLink(final String name) { - return getOneByTitle(name, navigationLinks); - } - - @Override - public List getNavigationLinks() { - return navigationLinks; - } - - @Override - public List getMediaEditLinks() { - return mediaEditLinks; - } - - @Override - public Link getNavigationBinding(String name) { - return getOneByTitle(name, bindingLinks); - } - - @Override - public List getNavigationBindings() { - return bindingLinks; - } - - @Override - public List getOperations() { - return operations; - } - - @Override - public Entity addProperty(final Property property) { - properties.add(property); - return this; - } - - @Override - public List getProperties() { - return properties; - } - - @Override - public Property getProperty(final String name) { - Property result = null; - - for (Property property : properties) { - if (name.equals(property.getName())) { - result = property; - } - } - - return result; - } - - @Override - public String getMediaContentType() { - return mediaContentType; - } - - @Override - public void setMediaContentType(final String mediaContentType) { - this.mediaContentType = mediaContentType; - } - - @Override - public URI getMediaContentSource() { - return mediaContentSource; - } - - @Override - public void setMediaContentSource(final URI mediaContentSource) { - this.mediaContentSource = mediaContentSource; - } - - @Override - public String getMediaETag() { - return mediaETag; - } - - @Override - public void setMediaETag(final String eTag) { - mediaETag = eTag; - } - - @Override - public boolean isMediaEntity() { - return mediaContentSource != null; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntitySetImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntitySetImpl.java deleted file mode 100755 index 7898a8c75..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/EntitySetImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -public class EntitySetImpl extends AbstractODataObject implements EntitySet { - - private Integer count; - - private final List entities = new ArrayList(); - - private URI next; - - private URI deltaLink; - - @Override - public void setCount(final Integer count) { - this.count = count; - } - - @Override - public Integer getCount() { - return count; - } - - @Override - public List getEntities() { - return entities; - } - - @Override - public void setNext(final URI next) { - this.next = next; - } - - @Override - public URI getNext() { - return next; - } - - @Override - public URI getDeltaLink() { - return deltaLink; - } - - @Override - public void setDeltaLink(final URI deltaLink) { - this.deltaLink = deltaLink; - } - -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/LinkImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/LinkImpl.java deleted file mode 100644 index 5d096d695..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/LinkImpl.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntitySet; -import org.apache.olingo.commons.api.data.Link; - -public class LinkImpl extends AbstractAnnotatedObject implements Link { - - private String title; - private String rel; - private String href; - private String type; - private String mediaETag; - private Entity entity; - private EntitySet entitySet; - private String bindingLink; - private List bindingLinks = new ArrayList(); - - @Override - public String getTitle() { - return title; - } - - @Override - public void setTitle(final String title) { - this.title = title; - } - - @Override - public String getRel() { - return rel; - } - - @Override - public void setRel(final String rel) { - this.rel = rel; - } - - @Override - public String getHref() { - return href; - } - - @Override - public void setHref(final String href) { - this.href = href; - } - - @Override - public String getType() { - return type; - } - - @Override - public void setType(final String type) { - this.type = type; - } - - @Override - public String getMediaETag() { - return mediaETag; - } - - @Override - public void setMediaETag(final String mediaETag) { - this.mediaETag = mediaETag; - } - - @Override - public Entity getInlineEntity() { - return entity; - } - - @Override - public void setInlineEntity(final Entity entity) { - this.entity = entity; - } - - @Override - public EntitySet getInlineEntitySet() { - return entitySet; - } - - @Override - public void setInlineEntitySet(final EntitySet entitySet) { - this.entitySet = entitySet; - } - - @Override - public String getBindingLink() { - return bindingLink; - } - - @Override - public List getBindingLinks() { - return bindingLinks; - } - - @Override - public void setBindingLink(String bindingLink) { - this.bindingLink = bindingLink; - } - - @Override - public void setBindingLinks(List bindingLinks) { - this.bindingLinks = bindingLinks; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ParameterImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ParameterImpl.java deleted file mode 100644 index fc2a1a98a..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/ParameterImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.Parameter; -import org.apache.olingo.commons.api.data.ValueType; - -public class ParameterImpl extends AbstractValuable implements Parameter { - - String name; - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public boolean isEntity() { - return getValueType() == ValueType.ENTITY; - } - - @Override - public Entity asEntity() { - return isEntity() ? (Entity) getValue() : null; - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/PropertyImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/PropertyImpl.java deleted file mode 100755 index 7b31da73e..000000000 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/data/PropertyImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.olingo.commons.core.data; - -import org.apache.olingo.commons.api.data.Property; -import org.apache.olingo.commons.api.data.ValueType; - -public class PropertyImpl extends AbstractValuable implements Property { - - private String name; - - public PropertyImpl() {} - - public PropertyImpl(final String type, final String name) { - this.name = name; - super.setType(type); - } - - public PropertyImpl(String type, String name, ValueType valueType, Object value) { - this(type, name); - setValue(valueType, value); - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(final String name) { - this.name = name; - } - - @Override - public boolean isNull() { - return getValue() == null || "Edm.Null".equals(getType()); - } -} diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java index 1a50c2655..cd5210a37 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomDeserializer.java @@ -36,12 +36,16 @@ import javax.xml.stream.events.XMLEvent; import org.apache.commons.lang3.StringUtils; import org.apache.olingo.commons.api.Constants; +import org.apache.olingo.commons.api.data.AbstractODataObject; import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.ComplexValue; +import org.apache.olingo.commons.api.data.DeletedEntity; import org.apache.olingo.commons.api.data.DeletedEntity.Reason; import org.apache.olingo.commons.api.data.Delta; +import org.apache.olingo.commons.api.data.DeltaLink; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.EntitySet; +import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.data.Valuable; @@ -56,16 +60,6 @@ import org.apache.olingo.commons.api.edm.geo.Geospatial; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataDeserializerException; -import org.apache.olingo.commons.core.data.AbstractODataObject; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.DeletedEntityImpl; -import org.apache.olingo.commons.core.data.DeltaImpl; -import org.apache.olingo.commons.core.data.DeltaLinkImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.aalto.stax.InputFactoryImpl; @@ -128,11 +122,11 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria if (event.isStartElement()) { if (value == null) { - value = new ComplexValueImpl(); + value = new ComplexValue(); } if (Constants.QNAME_ATOM_ELEM_LINK.equals(event.asStartElement().getName())) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); final Attribute rel = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REL)); if (rel != null) { link.setRel(rel.getValue()); @@ -260,7 +254,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria private Property property(final XMLEventReader reader, final StartElement start) throws XMLStreamException, EdmPrimitiveTypeException { - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); if (propertyValueQName.equals(start.getName())) { // retrieve name from context @@ -379,7 +373,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria } } - private void inline(final XMLEventReader reader, final StartElement start, final LinkImpl link) + private void inline(final XMLEventReader reader, final StartElement start, final Link link) throws XMLStreamException, EdmPrimitiveTypeException { boolean foundEndElement = false; @@ -434,7 +428,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) { return null; } - final DeltaImpl delta = new DeltaImpl(); + final Delta delta = new Delta(); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE); if (xmlBase != null) { delta.setBaseURI(xmlBase.getValue()); @@ -473,7 +467,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria } else if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(event.asStartElement().getName())) { delta.getEntities().add(entity(reader, event.asStartElement())); } else if (deletedEntryQName.equals(event.asStartElement().getName())) { - final DeletedEntityImpl deletedEntity = new DeletedEntityImpl(); + final DeletedEntity deletedEntity = new DeletedEntity(); final Attribute ref = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REF)); if (ref != null) { @@ -488,7 +482,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria } else if (linkQName.equals(event.asStartElement().getName()) || deletedLinkQName.equals(event.asStartElement().getName())) { - final DeltaLinkImpl link = new DeltaLinkImpl(); + final DeltaLink link = new DeltaLink(); final Attribute source = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_SOURCE)); if (source != null) { @@ -520,7 +514,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria return delta; } - private void properties(final XMLEventReader reader, final StartElement start, final EntityImpl entity) + private void properties(final XMLEventReader reader, final StartElement start, final Entity entity) throws XMLStreamException, EdmPrimitiveTypeException { final Map> annotations = new HashMap>(); @@ -557,7 +551,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria private Annotation annotation(final XMLEventReader reader, final StartElement start) throws XMLStreamException, EdmPrimitiveTypeException { - final Annotation annotation = new AnnotationImpl(); + final Annotation annotation = new Annotation(); annotation.setTerm(start.getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_TERM)).getValue()); valuable(annotation, reader, start); @@ -565,8 +559,8 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria return annotation; } - private EntityImpl entityRef(final StartElement start) throws XMLStreamException { - final EntityImpl entity = new EntityImpl(); + private Entity entityRef(final StartElement start) throws XMLStreamException { + final Entity entity = new Entity(); final Attribute entityRefId = start.getAttributeByName(Constants.QNAME_ATOM_ATTR_ID); if (entityRefId != null) { @@ -578,11 +572,11 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria private Entity entity(final XMLEventReader reader, final StartElement start) throws XMLStreamException, EdmPrimitiveTypeException { - final EntityImpl entity; + final Entity entity; if (entryRefQName.equals(start.getName())) { entity = entityRef(start); } else if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(start.getName())) { - entity = new EntityImpl(); + entity = new Entity(); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE); if (xmlBase != null) { entity.setBaseURI(xmlBase.getValue()); @@ -612,7 +606,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria entity.setType(new EdmTypeInfo.Builder().setTypeExpression(term.getValue()).build().internal()); } } else if (Constants.QNAME_ATOM_ELEM_LINK.equals(event.asStartElement().getName())) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); final Attribute rel = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REL)); if (rel != null) { link.setRel(rel.getValue()); @@ -740,7 +734,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) { return null; } - final EntitySetImpl entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE); if (xmlBase != null) { entitySet.setBaseURI(xmlBase.getValue()); diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java index de0600894..196a46e27 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/AtomSerializer.java @@ -31,6 +31,7 @@ import javax.xml.stream.XMLStreamWriter; import org.apache.commons.lang3.StringUtils; import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.ODataRuntimeException; +import org.apache.olingo.commons.api.data.AbstractODataObject; import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.ContextURL; @@ -47,10 +48,6 @@ import org.apache.olingo.commons.api.edm.geo.Geospatial; import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.serialization.ODataSerializer; import org.apache.olingo.commons.api.serialization.ODataSerializerException; -import org.apache.olingo.commons.core.data.AbstractODataObject; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; @@ -288,9 +285,7 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize } writer.writeEndElement(); - if (entity instanceof AbstractODataObject) { - common(writer, (AbstractODataObject) entity); - } + common(writer, entity); if (serverMode) { if (entity.getEditLink() != null) { @@ -416,9 +411,7 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize writer.writeEndElement(); } - if (entitySet instanceof AbstractODataObject) { - common(writer, (AbstractODataObject) entitySet); - } + common(writer, entitySet); for (Entity entity : entitySet.getEntities()) { if (entity.getType() == null && entity.getProperties().isEmpty()) { @@ -433,14 +426,14 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize if (serverMode) { if (entitySet.getNext() != null) { - final LinkImpl next = new LinkImpl(); + final Link next = new Link(); next.setRel(Constants.NEXT_LINK_REL); next.setHref(entitySet.getNext().toASCIIString()); links(writer, Collections. singletonList(next)); } if (entitySet.getDeltaLink() != null) { - final LinkImpl next = new LinkImpl(); + final Link next = new Link(); next.setRel(Constants.NS_DELTA_LINK_REL); next.setHref(entitySet.getDeltaLink().toASCIIString()); @@ -559,10 +552,10 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize final ContextURL contextURL = ContextURLParser.parse(container.getContextURL()); String base = contextURL.getServiceRoot().toASCIIString(); if (container.getPayload() instanceof EntitySet) { - ((EntitySetImpl) container.getPayload()).setBaseURI(base); + ((EntitySet) container.getPayload()).setBaseURI(base); } if (container.getPayload() instanceof Entity) { - ((EntityImpl) container.getPayload()).setBaseURI(base); + ((Entity) container.getPayload()).setBaseURI(base); } writer.writeAttribute(namespaceMetadata, Constants.CONTEXT, diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeltaDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeltaDeserializer.java index de79cf72f..313d32dd2 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeltaDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeltaDeserializer.java @@ -25,12 +25,11 @@ import java.net.URI; import org.apache.commons.lang3.StringUtils; import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.data.ContextURL; +import org.apache.olingo.commons.api.data.DeletedEntity; import org.apache.olingo.commons.api.data.Delta; +import org.apache.olingo.commons.api.data.DeltaLink; import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.serialization.ODataDeserializerException; -import org.apache.olingo.commons.core.data.DeletedEntityImpl; -import org.apache.olingo.commons.core.data.DeltaImpl; -import org.apache.olingo.commons.core.data.DeltaLinkImpl; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; @@ -48,7 +47,7 @@ public class JsonDeltaDeserializer extends JsonDeserializer { final ObjectNode tree = parser.getCodec().readTree(parser); - final DeltaImpl delta = new DeltaImpl(); + final Delta delta = new Delta(); final URI contextURL = tree.hasNonNull(Constants.JSON_CONTEXT) ? URI.create(tree.get(Constants.JSON_CONTEXT).textValue()) : null; @@ -77,11 +76,11 @@ public class JsonDeltaDeserializer extends JsonDeserializer { if (itemContextURL == null || itemContextURL.isEntity()) { delta.getEntities().add(entityDeserializer.doDeserialize(item.traverse(parser.getCodec())).getPayload()); } else if (itemContextURL.isDeltaDeletedEntity()) { - delta.getDeletedEntities().add(parser.getCodec().treeToValue(item, DeletedEntityImpl.class)); + delta.getDeletedEntities().add(parser.getCodec().treeToValue(item, DeletedEntity.class)); } else if (itemContextURL.isDeltaLink()) { - delta.getAddedLinks().add(parser.getCodec().treeToValue(item, DeltaLinkImpl.class)); + delta.getAddedLinks().add(parser.getCodec().treeToValue(item, DeltaLink.class)); } else if (itemContextURL.isDeltaDeletedLink()) { - delta.getDeletedLinks().add(parser.getCodec().treeToValue(item, DeltaLinkImpl.class)); + delta.getDeletedLinks().add(parser.getCodec().treeToValue(item, DeltaLink.class)); } } } diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java index 96416238a..1db725be2 100755 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonDeserializer.java @@ -37,6 +37,7 @@ import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.EntitySet; +import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Linked; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ResWrap; @@ -51,11 +52,6 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.geo.Geospatial; import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataDeserializerException; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonFactory; @@ -96,7 +92,7 @@ public class JsonDeserializer implements ODataDeserializer { } protected String setInline(final String name, final String suffix, final JsonNode tree, - final ObjectCodec codec, final LinkImpl link) throws IOException { + final ObjectCodec codec, final Link link) throws IOException { final String entityNamePrefix = name.substring(0, name.indexOf(suffix)); if (tree.has(entityNamePrefix)) { @@ -110,7 +106,7 @@ public class JsonDeserializer implements ODataDeserializer { } else if (inline instanceof ArrayNode) { link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); - final EntitySet entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); for (final Iterator entries = inline.elements(); entries.hasNext();) { entitySet.getEntities().add(entityDeserializer.doDeserialize(entries.next().traverse(codec)).getPayload()); } @@ -134,7 +130,7 @@ public class JsonDeserializer implements ODataDeserializer { final JsonNode tree, final ObjectCodec codec) throws IOException { if (field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(getTitle(field)); link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); @@ -148,7 +144,7 @@ public class JsonDeserializer implements ODataDeserializer { toRemove.add(field.getKey()); toRemove.add(setInline(field.getKey(), Constants.JSON_NAVIGATION_LINK, tree, codec, link)); } else if (field.getKey().endsWith(Constants.JSON_ASSOCIATION_LINK)) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(getTitle(field)); link.setRel(Constants.NS_ASSOCIATION_LINK_REL + getTitle(field)); link.setHref(field.getValue().textValue()); @@ -168,7 +164,7 @@ public class JsonDeserializer implements ODataDeserializer { if (field.getValue().isValueNode()) { final String suffix = field.getKey().replaceAll("^.*@", "@"); - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(getTitle(field)); link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); link.setHref(field.getValue().textValue()); @@ -180,7 +176,7 @@ public class JsonDeserializer implements ODataDeserializer { for (final Iterator itor = field.getValue().elements(); itor.hasNext();) { final JsonNode node = itor.next(); - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(getTitle(field)); link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); link.setHref(node.asText()); @@ -243,7 +239,7 @@ public class JsonDeserializer implements ODataDeserializer { final Matcher customAnnotation = CUSTOM_ANNOTATION.matcher(field.getKey()); if (field.getKey().charAt(0) == '@') { - final Annotation entityAnnot = new AnnotationImpl(); + final Annotation entityAnnot = new Annotation(); entityAnnot.setTerm(field.getKey().substring(1)); value(entityAnnot, field.getValue(), codec); @@ -253,11 +249,11 @@ public class JsonDeserializer implements ODataDeserializer { } else if (type == null && field.getKey().endsWith(getJSONAnnotation(Constants.JSON_TYPE))) { type = field.getValue().asText(); } else if (annotation == null && customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { - annotation = new AnnotationImpl(); + annotation = new Annotation(); annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3)); value(annotation, field.getValue(), codec); } else { - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); property.setName(field.getKey()); property.setType(type == null ? null @@ -289,7 +285,7 @@ public class JsonDeserializer implements ODataDeserializer { private Object fromComplex(final ObjectNode node, final ObjectCodec codec) throws IOException, EdmPrimitiveTypeException { - final ComplexValue complexValue = new ComplexValueImpl(); + final ComplexValue complexValue = new ComplexValue(); final Set toRemove = new HashSet(); for (final Iterator> itor = node.fields(); itor.hasNext();) { final Map.Entry field = itor.next(); diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java index 228ac062d..bf54cda4c 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntityDeserializer.java @@ -38,9 +38,6 @@ import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.domain.ODataLinkType; import org.apache.olingo.commons.api.domain.ODataOperation; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonParseException; @@ -67,7 +64,7 @@ public class JsonEntityDeserializer extends JsonDeserializer { throw new JsonParseException("Expected OData Entity, found EntitySet", parser.getCurrentLocation()); } - final EntityImpl entity = new EntityImpl(); + final Entity entity = new Entity(); final URI contextURL; if (tree.hasNonNull(Constants.JSON_CONTEXT)) { @@ -108,7 +105,7 @@ public class JsonEntityDeserializer extends JsonDeserializer { } if (tree.hasNonNull(Constants.JSON_READ_LINK)) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setRel(Constants.SELF_LINK_REL); link.setHref(tree.get(Constants.JSON_READ_LINK).textValue()); entity.setSelfLink(link); @@ -117,7 +114,7 @@ public class JsonEntityDeserializer extends JsonDeserializer { } if (tree.hasNonNull(Constants.JSON_EDIT_LINK)) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); if (serverMode) { link.setRel(Constants.EDIT_LINK_REL); } @@ -153,7 +150,7 @@ public class JsonEntityDeserializer extends JsonDeserializer { links(field, entity, toRemove, tree, parser.getCodec()); if (field.getKey().endsWith(getJSONAnnotation(Constants.JSON_MEDIA_EDIT_LINK))) { - final LinkImpl link = new LinkImpl(); + final Link link = new Link(); link.setTitle(getTitle(field)); link.setRel(Constants.NS_MEDIA_EDIT_LINK_REL + getTitle(field)); link.setHref(field.getValue().textValue()); @@ -188,7 +185,7 @@ public class JsonEntityDeserializer extends JsonDeserializer { toRemove.add(field.getKey()); } else if (customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { - final Annotation annotation = new AnnotationImpl(); + final Annotation annotation = new Annotation(); annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3)); try { value(annotation, field.getValue(), parser.getCodec()); diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java index 1e844b532..f2603696e 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonEntitySetDeserializer.java @@ -29,8 +29,6 @@ import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; @@ -55,7 +53,7 @@ public class JsonEntitySetDeserializer extends JsonDeserializer { return null; } - final EntitySetImpl entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); URI contextURL; if (tree.hasNonNull(Constants.JSON_CONTEXT)) { @@ -105,7 +103,7 @@ public class JsonEntitySetDeserializer extends JsonDeserializer { for (final Iterator> itor = tree.fields(); itor.hasNext();) { final Map.Entry field = itor.next(); if (field.getKey().charAt(0) == '@') { - final Annotation annotation = new AnnotationImpl(); + final Annotation annotation = new Annotation(); annotation.setTerm(field.getKey().substring(1)); try { diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java index e0732d5d9..47c4387e6 100644 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonPropertyDeserializer.java @@ -30,8 +30,6 @@ import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.data.AnnotationImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import com.fasterxml.jackson.core.JsonParser; @@ -53,7 +51,7 @@ public class JsonPropertyDeserializer extends JsonDeserializer { final String metadataETag; final URI contextURL; - final PropertyImpl property = new PropertyImpl(); + final Property property = new Property(); if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) { metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue(); @@ -99,7 +97,7 @@ public class JsonPropertyDeserializer extends JsonDeserializer { for (final Iterator> itor = tree.fields(); itor.hasNext();) { final Map.Entry field = itor.next(); if (field.getKey().charAt(0) == '@') { - final Annotation annotation = new AnnotationImpl(); + final Annotation annotation = new Annotation(); annotation.setTerm(field.getKey().substring(1)); try { diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java index fd3fda153..e749736c9 100755 --- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java +++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/serialization/JsonSerializer.java @@ -205,13 +205,13 @@ public class JsonSerializer implements ODataSerializer { } protected void serverLinks(final Linked linked, final JsonGenerator jgen) - throws IOException, EdmPrimitiveTypeException { + throws IOException, EdmPrimitiveTypeException { if (linked instanceof Entity) { for (Link link : ((Entity) linked).getMediaEditLinks()) { if (StringUtils.isNotBlank(link.getHref())) { jgen.writeStringField( - link.getTitle() + StringUtils.prependIfMissing(Constants.JSON_MEDIA_EDIT_LINK, "@"), - link.getHref()); + link.getTitle() + StringUtils.prependIfMissing(Constants.JSON_MEDIA_EDIT_LINK, "@"), + link.getHref()); } } } @@ -219,8 +219,8 @@ public class JsonSerializer implements ODataSerializer { for (Link link : linked.getAssociationLinks()) { if (StringUtils.isNotBlank(link.getHref())) { jgen.writeStringField( - link.getTitle() + Constants.JSON_ASSOCIATION_LINK, - link.getHref()); + link.getTitle() + Constants.JSON_ASSOCIATION_LINK, + link.getHref()); } } @@ -231,8 +231,8 @@ public class JsonSerializer implements ODataSerializer { if (StringUtils.isNotBlank(link.getHref())) { jgen.writeStringField( - link.getTitle() + Constants.JSON_NAVIGATION_LINK, - link.getHref()); + link.getTitle() + Constants.JSON_NAVIGATION_LINK, + link.getHref()); } if (link.getInlineEntity() != null) { @@ -359,8 +359,8 @@ public class JsonSerializer implements ODataSerializer { String type = valuable.getType(); if ((!valuable.isCollection() && - StringUtils.isBlank(type) && - valuable.isPrimitive()) || valuable.isNull()) { + StringUtils.isBlank(type) && + valuable.isPrimitive()) || valuable.isNull()) { type = EdmPrimitiveTypeKind.String.getFullQualifiedName().toString(); } if (StringUtils.isNotBlank(type) && format != ODataFormat.JSON_NO_METADATA) { @@ -370,10 +370,8 @@ public class JsonSerializer implements ODataSerializer { } } - if (valuable instanceof Annotatable) { - for (Annotation annotation : ((Annotatable) valuable).getAnnotations()) { - valuable(jgen, annotation, name + "@" + annotation.getTerm()); - } + for (Annotation annotation : ((Annotatable) valuable).getAnnotations()) { + valuable(jgen, annotation, name + "@" + annotation.getTerm()); } jgen.writeFieldName(name); diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java index 8db1ada22..1f6ff8e11 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java @@ -21,6 +21,8 @@ package org.apache.olingo.server.api; import java.util.List; import org.apache.olingo.commons.api.ODataRuntimeException; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.provider.EdmProvider; import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.server.api.deserializer.DeserializerException; @@ -99,5 +101,17 @@ public abstract class OData { */ public abstract UriHelper createUriHelper(); + /** + * Creates a new deserializer object for reading content in the specified format. + * Deserializer are used in Processor implementations. + * + * @param format any format supported by Olingo (XML, JSON ...) + */ public abstract ODataDeserializer createDeserializer(ODataFormat format) throws DeserializerException; + + /** + * @param kind + * @return a {@link EdmPrimitiveType} instance for the type kind + */ + public abstract EdmPrimitiveType createPrimitiveTypeInstance(EdmPrimitiveTypeKind kind); } 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 c05b4ae23..80bed2fd5 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 @@ -20,8 +20,11 @@ package org.apache.olingo.server.core; import java.util.List; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.provider.EdmProvider; import org.apache.olingo.commons.api.format.ODataFormat; +import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataHttpHandler; import org.apache.olingo.server.api.ServiceMetadata; @@ -105,4 +108,9 @@ public class ODataImpl extends OData { return serializer; } + + @Override + public EdmPrimitiveType createPrimitiveTypeInstance(EdmPrimitiveTypeKind kind) { + return EdmPrimitiveTypeFactory.getInstance(kind); + } } diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java index 538e95cb4..fa2f6a5fb 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java @@ -50,12 +50,6 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.EdmTypeDefinition; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.ParameterImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.DeserializerResult; import org.apache.olingo.server.api.deserializer.ODataDeserializer; @@ -80,13 +74,13 @@ public class ODataJsonDeserializer implements ODataDeserializer { private static final String ODATA_CONTROL_INFORMATION_PREFIX = "@odata."; @Override - public DeserializerResult entityCollection(InputStream stream, EdmEntityType edmEntityType) + public DeserializerResult entityCollection(InputStream stream, EdmEntityType edmEntityType) throws DeserializerException { try { final ObjectNode tree = parseJsonTree(stream); - + return DeserializerResultImpl.with().entityCollection(consumeEntitySetNode(edmEntityType, tree, null)) - .build(); + .build(); } catch (JsonParseException e) { throw new DeserializerException("An JsonParseException occurred", e, DeserializerException.MessageKeys.JSON_SYNTAX_EXCEPTION); @@ -98,9 +92,9 @@ public class ODataJsonDeserializer implements ODataDeserializer { } } - private EntitySet consumeEntitySetNode(EdmEntityType edmEntityType, final ObjectNode tree, + private EntitySet consumeEntitySetNode(EdmEntityType edmEntityType, final ObjectNode tree, final ExpandTreeBuilder expandBuilder) throws DeserializerException { - EntitySetImpl entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); // Consume entities JsonNode jsonNode = tree.get(Constants.VALUE); @@ -137,7 +131,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { return entitySet; } - private List consumeEntitySetArray(EdmEntityType edmEntityType, JsonNode jsonNode, + private List consumeEntitySetArray(EdmEntityType edmEntityType, JsonNode jsonNode, final ExpandTreeBuilder expandBuilder) throws DeserializerException { List entities = new ArrayList(); for (JsonNode arrayElement : jsonNode) { @@ -156,10 +150,10 @@ public class ODataJsonDeserializer implements ODataDeserializer { try { final ObjectNode tree = parseJsonTree(stream); final ExpandTreeBuilderImpl expandBuilder = new ExpandTreeBuilderImpl(); - + return DeserializerResultImpl.with().entity(consumeEntityNode(edmEntityType, tree, expandBuilder)) - .expandOption(expandBuilder.build()) - .build(); + .expandOption(expandBuilder.build()) + .build(); } catch (JsonParseException e) { throw new DeserializerException("An JsonParseException occurred", e, @@ -173,9 +167,9 @@ public class ODataJsonDeserializer implements ODataDeserializer { } - private Entity consumeEntityNode(EdmEntityType edmEntityType, final ObjectNode tree, + private Entity consumeEntityNode(EdmEntityType edmEntityType, final ObjectNode tree, final ExpandTreeBuilder expandBuilder) throws DeserializerException { - EntityImpl entity = new EntityImpl(); + Entity entity = new Entity(); entity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString()); // Check and consume all Properties @@ -193,7 +187,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } @Override - public DeserializerResult actionParameters(InputStream stream, final EdmAction edmAction) + public DeserializerResult actionParameters(InputStream stream, final EdmAction edmAction) throws DeserializerException { try { ObjectNode tree = parseJsonTree(stream); @@ -214,7 +208,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } } - private ObjectNode parseJsonTree(InputStream stream) + private ObjectNode parseJsonTree(InputStream stream) throws IOException, JsonParseException, JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, true); @@ -232,7 +226,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } for (final String name : parameterNames) { final EdmParameter edmParameter = edmAction.getParameter(name); - ParameterImpl parameter = new ParameterImpl(); + Parameter parameter = new Parameter(); parameter.setName(name); JsonNode jsonNode = node.get(name); @@ -281,7 +275,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { * @throws DeserializerException if an exception during consummation occurs */ private void consumeRemainingJsonNodeFields(final EdmEntityType edmEntityType, final ObjectNode node, - final EntityImpl entity) throws DeserializerException { + final Entity entity) throws DeserializerException { final List toRemove = new ArrayList(); Iterator> fieldsIterator = node.fields(); while (fieldsIterator.hasNext()) { @@ -304,7 +298,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } private void consumeEntityProperties(final EdmEntityType edmEntityType, final ObjectNode node, - final EntityImpl entity) throws DeserializerException { + final Entity entity) throws DeserializerException { List propertyNames = edmEntityType.getPropertyNames(); for (String propertyName : propertyNames) { JsonNode jsonNode = node.get(propertyName); @@ -326,7 +320,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { } private void consumeExpandedNavigationProperties(final EdmEntityType edmEntityType, final ObjectNode node, - final EntityImpl entity, final ExpandTreeBuilder expandBuilder) throws DeserializerException { + final Entity entity, final ExpandTreeBuilder expandBuilder) throws DeserializerException { List navigationPropertyNames = edmEntityType.getNavigationPropertyNames(); for (String navigationPropertyName : navigationPropertyNames) { // read expanded navigation property @@ -339,22 +333,22 @@ public class ODataJsonDeserializer implements ODataDeserializer { DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, navigationPropertyName); } - LinkImpl link = new LinkImpl(); + Link link = new Link(); link.setTitle(navigationPropertyName); - final ExpandTreeBuilder childExpandBuilder = (expandBuilder != null) ? - expandBuilder.expand(edmNavigationProperty) : null; + final ExpandTreeBuilder childExpandBuilder = (expandBuilder != null) ? + expandBuilder.expand(edmNavigationProperty) : null; if (jsonNode.isArray() && edmNavigationProperty.isCollection()) { link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); - EntitySetImpl inlineEntitySet = new EntitySetImpl(); - inlineEntitySet.getEntities().addAll(consumeEntitySetArray(edmNavigationProperty.getType(), jsonNode, - childExpandBuilder)); + EntitySet inlineEntitySet = new EntitySet(); + inlineEntitySet.getEntities().addAll(consumeEntitySetArray(edmNavigationProperty.getType(), jsonNode, + childExpandBuilder)); link.setInlineEntitySet(inlineEntitySet); } else if (!jsonNode.isArray() && (!jsonNode.isValueNode() || jsonNode.isNull()) && !edmNavigationProperty.isCollection()) { link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); if (!jsonNode.isNull()) { - Entity inlineEntity = consumeEntityNode(edmNavigationProperty.getType(), (ObjectNode) jsonNode, - childExpandBuilder); + Entity inlineEntity = consumeEntityNode(edmNavigationProperty.getType(), (ObjectNode) jsonNode, + childExpandBuilder); link.setInlineEntity(inlineEntity); } } else { @@ -377,7 +371,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { throw new DeserializerException("Invalid navigationPropertyName: " + navigationPropertyName, DeserializerException.MessageKeys.NAVIGATION_PROPERTY_NOT_FOUND, navigationPropertyName); } - LinkImpl bindingLink = new LinkImpl(); + Link bindingLink = new Link(); bindingLink.setTitle(navigationPropertyName); if (edmNavigationProperty.isCollection()) { @@ -419,7 +413,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { private Property consumePropertyNode(final String name, final EdmType type, final boolean isCollection, final boolean isNullable, final Integer maxLength, final Integer precision, final Integer scale, final boolean isUnicode, final EdmMapping mapping, JsonNode jsonNode) throws DeserializerException { - Property property = new PropertyImpl(); + Property property = new Property(); property.setName(name); property.setType(type.getFullQualifiedName().getFullQualifiedNameAsString()); if (isCollection) { @@ -552,7 +546,7 @@ public class ODataJsonDeserializer implements ODataDeserializer { DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, name); } // Even if there are no properties defined we have to give back an empty list - ComplexValueImpl complexValue = new ComplexValueImpl(); + ComplexValue complexValue = new ComplexValue(); EdmComplexType edmType = (EdmComplexType) type; // Check and consume all Properties for (String propertyName : edmType.getPropertyNames()) { @@ -795,9 +789,9 @@ public class ODataJsonDeserializer implements ODataDeserializer { JsonNode jsonNode = tree.get(Constants.VALUE); if (jsonNode != null) { if (jsonNode.isArray()) { - ArrayNode arrayNode = (ArrayNode)jsonNode; + ArrayNode arrayNode = (ArrayNode) jsonNode; Iterator it = arrayNode.iterator(); - while(it.hasNext()) { + while (it.hasNext()) { parsedValues.add(new URI(it.next().get(key).asText())); } } else { diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java index 1fc89e840..c7ae99dbd 100644 --- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java +++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java @@ -33,8 +33,6 @@ import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.format.ODataFormat; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.server.api.serializer.ComplexSerializerOptions; import org.junit.Test; @@ -44,7 +42,7 @@ public class ODataJsonSerializerTest { final List col = new ArrayList(); col.add(getValues(1)); col.add(getValues(2)); - final Property complexCollection = new PropertyImpl(null, "ComplexCol", ValueType.COLLECTION_COMPLEX, col); + final Property complexCollection = new Property(null, "ComplexCol", ValueType.COLLECTION_COMPLEX, col); final ODataJsonSerializer serializer = new ODataJsonSerializer(ODataFormat.APPLICATION_JSON); final ComplexSerializerOptions options = ComplexSerializerOptions.with() @@ -66,9 +64,9 @@ public class ODataJsonSerializerTest { } private ComplexValue getValues(int i) { - ComplexValue value = new ComplexValueImpl(); - value.getValue().add(new PropertyImpl(null, "prop1", ValueType.PRIMITIVE, "test" + i)); - value.getValue().add(new PropertyImpl(null, "prop2", ValueType.PRIMITIVE, "test" + i + i)); + ComplexValue value = new ComplexValue(); + value.getValue().add(new Property(null, "prop1", ValueType.PRIMITIVE, "test" + i)); + value.getValue().add(new Property(null, "prop2", ValueType.PRIMITIVE, "test" + i + i)); return value; } } diff --git a/lib/server-tecsvc/pom.xml b/lib/server-tecsvc/pom.xml index f74f78cc8..817745fba 100644 --- a/lib/server-tecsvc/pom.xml +++ b/lib/server-tecsvc/pom.xml @@ -133,6 +133,7 @@ org.apache.olingo odata-commons-core ${project.version} + runtime diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/Encoder.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/Encoder.java new file mode 100644 index 000000000..82bb775e0 --- /dev/null +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/Encoder.java @@ -0,0 +1,132 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package org.apache.olingo.server.tecsvc; + +import java.io.UnsupportedEncodingException; + +/** + * Encodes a Java String (in its internal UTF-16 encoding) into its + * percent-encoded UTF-8 representation according to + * RFC 3986 + * (with consideration of its predecessor RFC 2396). + * + */ +public class Encoder { + + //TODO: Should we really copy this class? + + /** + * Encodes a Java String (in its internal UTF-16 encoding) into its + * percent-encoded UTF-8 representation according to + * RFC 3986, + * suitable for parts of an OData path segment. + * @param value the Java String + * @return the encoded String + */ + public static String encode(final String value) { + return encoder.encodeInternal(value); + } + + // OData has special handling for "'", so we allow that to remain unencoded. + // Other sub-delims not used neither by JAX-RS nor by OData could be added + // if the encoding is considered to be too aggressive. + // RFC 3986 would also allow the gen-delims ":" and "@" to appear literally + // in path-segment parts. + private static final String ODATA_UNENCODED = "'"; + + // Character classes from RFC 3986 + private final static String UNRESERVED = "-._~"; // + ALPHA + DIGIT + // RFC 3986 says: "For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings." + private final static String[] hex = { "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", "%0A", + "%0B", "%0C", "%0D", "%0E", "%0F", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", "%18", "%19", "%1A", + "%1B", "%1C", "%1D", "%1E", "%1F", "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29", "%2A", + "%2B", "%2C", "%2D", "%2E", "%2F", "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37", "%38", "%39", "%3A", + "%3B", "%3C", "%3D", "%3E", "%3F", "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47", "%48", "%49", "%4A", + "%4B", "%4C", "%4D", "%4E", "%4F", "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57", "%58", "%59", "%5A", + "%5B", "%5C", "%5D", "%5E", "%5F", "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", "%68", "%69", "%6A", + "%6B", "%6C", "%6D", "%6E", "%6F", "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77", "%78", "%79", "%7A", + "%7B", "%7C", "%7D", "%7E", "%7F", "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", "%88", + "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F", "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", "%98", + "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F", "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", "%A8", + "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", "%B8", + "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF", "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", "%C8", + "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", "%D8", + "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF", "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7", "%E8", + "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", "%F8", + "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" }; + + private static final Encoder encoder = new Encoder(ODATA_UNENCODED); + + /** characters to remain unencoded in addition to {@link #UNRESERVED} */ + private final String unencoded; + + private Encoder(final String unencoded) { + this.unencoded = unencoded == null ? "" : unencoded; + } + + /** + *

Returns the percent-encoded UTF-8 representation of a String.

+ *

In order to avoid producing percent-encoded CESU-8 (as described in + * the Unicode Consortium's + * Technical Report #26), this is done in two steps: + *

    + *
  1. Re-encode the characters from their Java-internal UTF-16 representations + * into their UTF-8 representations.
  2. + *
  3. Percent-encode each of the bytes in the UTF-8 representation. + * This is possible on byte level because all characters that do not have + * a %xx representation are represented in one byte in UTF-8.
  4. + *

+ * @param input input String + * @return encoded representation + */ + private String encodeInternal(final String input) { + StringBuilder resultStr = new StringBuilder(); + + try { + for (byte utf8Byte : input.getBytes("UTF-8")) { + final char character = (char) utf8Byte; + if (isUnreserved(character)) { + resultStr.append(character); + } else if (isUnencoded(character)) { + resultStr.append(character); + } else if (utf8Byte >= 0) { + resultStr.append(hex[utf8Byte]); + } else { + // case UTF-8 continuation byte + resultStr.append(hex[256 + utf8Byte]); // index adjusted for the usage of signed bytes + } + } + } catch (final UnsupportedEncodingException e) { // should never happen; UTF-8 is always there + return null; + } + return resultStr.toString(); + } + + private static boolean isUnreserved(final char character) { + return 'A' <= character && character <= 'Z' // case A..Z + || 'a' <= character && character <= 'z' // case a..z + || '0' <= character && character <= '9' // case 0..9 + || UNRESERVED.indexOf(character) >= 0; + } + + private boolean isUnencoded(final char character) { + return unencoded.indexOf(character) >= 0; + } +} diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java index 7de80e713..06da1765c 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java @@ -36,11 +36,6 @@ import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.domain.ODataLinkType; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; public class DataCreator { @@ -64,19 +59,19 @@ public class DataCreator { data.put("ESServerSidePaging", createESServerSidePaging()); // No data available but to allow an insert operation create empty EntitySets - data.put("ESAllNullable", new EntitySetImpl()); - data.put("ESMixEnumDefCollComp", new EntitySetImpl()); - data.put("ESTwoBase", new EntitySetImpl()); - data.put("ESBaseTwoKeyNav", new EntitySetImpl()); - data.put("ESBaseTwoKeyTwoPrim", new EntitySetImpl()); - data.put("ESTwoKeyTwoPrim", new EntitySetImpl()); - data.put("ESCompCollAllPrim", new EntitySetImpl()); - data.put("ESKeyTwoKeyComp", new EntitySetImpl()); - data.put("ESFourKeyAlias", new EntitySetImpl()); - data.put("ESBase", new EntitySetImpl()); - data.put("ESTwoBaseTwoKeyTwoPrim", new EntitySetImpl()); - data.put("ESInvisible", new EntitySetImpl()); - data.put("ESCompMixPrimCollComp", new EntitySetImpl()); + data.put("ESAllNullable", new EntitySet()); + data.put("ESMixEnumDefCollComp", new EntitySet()); + data.put("ESTwoBase", new EntitySet()); + data.put("ESBaseTwoKeyNav", new EntitySet()); + data.put("ESBaseTwoKeyTwoPrim", new EntitySet()); + data.put("ESTwoKeyTwoPrim", new EntitySet()); + data.put("ESCompCollAllPrim", new EntitySet()); + data.put("ESKeyTwoKeyComp", new EntitySet()); + data.put("ESFourKeyAlias", new EntitySet()); + data.put("ESBase", new EntitySet()); + data.put("ESTwoBaseTwoKeyTwoPrim", new EntitySet()); + data.put("ESInvisible", new EntitySet()); + data.put("ESCompMixPrimCollComp", new EntitySet()); linkESTwoPrim(data); linkESAllPrim(data); @@ -89,10 +84,10 @@ public class DataCreator { } private EntitySet createESServerSidePaging() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); for (int i = 1; i <= 503; i++) { - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", i)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", i)) .addProperty(createPrimitive("PropertyString", "Number:" + i))); } @@ -100,7 +95,7 @@ public class DataCreator { } private EntitySet createESKeyNav() { - final EntitySet entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); entitySet.getEntities().add(createETKeyNavEntity(1, "I am String Property 1")); entitySet.getEntities().add(createETKeyNavEntity(2, "I am String Property 2")); @@ -111,7 +106,7 @@ public class DataCreator { @SuppressWarnings("unchecked") private Entity createETKeyNavEntity(int propertyInt16, String propertyString) { - return new EntityImpl().addProperty(createPrimitive("PropertyInt16", propertyInt16)) + return new Entity().addProperty(createPrimitive("PropertyInt16", propertyInt16)) .addProperty(createPrimitive("PropertyString", propertyString)) .addProperty(createComplex("PropertyCompNav", createPrimitive("PropertyInt16", 1))) .addProperty(createKeyNavAllPrimComplexValue("PropertyCompAllPrim")).addProperty( @@ -129,7 +124,7 @@ public class DataCreator { } private EntitySet createESTwoKeyNav() { - final EntitySet entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); entitySet.getEntities().add(createESTwoKeyNavEntity(1, "1")); entitySet.getEntities().add(createESTwoKeyNavEntity(1, "2")); @@ -141,7 +136,7 @@ public class DataCreator { @SuppressWarnings("unchecked") private Entity createESTwoKeyNavEntity(int propertyInt16, String propertyString) { - return new EntityImpl().addProperty(createPrimitive("PropertyInt16", propertyInt16)) + return new Entity().addProperty(createPrimitive("PropertyInt16", propertyInt16)) .addProperty(createPrimitive("PropertyString", propertyString)).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 11), createComplex("PropertyComp", createPrimitive("PropertyString", "StringValue"), @@ -180,9 +175,9 @@ public class DataCreator { @SuppressWarnings("unchecked") private EntitySet createESCompCollComp() { - final EntitySet entitySet = new EntitySetImpl(); + final EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays .asList(createPrimitive("PropertyInt16", 555), createPrimitive("PropertyString", "1 Test Complex in Complex Property")), Arrays @@ -191,7 +186,7 @@ public class DataCreator { .asList(createPrimitive("PropertyInt16", 777), createPrimitive("PropertyString", "3 Test Complex in Complex Property")))))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 12345)).addProperty( + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 12345)).addProperty( createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays .asList(createPrimitive("PropertyInt16", 888), createPrimitive("PropertyString", "11 Test Complex in Complex Property")), Arrays @@ -204,27 +199,27 @@ public class DataCreator { } private EntitySet createESTwoPrim() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 32766)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 32766)) .addProperty(createPrimitive("PropertyString", "Test String1"))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", -365)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -365)) .addProperty(createPrimitive("PropertyString", "Test String2"))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", -32766)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -32766)) .addProperty(createPrimitive("PropertyString", null))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createPrimitive("PropertyString", "Test String4"))); return entitySet; } private EntitySet createESAllPrim() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createPrimitive("PropertyString", "First Resource - positive values")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) @@ -239,7 +234,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5)))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE)) .addProperty(createPrimitive("PropertyString", "Second Resource - negative values")) .addProperty(createPrimitive("PropertyBoolean", false)).addProperty(createPrimitive("PropertyByte", 0)) .addProperty(createPrimitive("PropertySByte", Byte.MIN_VALUE)) @@ -255,7 +250,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff"))) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14)))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 0)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 0)) .addProperty(createPrimitive("PropertyString", "")).addProperty(createPrimitive("PropertyBoolean", false)) .addProperty(createPrimitive("PropertyByte", 0)).addProperty(createPrimitive("PropertySByte", 0)) .addProperty(createPrimitive("PropertyInt32", 0)).addProperty(createPrimitive("PropertyInt64", 0)) @@ -272,9 +267,9 @@ public class DataCreator { } private EntitySet createESCompAllPrim() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - Entity entity = new EntityImpl(); + Entity entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)); entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "First Resource - first"), createPrimitive("PropertyBinary", @@ -289,7 +284,7 @@ public class DataCreator { createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTime(1, 0, 1)))); entitySet.getEntities().add(entity); - entity = new EntityImpl(); + entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 7)); entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Second Resource - second"), createPrimitive("PropertyBinary", @@ -305,7 +300,7 @@ public class DataCreator { createPrimitive("PropertyTimeOfDay", getTimestamp(1, 1, 1, 7, 45, 12, 765432100)))); entitySet.getEntities().add(entity); - entity = new EntityImpl(); + entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 0)); entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Third Resource - third"), createPrimitive("PropertyBinary", @@ -324,9 +319,9 @@ public class DataCreator { } private EntitySet createESCollAllPrim() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 1)).addProperty( + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 1)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")) .addProperty(createPrimitiveCollection("CollPropertyBoolean", true, false, true)) @@ -353,12 +348,12 @@ public class DataCreator { createPrimitiveCollection("CollPropertyTimeOfDay", getTime(4, 14, 13), getTime(23, 59, 59), getTime(1, 12, 33)))); - Entity entity = new EntityImpl(); + Entity entity = new Entity(); entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); entity.getProperties().set(0, createPrimitive("PropertyInt16", 2)); entitySet.getEntities().add(entity); - entity = new EntityImpl(); + entity = new Entity(); entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); entity.getProperties().set(0, createPrimitive("PropertyInt16", 3)); entitySet.getEntities().add(entity); @@ -372,22 +367,22 @@ public class DataCreator { Arrays.asList(createPrimitive("PropertyInt16", 456), createPrimitive("PropertyString", "TEST 2")), Arrays.asList(createPrimitive("PropertyInt16", 789), createPrimitive("PropertyString", "TEST 3"))); - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 111), createPrimitive("PropertyString", "TEST A"))).addProperty(complexCollection)); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 7)).addProperty( + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 7)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 222), createPrimitive("PropertyString", "TEST B"))).addProperty(complexCollection)); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyInt16", 0)).addProperty( + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 0)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 333), @@ -397,9 +392,9 @@ public class DataCreator { } private EntitySet createESAllKey() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyString", "First")) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "First")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) .addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) @@ -411,7 +406,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(2, 48, 21)))); - entitySet.getEntities().add(new EntityImpl().addProperty(createPrimitive("PropertyString", "Second")) + entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "Second")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 254)) .addProperty(createPrimitive("PropertySByte", 124)).addProperty(createPrimitive("PropertyInt16", 32764)) .addProperty(createPrimitive("PropertyInt32", 2147483644)) @@ -426,16 +421,16 @@ public class DataCreator { } private EntitySet createESCompComp() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - Entity entity = new EntityImpl(); + Entity entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 1)); entity.addProperty(createComplex("PropertyComp", createComplex("PropertyComp", createPrimitive("PropertyInt16", 123), createPrimitive("PropertyString", "String 1")))); entitySet.getEntities().add(entity); - entity = new EntityImpl(); + entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 2)); entity.addProperty(createComplex("PropertyComp", createComplex("PropertyComp", createPrimitive("PropertyInt16", 987), @@ -446,24 +441,24 @@ public class DataCreator { } private EntitySet createESMedia() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - Entity entity = new EntityImpl().addProperty(createPrimitive("PropertyInt16", 1)) + Entity entity = new Entity().addProperty(createPrimitive("PropertyInt16", 1)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("darkturquoise"))); entity.setMediaContentType("image/svg+xml"); entitySet.getEntities().add(entity); - entity = new EntityImpl().addProperty(createPrimitive("PropertyInt16", 2)) + entity = new Entity().addProperty(createPrimitive("PropertyInt16", 2)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("royalblue"))); entity.setMediaContentType("image/svg+xml"); entitySet.getEntities().add(entity); - entity = new EntityImpl().addProperty(createPrimitive("PropertyInt16", 3)) + entity = new Entity().addProperty(createPrimitive("PropertyInt16", 3)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("crimson"))); entity.setMediaContentType("image/svg+xml"); entitySet.getEntities().add(entity); - entity = new EntityImpl().addProperty(createPrimitive("PropertyInt16", 4)) + entity = new Entity().addProperty(createPrimitive("PropertyInt16", 4)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("black"))); entity.setMediaContentType("image/svg+xml"); entitySet.getEntities().add(entity); @@ -558,29 +553,29 @@ public class DataCreator { } protected static Property createPrimitive(final String name, final Object value) { - return new PropertyImpl(null, name, ValueType.PRIMITIVE, value); + return new Property(null, name, ValueType.PRIMITIVE, value); } protected static Property createPrimitiveCollection(final String name, final Object... values) { - return new PropertyImpl(null, name, ValueType.COLLECTION_PRIMITIVE, Arrays.asList(values)); + return new Property(null, name, ValueType.COLLECTION_PRIMITIVE, Arrays.asList(values)); } protected static Property createComplex(final String name, final Property... properties) { - ComplexValue complexValue = new ComplexValueImpl(); + ComplexValue complexValue = new ComplexValue(); for (final Property property : properties) { complexValue.getValue().add(property); } - return new PropertyImpl(null, name, ValueType.COMPLEX, complexValue); + return new Property(null, name, ValueType.COMPLEX, complexValue); } protected static Property createComplexCollection(final String name, final List... propertiesList) { List complexCollection = new ArrayList(); for (final List properties : propertiesList) { - ComplexValue complexValue = new ComplexValueImpl(); + ComplexValue complexValue = new ComplexValue(); complexValue.getValue().addAll(properties); complexCollection.add(complexValue); } - return new PropertyImpl(null, name, ValueType.COLLECTION_COMPLEX, complexCollection); + return new Property(null, name, ValueType.COLLECTION_COMPLEX, complexCollection); } private Calendar getDateTime(final int year, final int month, final int day, @@ -610,7 +605,7 @@ public class DataCreator { protected static void setLink(Entity entity, final String navigationPropertyName, final Entity target) { Link link = entity.getNavigationLink(navigationPropertyName); if (link == null) { - link = new LinkImpl(); + link = new Link(); link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); link.setTitle(navigationPropertyName); entity.getNavigationLinks().add(link); @@ -621,10 +616,10 @@ public class DataCreator { protected static void setLinks(Entity entity, final String navigationPropertyName, final Entity... targets) { Link link = entity.getNavigationLink(navigationPropertyName); if (link == null) { - link = new LinkImpl(); + link = new Link(); link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); link.setTitle(navigationPropertyName); - EntitySet target = new EntitySetImpl(); + EntitySet target = new EntitySet(); target.getEntities().addAll(Arrays.asList(targets)); link.setInlineEntitySet(target); entity.getNavigationLinks().add(link); diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java index d47aa4631..a20375032 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java @@ -40,17 +40,12 @@ import org.apache.olingo.commons.api.edm.EdmFunction; import org.apache.olingo.commons.api.edm.EdmNavigationProperty; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmStructuredType; -import org.apache.olingo.commons.api.edm.EdmType; +import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.data.ComplexValueImpl; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64; -import org.apache.olingo.commons.core.edm.primitivetype.EdmString; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.deserializer.DeserializerException; @@ -137,7 +132,7 @@ public class DataProvider { final EntitySet entitySet = readAll(edmEntitySet); final List entities = entitySet.getEntities(); final Map newKey = findFreeComposedKey(entities, edmEntitySet.getEntityType()); - final Entity newEntity = new EntityImpl(); + final Entity newEntity = new Entity(); newEntity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString()); for (final String keyName : edmEntityType.getKeyPredicateNames()) { newEntity.addProperty(DataCreator.createPrimitive(keyName, newKey.get(keyName))); @@ -154,17 +149,19 @@ public class DataProvider { // Weak key construction final HashMap keys = new HashMap(); for (final String keyName : entityType.getKeyPredicateNames()) { - final EdmType type = entityType.getProperty(keyName).getType(); + final FullQualifiedName typeName = entityType.getProperty(keyName).getType().getFullQualifiedName(); Object newValue = null; - if (type instanceof EdmInt16 || type instanceof EdmInt32 || type instanceof EdmInt64) { + if (EdmPrimitiveTypeKind.Int16.getFullQualifiedName().equals(typeName) + || EdmPrimitiveTypeKind.Int32.getFullQualifiedName().equals(typeName) + || EdmPrimitiveTypeKind.Int64.getFullQualifiedName().equals(typeName)) { // Integer keys newValue = Integer.valueOf(1); while (!isFree(newValue, keyName, entities)) { newValue = ((Integer) newValue) + 1; } - } else if (type instanceof EdmString) { + } else if (EdmPrimitiveTypeKind.String.getFullQualifiedName().equals(typeName)) { // String keys newValue = String.valueOf(1); int i = 0; @@ -431,7 +428,7 @@ public class DataProvider { private ComplexValue createComplexValue(final EdmProperty edmProperty, final ComplexValue complexValue, final boolean patch) throws DataProviderException { - final ComplexValueImpl result = new ComplexValueImpl(); + final ComplexValue result = new ComplexValue(); final EdmComplexType edmType = (EdmComplexType) edmProperty.getType(); final List givenProperties = complexValue.getValue(); @@ -446,7 +443,7 @@ public class DataProvider { updateProperty(innerEdmProperty, newProperty, currentProperty, patch); } else { if (innerEdmProperty.isNullable()) { - // Check complex properties ... maybe null is not allowed + // Check complex properties ... may be null is not allowed if (edmProperty.getType().getKind() == EdmTypeKind.COMPLEX) { updateProperty(innerEdmProperty, newProperty, null, patch); } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java index 5451d5dd4..1028cd852 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/FunctionData.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -27,8 +27,7 @@ import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException; @@ -38,7 +37,7 @@ public class FunctionData { final Map data) throws DataProviderException { if (name.equals("UFCRTCollETTwoKeyNavParam")) { final List esTwoKeyNav = data.get("ESTwoKeyNav").getEntities(); - EntitySet result = new EntitySetImpl(); + EntitySet result = new EntitySet(); final int endIndex = parameters.isEmpty() ? 0 : Short.valueOf(parameters.get(0).getText()); result.getEntities().addAll( esTwoKeyNav.subList(0, @@ -85,15 +84,16 @@ public class FunctionData { DataCreator.createPrimitive("PropertyString", "UFCRTCTTwoPrim string value")); } else if (name.equals("UFCRTCTTwoPrimParam")) { try { + + OData oData = OData.newInstance(); return DataCreator.createComplex(name, - DataCreator.createPrimitive("PropertyInt16", - EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int16).valueOfString( - getParameterText("ParameterInt16", parameters), + DataCreator.createPrimitive("PropertyInt16", oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16) + .valueOfString(getParameterText("ParameterInt16", parameters), null, null, null, null, null, Short.class)), - DataCreator.createPrimitive("PropertyString", - EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).valueOfString( - EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).fromUriLiteral( - getParameterText("ParameterString", parameters)), + DataCreator.createPrimitive("PropertyString", oData + .createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String) + .valueOfString(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String) + .fromUriLiteral(getParameterText("ParameterString", parameters)), null, null, null, null, null, String.class))); } catch (final EdmPrimitiveTypeException e) { throw new DataProviderException("Error in function " + name + ".", e); diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java index a2774e34f..858963ddb 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java @@ -34,7 +34,6 @@ import org.apache.olingo.commons.api.http.HttpContentType; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.data.EntitySetImpl; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; @@ -77,11 +76,8 @@ public class TechnicalEntityProcessor extends TechnicalProcessor EntityProcessor, ActionEntityProcessor, MediaEntityProcessor, ActionVoidProcessor { - private final ServiceMetadata serviceMetadata; - public TechnicalEntityProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) { - super(dataProvider); - this.serviceMetadata = serviceMetadata; + super(dataProvider, serviceMetadata); } @Override @@ -101,7 +97,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor } else { // Modifying the original entitySet means modifying the "database", so we have to make a shallow // copy of the entity set (new EntitySet, but exactly the same data) - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); entitySet.getEntities().addAll(entitySetInitial.getEntities()); // Apply system query options diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java index 8a9968fdc..303800f7b 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalPrimitiveComplexProcessor.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -40,7 +40,6 @@ import org.apache.olingo.commons.api.format.ContentType; import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; @@ -82,12 +81,9 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor ComplexProcessor, ActionComplexProcessor, ComplexCollectionProcessor, ActionComplexCollectionProcessor { - private final ServiceMetadata serviceMetadata; - public TechnicalPrimitiveComplexProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) { - super(dataProvider); - this.serviceMetadata = serviceMetadata; + super(dataProvider, serviceMetadata); } @Override @@ -251,7 +247,7 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor .build()).getContent()); break; case COMPLEX: - response.setContent(serializer.complex(this.serviceMetadata,(EdmComplexType) type, property, + response.setContent(serializer.complex(this.serviceMetadata, (EdmComplexType) type, property, ComplexSerializerOptions.with().contextURL(contextURL) .expand(expand).select(select) .build()).getContent()); @@ -388,7 +384,7 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor final EdmReturnType returnType = resourceParts.get(0) instanceof UriResourceFunction ? ((UriResourceFunction) resourceParts.get(0)).getFunction().getReturnType() : null; final FixedFormatSerializer serializer = odata.createFixedFormatSerializer(); - response.setContent(type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary) ? + response.setContent(type == odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Binary) ? serializer.binary((byte[]) property.getValue()) : serializer.primitiveValue(type, property.getValue(), PrimitiveValueSerializerOptions.with() diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java index 4fb2e5eb9..33cd98fbc 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java @@ -54,6 +54,11 @@ public abstract class TechnicalProcessor implements Processor { protected TechnicalProcessor(final DataProvider dataProvider) { this.dataProvider = dataProvider; } + + protected TechnicalProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) { + this.dataProvider = dataProvider; + this.serviceMetadata = serviceMetadata; + } @Override public void init(final OData odata, final ServiceMetadata serviceMetadata) { diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java index ce1b7747e..e6b984908 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java @@ -31,9 +31,6 @@ import org.apache.olingo.commons.api.edm.EdmEntitySet; import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.edm.EdmNavigationProperty; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.LinkImpl; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.UriResource; import org.apache.olingo.server.api.uri.UriResourceNavigation; @@ -132,9 +129,7 @@ public class ExpandSystemQueryOptionHandler { public Entity transformEntityGraphToTree(final Entity entity, EdmBindingTarget edmEntitySet, final ExpandOption expand) throws ODataApplicationException { - final Entity newEntity = newEntity(entity); - if (hasExpandItems(expand)) { final boolean expandAll = expandAll(expand); final Set expanded = expandAll ? null : getExpandedPropertyNames(expand.getExpandItems()); @@ -167,7 +162,7 @@ public class ExpandSystemQueryOptionHandler { } public EntitySet newEntitySet(final EntitySet entitySet) { - final EntitySet newEntitySet = new EntitySetImpl(); + final EntitySet newEntitySet = new EntitySet(); newEntitySet.setCount(entitySet.getCount()); newEntitySet.setDeltaLink(entitySet.getDeltaLink()); newEntitySet.setNext(entitySet.getNext()); @@ -176,7 +171,7 @@ public class ExpandSystemQueryOptionHandler { } private Entity newEntity(final Entity entity) { - final Entity newEntity = new EntityImpl(); + final Entity newEntity = new Entity(); newEntity.getProperties().addAll(entity.getProperties()); newEntity.getAnnotations().addAll(entity.getAnnotations()); @@ -195,7 +190,7 @@ public class ExpandSystemQueryOptionHandler { } private Link newLink(Link link) { - final Link newLink = new LinkImpl(); + final Link newLink = new Link(); newLink.setMediaETag(link.getMediaETag()); newLink.setTitle(link.getTitle()); newLink.setType(link.getType()); diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java index d45e8a98a..639139007 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java @@ -26,14 +26,6 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull; @@ -73,13 +65,11 @@ public class TypedOperand extends VisitorOperand { Object newValue = null; for (EdmPrimitiveType asType : asTypes) { // Use BigDecimal for unlimited precision - if (asType.equals(EdmDouble.getInstance()) - || asType.equals(EdmSingle.getInstance()) - || asType.equals(EdmDecimal.getInstance())) { - + if (asType.equals(primDouble) || asType.equals(primSingle) || asType.equals(primDecimal)) { + try { newValue = new BigDecimal(value.toString()); - } catch(NumberFormatException e) { + } catch (NumberFormatException e) { // Nothing to do } } else { @@ -117,18 +107,18 @@ public class TypedOperand extends VisitorOperand { return this; } - if (type.equals(EdmDouble.getInstance()) || oType.equals(EdmDouble.getInstance())) { - return asTypedOperand(EdmDouble.getInstance()); - } else if (type.equals(EdmSingle.getInstance()) || oType.equals(EdmSingle.getInstance())) { - return asTypedOperand(EdmSingle.getInstance()); - } else if (type.equals(EdmDecimal.getInstance()) || oType.equals(EdmDecimal.getInstance())) { - return asTypedOperand(EdmDecimal.getInstance()); - } else if (type.equals(EdmInt64.getInstance()) || oType.equals(EdmInt64.getInstance())) { - return asTypedOperand(EdmInt64.getInstance()); - } else if (type.equals(EdmInt32.getInstance()) || oType.equals(EdmInt32.getInstance())) { - return asTypedOperand(EdmInt32.getInstance()); - } else if (type.equals(EdmInt16.getInstance()) || oType.equals(EdmInt16.getInstance())) { - return asTypedOperand(EdmInt16.getInstance()); + if (type.equals(primDouble) || oType.equals(primDouble)) { + return asTypedOperand(primDouble); + } else if (type.equals(primSingle) || oType.equals(primSingle)) { + return asTypedOperand(primSingle); + } else if (type.equals(primDecimal) || oType.equals(primDecimal)) { + return asTypedOperand(primDecimal); + } else if (type.equals(primInt64) || oType.equals(primInt64)) { + return asTypedOperand(primInt64); + } else if (type.equals(primInt32) || oType.equals(primInt32)) { + return asTypedOperand(primInt32); + } else if (type.equals(primInt16) || oType.equals(primInt16)) { + return asTypedOperand(primInt16); } else { return asTypedOperand((EdmPrimitiveType) type); } @@ -151,17 +141,19 @@ public class TypedOperand extends VisitorOperand { } public boolean isIntegerType() { - return is(EdmByte.getInstance(), - EdmSByte.getInstance(), - EdmInt16.getInstance(), - EdmInt32.getInstance(), - EdmInt64.getInstance()); + return is( + primByte, + primSByte, + primInt16, + primInt32, + primInt64); } public boolean isDecimalType() { - return is(EdmSingle.getInstance(), - EdmDouble.getInstance(), - EdmDecimal.getInstance()); + return is( + primSingle, + primDouble, + primDecimal); } public boolean is(EdmPrimitiveType... types) { diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java index ddb33af51..f9652da63 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java @@ -23,20 +23,6 @@ import java.util.Locale; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; -import org.apache.olingo.commons.core.edm.primitivetype.EdmByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDate; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle; -import org.apache.olingo.commons.core.edm.primitivetype.EdmString; -import org.apache.olingo.commons.core.edm.primitivetype.EdmTimeOfDay; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull; @@ -84,65 +70,65 @@ public class UntypedOperand extends VisitorOperand { } // String - if ((newValue = tryCast(literal, EdmString.getInstance())) != null) { - return new TypedOperand(newValue, EdmString.getInstance()); + if ((newValue = tryCast(literal, primString)) != null) { + return new TypedOperand(newValue, primString); } // Boolean - if ((newValue = tryCast(literal, EdmBoolean.getInstance())) != null) { - return new TypedOperand(newValue, EdmBoolean.getInstance()); + if ((newValue = tryCast(literal, primBoolean)) != null) { + return new TypedOperand(newValue, primBoolean); } // Date - if ((newValue = tryCast(literal, EdmDateTimeOffset.getInstance())) != null) { - return new TypedOperand(newValue, EdmDateTimeOffset.getInstance()); + if ((newValue = tryCast(literal, primDateTimeOffset)) != null) { + return new TypedOperand(newValue, primDateTimeOffset); } - if ((newValue = tryCast(literal, EdmDate.getInstance())) != null) { - return new TypedOperand(newValue, EdmDate.getInstance()); + if ((newValue = tryCast(literal, primDate)) != null) { + return new TypedOperand(newValue, primDate); } - if ((newValue = tryCast(literal, EdmTimeOfDay.getInstance())) != null) { - return new TypedOperand(newValue, EdmTimeOfDay.getInstance()); + if ((newValue = tryCast(literal, primTimeOfDay)) != null) { + return new TypedOperand(newValue, primTimeOfDay); } - if ((newValue = tryCast(literal, EdmDuration.getInstance())) != null) { - return new TypedOperand(newValue, EdmDuration.getInstance()); + if ((newValue = tryCast(literal, primDuration)) != null) { + return new TypedOperand(newValue, primDuration); } // Integer - if ((newValue = tryCast(literal, EdmSByte.getInstance())) != null) { - return new TypedOperand(newValue, EdmSByte.getInstance()); + if ((newValue = tryCast(literal, primSByte)) != null) { + return new TypedOperand(newValue, primSByte); } - if ((newValue = tryCast(literal, EdmByte.getInstance())) != null) { - return new TypedOperand(newValue, EdmByte.getInstance()); + if ((newValue = tryCast(literal, primByte)) != null) { + return new TypedOperand(newValue, primByte); } - if ((newValue = tryCast(literal, EdmInt16.getInstance())) != null) { - return new TypedOperand(newValue, EdmInt16.getInstance()); + if ((newValue = tryCast(literal, primInt16)) != null) { + return new TypedOperand(newValue, primInt16); } - if ((newValue = tryCast(literal, EdmInt32.getInstance())) != null) { - return new TypedOperand(newValue, EdmInt32.getInstance()); + if ((newValue = tryCast(literal, primInt32)) != null) { + return new TypedOperand(newValue, primInt32); } - if ((newValue = tryCast(literal, EdmInt64.getInstance())) != null) { - return new TypedOperand(newValue, EdmInt64.getInstance()); + if ((newValue = tryCast(literal, primInt64)) != null) { + return new TypedOperand(newValue, primInt64); } // Decimal - if ((newValue = tryCast(literal, EdmDecimal.getInstance())) != null) { - return new TypedOperand(newValue, EdmDecimal.getInstance()); + if ((newValue = tryCast(literal, primDecimal)) != null) { + return new TypedOperand(newValue, primDecimal); } // Float - if ((newValue = tryCast(literal, EdmSingle.getInstance())) != null) { - return new TypedOperand(newValue, EdmSingle.getInstance()); + if ((newValue = tryCast(literal, primSingle)) != null) { + return new TypedOperand(newValue, primSingle); } - if ((newValue = tryCast(literal, EdmDouble.getInstance())) != null) { - return new TypedOperand(newValue, EdmDouble.getInstance()); + if ((newValue = tryCast(literal, primDouble)) != null) { + return new TypedOperand(newValue, primDouble); } throw new ODataApplicationException("Could not determine type for literal " + literal, diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java index ed9f60ea8..5c0e65a8c 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java @@ -24,32 +24,57 @@ import java.util.HashMap; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmType; -import org.apache.olingo.commons.core.edm.primitivetype.EdmByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; public abstract class VisitorOperand { final static private HashMap> defaultTypeMapping = new HashMap>(); protected Object value; + protected static final OData oData; + protected static final EdmPrimitiveType primString; + protected static final EdmPrimitiveType primBoolean; + protected static final EdmPrimitiveType primDateTimeOffset; + protected static final EdmPrimitiveType primDate; + protected static final EdmPrimitiveType primTimeOfDay; + protected static final EdmPrimitiveType primDuration; + protected static final EdmPrimitiveType primSByte; + protected static final EdmPrimitiveType primByte; + protected static final EdmPrimitiveType primInt16; + protected static final EdmPrimitiveType primInt32; + protected static final EdmPrimitiveType primInt64; + protected static final EdmPrimitiveType primDecimal; + protected static final EdmPrimitiveType primSingle; + protected static final EdmPrimitiveType primDouble; static { - defaultTypeMapping.put(EdmByte.getInstance(), BigInteger.class); - defaultTypeMapping.put(EdmSByte.getInstance(), BigInteger.class); - defaultTypeMapping.put(EdmInt16.getInstance(), BigInteger.class); - defaultTypeMapping.put(EdmInt32.getInstance(), BigInteger.class); - defaultTypeMapping.put(EdmInt64.getInstance(), BigInteger.class); + oData = OData.newInstance(); + primString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String); + primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean); + primDateTimeOffset = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset); + primDate = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date); + primTimeOfDay = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.TimeOfDay); + primDuration = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration); + primSByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte); + primByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte); + primInt16 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16); + primInt32 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32); + primInt64 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64); + primDecimal = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal); + primSingle = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Single); + primDouble = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double); + + defaultTypeMapping.put(primByte, BigInteger.class); + defaultTypeMapping.put(primSByte, BigInteger.class); + defaultTypeMapping.put(primInt16, BigInteger.class); + defaultTypeMapping.put(primInt32, BigInteger.class); + defaultTypeMapping.put(primInt64, BigInteger.class); - defaultTypeMapping.put(EdmSingle.getInstance(), BigDecimal.class); - defaultTypeMapping.put(EdmDouble.getInstance(), BigDecimal.class); - defaultTypeMapping.put(EdmDecimal.getInstance(), BigDecimal.class); + defaultTypeMapping.put(primSingle, BigDecimal.class); + defaultTypeMapping.put(primDouble, BigDecimal.class); + defaultTypeMapping.put(primDecimal, BigDecimal.class); } public VisitorOperand(Object value) { diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java index 9d9e23f11..6d4924342 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java @@ -24,19 +24,11 @@ import java.sql.Timestamp; import java.util.Calendar; import java.util.Locale; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; -import org.apache.olingo.commons.core.edm.primitivetype.EdmByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDate; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSByte; -import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand; @@ -62,6 +54,40 @@ public class BinaryOperator { private static final int EQUALS = 0; private static final int LESS_THAN = -1; private static final int GREATER_THAN = 1; + + protected static final OData oData; + protected static final EdmPrimitiveType primString; + protected static final EdmPrimitiveType primBoolean; + protected static final EdmPrimitiveType primDateTimeOffset; + protected static final EdmPrimitiveType primDate; + protected static final EdmPrimitiveType primTimeOfDay; + protected static final EdmPrimitiveType primDuration; + protected static final EdmPrimitiveType primSByte; + protected static final EdmPrimitiveType primByte; + protected static final EdmPrimitiveType primInt16; + protected static final EdmPrimitiveType primInt32; + protected static final EdmPrimitiveType primInt64; + protected static final EdmPrimitiveType primDecimal; + protected static final EdmPrimitiveType primSingle; + protected static final EdmPrimitiveType primDouble; + + static { + oData = OData.newInstance(); + primString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String); + primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean); + primDateTimeOffset = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset); + primDate = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date); + primTimeOfDay = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.TimeOfDay); + primDuration = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration); + primSByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte); + primByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte); + primInt16 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16); + primInt32 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32); + primInt64 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64); + primDecimal = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal); + primSingle = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Single); + primDouble = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double); + } private TypedOperand right; private TypedOperand left; @@ -77,14 +103,14 @@ public class BinaryOperator { public VisitorOperand andOperator() throws ODataApplicationException { Boolean result = null; - if (left.is(EdmBoolean.getInstance()) && right.is(EdmBoolean.getInstance())) { + if (left.is(primBoolean) && right.is(primBoolean)) { if (Boolean.TRUE.equals(left.getValue()) && Boolean.TRUE.equals(right.getValue())) { result = true; } else if (Boolean.FALSE.equals(left.getValue()) || Boolean.FALSE.equals(right.getValue())) { result = false; } - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } else { throw new ODataApplicationException("Add operator needs two binary operands", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); @@ -93,14 +119,14 @@ public class BinaryOperator { public VisitorOperand orOperator() throws ODataApplicationException { Boolean result = null; - if (left.is(EdmBoolean.getInstance()) && right.is(EdmBoolean.getInstance())) { + if (left.is(primBoolean) && right.is(primBoolean)) { if (Boolean.TRUE.equals(left.getValue()) || Boolean.TRUE.equals(right.getValue())) { result = true; } else if (Boolean.FALSE.equals(left.getValue()) && Boolean.FALSE.equals(right.getValue())) { result = false; } - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } else { throw new ODataApplicationException("Or operator needs two binary operands", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); @@ -109,12 +135,12 @@ public class BinaryOperator { public VisitorOperand equalsOperator() { final boolean result = isBinaryComparisonNecessary() && binaryComparison(EQUALS); - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } public VisitorOperand notEqualsOperator() { final VisitorOperand equalsOperator = equalsOperator(); - return new TypedOperand(!(Boolean) equalsOperator.getValue(), EdmBoolean.getInstance()); + return new TypedOperand(!(Boolean) equalsOperator.getValue(), primBoolean); } private boolean isBinaryComparisonNecessary() { @@ -124,22 +150,22 @@ public class BinaryOperator { public VisitorOperand greaterEqualsOperator() { final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN, EQUALS); - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } public VisitorOperand greaterThanOperator() { final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN); - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } public VisitorOperand lessEqualsOperator() { final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN, EQUALS); - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } public VisitorOperand lessThanOperator() { final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN); - return new TypedOperand(result, EdmBoolean.getInstance()); + return new TypedOperand(result, primBoolean); } private boolean binaryComparison(int... expect) { @@ -176,7 +202,7 @@ public class BinaryOperator { } else if (left.isDecimalType()) { final BigDecimal result = decimalArithmeticOperation(operator); return new TypedOperand(result, determineResultType(result, left)); - } else if (left.is(EdmDate.getInstance(), EdmDuration.getInstance(), EdmDateTimeOffset.getInstance())) { + } else if (left.is(primDate, primDuration, primDateTimeOffset)) { return dateArithmeticOperation(operator); } else { throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(), @@ -190,81 +216,81 @@ public class BinaryOperator { if (leftOperand.isDecimalType()) { final BigDecimal value = (BigDecimal) arithmeticResult; if (value.compareTo(EDM_SINGLE_MIN) >= 0 && value.compareTo(EDM_SINGLE_MAX) <= 0) { - return EdmSingle.getInstance(); + return primSingle; } else { - return EdmDouble.getInstance(); + return primDouble; } } else { final BigInteger value = (BigInteger) arithmeticResult; if (value.compareTo(EDN_SBYTE_MAX) <= 0 && value.compareTo(EDM_SBYTE_MIN) >= 0) { - return EdmSByte.getInstance(); + return primSByte; } if (value.compareTo(EDM_BYTE_MAX) <= 0 && value.compareTo(EDM_BYTE_MIN) >= 0) { - return EdmByte.getInstance(); + return primByte; } if (value.compareTo(EDM_INT16_MAX) <= 0 && value.compareTo(EDM_INT16_MIN) >= 0) { - return EdmInt16.getInstance(); + return primInt16; } if (value.compareTo(EDM_INT32_MAX) <= 0 && value.compareTo(EDM_INT32_MIN) >= 0) { - return EdmInt32.getInstance(); + return primInt32; } if (value.compareTo(EDM_INT64_MAX) <= 0 && value.compareTo(EDM_INT64_MIN) >= 0) { - return EdmInt64.getInstance(); + return primInt64; } // Choose double instead single because precision is higher (52 bits instead of 23) - return EdmDouble.getInstance(); + return primDouble; } } private VisitorOperand dateArithmeticOperation(BinaryOperatorKind operator) throws ODataApplicationException { VisitorOperand result = null; - if (left.is(EdmDate.getInstance())) { - if (right.is(EdmDate.getInstance()) && operator == BinaryOperatorKind.SUB) { + if (left.is(primDate)) { + if (right.is(primDate) && operator == BinaryOperatorKind.SUB) { long millis = left.getTypedValue(Calendar.class).getTimeInMillis() - left.getTypedValue(Calendar.class).getTimeInMillis(); - result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), EdmDuration.getInstance()); - } else if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { + result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), primDuration); + } else if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) { long millis = left.getTypedValue(Calendar.class).getTimeInMillis() + (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - result = new TypedOperand(new Timestamp(millis), EdmDateTimeOffset.getInstance()); - } else if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { + result = new TypedOperand(new Timestamp(millis), primDateTimeOffset); + } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) { long millis = left.getTypedValue(Calendar.class).getTimeInMillis() - (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - result = new TypedOperand(new Timestamp(millis), EdmDateTimeOffset.getInstance()); + result = new TypedOperand(new Timestamp(millis), primDateTimeOffset); } - } else if (left.is(EdmDuration.getInstance())) { - if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { + } else if (left.is(primDuration)) { + if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) { long seconds = left.getTypedValue(BigDecimal.class).longValue() + right.getTypedValue(BigDecimal.class).longValue(); - result = new TypedOperand(new BigDecimal(seconds), EdmDuration.getInstance()); - } else if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { + result = new TypedOperand(new BigDecimal(seconds), primDuration); + } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) { long seconds = left.getTypedValue(BigDecimal.class).longValue() - right.getTypedValue(BigDecimal.class).longValue(); - result = new TypedOperand(new BigDecimal(seconds), EdmDuration.getInstance()); + result = new TypedOperand(new BigDecimal(seconds), primDuration); } - } else if (left.is(EdmDateTimeOffset.getInstance())) { - if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { + } else if (left.is(primDateTimeOffset)) { + if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) { long millis = left.getTypedValue(Timestamp.class).getTime() + (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - result = new TypedOperand(new Timestamp(millis), EdmDateTimeOffset.getInstance()); - } else if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { + result = new TypedOperand(new Timestamp(millis), primDateTimeOffset); + } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) { long millis = left.getTypedValue(Timestamp.class).getTime() - (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - result = new TypedOperand(new Timestamp(millis), EdmDateTimeOffset.getInstance()); - } else if (right.is(EdmDateTimeOffset.getInstance()) && operator == BinaryOperatorKind.SUB) { + result = new TypedOperand(new Timestamp(millis), primDateTimeOffset); + } else if (right.is(primDateTimeOffset) && operator == BinaryOperatorKind.SUB) { long millis = left.getTypedValue(Timestamp.class).getTime() - right.getTypedValue(Timestamp.class).getTime(); - result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), EdmDuration.getInstance()); + result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), primDuration); } } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/MethodCallOperator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/MethodCallOperator.java index 62fbb6d37..5f8575b3b 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/MethodCallOperator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/MethodCallOperator.java @@ -30,21 +30,50 @@ import java.util.Locale; import java.util.TimeZone; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDate; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal; -import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32; -import org.apache.olingo.commons.core.edm.primitivetype.EdmString; -import org.apache.olingo.commons.core.edm.primitivetype.EdmTimeOfDay; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; public class MethodCallOperator { + protected static final OData oData; + protected static final EdmPrimitiveType primString; + protected static final EdmPrimitiveType primBoolean; + protected static final EdmPrimitiveType primDateTimeOffset; + protected static final EdmPrimitiveType primDate; + protected static final EdmPrimitiveType primTimeOfDay; + protected static final EdmPrimitiveType primDuration; + protected static final EdmPrimitiveType primSByte; + protected static final EdmPrimitiveType primByte; + protected static final EdmPrimitiveType primInt16; + protected static final EdmPrimitiveType primInt32; + protected static final EdmPrimitiveType primInt64; + protected static final EdmPrimitiveType primDecimal; + protected static final EdmPrimitiveType primSingle; + protected static final EdmPrimitiveType primDouble; + + static { + oData = OData.newInstance(); + primString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String); + primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean); + primDateTimeOffset = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset); + primDate = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Date); + primTimeOfDay = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.TimeOfDay); + primDuration = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration); + primSByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.SByte); + primByte = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Byte); + primInt16 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16); + primInt32 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int32); + primInt64 = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int64); + primDecimal = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Decimal); + primSingle = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Single); + primDouble = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double); + } + final private List parameters; public MethodCallOperator(List parameters) { @@ -57,7 +86,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).endsWith(params.get(1)); } - }, EdmBoolean.getInstance()); + }, primBoolean); } public VisitorOperand indexOf() throws ODataApplicationException { @@ -67,7 +96,7 @@ public class MethodCallOperator { // If the first string do not contain the second string, return -1. See OASIS JIRA ODATA-780 return params.get(0).indexOf(params.get(1)); } - }, EdmInt32.getInstance()); + }, primInt32); } public VisitorOperand startsWith() throws ODataApplicationException { @@ -76,7 +105,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).startsWith(params.get(1)); } - }, EdmBoolean.getInstance()); + }, primBoolean); } public VisitorOperand toLower() throws ODataApplicationException { @@ -85,7 +114,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).toLowerCase(); } - }, EdmString.getInstance()); + }, primString); } public VisitorOperand toUpper() throws ODataApplicationException { @@ -94,7 +123,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).toUpperCase(); } - }, EdmString.getInstance()); + }, primString); } public VisitorOperand trim() throws ODataApplicationException { @@ -103,7 +132,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).trim(); } - }, EdmString.getInstance()); + }, primString); } public VisitorOperand substring() throws ODataApplicationException { @@ -113,8 +142,8 @@ public class MethodCallOperator { final TypedOperand startOperand = parameters.get(1).asTypedOperand(); if (valueOperand.isNull() || startOperand.isNull()) { - return new TypedOperand(null, EdmString.getInstance()); - } else if (valueOperand.is(EdmString.getInstance()) && startOperand.isIntegerType()) { + return new TypedOperand(null, primString); + } else if (valueOperand.is(primString) && startOperand.isIntegerType()) { final String value = valueOperand.getTypedValue(String.class); int start = Math.min(startOperand.getTypedValue(BigInteger.class).intValue(), value.length()); start = start < 0 ? 0 : start; @@ -125,7 +154,7 @@ public class MethodCallOperator { final TypedOperand lengthOperand = parameters.get(2).asTypedOperand(); if (lengthOperand.isNull()) { - return new TypedOperand(null, EdmString.getInstance()); + return new TypedOperand(null, primString); } else if (lengthOperand.isIntegerType()) { end = Math.min(start + lengthOperand.getTypedValue(BigInteger.class).intValue(), value.length()); end = end < 0 ? 0 : end; @@ -136,7 +165,7 @@ public class MethodCallOperator { } return new TypedOperand(value.substring(start, end), - EdmString.getInstance()); + primString); } else { throw new ODataApplicationException("Substring has invalid parameters. First parameter should be Edm.String," + " second parameter should be Edm.Int32", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); @@ -149,7 +178,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).contains(params.get(1)); } - }, EdmBoolean.getInstance()); + }, primBoolean); } public VisitorOperand concat() throws ODataApplicationException { @@ -158,7 +187,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0) + params.get(1); } - }, EdmString.getInstance()); + }, primString); } public VisitorOperand length() throws ODataApplicationException { @@ -167,7 +196,7 @@ public class MethodCallOperator { public Object perform(List params) { return params.get(0).length(); } - }, EdmInt32.getInstance()); + }, primInt32); } public VisitorOperand year() throws ODataApplicationException { @@ -176,7 +205,7 @@ public class MethodCallOperator { public Object perform(Calendar calendar, TypedOperand operand) { return calendar.get(Calendar.YEAR); } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); + }, primInt32, primDateTimeOffset, primDate); } public VisitorOperand month() throws ODataApplicationException { @@ -186,7 +215,7 @@ public class MethodCallOperator { // Month is 0-based! return calendar.get(Calendar.MONTH) + 1; } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); + }, primInt32, primDateTimeOffset, primDate); } public VisitorOperand day() throws ODataApplicationException { @@ -195,7 +224,7 @@ public class MethodCallOperator { public Object perform(Calendar calendar, TypedOperand operand) { return calendar.get(Calendar.DAY_OF_MONTH); } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); + }, primInt32, primDateTimeOffset, primDate); } public VisitorOperand hour() throws ODataApplicationException { @@ -204,7 +233,7 @@ public class MethodCallOperator { public Object perform(Calendar calendar, TypedOperand operand) { return calendar.get(Calendar.HOUR_OF_DAY); } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); + }, primInt32, primDateTimeOffset, primTimeOfDay); } public VisitorOperand minute() throws ODataApplicationException { @@ -213,7 +242,7 @@ public class MethodCallOperator { public Object perform(Calendar calendar, TypedOperand operand) { return calendar.get(Calendar.MINUTE); } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); + }, primInt32, primDateTimeOffset, primTimeOfDay); } public VisitorOperand second() throws ODataApplicationException { @@ -222,7 +251,7 @@ public class MethodCallOperator { public Object perform(Calendar calendar, TypedOperand operand) { return calendar.get(Calendar.SECOND); } - }, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); + }, primInt32, primDateTimeOffset, primTimeOfDay); } public VisitorOperand fractionalseconds() throws ODataApplicationException { @@ -236,7 +265,7 @@ public class MethodCallOperator { return new BigDecimal(calendar.get(Calendar.MILLISECOND)).divide(BigDecimal.valueOf(1000)); } } - }, EdmDecimal.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); + }, primDecimal, primDateTimeOffset, primTimeOfDay); } public VisitorOperand round() throws ODataApplicationException { @@ -290,13 +319,13 @@ public class MethodCallOperator { if (operand.is(expectedTypes)) { if (!operand.isNull()) { Calendar calendar = null; - if (operand.is(EdmDate.getInstance())) { + if (operand.is(primDate)) { calendar = operand.getTypedValue(Calendar.class); - } else if (operand.is(EdmDateTimeOffset.getInstance())) { + } else if (operand.is(primDateTimeOffset)) { final Timestamp timestamp = operand.getTypedValue(Timestamp.class); calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.setTimeInMillis(timestamp.getTime()); - } else if (operand.is(EdmTimeOfDay.getInstance())) { + } else if (operand.is(primTimeOfDay)) { calendar = operand.getTypedValue(Calendar.class); } else { throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); @@ -327,7 +356,7 @@ public class MethodCallOperator { TypedOperand operand = param.asTypedOperand(); if (operand.isNull()) { result.add(null); - } else if (operand.is(EdmString.getInstance())) { + } else if (operand.is(primString)) { result.add(operand.getTypedValue(String.class)); } else { throw new ODataApplicationException("Invalid parameter. Expected Edm.String", HttpStatusCode.BAD_REQUEST diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/UnaryOperator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/UnaryOperator.java index 7f5ba215a..5e0c2bc7a 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/UnaryOperator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/UnaryOperator.java @@ -23,14 +23,26 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.Locale; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; -import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; public class UnaryOperator { + + protected static final OData oData; + protected static final EdmPrimitiveType primBoolean; + protected static final EdmPrimitiveType primDuration; + + static { + oData = OData.newInstance(); + primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean); + primDuration = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Duration); + } + final private TypedOperand operand; public UnaryOperator(VisitorOperand operand) throws ODataApplicationException { @@ -42,7 +54,7 @@ public class UnaryOperator { return operand; } else if (operand.isIntegerType()) { return new TypedOperand(operand.getTypedValue(BigInteger.class).negate(), operand.getType()); - } else if (operand.isDecimalType() || operand.is(EdmDuration.getInstance())) { + } else if (operand.isDecimalType() || operand.is(primDuration)) { return new TypedOperand(operand.getTypedValue(BigDecimal.class).negate(), operand.getType()); } else { throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(), @@ -53,7 +65,7 @@ public class UnaryOperator { public VisitorOperand notOperation() throws ODataApplicationException { if (operand.isNull()) { return operand; - } else if (operand.is(EdmBoolean.getInstance())) { + } else if (operand.is(primBoolean)) { return new TypedOperand(!operand.getTypedValue(Boolean.class), operand.getType()); } else { throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(), diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/primitive/EdmNull.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/primitive/EdmNull.java index b46aa28cc..156e2cbfa 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/primitive/EdmNull.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/primitive/EdmNull.java @@ -18,11 +18,13 @@ */ package org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; -import org.apache.olingo.commons.core.edm.primitivetype.SingletonPrimitiveType; +import org.apache.olingo.commons.api.edm.FullQualifiedName; +import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; -public final class EdmNull extends SingletonPrimitiveType { +public final class EdmNull implements EdmPrimitiveType { private static final EdmNull instance = new EdmNull(); @@ -34,8 +36,88 @@ public final class EdmNull extends SingletonPrimitiveType { public Class getDefaultType() { return Object.class; } + + protected String uriPrefix = ""; + + protected String uriSuffix = ""; @Override + public FullQualifiedName getFullQualifiedName() { + return new FullQualifiedName(getNamespace(), getName()); + } + + @Override + public boolean isCompatible(final EdmPrimitiveType primitiveType) { + return equals(primitiveType); + } + + @Override + public boolean validate(final String value, + final Boolean isNullable, final Integer maxLength, final Integer precision, final Integer scale, + final Boolean isUnicode) { + + try { + valueOfString(value, isNullable, maxLength, precision, scale, isUnicode, getDefaultType()); + return true; + } catch (final EdmPrimitiveTypeException e) { + return false; + } + } + + @Override + public final T valueOfString(final String value, + final Boolean isNullable, final Integer maxLength, final Integer precision, + final Integer scale, final Boolean isUnicode, final Class returnType) + throws EdmPrimitiveTypeException { + + if (value == null) { + if (isNullable != null && !isNullable) { + throw new EdmPrimitiveTypeException("The literal 'null' is not allowed."); + } + return null; + } + return internalValueOfString(value, isNullable, maxLength, precision, scale, isUnicode, returnType); + } + + @Override + public final String valueToString(final Object value, + final Boolean isNullable, final Integer maxLength, final Integer precision, + final Integer scale, final Boolean isUnicode) throws EdmPrimitiveTypeException { + if (value == null) { + if (isNullable != null && !isNullable) { + throw new EdmPrimitiveTypeException("The value NULL is not allowed."); + } + return null; + } + return internalValueToString(value, isNullable, maxLength, precision, scale, isUnicode); + } + + @Override + public String toUriLiteral(final String literal) { + return literal == null ? null : + uriPrefix.isEmpty() && uriSuffix.isEmpty() ? literal : uriPrefix + literal + uriSuffix; + } + + @Override + public String fromUriLiteral(final String literal) throws EdmPrimitiveTypeException { + if (literal == null) { + return null; + } else if (uriPrefix.isEmpty() && uriSuffix.isEmpty()) { + return literal; + } else if (literal.length() >= uriPrefix.length() + uriSuffix.length() + && literal.startsWith(uriPrefix) && literal.endsWith(uriSuffix)) { + + return literal.substring(uriPrefix.length(), literal.length() - uriSuffix.length()); + } else { + throw new EdmPrimitiveTypeException("The literal '" + literal + "' has illegal content."); + } + } + + @Override + public String toString() { + return new FullQualifiedName(getNamespace(), getName()).getFullQualifiedNameAsString(); + } + protected T internalValueOfString(String value, Boolean isNullable, Integer maxLength, Integer precision, Integer scale, Boolean isUnicode, Class returnType) throws EdmPrimitiveTypeException { if (!value.equals("null")) { @@ -49,10 +131,34 @@ public final class EdmNull extends SingletonPrimitiveType { } } - @Override protected String internalValueToString(T value, Boolean isNullable, Integer maxLength, Integer precision, Integer scale, Boolean isUnicode) throws EdmPrimitiveTypeException { return "null"; } + @Override + public boolean equals(final Object obj) { + return this == obj || obj != null && getClass() == obj.getClass(); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public String getNamespace() { + return EDM_NAMESPACE; + } + + @Override + public String getName() { + return getClass().getSimpleName().substring(3); + } + + @Override + public EdmTypeKind getKind() { + return EdmTypeKind.PRIMITIVE; + } + } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/FilterHandler.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/FilterHandler.java index d4068a172..69fa2e4f2 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/FilterHandler.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/FilterHandler.java @@ -24,34 +24,26 @@ import java.util.Locale; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.edm.EdmBindingTarget; +import org.apache.olingo.commons.api.edm.EdmPrimitiveType; +import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; +import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.queryoption.FilterOption; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.ExpressionVisitorImpl; -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; public class FilterHandler { + + protected static final OData oData; + protected static final EdmPrimitiveType primBoolean; + + static { + oData = OData.newInstance(); + primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean); + } public static void applyFilterSystemQuery(FilterOption filterOption, EntitySet entitySet, EdmBindingTarget edmEntitySet) throws ODataApplicationException { @@ -68,7 +60,7 @@ public class FilterHandler { .accept(new ExpressionVisitorImpl(iter.next(), edmEntitySet)); final TypedOperand typedOperand = operand.asTypedOperand(); - if (!(typedOperand.is(EdmBoolean.getInstance()) + if (!(typedOperand.is(primBoolean) && Boolean.TRUE.equals(typedOperand.getTypedValue(Boolean.class)))) { iter.remove(); } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/ServerSidePagingHandler.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/ServerSidePagingHandler.java index b5aedac64..a945edb4f 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/ServerSidePagingHandler.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/options/ServerSidePagingHandler.java @@ -25,10 +25,10 @@ import java.util.Locale; import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.edm.EdmEntitySet; import org.apache.olingo.commons.api.http.HttpStatusCode; -import org.apache.olingo.commons.core.Encoder; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; +import org.apache.olingo.server.tecsvc.Encoder; public class ServerSidePagingHandler { private static final int MAX_PAGE_SIZE = 10; diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java index f8b1dab36..801377ef4 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java @@ -39,7 +39,6 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.format.ODataFormat; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.server.api.OData; import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.edmx.EdmxReference; @@ -615,7 +614,7 @@ public class ODataJsonSerializerTest { public void primitivePropertyNull() throws Exception { final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim"); final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyString"); - final Property property = new PropertyImpl("Edm.String", edmProperty.getName(), ValueType.PRIMITIVE, null); + final Property property = new Property("Edm.String", edmProperty.getName(), ValueType.PRIMITIVE, null); serializer.primitive((EdmPrimitiveType) edmProperty.getType(), property, PrimitiveSerializerOptions.with() .contextURL(ContextURL.with() diff --git a/samples/server/src/main/java/org/apache/olingo/server/sample/data/DataProvider.java b/samples/server/src/main/java/org/apache/olingo/server/sample/data/DataProvider.java index 2e44e3596..b8789bddc 100644 --- a/samples/server/src/main/java/org/apache/olingo/server/sample/data/DataProvider.java +++ b/samples/server/src/main/java/org/apache/olingo/server/sample/data/DataProvider.java @@ -33,9 +33,6 @@ import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.edm.EdmProperty; -import org.apache.olingo.commons.core.data.EntityImpl; -import org.apache.olingo.commons.core.data.EntitySetImpl; -import org.apache.olingo.commons.core.data.PropertyImpl; import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.sample.edmprovider.CarsEdmProvider; @@ -97,37 +94,37 @@ public class DataProvider { } private EntitySet createCars() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 1)) .addProperty(createPrimitive("Model", "F1 W03")) .addProperty(createPrimitive("ModelYear", "2012")) .addProperty(createPrimitive("Price", 189189.43)) .addProperty(createPrimitive("Currency", "EUR"))); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 2)) .addProperty(createPrimitive("Model", "F1 W04")) .addProperty(createPrimitive("ModelYear", "2013")) .addProperty(createPrimitive("Price", 199999.99)) .addProperty(createPrimitive("Currency", "EUR"))); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 3)) .addProperty(createPrimitive("Model", "F2012")) .addProperty(createPrimitive("ModelYear", "2012")) .addProperty(createPrimitive("Price", 137285.33)) .addProperty(createPrimitive("Currency", "EUR"))); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 4)) .addProperty(createPrimitive("Model", "F2013")) .addProperty(createPrimitive("ModelYear", "2013")) .addProperty(createPrimitive("Price", 145285.00)) .addProperty(createPrimitive("Currency", "EUR"))); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 5)) .addProperty(createPrimitive("Model", "F1 W02")) .addProperty(createPrimitive("ModelYear", "2011")) @@ -141,14 +138,14 @@ public class DataProvider { } private EntitySet createManufacturers() { - EntitySet entitySet = new EntitySetImpl(); + EntitySet entitySet = new EntitySet(); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 1)) .addProperty(createPrimitive("Name", "Star Powered Racing")) .addProperty(createAddress("Star Street 137", "Stuttgart", "70173", "Germany"))); - entitySet.getEntities().add(new EntityImpl() + entitySet.getEntities().add(new Entity() .addProperty(createPrimitive("Id", 2)) .addProperty(createPrimitive("Name", "Horse Powered Racing")) .addProperty(createAddress("Horse Street 1", "Maranello", "41053", "Italy"))); @@ -165,10 +162,10 @@ public class DataProvider { addressProperties.add(createPrimitive("City", city)); addressProperties.add(createPrimitive("ZipCode", zipCode)); addressProperties.add(createPrimitive("Country", country)); - return new PropertyImpl(null, "Address", ValueType.COMPLEX, addressProperties); + return new Property(null, "Address", ValueType.COMPLEX, addressProperties); } private Property createPrimitive(final String name, final Object value) { - return new PropertyImpl(null, name, ValueType.PRIMITIVE, value); + return new Property(null, name, ValueType.PRIMITIVE, value); } }