[OLINGO-603] Delete core dependecies in Tec Scenario

This commit is contained in:
Christian Amend 2015-04-07 13:47:26 +02:00
parent d4c2b89e46
commit 05935a0c3d
62 changed files with 1367 additions and 1767 deletions

View File

@ -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.format.ContentType;
import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataDeserializer;
import org.apache.olingo.commons.api.serialization.ODataSerializer; 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.edm.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.commons.core.serialization.AtomSerializer; import org.apache.olingo.commons.core.serialization.AtomSerializer;
import org.apache.olingo.commons.core.serialization.JsonDeserializer; import org.apache.olingo.commons.core.serialization.JsonDeserializer;
@ -231,14 +227,14 @@ public abstract class AbstractServices {
@GET @GET
@Path("/StoredPIs(1000)") @Path("/StoredPIs(1000)")
public Response getStoredPI(@Context final UriInfo uriInfo) { 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"); entity.setType("Microsoft.Test.OData.Services.ODataWCFService.StoredPI");
final Property id = new PropertyImpl(); final Property id = new Property();
id.setType("Edm.Int32"); id.setType("Edm.Int32");
id.setName("StoredPIID"); id.setName("StoredPIID");
id.setValue(ValueType.PRIMITIVE, 1000); id.setValue(ValueType.PRIMITIVE, 1000);
entity.getProperties().add(id); entity.getProperties().add(id);
final Link edit = new LinkImpl(); final Link edit = new Link();
edit.setHref(uriInfo.getRequestUri().toASCIIString()); edit.setHref(uriInfo.getRequestUri().toASCIIString());
edit.setRel("edit"); edit.setRel("edit");
edit.setTitle("StoredPI"); edit.setTitle("StoredPI");
@ -622,7 +618,7 @@ public abstract class AbstractServices {
final Entity entry; final Entity entry;
final String entityKey; final String entityKey;
if (xml.isMediaContent(entitySetName)) { if (xml.isMediaContent(entitySetName)) {
entry = new EntityImpl(); entry = new Entity();
entry.setMediaContentType(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString()); entry.setMediaContentType(ContentType.APPLICATION_OCTET_STREAM.toContentTypeString());
entry.setType(entitySet.getType()); entry.setType(entitySet.getType());
@ -632,7 +628,7 @@ public abstract class AbstractServices {
final Pair<String, EdmPrimitiveTypeKind> id = Commons.getMediaContent().get(entitySetName); final Pair<String, EdmPrimitiveTypeKind> id = Commons.getMediaContent().get(entitySetName);
if (id != null) { if (id != null) {
final Property prop = new PropertyImpl(); final Property prop = new Property();
prop.setName(id.getKey()); prop.setName(id.getKey());
prop.setType(id.getValue().toString()); prop.setType(id.getValue().toString());
prop.setValue(ValueType.PRIMITIVE, prop.setValue(ValueType.PRIMITIVE,
@ -644,7 +640,7 @@ public abstract class AbstractServices {
entry.getProperties().add(prop); entry.getProperties().add(prop);
} }
final Link editLink = new LinkImpl(); final Link editLink = new Link();
editLink.setHref(Commons.getEntityURI(entitySetName, entityKey)); editLink.setHref(Commons.getEntityURI(entitySetName, entityKey));
editLink.setRel("edit"); editLink.setRel("edit");
editLink.setTitle(entitySetName); editLink.setTitle(entitySetName);
@ -691,7 +687,7 @@ public abstract class AbstractServices {
if ((this instanceof V4KeyAsSegment)) { if ((this instanceof V4KeyAsSegment)) {
location = uriInfo.getRequestUri().toASCIIString() + "/" + entityKey; location = uriInfo.getRequestUri().toASCIIString() + "/" + entityKey;
final Link editLink = new LinkImpl(); final Link editLink = new Link();
editLink.setRel("edit"); editLink.setRel("edit");
editLink.setTitle(entitySetName); editLink.setTitle(entitySetName);
editLink.setHref(location); editLink.setHref(location);
@ -1207,7 +1203,7 @@ public abstract class AbstractServices {
final Entity entry = container.getPayload(); final Entity entry = container.getPayload();
if ((this instanceof V4KeyAsSegment)) { if ((this instanceof V4KeyAsSegment)) {
final Link editLink = new LinkImpl(); final Link editLink = new Link();
editLink.setRel("edit"); editLink.setRel("edit");
editLink.setTitle(entitySetName); editLink.setTitle(entitySetName);
editLink.setHref(Constants.get(ConstantKey.DEFAULT_SERVICE_URL) + entitySetName + "/" + entityId); editLink.setHref(Constants.get(ConstantKey.DEFAULT_SERVICE_URL) + entitySetName + "/" + entityId);
@ -1248,7 +1244,7 @@ public abstract class AbstractServices {
for (Link link : entry.getNavigationLinks()) { for (Link link : entry.getNavigationLinks()) {
if (links.contains(link.getTitle())) { if (links.contains(link.getTitle())) {
// expand link // expand link
final Link rep = new LinkImpl(); final Link rep = new Link();
rep.setHref(link.getHref()); rep.setHref(link.getHref());
rep.setRel(link.getRel()); rep.setRel(link.getRel());
rep.setTitle(link.getTitle()); rep.setTitle(link.getTitle());
@ -1904,7 +1900,7 @@ public abstract class AbstractServices {
for (Property property : entity.getProperties()) { for (Property property : entity.getProperties()) {
if (navProperties.containsKey(property.getName())) { if (navProperties.containsKey(property.getName())) {
Link alink = new LinkImpl(); Link alink = new Link();
alink.setTitle(property.getName()); alink.setTitle(property.getName());
alink.getAnnotations().addAll(property.getAnnotations()); alink.getAnnotations().addAll(property.getAnnotations());
@ -1915,9 +1911,9 @@ public abstract class AbstractServices {
alink.setRel(Constants.get(ConstantKey.ATOM_LINK_REL) + property.getName()); alink.setRel(Constants.get(ConstantKey.ATOM_LINK_REL) + property.getName());
if (property.isCollection()) { if (property.isCollection()) {
EntitySet inline = new EntitySetImpl(); EntitySet inline = new EntitySet();
for (Object value : property.asCollection()) { for (Object value : property.asCollection()) {
Entity inlineEntity = new EntityImpl(); Entity inlineEntity = new Entity();
inlineEntity.setType(navProperties.get(property.getName()).getType()); inlineEntity.setType(navProperties.get(property.getName()).getType());
for (Property prop : ((ComplexValue) value).getValue()) { for (Property prop : ((ComplexValue) value).getValue()) {
inlineEntity.getProperties().add(prop); inlineEntity.getProperties().add(prop);
@ -1926,7 +1922,7 @@ public abstract class AbstractServices {
} }
alink.setInlineEntitySet(inline); alink.setInlineEntitySet(inline);
} else if (property.isComplex()) { } else if (property.isComplex()) {
Entity inline = new EntityImpl(); Entity inline = new Entity();
inline.setType(navProperties.get(property.getName()).getType()); inline.setType(navProperties.get(property.getName()).getType());
for (Property prop : property.asComplex().getValue()) { for (Property prop : property.asComplex().getValue()) {
inline.getProperties().add(prop); inline.getProperties().add(prop);
@ -1946,7 +1942,7 @@ public abstract class AbstractServices {
final EntityType entityType = metadata.getEntityOrComplexType(entitySet.getType()); final EntityType entityType = metadata.getEntityOrComplexType(entitySet.getType());
for (Map.Entry<String, org.apache.olingo.fit.metadata.Property> property : entityType.getPropertyMap().entrySet()) { for (Map.Entry<String, org.apache.olingo.fit.metadata.Property> property : entityType.getPropertyMap().entrySet()) {
if (entry.getProperty(property.getKey()) == null && property.getValue().isNullable()) { if (entry.getProperty(property.getKey()) == null && property.getValue().isNullable()) {
final PropertyImpl prop = new PropertyImpl(); final Property prop = new Property();
prop.setName(property.getKey()); prop.setName(property.getKey());
prop.setValue(ValueType.PRIMITIVE, null); prop.setValue(ValueType.PRIMITIVE, null);
entry.getProperties().add(prop); entry.getProperties().add(prop);
@ -1962,7 +1958,7 @@ public abstract class AbstractServices {
} }
if (!found) { if (!found) {
final LinkImpl link = new LinkImpl(); final Link link = new Link();
link.setTitle(property.getKey()); link.setTitle(property.getKey());
link.setType(property.getValue().isEntitySet() link.setType(property.getValue().isEntitySet()
? Constants.get(ConstantKey.ATOM_LINK_FEED) ? Constants.get(ConstantKey.ATOM_LINK_FEED)

View File

@ -18,42 +18,25 @@
*/ */
package org.apache.olingo.fit; package org.apache.olingo.fit;
import org.apache.commons.codec.binary.Base64; import java.io.ByteArrayInputStream;
import org.apache.commons.io.IOUtils; import java.io.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils; import java.io.File;
import org.apache.commons.lang3.math.NumberUtils; import java.io.IOException;
import org.apache.cxf.interceptor.InInterceptors; import java.io.InputStream;
import org.apache.cxf.jaxrs.ext.multipart.Attachment; import java.io.OutputStreamWriter;
import org.apache.cxf.jaxrs.ext.multipart.Multipart; import java.net.URI;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; import java.util.ArrayList;
import org.apache.olingo.commons.api.data.Entity; import java.util.Arrays;
import org.apache.olingo.commons.api.data.EntitySet; import java.util.Collections;
import org.apache.olingo.commons.api.data.Link; import java.util.HashMap;
import org.apache.olingo.commons.api.data.Property; import java.util.List;
import org.apache.olingo.commons.api.data.ResWrap; import java.util.Map;
import org.apache.olingo.commons.api.data.ValueType; import java.util.UUID;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; import java.util.regex.Pattern;
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 javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeMultipart;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue; 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.Response.Status;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import java.io.ByteArrayInputStream; import org.apache.commons.codec.binary.Base64;
import java.io.ByteArrayOutputStream; import org.apache.commons.io.IOUtils;
import java.io.File; import org.apache.commons.lang3.StringUtils;
import java.io.IOException; import org.apache.commons.lang3.math.NumberUtils;
import java.io.InputStream; import org.apache.cxf.interceptor.InInterceptors;
import java.io.OutputStreamWriter; import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import java.net.URI; import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import java.util.ArrayList; import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
import java.util.Arrays; import org.apache.olingo.commons.api.data.Entity;
import java.util.Collections; import org.apache.olingo.commons.api.data.EntitySet;
import java.util.HashMap; import org.apache.olingo.commons.api.data.Link;
import java.util.List; import org.apache.olingo.commons.api.data.Property;
import java.util.Map; import org.apache.olingo.commons.api.data.ResWrap;
import java.util.UUID; import org.apache.olingo.commons.api.data.ValueType;
import java.util.regex.Pattern; import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.api.format.ContentType;
import javax.ws.rs.BadRequestException; 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 @Service
@Path("/V40/Static.svc") @Path("/V40/Static.svc")
@ -504,7 +499,7 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final Property property = new PropertyImpl(); final Property property = new Property();
property.setType("Edm.Int32"); property.setType("Edm.Int32");
property.setValue(ValueType.PRIMITIVE, 2); property.setValue(ValueType.PRIMITIVE, 2);
final ResWrap<Property> container = new ResWrap<Property>( final ResWrap<Property> container = new ResWrap<Property>(
@ -565,27 +560,27 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final EntityImpl entry = new EntityImpl(); final Entity entry = new Entity();
entry.setType("Microsoft.Test.OData.Services.ODataWCFService.ProductDetail"); entry.setType("Microsoft.Test.OData.Services.ODataWCFService.ProductDetail");
final Property productId = new PropertyImpl(); final Property productId = new Property();
productId.setName("ProductID"); productId.setName("ProductID");
productId.setType("Edm.Int32"); productId.setType("Edm.Int32");
productId.setValue(ValueType.PRIMITIVE, Integer.valueOf(entityId)); productId.setValue(ValueType.PRIMITIVE, Integer.valueOf(entityId));
entry.getProperties().add(productId); entry.getProperties().add(productId);
final Property productDetailId = new PropertyImpl(); final Property productDetailId = new Property();
productDetailId.setName("ProductDetailID"); productDetailId.setName("ProductDetailID");
productDetailId.setType("Edm.Int32"); productDetailId.setType("Edm.Int32");
productDetailId.setValue(ValueType.PRIMITIVE, 2); productDetailId.setValue(ValueType.PRIMITIVE, 2);
entry.getProperties().add(productDetailId); entry.getProperties().add(productDetailId);
final Link link = new LinkImpl(); final Link link = new Link();
link.setRel("edit"); link.setRel("edit");
link.setHref(URI.create( link.setHref(URI.create(
Constants.get(ConstantKey.DEFAULT_SERVICE_URL) Constants.get(ConstantKey.DEFAULT_SERVICE_URL)
+ "ProductDetails(ProductID=6,ProductDetailID=1)").toASCIIString()); + "ProductDetails(ProductID=6,ProductDetailID=1)").toASCIIString());
entry.setEditLink(link); entry.setEditLink(link);
final EntitySetImpl feed = new EntitySetImpl(); final EntitySet feed = new EntitySet();
feed.getEntities().add(entry); feed.getEntities().add(entry);
final ResWrap<EntitySet> container = new ResWrap<EntitySet>( final ResWrap<EntitySet> container = new ResWrap<EntitySet>(
@ -736,7 +731,7 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final Property property = new PropertyImpl(); final Property property = new Property();
property.setType("Edm.Double"); property.setType("Edm.Double");
property.setValue(ValueType.PRIMITIVE, 41.79); property.setValue(ValueType.PRIMITIVE, 41.79);
@ -1144,7 +1139,7 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
property.setType("Microsoft.Test.OData.Services.ODataWCFService.Color"); property.setType("Microsoft.Test.OData.Services.ODataWCFService.Color");
property.setValue(ValueType.ENUM, "Red"); property.setValue(ValueType.ENUM, "Red");
final ResWrap<Property> container = new ResWrap<Property>( final ResWrap<Property> container = new ResWrap<Property>(
@ -1236,7 +1231,7 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
property.setType("Collection(String)"); property.setType("Collection(String)");
final List<String> value = Arrays.asList("Cheetos", "Mushrooms", "Apple", "Car", "Computer"); final List<String> value = Arrays.asList("Cheetos", "Mushrooms", "Apple", "Car", "Computer");
property.setValue(ValueType.COLLECTION_PRIMITIVE, value); property.setValue(ValueType.COLLECTION_PRIMITIVE, value);
@ -1268,7 +1263,7 @@ public class V4Services extends AbstractServices {
acceptType = Accept.parse(accept); acceptType = Accept.parse(accept);
} }
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
property.setType("Collection(Edm.String)"); property.setType("Collection(Edm.String)");
property.setValue(ValueType.COLLECTION_PRIMITIVE, property.setValue(ValueType.COLLECTION_PRIMITIVE,
Arrays.asList("first@olingo.apache.org", "second@olingo.apache.org")); Arrays.asList("first@olingo.apache.org", "second@olingo.apache.org"));

View File

@ -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.edm.geo.Geospatial;
import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.serialization.ODataSerializerException; 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.ODataAnnotationImpl;
import org.apache.olingo.commons.core.domain.ODataDeletedEntityImpl; import org.apache.olingo.commons.core.domain.ODataDeletedEntityImpl;
import org.apache.olingo.commons.core.domain.ODataDeltaLinkImpl; 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) { private void annotations(final ODataAnnotatable odataAnnotatable, final Annotatable annotatable) {
for (ODataAnnotation odataAnnotation : odataAnnotatable.getAnnotations()) { for (ODataAnnotation odataAnnotation : odataAnnotatable.getAnnotations()) {
final Annotation annotation = new AnnotationImpl(); final Annotation annotation = new Annotation();
annotation.setTerm(odataAnnotation.getTerm()); annotation.setTerm(odataAnnotation.getTerm());
annotation.setType(odataAnnotation.getValue().getTypeName()); annotation.setType(odataAnnotation.getValue().getTypeName());
@ -199,7 +193,7 @@ public class ODataBinderImpl implements ODataBinder {
@Override @Override
public EntitySet getEntitySet(final ODataEntitySet odataEntitySet) { public EntitySet getEntitySet(final ODataEntitySet odataEntitySet) {
final EntitySet entitySet = new EntitySetImpl(); final EntitySet entitySet = new EntitySet();
entitySet.setCount(odataEntitySet.getCount()); entitySet.setCount(odataEntitySet.getCount());
@ -248,7 +242,7 @@ public class ODataBinderImpl implements ODataBinder {
@Override @Override
public Entity getEntity(final ODataEntity odataEntity) { 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()); entity.setType(odataEntity.getTypeName() == null ? null : odataEntity.getTypeName().toString());
@ -257,7 +251,7 @@ public class ODataBinderImpl implements ODataBinder {
// ------------------------------------------------------------- // -------------------------------------------------------------
final URI odataEditLink = odataEntity.getEditLink(); final URI odataEditLink = odataEntity.getEditLink();
if (odataEditLink != null) { if (odataEditLink != null) {
final LinkImpl editLink = new LinkImpl(); final Link editLink = new Link();
editLink.setTitle(entity.getType()); editLink.setTitle(entity.getType());
editLink.setHref(odataEditLink.toASCIIString()); editLink.setHref(odataEditLink.toASCIIString());
editLink.setRel(Constants.EDIT_LINK_REL); editLink.setRel(Constants.EDIT_LINK_REL);
@ -265,7 +259,7 @@ public class ODataBinderImpl implements ODataBinder {
} }
if (odataEntity.isReadOnly()) { if (odataEntity.isReadOnly()) {
final LinkImpl selfLink = new LinkImpl(); final Link selfLink = new Link();
selfLink.setTitle(entity.getType()); selfLink.setTitle(entity.getType());
selfLink.setHref(odataEntity.getLink().toASCIIString()); selfLink.setHref(odataEntity.getLink().toASCIIString());
selfLink.setRel(Constants.SELF_LINK_REL); selfLink.setRel(Constants.SELF_LINK_REL);
@ -301,7 +295,7 @@ public class ODataBinderImpl implements ODataBinder {
@Override @Override
public Link getLink(final ODataLink link) { public Link getLink(final ODataLink link) {
final Link linkResource = new LinkImpl(); final Link linkResource = new Link();
linkResource.setRel(link.getRel()); linkResource.setRel(link.getRel());
linkResource.setTitle(link.getName()); linkResource.setTitle(link.getName());
linkResource.setHref(link.getLink() == null ? null : link.getLink().toASCIIString()); linkResource.setHref(link.getLink() == null ? null : link.getLink().toASCIIString());
@ -328,7 +322,7 @@ public class ODataBinderImpl implements ODataBinder {
@Override @Override
public Property getProperty(final ODataProperty property) { public Property getProperty(final ODataProperty property) {
final Property propertyResource = new PropertyImpl(); final Property propertyResource = new Property();
propertyResource.setName(property.getName()); propertyResource.setName(property.getName());
updateValuable(propertyResource, property); updateValuable(propertyResource, property);
annotations(property, propertyResource); annotations(property, propertyResource);
@ -350,7 +344,7 @@ public class ODataBinderImpl implements ODataBinder {
for (final ODataProperty propertyValue : value.asComplex()) { for (final ODataProperty propertyValue : value.asComplex()) {
complexProperties.add(getProperty(propertyValue)); complexProperties.add(getProperty(propertyValue));
} }
final ComplexValue lcValueResource = new ComplexValueImpl(); final ComplexValue lcValueResource = new ComplexValue();
lcValueResource.getValue().addAll(complexProperties); lcValueResource.getValue().addAll(complexProperties);
annotations(value.asComplex(), lcValueResource); annotations(value.asComplex(), lcValueResource);
links(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) { private ODataLink createLinkFromNavigationProperty(final Property property, final String propertyTypeName) {
if (property.isCollection()) { if (property.isCollection()) {
EntitySet inlineEntitySet = new EntitySetImpl(); EntitySet inlineEntitySet = new EntitySet();
for (final Object inlined : property.asCollection()) { for (final Object inlined : property.asCollection()) {
Entity inlineEntity = new EntityImpl(); Entity inlineEntity = new Entity();
inlineEntity.setType(propertyTypeName); inlineEntity.setType(propertyTypeName);
inlineEntity.getProperties().addAll(((ComplexValue) inlined).getValue()); inlineEntity.getProperties().addAll(((ComplexValue) inlined).getValue());
inlineEntitySet.getEntities().add(inlineEntity); inlineEntitySet.getEntities().add(inlineEntity);
} }
return createODataInlineEntitySet(inlineEntitySet, null, property.getName(), null); return createODataInlineEntitySet(inlineEntitySet, null, property.getName(), null);
} else { } else {
Entity inlineEntity = new EntityImpl(); Entity inlineEntity = new Entity();
inlineEntity.setType(propertyTypeName); inlineEntity.setType(propertyTypeName);
inlineEntity.getProperties().addAll(property.asComplex().getValue()); inlineEntity.getProperties().addAll(property.asComplex().getValue());
return createODataInlineEntity(inlineEntity, null, property.getName(), null); 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() + ")"); value = client.getObjectFactory().newCollectionValue(type == null ? null : "Collection(" + type.toString() + ")");
for (Object _value : valuable.asCollection()) { for (Object _value : valuable.asCollection()) {
final Property fake = new PropertyImpl(); final Property fake = new Property();
fake.setValue(valuable.getValueType().getBaseType(), _value); fake.setValue(valuable.getValueType().getBaseType(), _value);
value.asCollection().add(getODataValue(type, fake, contextURL, metadataETag)); value.asCollection().add(getODataValue(type, fake, contextURL, metadataETag));
} }

View File

@ -16,17 +16,22 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
package org.apache.olingo.commons.core.data; package org.apache.olingo.commons.api.data;
import java.net.URI; import java.net.URI;
import java.text.ParseException; import java.text.ParseException;
public abstract class AbstractODataObject extends AbstractAnnotatedObject { public abstract class AbstractODataObject extends Annotatable {
private URI baseURI; private URI baseURI;
private URI id; private URI id;
private String title; private String title;
/**
* Gets base URI.
*
* @return base URI.
*/
public URI getBaseURI() { public URI getBaseURI() {
return baseURI; return baseURI;
} }
@ -35,6 +40,12 @@ public abstract class AbstractODataObject extends AbstractAnnotatedObject {
this.baseURI = baseURI == null ? null : URI.create(baseURI); this.baseURI = baseURI == null ? null : URI.create(baseURI);
} }
/**
* Gest ID.
*
* @return ID.
*/
public URI getId() { public URI getId() {
return id; return id;
} }

View File

@ -18,12 +18,37 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.util.ArrayList;
import java.util.List; 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. * An element with instance annotations.
*/ */
public interface Annotatable { public abstract class Annotatable {
List<Annotation> getAnnotations(); private final List<Annotation> annotations = new ArrayList<Annotation>();
public List<Annotation> 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);
}
} }

View File

@ -21,9 +21,15 @@ package org.apache.olingo.commons.api.data;
/** /**
* Represents an instance annotation. * 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;
}
} }

View File

@ -18,9 +18,14 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public interface ComplexValue extends Linked, Annotatable { public class ComplexValue extends Linked {
List<Property> getValue(); private final List<Property> value = new ArrayList<Property>();
public List<Property> getValue() {
return value;
}
} }

View File

@ -20,17 +20,31 @@ package org.apache.olingo.commons.api.data;
import java.net.URI; import java.net.URI;
public interface DeletedEntity { public class DeletedEntity {
enum Reason { public enum Reason {
deleted, deleted,
changed 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;
}
} }

View File

@ -18,14 +18,25 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public interface Delta extends EntitySet { public class Delta extends EntitySet {
List<DeletedEntity> getDeletedEntities(); private final List<DeletedEntity> deletedEntities = new ArrayList<DeletedEntity>();
private final List<DeltaLink> addedLinks = new ArrayList<DeltaLink>();
private final List<DeltaLink> deletedLinks = new ArrayList<DeltaLink>();
List<DeltaLink> getAddedLinks(); public List<DeletedEntity> getDeletedEntities() {
return deletedEntities;
}
List<DeltaLink> getDeletedLinks(); public List<DeltaLink> getAddedLinks() {
return addedLinks;
}
public List<DeltaLink> getDeletedLinks() {
return deletedLinks;
}
} }

View File

@ -20,17 +20,33 @@ package org.apache.olingo.commons.api.data;
import java.net.URI; 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(); }
void setRelationship(String relationship); public void setSource(final URI source) {
this.source = source;
URI getTarget(); }
void setTarget(URI target); public String getRelationship() {
return relationship;
}
public void setRelationship(final String relationship) {
this.relationship = relationship;
}
public URI getTarget() {
return target;
}
public void setTarget(final URI target) {
this.target = target;
}
} }

View File

@ -21,93 +21,110 @@ package org.apache.olingo.commons.api.data;
import org.apache.olingo.commons.api.domain.ODataOperation; import org.apache.olingo.commons.api.domain.ODataOperation;
import java.net.URI; import java.net.URI;
import java.util.ArrayList;
import java.util.List; 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<Link> mediaEditLinks = new ArrayList<Link>();
private final List<ODataOperation> operations = new ArrayList<ODataOperation>();
private final List<Property> properties = new ArrayList<Property>();
private URI mediaContentSource;
private String mediaContentType;
private String mediaETag;
/** /**
* Gets ETag. * Gets ETag.
* *
* @return ETag. * @return ETag.
*/ */
String getETag(); public String getETag() {
return eTag;
}
/** public void setETag(final String eTag) {
* Gets base URI. this.eTag = eTag;
* }
* @return base URI.
*/
URI getBaseURI();
/** /**
* Gets entity type. * Gets entity type.
* *
* @return entity type. * @return entity type.
*/ */
String getType(); public String getType() {
return type;
}
/** /**
* Sets entity type. * Sets entity type.
* *
* @param type entity type. * @param type entity type.
*/ */
void setType(String type); public void setType(final String type) {
this.type = type;
/** }
* Gets entity ID.
*
* @return entity ID.
*/
URI getId();
/**
* Sets entity ID.
*
* @param id entity ID.
*/
void setId(URI id);
/** /**
* Gets entity self link. * Gets entity self link.
* *
* @return self link. * @return self link.
*/ */
Link getSelfLink(); public Link getSelfLink() {
return readLink;
}
/** /**
* Sets entity self link. * Sets entity self link.
* *
* @param selfLink self link. * @param selfLink self link.
*/ */
void setSelfLink(Link selfLink); public void setSelfLink(final Link selfLink) {
this.readLink = selfLink;
}
/** /**
* Gets entity edit link. * Gets entity edit link.
* *
* @return edit link. * @return edit link.
*/ */
Link getEditLink(); public Link getEditLink() {
return editLink;
}
/** /**
* Sets entity edit link. * Sets entity edit link.
* *
* @param editLink edit link. * @param editLink edit link.
*/ */
void setEditLink(Link editLink); public void setEditLink(final Link editLink) {
this.editLink = editLink;
}
/** /**
* Gets media entity links. * Gets media entity links.
* *
* @return links. * @return links.
*/ */
List<Link> getMediaEditLinks(); public List<Link> getMediaEditLinks() {
return mediaEditLinks;
}
/** /**
* Gets operations. * Gets operations.
* *
* @return operations. * @return operations.
*/ */
List<ODataOperation> getOperations(); public List<ODataOperation> getOperations() {
return operations;
}
/** /**
* Add property to this Entity. * Add property to this Entity.
@ -115,14 +132,19 @@ public interface Entity extends Linked, Annotatable {
* @param property property which is added * @param property property which is added
* @return this Entity for fluid/flow adding * @return this Entity for fluid/flow adding
*/ */
Entity addProperty(Property property); public Entity addProperty(final Property property) {
properties.add(property);
return this;
}
/** /**
* Gets properties. * Gets properties.
* *
* @return properties. * @return properties.
*/ */
List<Property> getProperties(); public List<Property> getProperties() {
return properties;
}
/** /**
* Gets property with given name. * Gets property with given name.
@ -130,54 +152,78 @@ public interface Entity extends Linked, Annotatable {
* @param name property name * @param name property name
* @return property with given name if found, null otherwise * @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. * Gets media content type.
* *
* @return media content type. * @return media content type.
*/ */
String getMediaContentType(); public String getMediaContentType() {
return mediaContentType;
/** }
* Gets media content resource.
*
* @return media content resource.
*/
URI getMediaContentSource();
/**
* Set media content source.
*
* @param mediaContentSource media content source.
*/
void setMediaContentSource(URI mediaContentSource);
/** /**
* Set media content type. * Set media content type.
* *
* @param mediaContentType 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. * ETag of the binary stream represented by this media entity or named stream property.
* *
* @return media ETag value * @return media ETag value
*/ */
String getMediaETag(); public String getMediaETag() {
return mediaETag;
}
/** /**
* Set media ETag. * Set media ETag.
* *
* @param eTag media ETag value * @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. * Checks if the current entity is a media entity.
* *
* @return 'TRUE' if is a media entity; 'FALSE' otherwise. * @return 'TRUE' if is a media entity; 'FALSE' otherwise.
*/ */
boolean isMediaEntity(); public boolean isMediaEntity() {
return mediaContentSource != null;
}
} }

View File

@ -19,70 +19,79 @@
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.net.URI; import java.net.URI;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public interface EntitySet extends Annotatable { public class EntitySet extends AbstractODataObject {
/** private Integer count;
* Gets base URI.
* private final List<Entity> entities = new ArrayList<Entity>();
* @return base URI.
*/ private URI next;
URI getBaseURI();
private URI deltaLink;
/** /**
* Sets number of entries. * Sets number of entries.
* *
* @param count 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. * Gets number of entries - if it was required.
* *
* @return number of entries into the entity set. * @return number of entries into the entity set.
*/ */
Integer getCount(); public Integer getCount() {
return count;
/** }
* Gest ID.
*
* @return ID.
*/
URI getId();
/** /**
* Gets entities. * Gets entities.
* *
* @return entries. * @return entries.
*/ */
List<Entity> getEntities(); public List<Entity> getEntities() {
return entities;
/** }
* Gets next link if exists.
*
* @return next link if exists; null otherwise.
*/
URI getNext();
/** /**
* Sets next link. * Sets next link.
* *
* @param next 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. * Gets delta link if exists.
* *
* @return delta link if exists; null otherwise. * @return delta link if exists; null otherwise.
*/ */
URI getDeltaLink(); public URI getDeltaLink() {
return deltaLink;
}
/** /**
* Sets delta link. * Sets delta link.
* *
* @param deltaLink delta link. * @param deltaLink delta link.
*/ */
void setDeltaLink(URI deltaLink); public void setDeltaLink(final URI deltaLink) {
this.deltaLink = deltaLink;
}
} }

View File

@ -18,130 +18,177 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public interface Link extends Annotatable { public class Link extends Annotatable {
/** private String title;
* Gets rel info. private String rel;
* private String href;
* @return rel info. private String type;
*/ private String mediaETag;
String getRel(); private Entity entity;
private EntitySet entitySet;
/** private String bindingLink;
* Sets rel info. private List<String> bindingLinks = new ArrayList<String>();
*
* @param rel rel info.
*/
void setRel(String rel);
/**
* Gets type.
*
* @return type.
*/
String getType();
/**
* Sets type.
*
* @param type type.
*/
void setType(String type);
/** /**
* Gets title. * Gets title.
* *
* @return title. * @return title.
*/ */
String getTitle(); public String getTitle() {
return title;
}
/** /**
* Sets title. * Sets title.
* *
* @param title 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. * Gets href.
* *
* @return href. * @return href.
*/ */
String getHref(); public String getHref() {
return href;
}
/** /**
* Sets href. * Sets href.
* *
* @param href 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. * Gets Media ETag.
* *
* @return media ETag * @return media ETag
*/ */
String getMediaETag(); public String getMediaETag() {
return mediaETag;
}
/** /**
* Sets Media ETag. * 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. * Gets in-line entity.
* *
* @return in-line entity. * @return in-line entity.
*/ */
Entity getInlineEntity(); public Entity getInlineEntity() {
return entity;
}
/** /**
* Sets in-line entity. * Sets in-line entity.
* *
* @param entity entity. * @param entity entity.
*/ */
void setInlineEntity(Entity entity); public void setInlineEntity(final Entity entity) {
this.entity = entity;
}
/** /**
* Gets in-line entity set. * Gets in-line entity set.
* *
* @return in-line entity set. * @return in-line entity set.
*/ */
EntitySet getInlineEntitySet(); public EntitySet getInlineEntitySet() {
return entitySet;
}
/** /**
* Sets in-line entity set. * Sets in-line entity set.
* *
* @param entitySet 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 <tt>null</tt> if not set. * If this is a "toOne" relationship this method delivers the binding link or <tt>null</tt> if not set.
* @return String the binding link. * @return String the binding link.
*/ */
String getBindingLink(); public String getBindingLink() {
return bindingLink;
/** }
* Sets the binding link.
* @param bindingLink
*/
void setBindingLink(String bindingLink);
/** /**
* If this is a "toMany" relationship this method delivers the binding links or <tt>emptyList</tt> if not set. * If this is a "toMany" relationship this method delivers the binding links or <tt>emptyList</tt> if not set.
* @return a list of binding links. * @return a list of binding links.
*/ */
List<String> getBindingLinks(); public List<String> 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 <tt>null</tt>. * Sets the binding links. List MUST NOT be <tt>null</tt>.
* @param bindingLinks * @param bindingLinks
*/ */
void setBindingLinks(List<String> bindingLinks); public void setBindingLinks(List<String> bindingLinks) {
this.bindingLinks = bindingLinks;
}
} }

View File

@ -18,9 +18,26 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public interface Linked { public abstract class Linked extends AbstractODataObject {
private final List<Link> associationLinks = new ArrayList<Link>();
private final List<Link> navigationLinks = new ArrayList<Link>();
private final List<Link> bindingLinks = new ArrayList<Link>();
protected Link getOneByTitle(final String name, final List<Link> 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 <tt>null</tt>. * Gets association link with given name, if available, otherwise <tt>null</tt>.
@ -28,14 +45,18 @@ public interface Linked {
* @param name candidate link name * @param name candidate link name
* @return association link with given name, if available, otherwise <tt>null</tt> * @return association link with given name, if available, otherwise <tt>null</tt>
*/ */
Link getAssociationLink(String name); public Link getAssociationLink(final String name) {
return getOneByTitle(name, associationLinks);
}
/** /**
* Gets association links. * Gets association links.
* *
* @return association links. * @return association links.
*/ */
List<Link> getAssociationLinks(); public List<Link> getAssociationLinks() {
return associationLinks;
}
/** /**
* Gets navigation link with given name, if available, otherwise <tt>null</tt>. * Gets navigation link with given name, if available, otherwise <tt>null</tt>.
@ -43,26 +64,34 @@ public interface Linked {
* @param name candidate link name * @param name candidate link name
* @return navigation link with given name, if available, otherwise <tt>null</tt> * @return navigation link with given name, if available, otherwise <tt>null</tt>
*/ */
Link getNavigationLink(String name); public Link getNavigationLink(final String name) {
return getOneByTitle(name, navigationLinks);
}
/** /**
* Gets navigation links. * Gets navigation links.
* *
* @return links. * @return links.
*/ */
List<Link> getNavigationLinks(); public List<Link> getNavigationLinks() {
return navigationLinks;
}
/** /**
* Gets binding link with given name, if available, otherwise <tt>null</tt>. * Gets binding link with given name, if available, otherwise <tt>null</tt>.
* @param name candidate link name * @param name candidate link name
* @return binding link with given name, if available, otherwise <tt>null</tt> * @return binding link with given name, if available, otherwise <tt>null</tt>
*/ */
Link getNavigationBinding(String name); public Link getNavigationBinding(String name) {
return getOneByTitle(name, bindingLinks);
}
/** /**
* Gets binding links. * Gets binding links.
* *
* @return links. * @return links.
*/ */
List<Link> getNavigationBindings(); public List<Link> getNavigationBindings() {
return bindingLinks;
}
} }

View File

@ -18,15 +18,46 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
public interface Parameter extends Valuable { public class Parameter extends Valuable {
String name;
/** /**
* @return name of the parameter * @return name of the parameter
*/ */
String getName(); public String getName() {
return name;
}
boolean isEntity(); /**
* @param name of the parameter
*/
public void setName(String name) {
this.name = name;
}
Entity asEntity(); /**
* 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;
}
} }

View File

@ -18,9 +18,32 @@
*/ */
package org.apache.olingo.commons.api.data; 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());
}
} }

View File

@ -18,96 +18,178 @@
*/ */
package org.apache.olingo.commons.api.data; package org.apache.olingo.commons.api.data;
import org.apache.olingo.commons.api.edm.geo.Geospatial;
import java.util.List; 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 * Check if Valuable contains a PRIMITIVE or COLLECTION_PRIMITIVE ValueType
* *
* @return true if ValueType is a PRIMITIVE or COLLECTION_PRIMITIVE, otherwise false * @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 * Check if Valuable contains a GEOSPATIAL or COLLECTION_GEOSPATIAL ValueType
* *
* @return true if ValueType is a GEOSPATIAL or COLLECTION_GEOSPATIAL, otherwise false * @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 * Check if Valuable contains a ENUM or COLLECTION_ENUM ValueType
* *
* @return true if ValueType is a ENUM or COLLECTION_ENUM, otherwise false * @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 * Check if Valuable contains a COMPLEX or COLLECTION_COMPLEX ValueType
* *
* @return true if ValueType is a COMPLEX or COLLECTION_COMPLEX, otherwise false * @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 * Check if Valuable contains a COLLECTION_* ValueType
* *
* @return true if ValueType is a COLLECTION_*, otherwise false * @return true if ValueType is a COLLECTION_*, otherwise false
*/ */
boolean isCollection(); public boolean isCollection() {
return valueType != null && valueType != valueType.getBaseType();
/** }
* Get the value
*
* @return the value
*/
Object getValue();
/** /**
* Get the value in its primitive representation or null if it is not based on a primitive ValueType * 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 * @return primitive representation or null if it is not based on a primitive ValueType
*/ */
Object asPrimitive(); public Object asPrimitive() {
if(isCollection()) {
/** return null;
* Get the value in its enum representation or null if it is not based on a enum ValueType }
* return isPrimitive() ? value : null;
* @return enum representation or null if it is not based on a enum ValueType }
*/
Object asEnum();
/** /**
* Get the value in its geospatial representation or null if it is not based on a geospatial ValueType * 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 * @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 * 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 * @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 * 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 * @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); }
ValueType getValueType(); /**
* Get the value
*
* @return the value
*/
public Object getValue() {
return value;
}
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);
}
} }

View File

@ -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<Annotation> annotations = new ArrayList<Annotation>();
@Override
public List<Annotation> 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);
}
}

View File

@ -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<Annotation> annotations = new ArrayList<Annotation>();
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<Annotation> 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);
}
}

View File

@ -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;
}
}

View File

@ -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<Property> value = new ArrayList<Property>();
private final List<Link> associationLinks = new ArrayList<Link>();
private final List<Link> navigationLinks = new ArrayList<Link>();
private final List<Link> bindingLinks = new ArrayList<Link>();
private final List<Annotation> annotations = new ArrayList<Annotation>();
@Override
public List<Property> getValue() {
return value;
}
private Link getOneByTitle(final String name, final List<Link> 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<Link> getAssociationLinks() {
return associationLinks;
}
@Override
public Link getNavigationLink(final String name) {
return getOneByTitle(name, navigationLinks);
}
@Override
public List<Link> getNavigationLinks() {
return navigationLinks;
}
@Override
public List<Annotation> getAnnotations() {
return annotations;
}
@Override
public Link getNavigationBinding(String name) {
return getOneByTitle(name, bindingLinks);
}
@Override
public List<Link> getNavigationBindings() {
return bindingLinks;
}
}

View File

@ -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;
}
}

View File

@ -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<DeletedEntity> deletedEntities = new ArrayList<DeletedEntity>();
private final List<DeltaLink> addedLinks = new ArrayList<DeltaLink>();
private final List<DeltaLink> deletedLinks = new ArrayList<DeltaLink>();
@Override
public List<DeletedEntity> getDeletedEntities() {
return deletedEntities;
}
@Override
public List<DeltaLink> getAddedLinks() {
return addedLinks;
}
@Override
public List<DeltaLink> getDeletedLinks() {
return deletedLinks;
}
}

View File

@ -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;
}
}

View File

@ -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<Link> associationLinks = new ArrayList<Link>();
private final List<Link> navigationLinks = new ArrayList<Link>();
private final List<Link> mediaEditLinks = new ArrayList<Link>();
private final List<Link> bindingLinks = new ArrayList<Link>();
private final List<ODataOperation> operations = new ArrayList<ODataOperation>();
private final List<Property> properties = new ArrayList<Property>();
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<Link> 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<Link> getAssociationLinks() {
return associationLinks;
}
@Override
public Link getNavigationLink(final String name) {
return getOneByTitle(name, navigationLinks);
}
@Override
public List<Link> getNavigationLinks() {
return navigationLinks;
}
@Override
public List<Link> getMediaEditLinks() {
return mediaEditLinks;
}
@Override
public Link getNavigationBinding(String name) {
return getOneByTitle(name, bindingLinks);
}
@Override
public List<Link> getNavigationBindings() {
return bindingLinks;
}
@Override
public List<ODataOperation> getOperations() {
return operations;
}
@Override
public Entity addProperty(final Property property) {
properties.add(property);
return this;
}
@Override
public List<Property> 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;
}
}

View File

@ -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<Entity> entities = new ArrayList<Entity>();
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<Entity> 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;
}
}

View File

@ -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<String> bindingLinks = new ArrayList<String>();
@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<String> getBindingLinks() {
return bindingLinks;
}
@Override
public void setBindingLink(String bindingLink) {
this.bindingLink = bindingLink;
}
@Override
public void setBindingLinks(List<String> bindingLinks) {
this.bindingLinks = bindingLinks;
}
}

View File

@ -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;
}
}

View File

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

View File

@ -36,12 +36,16 @@ import javax.xml.stream.events.XMLEvent;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.Constants; 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.Annotation;
import org.apache.olingo.commons.api.data.ComplexValue; 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.DeletedEntity.Reason;
import org.apache.olingo.commons.api.data.Delta; 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.Entity;
import org.apache.olingo.commons.api.data.EntitySet; 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.Property;
import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.data.Valuable; 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.format.ContentType;
import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataDeserializer;
import org.apache.olingo.commons.api.serialization.ODataDeserializerException; 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 org.apache.olingo.commons.core.edm.provider.EdmTypeInfo;
import com.fasterxml.aalto.stax.InputFactoryImpl; import com.fasterxml.aalto.stax.InputFactoryImpl;
@ -128,11 +122,11 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
if (event.isStartElement()) { if (event.isStartElement()) {
if (value == null) { if (value == null) {
value = new ComplexValueImpl(); value = new ComplexValue();
} }
if (Constants.QNAME_ATOM_ELEM_LINK.equals(event.asStartElement().getName())) { 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)); final Attribute rel = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REL));
if (rel != null) { if (rel != null) {
link.setRel(rel.getValue()); link.setRel(rel.getValue());
@ -260,7 +254,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
private Property property(final XMLEventReader reader, final StartElement start) private Property property(final XMLEventReader reader, final StartElement start)
throws XMLStreamException, EdmPrimitiveTypeException { throws XMLStreamException, EdmPrimitiveTypeException {
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
if (propertyValueQName.equals(start.getName())) { if (propertyValueQName.equals(start.getName())) {
// retrieve name from context // 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 { throws XMLStreamException, EdmPrimitiveTypeException {
boolean foundEndElement = false; boolean foundEndElement = false;
@ -434,7 +428,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) { if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) {
return null; return null;
} }
final DeltaImpl delta = new DeltaImpl(); final Delta delta = new Delta();
final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE);
if (xmlBase != null) { if (xmlBase != null) {
delta.setBaseURI(xmlBase.getValue()); 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())) { } else if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(event.asStartElement().getName())) {
delta.getEntities().add(entity(reader, event.asStartElement())); delta.getEntities().add(entity(reader, event.asStartElement()));
} else if (deletedEntryQName.equals(event.asStartElement().getName())) { } 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)); final Attribute ref = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REF));
if (ref != null) { if (ref != null) {
@ -488,7 +482,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
} else if (linkQName.equals(event.asStartElement().getName()) } else if (linkQName.equals(event.asStartElement().getName())
|| deletedLinkQName.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)); final Attribute source = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_SOURCE));
if (source != null) { if (source != null) {
@ -520,7 +514,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
return delta; 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 { throws XMLStreamException, EdmPrimitiveTypeException {
final Map<String, List<Annotation>> annotations = new HashMap<String, List<Annotation>>(); final Map<String, List<Annotation>> annotations = new HashMap<String, List<Annotation>>();
@ -557,7 +551,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
private Annotation annotation(final XMLEventReader reader, final StartElement start) private Annotation annotation(final XMLEventReader reader, final StartElement start)
throws XMLStreamException, EdmPrimitiveTypeException { throws XMLStreamException, EdmPrimitiveTypeException {
final Annotation annotation = new AnnotationImpl(); final Annotation annotation = new Annotation();
annotation.setTerm(start.getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_TERM)).getValue()); annotation.setTerm(start.getAttributeByName(QName.valueOf(Constants.ATOM_ATTR_TERM)).getValue());
valuable(annotation, reader, start); valuable(annotation, reader, start);
@ -565,8 +559,8 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
return annotation; return annotation;
} }
private EntityImpl entityRef(final StartElement start) throws XMLStreamException { private Entity entityRef(final StartElement start) throws XMLStreamException {
final EntityImpl entity = new EntityImpl(); final Entity entity = new Entity();
final Attribute entityRefId = start.getAttributeByName(Constants.QNAME_ATOM_ATTR_ID); final Attribute entityRefId = start.getAttributeByName(Constants.QNAME_ATOM_ATTR_ID);
if (entityRefId != null) { if (entityRefId != null) {
@ -578,11 +572,11 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
private Entity entity(final XMLEventReader reader, final StartElement start) private Entity entity(final XMLEventReader reader, final StartElement start)
throws XMLStreamException, EdmPrimitiveTypeException { throws XMLStreamException, EdmPrimitiveTypeException {
final EntityImpl entity; final Entity entity;
if (entryRefQName.equals(start.getName())) { if (entryRefQName.equals(start.getName())) {
entity = entityRef(start); entity = entityRef(start);
} else if (Constants.QNAME_ATOM_ELEM_ENTRY.equals(start.getName())) { } 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); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE);
if (xmlBase != null) { if (xmlBase != null) {
entity.setBaseURI(xmlBase.getValue()); 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()); entity.setType(new EdmTypeInfo.Builder().setTypeExpression(term.getValue()).build().internal());
} }
} else if (Constants.QNAME_ATOM_ELEM_LINK.equals(event.asStartElement().getName())) { } 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)); final Attribute rel = event.asStartElement().getAttributeByName(QName.valueOf(Constants.ATTR_REL));
if (rel != null) { if (rel != null) {
link.setRel(rel.getValue()); link.setRel(rel.getValue());
@ -740,7 +734,7 @@ public class AtomDeserializer extends AbstractAtomDealer implements ODataDeseria
if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) { if (!Constants.QNAME_ATOM_ELEM_FEED.equals(start.getName())) {
return null; return null;
} }
final EntitySetImpl entitySet = new EntitySetImpl(); final EntitySet entitySet = new EntitySet();
final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE); final Attribute xmlBase = start.getAttributeByName(Constants.QNAME_ATTR_XML_BASE);
if (xmlBase != null) { if (xmlBase != null) {
entitySet.setBaseURI(xmlBase.getValue()); entitySet.setBaseURI(xmlBase.getValue());

View File

@ -31,6 +31,7 @@ import javax.xml.stream.XMLStreamWriter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.ODataRuntimeException; import org.apache.olingo.commons.api.ODataRuntimeException;
import org.apache.olingo.commons.api.data.AbstractODataObject;
import org.apache.olingo.commons.api.data.Annotation; import org.apache.olingo.commons.api.data.Annotation;
import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.ComplexValue;
import org.apache.olingo.commons.api.data.ContextURL; 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.format.ContentType;
import org.apache.olingo.commons.api.serialization.ODataSerializer; import org.apache.olingo.commons.api.serialization.ODataSerializer;
import org.apache.olingo.commons.api.serialization.ODataSerializerException; 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.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo; import org.apache.olingo.commons.core.edm.provider.EdmTypeInfo;
@ -288,9 +285,7 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize
} }
writer.writeEndElement(); writer.writeEndElement();
if (entity instanceof AbstractODataObject) { common(writer, entity);
common(writer, (AbstractODataObject) entity);
}
if (serverMode) { if (serverMode) {
if (entity.getEditLink() != null) { if (entity.getEditLink() != null) {
@ -416,9 +411,7 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize
writer.writeEndElement(); writer.writeEndElement();
} }
if (entitySet instanceof AbstractODataObject) { common(writer, entitySet);
common(writer, (AbstractODataObject) entitySet);
}
for (Entity entity : entitySet.getEntities()) { for (Entity entity : entitySet.getEntities()) {
if (entity.getType() == null && entity.getProperties().isEmpty()) { if (entity.getType() == null && entity.getProperties().isEmpty()) {
@ -433,14 +426,14 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize
if (serverMode) { if (serverMode) {
if (entitySet.getNext() != null) { if (entitySet.getNext() != null) {
final LinkImpl next = new LinkImpl(); final Link next = new Link();
next.setRel(Constants.NEXT_LINK_REL); next.setRel(Constants.NEXT_LINK_REL);
next.setHref(entitySet.getNext().toASCIIString()); next.setHref(entitySet.getNext().toASCIIString());
links(writer, Collections.<Link> singletonList(next)); links(writer, Collections.<Link> singletonList(next));
} }
if (entitySet.getDeltaLink() != null) { if (entitySet.getDeltaLink() != null) {
final LinkImpl next = new LinkImpl(); final Link next = new Link();
next.setRel(Constants.NS_DELTA_LINK_REL); next.setRel(Constants.NS_DELTA_LINK_REL);
next.setHref(entitySet.getDeltaLink().toASCIIString()); next.setHref(entitySet.getDeltaLink().toASCIIString());
@ -559,10 +552,10 @@ public class AtomSerializer extends AbstractAtomDealer implements ODataSerialize
final ContextURL contextURL = ContextURLParser.parse(container.getContextURL()); final ContextURL contextURL = ContextURLParser.parse(container.getContextURL());
String base = contextURL.getServiceRoot().toASCIIString(); String base = contextURL.getServiceRoot().toASCIIString();
if (container.getPayload() instanceof EntitySet) { if (container.getPayload() instanceof EntitySet) {
((EntitySetImpl) container.getPayload()).setBaseURI(base); ((EntitySet) container.getPayload()).setBaseURI(base);
} }
if (container.getPayload() instanceof Entity) { if (container.getPayload() instanceof Entity) {
((EntityImpl) container.getPayload()).setBaseURI(base); ((Entity) container.getPayload()).setBaseURI(base);
} }
writer.writeAttribute(namespaceMetadata, Constants.CONTEXT, writer.writeAttribute(namespaceMetadata, Constants.CONTEXT,

View File

@ -25,12 +25,11 @@ import java.net.URI;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.ContextURL; 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.Delta;
import org.apache.olingo.commons.api.data.DeltaLink;
import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.serialization.ODataDeserializerException; 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.JsonFactory;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
@ -48,7 +47,7 @@ public class JsonDeltaDeserializer extends JsonDeserializer {
final ObjectNode tree = parser.getCodec().readTree(parser); 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) ? final URI contextURL = tree.hasNonNull(Constants.JSON_CONTEXT) ?
URI.create(tree.get(Constants.JSON_CONTEXT).textValue()) : null; URI.create(tree.get(Constants.JSON_CONTEXT).textValue()) : null;
@ -77,11 +76,11 @@ public class JsonDeltaDeserializer extends JsonDeserializer {
if (itemContextURL == null || itemContextURL.isEntity()) { if (itemContextURL == null || itemContextURL.isEntity()) {
delta.getEntities().add(entityDeserializer.doDeserialize(item.traverse(parser.getCodec())).getPayload()); delta.getEntities().add(entityDeserializer.doDeserialize(item.traverse(parser.getCodec())).getPayload());
} else if (itemContextURL.isDeltaDeletedEntity()) { } 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()) { } 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()) { } else if (itemContextURL.isDeltaDeletedLink()) {
delta.getDeletedLinks().add(parser.getCodec().treeToValue(item, DeltaLinkImpl.class)); delta.getDeletedLinks().add(parser.getCodec().treeToValue(item, DeltaLink.class));
} }
} }
} }

View File

@ -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.ComplexValue;
import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet; 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.Linked;
import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ResWrap; 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.edm.geo.Geospatial;
import org.apache.olingo.commons.api.serialization.ODataDeserializer; import org.apache.olingo.commons.api.serialization.ODataDeserializer;
import org.apache.olingo.commons.api.serialization.ODataDeserializerException; 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 org.apache.olingo.commons.core.edm.provider.EdmTypeInfo;
import com.fasterxml.jackson.core.JsonFactory; 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, 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)); final String entityNamePrefix = name.substring(0, name.indexOf(suffix));
if (tree.has(entityNamePrefix)) { if (tree.has(entityNamePrefix)) {
@ -110,7 +106,7 @@ public class JsonDeserializer implements ODataDeserializer {
} else if (inline instanceof ArrayNode) { } else if (inline instanceof ArrayNode) {
link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString());
final EntitySet entitySet = new EntitySetImpl(); final EntitySet entitySet = new EntitySet();
for (final Iterator<JsonNode> entries = inline.elements(); entries.hasNext();) { for (final Iterator<JsonNode> entries = inline.elements(); entries.hasNext();) {
entitySet.getEntities().add(entityDeserializer.doDeserialize(entries.next().traverse(codec)).getPayload()); 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 { final JsonNode tree, final ObjectCodec codec) throws IOException {
if (field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) { if (field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) {
final LinkImpl link = new LinkImpl(); final Link link = new Link();
link.setTitle(getTitle(field)); link.setTitle(getTitle(field));
link.setRel(Constants.NS_NAVIGATION_LINK_REL + 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(field.getKey());
toRemove.add(setInline(field.getKey(), Constants.JSON_NAVIGATION_LINK, tree, codec, link)); toRemove.add(setInline(field.getKey(), Constants.JSON_NAVIGATION_LINK, tree, codec, link));
} else if (field.getKey().endsWith(Constants.JSON_ASSOCIATION_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.setTitle(getTitle(field));
link.setRel(Constants.NS_ASSOCIATION_LINK_REL + getTitle(field)); link.setRel(Constants.NS_ASSOCIATION_LINK_REL + getTitle(field));
link.setHref(field.getValue().textValue()); link.setHref(field.getValue().textValue());
@ -168,7 +164,7 @@ public class JsonDeserializer implements ODataDeserializer {
if (field.getValue().isValueNode()) { if (field.getValue().isValueNode()) {
final String suffix = field.getKey().replaceAll("^.*@", "@"); final String suffix = field.getKey().replaceAll("^.*@", "@");
final LinkImpl link = new LinkImpl(); final Link link = new Link();
link.setTitle(getTitle(field)); link.setTitle(getTitle(field));
link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field));
link.setHref(field.getValue().textValue()); link.setHref(field.getValue().textValue());
@ -180,7 +176,7 @@ public class JsonDeserializer implements ODataDeserializer {
for (final Iterator<JsonNode> itor = field.getValue().elements(); itor.hasNext();) { for (final Iterator<JsonNode> itor = field.getValue().elements(); itor.hasNext();) {
final JsonNode node = itor.next(); final JsonNode node = itor.next();
final LinkImpl link = new LinkImpl(); final Link link = new Link();
link.setTitle(getTitle(field)); link.setTitle(getTitle(field));
link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field)); link.setRel(Constants.NS_NAVIGATION_LINK_REL + getTitle(field));
link.setHref(node.asText()); link.setHref(node.asText());
@ -243,7 +239,7 @@ public class JsonDeserializer implements ODataDeserializer {
final Matcher customAnnotation = CUSTOM_ANNOTATION.matcher(field.getKey()); final Matcher customAnnotation = CUSTOM_ANNOTATION.matcher(field.getKey());
if (field.getKey().charAt(0) == '@') { if (field.getKey().charAt(0) == '@') {
final Annotation entityAnnot = new AnnotationImpl(); final Annotation entityAnnot = new Annotation();
entityAnnot.setTerm(field.getKey().substring(1)); entityAnnot.setTerm(field.getKey().substring(1));
value(entityAnnot, field.getValue(), codec); 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))) { } else if (type == null && field.getKey().endsWith(getJSONAnnotation(Constants.JSON_TYPE))) {
type = field.getValue().asText(); type = field.getValue().asText();
} else if (annotation == null && customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { } 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)); annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3));
value(annotation, field.getValue(), codec); value(annotation, field.getValue(), codec);
} else { } else {
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
property.setName(field.getKey()); property.setName(field.getKey());
property.setType(type == null property.setType(type == null
? null ? null
@ -289,7 +285,7 @@ public class JsonDeserializer implements ODataDeserializer {
private Object fromComplex(final ObjectNode node, final ObjectCodec codec) private Object fromComplex(final ObjectNode node, final ObjectCodec codec)
throws IOException, EdmPrimitiveTypeException { throws IOException, EdmPrimitiveTypeException {
final ComplexValue complexValue = new ComplexValueImpl(); final ComplexValue complexValue = new ComplexValue();
final Set<String> toRemove = new HashSet<String>(); final Set<String> toRemove = new HashSet<String>();
for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) { for (final Iterator<Map.Entry<String, JsonNode>> itor = node.fields(); itor.hasNext();) {
final Map.Entry<String, JsonNode> field = itor.next(); final Map.Entry<String, JsonNode> field = itor.next();

View File

@ -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.ODataLinkType;
import org.apache.olingo.commons.api.domain.ODataOperation; import org.apache.olingo.commons.api.domain.ODataOperation;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; 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 org.apache.olingo.commons.core.edm.provider.EdmTypeInfo;
import com.fasterxml.jackson.core.JsonParseException; 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()); throw new JsonParseException("Expected OData Entity, found EntitySet", parser.getCurrentLocation());
} }
final EntityImpl entity = new EntityImpl(); final Entity entity = new Entity();
final URI contextURL; final URI contextURL;
if (tree.hasNonNull(Constants.JSON_CONTEXT)) { if (tree.hasNonNull(Constants.JSON_CONTEXT)) {
@ -108,7 +105,7 @@ public class JsonEntityDeserializer extends JsonDeserializer {
} }
if (tree.hasNonNull(Constants.JSON_READ_LINK)) { if (tree.hasNonNull(Constants.JSON_READ_LINK)) {
final LinkImpl link = new LinkImpl(); final Link link = new Link();
link.setRel(Constants.SELF_LINK_REL); link.setRel(Constants.SELF_LINK_REL);
link.setHref(tree.get(Constants.JSON_READ_LINK).textValue()); link.setHref(tree.get(Constants.JSON_READ_LINK).textValue());
entity.setSelfLink(link); entity.setSelfLink(link);
@ -117,7 +114,7 @@ public class JsonEntityDeserializer extends JsonDeserializer {
} }
if (tree.hasNonNull(Constants.JSON_EDIT_LINK)) { if (tree.hasNonNull(Constants.JSON_EDIT_LINK)) {
final LinkImpl link = new LinkImpl(); final Link link = new Link();
if (serverMode) { if (serverMode) {
link.setRel(Constants.EDIT_LINK_REL); link.setRel(Constants.EDIT_LINK_REL);
} }
@ -153,7 +150,7 @@ public class JsonEntityDeserializer extends JsonDeserializer {
links(field, entity, toRemove, tree, parser.getCodec()); links(field, entity, toRemove, tree, parser.getCodec());
if (field.getKey().endsWith(getJSONAnnotation(Constants.JSON_MEDIA_EDIT_LINK))) { 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.setTitle(getTitle(field));
link.setRel(Constants.NS_MEDIA_EDIT_LINK_REL + getTitle(field)); link.setRel(Constants.NS_MEDIA_EDIT_LINK_REL + getTitle(field));
link.setHref(field.getValue().textValue()); link.setHref(field.getValue().textValue());
@ -188,7 +185,7 @@ public class JsonEntityDeserializer extends JsonDeserializer {
toRemove.add(field.getKey()); toRemove.add(field.getKey());
} else if (customAnnotation.matches() && !"odata".equals(customAnnotation.group(2))) { } 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)); annotation.setTerm(customAnnotation.group(2) + "." + customAnnotation.group(3));
try { try {
value(annotation, field.getValue(), parser.getCodec()); value(annotation, field.getValue(), parser.getCodec());

View File

@ -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.EntitySet;
import org.apache.olingo.commons.api.data.ResWrap; import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; 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.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
@ -55,7 +53,7 @@ public class JsonEntitySetDeserializer extends JsonDeserializer {
return null; return null;
} }
final EntitySetImpl entitySet = new EntitySetImpl(); final EntitySet entitySet = new EntitySet();
URI contextURL; URI contextURL;
if (tree.hasNonNull(Constants.JSON_CONTEXT)) { if (tree.hasNonNull(Constants.JSON_CONTEXT)) {
@ -105,7 +103,7 @@ public class JsonEntitySetDeserializer extends JsonDeserializer {
for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) {
final Map.Entry<String, JsonNode> field = itor.next(); final Map.Entry<String, JsonNode> field = itor.next();
if (field.getKey().charAt(0) == '@') { if (field.getKey().charAt(0) == '@') {
final Annotation annotation = new AnnotationImpl(); final Annotation annotation = new Annotation();
annotation.setTerm(field.getKey().substring(1)); annotation.setTerm(field.getKey().substring(1));
try { try {

View File

@ -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.ResWrap;
import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; 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 org.apache.olingo.commons.core.edm.provider.EdmTypeInfo;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
@ -53,7 +51,7 @@ public class JsonPropertyDeserializer extends JsonDeserializer {
final String metadataETag; final String metadataETag;
final URI contextURL; final URI contextURL;
final PropertyImpl property = new PropertyImpl(); final Property property = new Property();
if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) { if (tree.hasNonNull(Constants.JSON_METADATA_ETAG)) {
metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue(); metadataETag = tree.get(Constants.JSON_METADATA_ETAG).textValue();
@ -99,7 +97,7 @@ public class JsonPropertyDeserializer extends JsonDeserializer {
for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) { for (final Iterator<Map.Entry<String, JsonNode>> itor = tree.fields(); itor.hasNext();) {
final Map.Entry<String, JsonNode> field = itor.next(); final Map.Entry<String, JsonNode> field = itor.next();
if (field.getKey().charAt(0) == '@') { if (field.getKey().charAt(0) == '@') {
final Annotation annotation = new AnnotationImpl(); final Annotation annotation = new Annotation();
annotation.setTerm(field.getKey().substring(1)); annotation.setTerm(field.getKey().substring(1));
try { try {

View File

@ -370,11 +370,9 @@ public class JsonSerializer implements ODataSerializer {
} }
} }
if (valuable instanceof Annotatable) {
for (Annotation annotation : ((Annotatable) valuable).getAnnotations()) { for (Annotation annotation : ((Annotatable) valuable).getAnnotations()) {
valuable(jgen, annotation, name + "@" + annotation.getTerm()); valuable(jgen, annotation, name + "@" + annotation.getTerm());
} }
}
jgen.writeFieldName(name); jgen.writeFieldName(name);
value(jgen, valuable.getType(), valuable); value(jgen, valuable.getType(), valuable);

View File

@ -21,6 +21,8 @@ package org.apache.olingo.server.api;
import java.util.List; import java.util.List;
import org.apache.olingo.commons.api.ODataRuntimeException; 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.edm.provider.EdmProvider;
import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.DeserializerException;
@ -99,5 +101,17 @@ public abstract class OData {
*/ */
public abstract UriHelper createUriHelper(); 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; 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);
} }

View File

@ -20,8 +20,11 @@ package org.apache.olingo.server.core;
import java.util.List; 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.edm.provider.EdmProvider;
import org.apache.olingo.commons.api.format.ODataFormat; 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.OData;
import org.apache.olingo.server.api.ODataHttpHandler; import org.apache.olingo.server.api.ODataHttpHandler;
import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.ServiceMetadata;
@ -105,4 +108,9 @@ public class ODataImpl extends OData {
return serializer; return serializer;
} }
@Override
public EdmPrimitiveType createPrimitiveTypeInstance(EdmPrimitiveTypeKind kind) {
return EdmPrimitiveTypeFactory.getInstance(kind);
}
} }

View File

@ -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.EdmProperty;
import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.edm.EdmTypeDefinition; 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.DeserializerException;
import org.apache.olingo.server.api.deserializer.DeserializerResult; import org.apache.olingo.server.api.deserializer.DeserializerResult;
import org.apache.olingo.server.api.deserializer.ODataDeserializer; import org.apache.olingo.server.api.deserializer.ODataDeserializer;
@ -100,7 +94,7 @@ 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 { final ExpandTreeBuilder expandBuilder) throws DeserializerException {
EntitySetImpl entitySet = new EntitySetImpl(); EntitySet entitySet = new EntitySet();
// Consume entities // Consume entities
JsonNode jsonNode = tree.get(Constants.VALUE); JsonNode jsonNode = tree.get(Constants.VALUE);
@ -175,7 +169,7 @@ 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 { final ExpandTreeBuilder expandBuilder) throws DeserializerException {
EntityImpl entity = new EntityImpl(); Entity entity = new Entity();
entity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString()); entity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString());
// Check and consume all Properties // Check and consume all Properties
@ -232,7 +226,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
} }
for (final String name : parameterNames) { for (final String name : parameterNames) {
final EdmParameter edmParameter = edmAction.getParameter(name); final EdmParameter edmParameter = edmAction.getParameter(name);
ParameterImpl parameter = new ParameterImpl(); Parameter parameter = new Parameter();
parameter.setName(name); parameter.setName(name);
JsonNode jsonNode = node.get(name); JsonNode jsonNode = node.get(name);
@ -281,7 +275,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
* @throws DeserializerException if an exception during consummation occurs * @throws DeserializerException if an exception during consummation occurs
*/ */
private void consumeRemainingJsonNodeFields(final EdmEntityType edmEntityType, final ObjectNode node, private void consumeRemainingJsonNodeFields(final EdmEntityType edmEntityType, final ObjectNode node,
final EntityImpl entity) throws DeserializerException { final Entity entity) throws DeserializerException {
final List<String> toRemove = new ArrayList<String>(); final List<String> toRemove = new ArrayList<String>();
Iterator<Entry<String, JsonNode>> fieldsIterator = node.fields(); Iterator<Entry<String, JsonNode>> fieldsIterator = node.fields();
while (fieldsIterator.hasNext()) { while (fieldsIterator.hasNext()) {
@ -304,7 +298,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
} }
private void consumeEntityProperties(final EdmEntityType edmEntityType, final ObjectNode node, private void consumeEntityProperties(final EdmEntityType edmEntityType, final ObjectNode node,
final EntityImpl entity) throws DeserializerException { final Entity entity) throws DeserializerException {
List<String> propertyNames = edmEntityType.getPropertyNames(); List<String> propertyNames = edmEntityType.getPropertyNames();
for (String propertyName : propertyNames) { for (String propertyName : propertyNames) {
JsonNode jsonNode = node.get(propertyName); JsonNode jsonNode = node.get(propertyName);
@ -326,7 +320,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
} }
private void consumeExpandedNavigationProperties(final EdmEntityType edmEntityType, final ObjectNode node, 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<String> navigationPropertyNames = edmEntityType.getNavigationPropertyNames(); List<String> navigationPropertyNames = edmEntityType.getNavigationPropertyNames();
for (String navigationPropertyName : navigationPropertyNames) { for (String navigationPropertyName : navigationPropertyNames) {
// read expanded navigation property // read expanded navigation property
@ -339,13 +333,13 @@ public class ODataJsonDeserializer implements ODataDeserializer {
DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, navigationPropertyName); DeserializerException.MessageKeys.INVALID_NULL_PROPERTY, navigationPropertyName);
} }
LinkImpl link = new LinkImpl(); Link link = new Link();
link.setTitle(navigationPropertyName); link.setTitle(navigationPropertyName);
final ExpandTreeBuilder childExpandBuilder = (expandBuilder != null) ? final ExpandTreeBuilder childExpandBuilder = (expandBuilder != null) ?
expandBuilder.expand(edmNavigationProperty) : null; expandBuilder.expand(edmNavigationProperty) : null;
if (jsonNode.isArray() && edmNavigationProperty.isCollection()) { if (jsonNode.isArray() && edmNavigationProperty.isCollection()) {
link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString());
EntitySetImpl inlineEntitySet = new EntitySetImpl(); EntitySet inlineEntitySet = new EntitySet();
inlineEntitySet.getEntities().addAll(consumeEntitySetArray(edmNavigationProperty.getType(), jsonNode, inlineEntitySet.getEntities().addAll(consumeEntitySetArray(edmNavigationProperty.getType(), jsonNode,
childExpandBuilder)); childExpandBuilder));
link.setInlineEntitySet(inlineEntitySet); link.setInlineEntitySet(inlineEntitySet);
@ -377,7 +371,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
throw new DeserializerException("Invalid navigationPropertyName: " + navigationPropertyName, throw new DeserializerException("Invalid navigationPropertyName: " + navigationPropertyName,
DeserializerException.MessageKeys.NAVIGATION_PROPERTY_NOT_FOUND, navigationPropertyName); DeserializerException.MessageKeys.NAVIGATION_PROPERTY_NOT_FOUND, navigationPropertyName);
} }
LinkImpl bindingLink = new LinkImpl(); Link bindingLink = new Link();
bindingLink.setTitle(navigationPropertyName); bindingLink.setTitle(navigationPropertyName);
if (edmNavigationProperty.isCollection()) { if (edmNavigationProperty.isCollection()) {
@ -419,7 +413,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
private Property consumePropertyNode(final String name, final EdmType type, final boolean isCollection, 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 isNullable, final Integer maxLength, final Integer precision, final Integer scale,
final boolean isUnicode, final EdmMapping mapping, JsonNode jsonNode) throws DeserializerException { final boolean isUnicode, final EdmMapping mapping, JsonNode jsonNode) throws DeserializerException {
Property property = new PropertyImpl(); Property property = new Property();
property.setName(name); property.setName(name);
property.setType(type.getFullQualifiedName().getFullQualifiedNameAsString()); property.setType(type.getFullQualifiedName().getFullQualifiedNameAsString());
if (isCollection) { if (isCollection) {
@ -552,7 +546,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, name); DeserializerException.MessageKeys.INVALID_JSON_TYPE_FOR_PROPERTY, name);
} }
// Even if there are no properties defined we have to give back an empty list // 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; EdmComplexType edmType = (EdmComplexType) type;
// Check and consume all Properties // Check and consume all Properties
for (String propertyName : edmType.getPropertyNames()) { for (String propertyName : edmType.getPropertyNames()) {

View File

@ -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.Property;
import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.format.ODataFormat; 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.apache.olingo.server.api.serializer.ComplexSerializerOptions;
import org.junit.Test; import org.junit.Test;
@ -44,7 +42,7 @@ public class ODataJsonSerializerTest {
final List<ComplexValue> col = new ArrayList<ComplexValue>(); final List<ComplexValue> col = new ArrayList<ComplexValue>();
col.add(getValues(1)); col.add(getValues(1));
col.add(getValues(2)); 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 ODataJsonSerializer serializer = new ODataJsonSerializer(ODataFormat.APPLICATION_JSON);
final ComplexSerializerOptions options = ComplexSerializerOptions.with() final ComplexSerializerOptions options = ComplexSerializerOptions.with()
@ -66,9 +64,9 @@ public class ODataJsonSerializerTest {
} }
private ComplexValue getValues(int i) { private ComplexValue getValues(int i) {
ComplexValue value = new ComplexValueImpl(); ComplexValue value = new ComplexValue();
value.getValue().add(new PropertyImpl(null, "prop1", ValueType.PRIMITIVE, "test" + i)); value.getValue().add(new Property(null, "prop1", ValueType.PRIMITIVE, "test" + i));
value.getValue().add(new PropertyImpl(null, "prop2", ValueType.PRIMITIVE, "test" + i + i)); value.getValue().add(new Property(null, "prop2", ValueType.PRIMITIVE, "test" + i + i));
return value; return value;
} }
} }

View File

@ -133,6 +133,7 @@
<groupId>org.apache.olingo</groupId> <groupId>org.apache.olingo</groupId>
<artifactId>odata-commons-core</artifactId> <artifactId>odata-commons-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
<scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -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
* <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>
* (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
* <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>,
* 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;
}
/**
* <p>Returns the percent-encoded UTF-8 representation of a String.</p>
* <p>In order to avoid producing percent-encoded CESU-8 (as described in
* the Unicode Consortium's <a href="http://www.unicode.org/reports/tr26/">
* Technical Report #26</a>), this is done in two steps:
* <ol>
* <li>Re-encode the characters from their Java-internal UTF-16 representations
* into their UTF-8 representations.</li>
* <li>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 <code>%xx</code> representation are represented in one byte in UTF-8.</li>
* </ol></p>
* @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;
}
}

View File

@ -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.Property;
import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.domain.ODataLinkType; 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 { public class DataCreator {
@ -64,19 +59,19 @@ public class DataCreator {
data.put("ESServerSidePaging", createESServerSidePaging()); data.put("ESServerSidePaging", createESServerSidePaging());
// No data available but to allow an insert operation create empty EntitySets // No data available but to allow an insert operation create empty EntitySets
data.put("ESAllNullable", new EntitySetImpl()); data.put("ESAllNullable", new EntitySet());
data.put("ESMixEnumDefCollComp", new EntitySetImpl()); data.put("ESMixEnumDefCollComp", new EntitySet());
data.put("ESTwoBase", new EntitySetImpl()); data.put("ESTwoBase", new EntitySet());
data.put("ESBaseTwoKeyNav", new EntitySetImpl()); data.put("ESBaseTwoKeyNav", new EntitySet());
data.put("ESBaseTwoKeyTwoPrim", new EntitySetImpl()); data.put("ESBaseTwoKeyTwoPrim", new EntitySet());
data.put("ESTwoKeyTwoPrim", new EntitySetImpl()); data.put("ESTwoKeyTwoPrim", new EntitySet());
data.put("ESCompCollAllPrim", new EntitySetImpl()); data.put("ESCompCollAllPrim", new EntitySet());
data.put("ESKeyTwoKeyComp", new EntitySetImpl()); data.put("ESKeyTwoKeyComp", new EntitySet());
data.put("ESFourKeyAlias", new EntitySetImpl()); data.put("ESFourKeyAlias", new EntitySet());
data.put("ESBase", new EntitySetImpl()); data.put("ESBase", new EntitySet());
data.put("ESTwoBaseTwoKeyTwoPrim", new EntitySetImpl()); data.put("ESTwoBaseTwoKeyTwoPrim", new EntitySet());
data.put("ESInvisible", new EntitySetImpl()); data.put("ESInvisible", new EntitySet());
data.put("ESCompMixPrimCollComp", new EntitySetImpl()); data.put("ESCompMixPrimCollComp", new EntitySet());
linkESTwoPrim(data); linkESTwoPrim(data);
linkESAllPrim(data); linkESAllPrim(data);
@ -89,10 +84,10 @@ public class DataCreator {
} }
private EntitySet createESServerSidePaging() { private EntitySet createESServerSidePaging() {
EntitySet entitySet = new EntitySetImpl(); EntitySet entitySet = new EntitySet();
for (int i = 1; i <= 503; i++) { 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))); .addProperty(createPrimitive("PropertyString", "Number:" + i)));
} }
@ -100,7 +95,7 @@ public class DataCreator {
} }
private EntitySet createESKeyNav() { 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(1, "I am String Property 1"));
entitySet.getEntities().add(createETKeyNavEntity(2, "I am String Property 2")); entitySet.getEntities().add(createETKeyNavEntity(2, "I am String Property 2"));
@ -111,7 +106,7 @@ public class DataCreator {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Entity createETKeyNavEntity(int propertyInt16, String propertyString) { 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(createPrimitive("PropertyString", propertyString))
.addProperty(createComplex("PropertyCompNav", createPrimitive("PropertyInt16", 1))) .addProperty(createComplex("PropertyCompNav", createPrimitive("PropertyInt16", 1)))
.addProperty(createKeyNavAllPrimComplexValue("PropertyCompAllPrim")).addProperty( .addProperty(createKeyNavAllPrimComplexValue("PropertyCompAllPrim")).addProperty(
@ -129,7 +124,7 @@ public class DataCreator {
} }
private EntitySet createESTwoKeyNav() { private EntitySet createESTwoKeyNav() {
final EntitySet entitySet = new EntitySetImpl(); final EntitySet entitySet = new EntitySet();
entitySet.getEntities().add(createESTwoKeyNavEntity(1, "1")); entitySet.getEntities().add(createESTwoKeyNavEntity(1, "1"));
entitySet.getEntities().add(createESTwoKeyNavEntity(1, "2")); entitySet.getEntities().add(createESTwoKeyNavEntity(1, "2"));
@ -141,7 +136,7 @@ public class DataCreator {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Entity createESTwoKeyNavEntity(int propertyInt16, String propertyString) { 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( .addProperty(createPrimitive("PropertyString", propertyString)).addProperty(
createComplex("PropertyComp", createPrimitive("PropertyInt16", 11), createComplex("PropertyComp", createPrimitive("PropertyInt16", 11),
createComplex("PropertyComp", createPrimitive("PropertyString", "StringValue"), createComplex("PropertyComp", createPrimitive("PropertyString", "StringValue"),
@ -180,9 +175,9 @@ public class DataCreator {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private EntitySet createESCompCollComp() { 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 .addProperty(createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays
.asList(createPrimitive("PropertyInt16", 555), .asList(createPrimitive("PropertyInt16", 555),
createPrimitive("PropertyString", "1 Test Complex in Complex Property")), Arrays createPrimitive("PropertyString", "1 Test Complex in Complex Property")), Arrays
@ -191,7 +186,7 @@ public class DataCreator {
.asList(createPrimitive("PropertyInt16", 777), .asList(createPrimitive("PropertyInt16", 777),
createPrimitive("PropertyString", "3 Test Complex in Complex Property")))))); 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 createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays
.asList(createPrimitive("PropertyInt16", 888), .asList(createPrimitive("PropertyInt16", 888),
createPrimitive("PropertyString", "11 Test Complex in Complex Property")), Arrays createPrimitive("PropertyString", "11 Test Complex in Complex Property")), Arrays
@ -204,27 +199,27 @@ public class DataCreator {
} }
private EntitySet createESTwoPrim() { 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"))); .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"))); .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))); .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"))); .addProperty(createPrimitive("PropertyString", "Test String4")));
return entitySet; return entitySet;
} }
private EntitySet createESAllPrim() { 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("PropertyString", "First Resource - positive values"))
.addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255)) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255))
.addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE))
@ -239,7 +234,7 @@ public class DataCreator {
.addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5)))); .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("PropertyString", "Second Resource - negative values"))
.addProperty(createPrimitive("PropertyBoolean", false)).addProperty(createPrimitive("PropertyByte", 0)) .addProperty(createPrimitive("PropertyBoolean", false)).addProperty(createPrimitive("PropertyByte", 0))
.addProperty(createPrimitive("PropertySByte", Byte.MIN_VALUE)) .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("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14)))); .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("PropertyString", "")).addProperty(createPrimitive("PropertyBoolean", false))
.addProperty(createPrimitive("PropertyByte", 0)).addProperty(createPrimitive("PropertySByte", 0)) .addProperty(createPrimitive("PropertyByte", 0)).addProperty(createPrimitive("PropertySByte", 0))
.addProperty(createPrimitive("PropertyInt32", 0)).addProperty(createPrimitive("PropertyInt64", 0)) .addProperty(createPrimitive("PropertyInt32", 0)).addProperty(createPrimitive("PropertyInt64", 0))
@ -272,9 +267,9 @@ public class DataCreator {
} }
private EntitySet createESCompAllPrim() { 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(createPrimitive("PropertyInt16", Short.MAX_VALUE));
entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "First Resource - first"), entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "First Resource - first"),
createPrimitive("PropertyBinary", createPrimitive("PropertyBinary",
@ -289,7 +284,7 @@ public class DataCreator {
createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTime(1, 0, 1)))); createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTime(1, 0, 1))));
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
entity = new EntityImpl(); entity = new Entity();
entity.addProperty(createPrimitive("PropertyInt16", 7)); entity.addProperty(createPrimitive("PropertyInt16", 7));
entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Second Resource - second"), entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Second Resource - second"),
createPrimitive("PropertyBinary", createPrimitive("PropertyBinary",
@ -305,7 +300,7 @@ public class DataCreator {
createPrimitive("PropertyTimeOfDay", getTimestamp(1, 1, 1, 7, 45, 12, 765432100)))); createPrimitive("PropertyTimeOfDay", getTimestamp(1, 1, 1, 7, 45, 12, 765432100))));
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
entity = new EntityImpl(); entity = new Entity();
entity.addProperty(createPrimitive("PropertyInt16", 0)); entity.addProperty(createPrimitive("PropertyInt16", 0));
entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Third Resource - third"), entity.addProperty(createComplex("PropertyComp", createPrimitive("PropertyString", "Third Resource - third"),
createPrimitive("PropertyBinary", createPrimitive("PropertyBinary",
@ -324,9 +319,9 @@ public class DataCreator {
} }
private EntitySet createESCollAllPrim() { 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", createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example",
"Employee3@company.example")) "Employee3@company.example"))
.addProperty(createPrimitiveCollection("CollPropertyBoolean", true, false, true)) .addProperty(createPrimitiveCollection("CollPropertyBoolean", true, false, true))
@ -353,12 +348,12 @@ public class DataCreator {
createPrimitiveCollection("CollPropertyTimeOfDay", getTime(4, 14, 13), getTime(23, 59, 59), createPrimitiveCollection("CollPropertyTimeOfDay", getTime(4, 14, 13), getTime(23, 59, 59),
getTime(1, 12, 33)))); getTime(1, 12, 33))));
Entity entity = new EntityImpl(); Entity entity = new Entity();
entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties());
entity.getProperties().set(0, createPrimitive("PropertyInt16", 2)); entity.getProperties().set(0, createPrimitive("PropertyInt16", 2));
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
entity = new EntityImpl(); entity = new Entity();
entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties());
entity.getProperties().set(0, createPrimitive("PropertyInt16", 3)); entity.getProperties().set(0, createPrimitive("PropertyInt16", 3));
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
@ -372,22 +367,22 @@ public class DataCreator {
Arrays.asList(createPrimitive("PropertyInt16", 456), createPrimitive("PropertyString", "TEST 2")), Arrays.asList(createPrimitive("PropertyInt16", 456), createPrimitive("PropertyString", "TEST 2")),
Arrays.asList(createPrimitive("PropertyInt16", 789), createPrimitive("PropertyString", "TEST 3"))); 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( .addProperty(
createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example",
"Employee3@company.example")).addProperty( "Employee3@company.example")).addProperty(
createComplex("PropertyComp", createPrimitive("PropertyInt16", 111), createComplex("PropertyComp", createPrimitive("PropertyInt16", 111),
createPrimitive("PropertyString", "TEST A"))).addProperty(complexCollection)); 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", createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example",
"Employee3@company.example")).addProperty( "Employee3@company.example")).addProperty(
createComplex("PropertyComp", createPrimitive("PropertyInt16", 222), createComplex("PropertyComp", createPrimitive("PropertyInt16", 222),
createPrimitive("PropertyString", "TEST B"))).addProperty(complexCollection)); 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", createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example",
"Employee3@company.example")).addProperty( "Employee3@company.example")).addProperty(
createComplex("PropertyComp", createPrimitive("PropertyInt16", 333), createComplex("PropertyComp", createPrimitive("PropertyInt16", 333),
@ -397,9 +392,9 @@ public class DataCreator {
} }
private EntitySet createESAllKey() { 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("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255))
.addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt16", Short.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("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(2, 48, 21)))); .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("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 254))
.addProperty(createPrimitive("PropertySByte", 124)).addProperty(createPrimitive("PropertyInt16", 32764)) .addProperty(createPrimitive("PropertySByte", 124)).addProperty(createPrimitive("PropertyInt16", 32764))
.addProperty(createPrimitive("PropertyInt32", 2147483644)) .addProperty(createPrimitive("PropertyInt32", 2147483644))
@ -426,16 +421,16 @@ public class DataCreator {
} }
private EntitySet createESCompComp() { 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(createPrimitive("PropertyInt16", 1));
entity.addProperty(createComplex("PropertyComp", entity.addProperty(createComplex("PropertyComp",
createComplex("PropertyComp", createPrimitive("PropertyInt16", 123), createComplex("PropertyComp", createPrimitive("PropertyInt16", 123),
createPrimitive("PropertyString", "String 1")))); createPrimitive("PropertyString", "String 1"))));
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
entity = new EntityImpl(); entity = new Entity();
entity.addProperty(createPrimitive("PropertyInt16", 2)); entity.addProperty(createPrimitive("PropertyInt16", 2));
entity.addProperty(createComplex("PropertyComp", entity.addProperty(createComplex("PropertyComp",
createComplex("PropertyComp", createPrimitive("PropertyInt16", 987), createComplex("PropertyComp", createPrimitive("PropertyInt16", 987),
@ -446,24 +441,24 @@ public class DataCreator {
} }
private EntitySet createESMedia() { 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"))); .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("darkturquoise")));
entity.setMediaContentType("image/svg+xml"); entity.setMediaContentType("image/svg+xml");
entitySet.getEntities().add(entity); 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"))); .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("royalblue")));
entity.setMediaContentType("image/svg+xml"); entity.setMediaContentType("image/svg+xml");
entitySet.getEntities().add(entity); 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"))); .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("crimson")));
entity.setMediaContentType("image/svg+xml"); entity.setMediaContentType("image/svg+xml");
entitySet.getEntities().add(entity); 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"))); .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("black")));
entity.setMediaContentType("image/svg+xml"); entity.setMediaContentType("image/svg+xml");
entitySet.getEntities().add(entity); entitySet.getEntities().add(entity);
@ -558,29 +553,29 @@ public class DataCreator {
} }
protected static Property createPrimitive(final String name, final Object value) { 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) { 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) { protected static Property createComplex(final String name, final Property... properties) {
ComplexValue complexValue = new ComplexValueImpl(); ComplexValue complexValue = new ComplexValue();
for (final Property property : properties) { for (final Property property : properties) {
complexValue.getValue().add(property); 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<Property>... propertiesList) { protected static Property createComplexCollection(final String name, final List<Property>... propertiesList) {
List<ComplexValue> complexCollection = new ArrayList<ComplexValue>(); List<ComplexValue> complexCollection = new ArrayList<ComplexValue>();
for (final List<Property> properties : propertiesList) { for (final List<Property> properties : propertiesList) {
ComplexValue complexValue = new ComplexValueImpl(); ComplexValue complexValue = new ComplexValue();
complexValue.getValue().addAll(properties); complexValue.getValue().addAll(properties);
complexCollection.add(complexValue); 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, 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) { protected static void setLink(Entity entity, final String navigationPropertyName, final Entity target) {
Link link = entity.getNavigationLink(navigationPropertyName); Link link = entity.getNavigationLink(navigationPropertyName);
if (link == null) { if (link == null) {
link = new LinkImpl(); link = new Link();
link.setType(ODataLinkType.ENTITY_NAVIGATION.toString()); link.setType(ODataLinkType.ENTITY_NAVIGATION.toString());
link.setTitle(navigationPropertyName); link.setTitle(navigationPropertyName);
entity.getNavigationLinks().add(link); entity.getNavigationLinks().add(link);
@ -621,10 +616,10 @@ public class DataCreator {
protected static void setLinks(Entity entity, final String navigationPropertyName, final Entity... targets) { protected static void setLinks(Entity entity, final String navigationPropertyName, final Entity... targets) {
Link link = entity.getNavigationLink(navigationPropertyName); Link link = entity.getNavigationLink(navigationPropertyName);
if (link == null) { if (link == null) {
link = new LinkImpl(); link = new Link();
link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString()); link.setType(ODataLinkType.ENTITY_SET_NAVIGATION.toString());
link.setTitle(navigationPropertyName); link.setTitle(navigationPropertyName);
EntitySet target = new EntitySetImpl(); EntitySet target = new EntitySet();
target.getEntities().addAll(Arrays.asList(targets)); target.getEntities().addAll(Arrays.asList(targets));
link.setInlineEntitySet(target); link.setInlineEntitySet(target);
entity.getNavigationLinks().add(link); entity.getNavigationLinks().add(link);

View File

@ -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.EdmNavigationProperty;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; 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.EdmProperty;
import org.apache.olingo.commons.api.edm.EdmStructuredType; 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.edm.constants.EdmTypeKind;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.OData;
import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.ODataApplicationException;
import org.apache.olingo.server.api.deserializer.DeserializerException; import org.apache.olingo.server.api.deserializer.DeserializerException;
@ -137,7 +132,7 @@ public class DataProvider {
final EntitySet entitySet = readAll(edmEntitySet); final EntitySet entitySet = readAll(edmEntitySet);
final List<Entity> entities = entitySet.getEntities(); final List<Entity> entities = entitySet.getEntities();
final Map<String, Object> newKey = findFreeComposedKey(entities, edmEntitySet.getEntityType()); final Map<String, Object> newKey = findFreeComposedKey(entities, edmEntitySet.getEntityType());
final Entity newEntity = new EntityImpl(); final Entity newEntity = new Entity();
newEntity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString()); newEntity.setType(edmEntityType.getFullQualifiedName().getFullQualifiedNameAsString());
for (final String keyName : edmEntityType.getKeyPredicateNames()) { for (final String keyName : edmEntityType.getKeyPredicateNames()) {
newEntity.addProperty(DataCreator.createPrimitive(keyName, newKey.get(keyName))); newEntity.addProperty(DataCreator.createPrimitive(keyName, newKey.get(keyName)));
@ -154,17 +149,19 @@ public class DataProvider {
// Weak key construction // Weak key construction
final HashMap<String, Object> keys = new HashMap<String, Object>(); final HashMap<String, Object> keys = new HashMap<String, Object>();
for (final String keyName : entityType.getKeyPredicateNames()) { for (final String keyName : entityType.getKeyPredicateNames()) {
final EdmType type = entityType.getProperty(keyName).getType(); final FullQualifiedName typeName = entityType.getProperty(keyName).getType().getFullQualifiedName();
Object newValue = null; 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 // Integer keys
newValue = Integer.valueOf(1); newValue = Integer.valueOf(1);
while (!isFree(newValue, keyName, entities)) { while (!isFree(newValue, keyName, entities)) {
newValue = ((Integer) newValue) + 1; newValue = ((Integer) newValue) + 1;
} }
} else if (type instanceof EdmString) { } else if (EdmPrimitiveTypeKind.String.getFullQualifiedName().equals(typeName)) {
// String keys // String keys
newValue = String.valueOf(1); newValue = String.valueOf(1);
int i = 0; int i = 0;
@ -431,7 +428,7 @@ public class DataProvider {
private ComplexValue createComplexValue(final EdmProperty edmProperty, final ComplexValue complexValue, private ComplexValue createComplexValue(final EdmProperty edmProperty, final ComplexValue complexValue,
final boolean patch) throws DataProviderException { final boolean patch) throws DataProviderException {
final ComplexValueImpl result = new ComplexValueImpl(); final ComplexValue result = new ComplexValue();
final EdmComplexType edmType = (EdmComplexType) edmProperty.getType(); final EdmComplexType edmType = (EdmComplexType) edmProperty.getType();
final List<Property> givenProperties = complexValue.getValue(); final List<Property> givenProperties = complexValue.getValue();

View File

@ -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.data.Property;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.core.data.EntitySetImpl; import org.apache.olingo.server.api.OData;
import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.server.api.uri.UriParameter; import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException; import org.apache.olingo.server.tecsvc.data.DataProvider.DataProviderException;
@ -38,7 +37,7 @@ public class FunctionData {
final Map<String, EntitySet> data) throws DataProviderException { final Map<String, EntitySet> data) throws DataProviderException {
if (name.equals("UFCRTCollETTwoKeyNavParam")) { if (name.equals("UFCRTCollETTwoKeyNavParam")) {
final List<Entity> esTwoKeyNav = data.get("ESTwoKeyNav").getEntities(); final List<Entity> 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()); final int endIndex = parameters.isEmpty() ? 0 : Short.valueOf(parameters.get(0).getText());
result.getEntities().addAll( result.getEntities().addAll(
esTwoKeyNav.subList(0, esTwoKeyNav.subList(0,
@ -85,15 +84,16 @@ public class FunctionData {
DataCreator.createPrimitive("PropertyString", "UFCRTCTTwoPrim string value")); DataCreator.createPrimitive("PropertyString", "UFCRTCTTwoPrim string value"));
} else if (name.equals("UFCRTCTTwoPrimParam")) { } else if (name.equals("UFCRTCTTwoPrimParam")) {
try { try {
OData oData = OData.newInstance();
return DataCreator.createComplex(name, return DataCreator.createComplex(name,
DataCreator.createPrimitive("PropertyInt16", DataCreator.createPrimitive("PropertyInt16", oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Int16)
EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int16).valueOfString( .valueOfString(getParameterText("ParameterInt16", parameters),
getParameterText("ParameterInt16", parameters),
null, null, null, null, null, Short.class)), null, null, null, null, null, Short.class)),
DataCreator.createPrimitive("PropertyString", DataCreator.createPrimitive("PropertyString", oData
EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).valueOfString( .createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String)
EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String).fromUriLiteral( .valueOfString(oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String)
getParameterText("ParameterString", parameters)), .fromUriLiteral(getParameterText("ParameterString", parameters)),
null, null, null, null, null, String.class))); null, null, null, null, null, String.class)));
} catch (final EdmPrimitiveTypeException e) { } catch (final EdmPrimitiveTypeException e) {
throw new DataProviderException("Error in function " + name + ".", e); throw new DataProviderException("Error in function " + name + ".", e);

View File

@ -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.HttpHeader;
import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.commons.api.http.HttpMethod;
import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.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.ODataApplicationException;
import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataRequest;
import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataResponse;
@ -77,11 +76,8 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
EntityProcessor, ActionEntityProcessor, MediaEntityProcessor, EntityProcessor, ActionEntityProcessor, MediaEntityProcessor,
ActionVoidProcessor { ActionVoidProcessor {
private final ServiceMetadata serviceMetadata;
public TechnicalEntityProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) { public TechnicalEntityProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) {
super(dataProvider); super(dataProvider, serviceMetadata);
this.serviceMetadata = serviceMetadata;
} }
@Override @Override
@ -101,7 +97,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
} else { } else {
// Modifying the original entitySet means modifying the "database", so we have to make a shallow // 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) // 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()); entitySet.getEntities().addAll(entitySetInitial.getEntities());
// Apply system query options // Apply system query options

View File

@ -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.format.ODataFormat;
import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.ODataApplicationException;
import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataRequest;
import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataResponse;
@ -82,12 +81,9 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor
ComplexProcessor, ActionComplexProcessor, ComplexProcessor, ActionComplexProcessor,
ComplexCollectionProcessor, ActionComplexCollectionProcessor { ComplexCollectionProcessor, ActionComplexCollectionProcessor {
private final ServiceMetadata serviceMetadata;
public TechnicalPrimitiveComplexProcessor(final DataProvider dataProvider, public TechnicalPrimitiveComplexProcessor(final DataProvider dataProvider,
ServiceMetadata serviceMetadata) { ServiceMetadata serviceMetadata) {
super(dataProvider); super(dataProvider, serviceMetadata);
this.serviceMetadata = serviceMetadata;
} }
@Override @Override
@ -388,7 +384,7 @@ public class TechnicalPrimitiveComplexProcessor extends TechnicalProcessor
final EdmReturnType returnType = resourceParts.get(0) instanceof UriResourceFunction ? final EdmReturnType returnType = resourceParts.get(0) instanceof UriResourceFunction ?
((UriResourceFunction) resourceParts.get(0)).getFunction().getReturnType() : null; ((UriResourceFunction) resourceParts.get(0)).getFunction().getReturnType() : null;
final FixedFormatSerializer serializer = odata.createFixedFormatSerializer(); 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.binary((byte[]) property.getValue()) :
serializer.primitiveValue(type, property.getValue(), serializer.primitiveValue(type, property.getValue(),
PrimitiveValueSerializerOptions.with() PrimitiveValueSerializerOptions.with()

View File

@ -55,6 +55,11 @@ public abstract class TechnicalProcessor implements Processor {
this.dataProvider = dataProvider; this.dataProvider = dataProvider;
} }
protected TechnicalProcessor(final DataProvider dataProvider, ServiceMetadata serviceMetadata) {
this.dataProvider = dataProvider;
this.serviceMetadata = serviceMetadata;
}
@Override @Override
public void init(final OData odata, final ServiceMetadata serviceMetadata) { public void init(final OData odata, final ServiceMetadata serviceMetadata) {
this.odata = odata; this.odata = odata;

View File

@ -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.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmNavigationProperty; import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.ODataApplicationException;
import org.apache.olingo.server.api.uri.UriResource; import org.apache.olingo.server.api.uri.UriResource;
import org.apache.olingo.server.api.uri.UriResourceNavigation; import org.apache.olingo.server.api.uri.UriResourceNavigation;
@ -132,9 +129,7 @@ public class ExpandSystemQueryOptionHandler {
public Entity transformEntityGraphToTree(final Entity entity, EdmBindingTarget edmEntitySet, public Entity transformEntityGraphToTree(final Entity entity, EdmBindingTarget edmEntitySet,
final ExpandOption expand) throws ODataApplicationException { final ExpandOption expand) throws ODataApplicationException {
final Entity newEntity = newEntity(entity); final Entity newEntity = newEntity(entity);
if (hasExpandItems(expand)) { if (hasExpandItems(expand)) {
final boolean expandAll = expandAll(expand); final boolean expandAll = expandAll(expand);
final Set<String> expanded = expandAll ? null : getExpandedPropertyNames(expand.getExpandItems()); final Set<String> expanded = expandAll ? null : getExpandedPropertyNames(expand.getExpandItems());
@ -167,7 +162,7 @@ public class ExpandSystemQueryOptionHandler {
} }
public EntitySet newEntitySet(final EntitySet entitySet) { public EntitySet newEntitySet(final EntitySet entitySet) {
final EntitySet newEntitySet = new EntitySetImpl(); final EntitySet newEntitySet = new EntitySet();
newEntitySet.setCount(entitySet.getCount()); newEntitySet.setCount(entitySet.getCount());
newEntitySet.setDeltaLink(entitySet.getDeltaLink()); newEntitySet.setDeltaLink(entitySet.getDeltaLink());
newEntitySet.setNext(entitySet.getNext()); newEntitySet.setNext(entitySet.getNext());
@ -176,7 +171,7 @@ public class ExpandSystemQueryOptionHandler {
} }
private Entity newEntity(final Entity entity) { private Entity newEntity(final Entity entity) {
final Entity newEntity = new EntityImpl(); final Entity newEntity = new Entity();
newEntity.getProperties().addAll(entity.getProperties()); newEntity.getProperties().addAll(entity.getProperties());
newEntity.getAnnotations().addAll(entity.getAnnotations()); newEntity.getAnnotations().addAll(entity.getAnnotations());
@ -195,7 +190,7 @@ public class ExpandSystemQueryOptionHandler {
} }
private Link newLink(Link link) { private Link newLink(Link link) {
final Link newLink = new LinkImpl(); final Link newLink = new Link();
newLink.setMediaETag(link.getMediaETag()); newLink.setMediaETag(link.getMediaETag());
newLink.setTitle(link.getTitle()); newLink.setTitle(link.getTitle());
newLink.setType(link.getType()); newLink.setType(link.getType());

View File

@ -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.EdmProperty;
import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.api.ODataApplicationException;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull;
@ -73,9 +65,7 @@ public class TypedOperand extends VisitorOperand {
Object newValue = null; Object newValue = null;
for (EdmPrimitiveType asType : asTypes) { for (EdmPrimitiveType asType : asTypes) {
// Use BigDecimal for unlimited precision // Use BigDecimal for unlimited precision
if (asType.equals(EdmDouble.getInstance()) if (asType.equals(primDouble) || asType.equals(primSingle) || asType.equals(primDecimal)) {
|| asType.equals(EdmSingle.getInstance())
|| asType.equals(EdmDecimal.getInstance())) {
try { try {
newValue = new BigDecimal(value.toString()); newValue = new BigDecimal(value.toString());
@ -117,18 +107,18 @@ public class TypedOperand extends VisitorOperand {
return this; return this;
} }
if (type.equals(EdmDouble.getInstance()) || oType.equals(EdmDouble.getInstance())) { if (type.equals(primDouble) || oType.equals(primDouble)) {
return asTypedOperand(EdmDouble.getInstance()); return asTypedOperand(primDouble);
} else if (type.equals(EdmSingle.getInstance()) || oType.equals(EdmSingle.getInstance())) { } else if (type.equals(primSingle) || oType.equals(primSingle)) {
return asTypedOperand(EdmSingle.getInstance()); return asTypedOperand(primSingle);
} else if (type.equals(EdmDecimal.getInstance()) || oType.equals(EdmDecimal.getInstance())) { } else if (type.equals(primDecimal) || oType.equals(primDecimal)) {
return asTypedOperand(EdmDecimal.getInstance()); return asTypedOperand(primDecimal);
} else if (type.equals(EdmInt64.getInstance()) || oType.equals(EdmInt64.getInstance())) { } else if (type.equals(primInt64) || oType.equals(primInt64)) {
return asTypedOperand(EdmInt64.getInstance()); return asTypedOperand(primInt64);
} else if (type.equals(EdmInt32.getInstance()) || oType.equals(EdmInt32.getInstance())) { } else if (type.equals(primInt32) || oType.equals(primInt32)) {
return asTypedOperand(EdmInt32.getInstance()); return asTypedOperand(primInt32);
} else if (type.equals(EdmInt16.getInstance()) || oType.equals(EdmInt16.getInstance())) { } else if (type.equals(primInt16) || oType.equals(primInt16)) {
return asTypedOperand(EdmInt16.getInstance()); return asTypedOperand(primInt16);
} else { } else {
return asTypedOperand((EdmPrimitiveType) type); return asTypedOperand((EdmPrimitiveType) type);
} }
@ -151,17 +141,19 @@ public class TypedOperand extends VisitorOperand {
} }
public boolean isIntegerType() { public boolean isIntegerType() {
return is(EdmByte.getInstance(), return is(
EdmSByte.getInstance(), primByte,
EdmInt16.getInstance(), primSByte,
EdmInt32.getInstance(), primInt16,
EdmInt64.getInstance()); primInt32,
primInt64);
} }
public boolean isDecimalType() { public boolean isDecimalType() {
return is(EdmSingle.getInstance(), return is(
EdmDouble.getInstance(), primSingle,
EdmDecimal.getInstance()); primDouble,
primDecimal);
} }
public boolean is(EdmPrimitiveType... types) { public boolean is(EdmPrimitiveType... types) {

View File

@ -23,20 +23,6 @@ import java.util.Locale;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmProperty; import org.apache.olingo.commons.api.edm.EdmProperty;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.api.ODataApplicationException;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive.EdmNull;
@ -84,65 +70,65 @@ public class UntypedOperand extends VisitorOperand {
} }
// String // String
if ((newValue = tryCast(literal, EdmString.getInstance())) != null) { if ((newValue = tryCast(literal, primString)) != null) {
return new TypedOperand(newValue, EdmString.getInstance()); return new TypedOperand(newValue, primString);
} }
// Boolean // Boolean
if ((newValue = tryCast(literal, EdmBoolean.getInstance())) != null) { if ((newValue = tryCast(literal, primBoolean)) != null) {
return new TypedOperand(newValue, EdmBoolean.getInstance()); return new TypedOperand(newValue, primBoolean);
} }
// Date // Date
if ((newValue = tryCast(literal, EdmDateTimeOffset.getInstance())) != null) { if ((newValue = tryCast(literal, primDateTimeOffset)) != null) {
return new TypedOperand(newValue, EdmDateTimeOffset.getInstance()); return new TypedOperand(newValue, primDateTimeOffset);
} }
if ((newValue = tryCast(literal, EdmDate.getInstance())) != null) { if ((newValue = tryCast(literal, primDate)) != null) {
return new TypedOperand(newValue, EdmDate.getInstance()); return new TypedOperand(newValue, primDate);
} }
if ((newValue = tryCast(literal, EdmTimeOfDay.getInstance())) != null) { if ((newValue = tryCast(literal, primTimeOfDay)) != null) {
return new TypedOperand(newValue, EdmTimeOfDay.getInstance()); return new TypedOperand(newValue, primTimeOfDay);
} }
if ((newValue = tryCast(literal, EdmDuration.getInstance())) != null) { if ((newValue = tryCast(literal, primDuration)) != null) {
return new TypedOperand(newValue, EdmDuration.getInstance()); return new TypedOperand(newValue, primDuration);
} }
// Integer // Integer
if ((newValue = tryCast(literal, EdmSByte.getInstance())) != null) { if ((newValue = tryCast(literal, primSByte)) != null) {
return new TypedOperand(newValue, EdmSByte.getInstance()); return new TypedOperand(newValue, primSByte);
} }
if ((newValue = tryCast(literal, EdmByte.getInstance())) != null) { if ((newValue = tryCast(literal, primByte)) != null) {
return new TypedOperand(newValue, EdmByte.getInstance()); return new TypedOperand(newValue, primByte);
} }
if ((newValue = tryCast(literal, EdmInt16.getInstance())) != null) { if ((newValue = tryCast(literal, primInt16)) != null) {
return new TypedOperand(newValue, EdmInt16.getInstance()); return new TypedOperand(newValue, primInt16);
} }
if ((newValue = tryCast(literal, EdmInt32.getInstance())) != null) { if ((newValue = tryCast(literal, primInt32)) != null) {
return new TypedOperand(newValue, EdmInt32.getInstance()); return new TypedOperand(newValue, primInt32);
} }
if ((newValue = tryCast(literal, EdmInt64.getInstance())) != null) { if ((newValue = tryCast(literal, primInt64)) != null) {
return new TypedOperand(newValue, EdmInt64.getInstance()); return new TypedOperand(newValue, primInt64);
} }
// Decimal // Decimal
if ((newValue = tryCast(literal, EdmDecimal.getInstance())) != null) { if ((newValue = tryCast(literal, primDecimal)) != null) {
return new TypedOperand(newValue, EdmDecimal.getInstance()); return new TypedOperand(newValue, primDecimal);
} }
// Float // Float
if ((newValue = tryCast(literal, EdmSingle.getInstance())) != null) { if ((newValue = tryCast(literal, primSingle)) != null) {
return new TypedOperand(newValue, EdmSingle.getInstance()); return new TypedOperand(newValue, primSingle);
} }
if ((newValue = tryCast(literal, EdmDouble.getInstance())) != null) { if ((newValue = tryCast(literal, primDouble)) != null) {
return new TypedOperand(newValue, EdmDouble.getInstance()); return new TypedOperand(newValue, primDouble);
} }
throw new ODataApplicationException("Could not determine type for literal " + literal, throw new ODataApplicationException("Could not determine type for literal " + literal,

View File

@ -24,32 +24,57 @@ import java.util.HashMap;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; 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.EdmProperty;
import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.core.edm.primitivetype.EdmByte; import org.apache.olingo.server.api.OData;
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.api.ODataApplicationException;
public abstract class VisitorOperand { public abstract class VisitorOperand {
final static private HashMap<EdmType, Class<?>> defaultTypeMapping = new HashMap<EdmType, Class<?>>(); final static private HashMap<EdmType, Class<?>> defaultTypeMapping = new HashMap<EdmType, Class<?>>();
protected Object value; 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 { static {
defaultTypeMapping.put(EdmByte.getInstance(), BigInteger.class); oData = OData.newInstance();
defaultTypeMapping.put(EdmSByte.getInstance(), BigInteger.class); primString = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.String);
defaultTypeMapping.put(EdmInt16.getInstance(), BigInteger.class); primBoolean = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean);
defaultTypeMapping.put(EdmInt32.getInstance(), BigInteger.class); primDateTimeOffset = oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.DateTimeOffset);
defaultTypeMapping.put(EdmInt64.getInstance(), BigInteger.class); 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(EdmSingle.getInstance(), BigDecimal.class); defaultTypeMapping.put(primByte, BigInteger.class);
defaultTypeMapping.put(EdmDouble.getInstance(), BigDecimal.class); defaultTypeMapping.put(primSByte, BigInteger.class);
defaultTypeMapping.put(EdmDecimal.getInstance(), BigDecimal.class); defaultTypeMapping.put(primInt16, BigInteger.class);
defaultTypeMapping.put(primInt32, BigInteger.class);
defaultTypeMapping.put(primInt64, BigInteger.class);
defaultTypeMapping.put(primSingle, BigDecimal.class);
defaultTypeMapping.put(primDouble, BigDecimal.class);
defaultTypeMapping.put(primDecimal, BigDecimal.class);
} }
public VisitorOperand(Object value) { public VisitorOperand(Object value) {

View File

@ -24,19 +24,11 @@ import java.sql.Timestamp;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale; 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.edm.EdmType;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.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.ODataApplicationException; import org.apache.olingo.server.api.ODataApplicationException;
import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind; import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.TypedOperand;
@ -63,6 +55,40 @@ public class BinaryOperator {
private static final int LESS_THAN = -1; private static final int LESS_THAN = -1;
private static final int GREATER_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 right;
private TypedOperand left; private TypedOperand left;
@ -77,14 +103,14 @@ public class BinaryOperator {
public VisitorOperand andOperator() throws ODataApplicationException { public VisitorOperand andOperator() throws ODataApplicationException {
Boolean result = null; 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())) { if (Boolean.TRUE.equals(left.getValue()) && Boolean.TRUE.equals(right.getValue())) {
result = true; result = true;
} else if (Boolean.FALSE.equals(left.getValue()) || Boolean.FALSE.equals(right.getValue())) { } else if (Boolean.FALSE.equals(left.getValue()) || Boolean.FALSE.equals(right.getValue())) {
result = false; result = false;
} }
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} else { } else {
throw new ODataApplicationException("Add operator needs two binary operands", throw new ODataApplicationException("Add operator needs two binary operands",
HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
@ -93,14 +119,14 @@ public class BinaryOperator {
public VisitorOperand orOperator() throws ODataApplicationException { public VisitorOperand orOperator() throws ODataApplicationException {
Boolean result = null; 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())) { if (Boolean.TRUE.equals(left.getValue()) || Boolean.TRUE.equals(right.getValue())) {
result = true; result = true;
} else if (Boolean.FALSE.equals(left.getValue()) && Boolean.FALSE.equals(right.getValue())) { } else if (Boolean.FALSE.equals(left.getValue()) && Boolean.FALSE.equals(right.getValue())) {
result = false; result = false;
} }
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} else { } else {
throw new ODataApplicationException("Or operator needs two binary operands", throw new ODataApplicationException("Or operator needs two binary operands",
HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
@ -109,12 +135,12 @@ public class BinaryOperator {
public VisitorOperand equalsOperator() { public VisitorOperand equalsOperator() {
final boolean result = isBinaryComparisonNecessary() && binaryComparison(EQUALS); final boolean result = isBinaryComparisonNecessary() && binaryComparison(EQUALS);
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} }
public VisitorOperand notEqualsOperator() { public VisitorOperand notEqualsOperator() {
final VisitorOperand equalsOperator = equalsOperator(); final VisitorOperand equalsOperator = equalsOperator();
return new TypedOperand(!(Boolean) equalsOperator.getValue(), EdmBoolean.getInstance()); return new TypedOperand(!(Boolean) equalsOperator.getValue(), primBoolean);
} }
private boolean isBinaryComparisonNecessary() { private boolean isBinaryComparisonNecessary() {
@ -124,22 +150,22 @@ public class BinaryOperator {
public VisitorOperand greaterEqualsOperator() { public VisitorOperand greaterEqualsOperator() {
final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN, EQUALS); final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN, EQUALS);
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} }
public VisitorOperand greaterThanOperator() { public VisitorOperand greaterThanOperator() {
final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN); final boolean result = isBinaryComparisonNecessary() && binaryComparison(GREATER_THAN);
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} }
public VisitorOperand lessEqualsOperator() { public VisitorOperand lessEqualsOperator() {
final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN, EQUALS); final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN, EQUALS);
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} }
public VisitorOperand lessThanOperator() { public VisitorOperand lessThanOperator() {
final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN); final boolean result = isBinaryComparisonNecessary() && binaryComparison(LESS_THAN);
return new TypedOperand(result, EdmBoolean.getInstance()); return new TypedOperand(result, primBoolean);
} }
private boolean binaryComparison(int... expect) { private boolean binaryComparison(int... expect) {
@ -176,7 +202,7 @@ public class BinaryOperator {
} else if (left.isDecimalType()) { } else if (left.isDecimalType()) {
final BigDecimal result = decimalArithmeticOperation(operator); final BigDecimal result = decimalArithmeticOperation(operator);
return new TypedOperand(result, determineResultType(result, left)); 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); return dateArithmeticOperation(operator);
} else { } else {
throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(), throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(),
@ -190,81 +216,81 @@ public class BinaryOperator {
if (leftOperand.isDecimalType()) { if (leftOperand.isDecimalType()) {
final BigDecimal value = (BigDecimal) arithmeticResult; final BigDecimal value = (BigDecimal) arithmeticResult;
if (value.compareTo(EDM_SINGLE_MIN) >= 0 && value.compareTo(EDM_SINGLE_MAX) <= 0) { if (value.compareTo(EDM_SINGLE_MIN) >= 0 && value.compareTo(EDM_SINGLE_MAX) <= 0) {
return EdmSingle.getInstance(); return primSingle;
} else { } else {
return EdmDouble.getInstance(); return primDouble;
} }
} else { } else {
final BigInteger value = (BigInteger) arithmeticResult; final BigInteger value = (BigInteger) arithmeticResult;
if (value.compareTo(EDN_SBYTE_MAX) <= 0 && value.compareTo(EDM_SBYTE_MIN) >= 0) { 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) { 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) { 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) { 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) { 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) // 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 { private VisitorOperand dateArithmeticOperation(BinaryOperatorKind operator) throws ODataApplicationException {
VisitorOperand result = null; VisitorOperand result = null;
if (left.is(EdmDate.getInstance())) { if (left.is(primDate)) {
if (right.is(EdmDate.getInstance()) && operator == BinaryOperatorKind.SUB) { if (right.is(primDate) && operator == BinaryOperatorKind.SUB) {
long millis = left.getTypedValue(Calendar.class).getTimeInMillis() long millis = left.getTypedValue(Calendar.class).getTimeInMillis()
- left.getTypedValue(Calendar.class).getTimeInMillis(); - left.getTypedValue(Calendar.class).getTimeInMillis();
result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), EdmDuration.getInstance()); result = new TypedOperand(new BigDecimal(millis).divide(FACTOR_SECOND), primDuration);
} else if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { } else if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) {
long millis = left.getTypedValue(Calendar.class).getTimeInMillis() long millis = left.getTypedValue(Calendar.class).getTimeInMillis()
+ (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); + (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 (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) {
long millis = left.getTypedValue(Calendar.class).getTimeInMillis() long millis = left.getTypedValue(Calendar.class).getTimeInMillis()
- (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - (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())) { } else if (left.is(primDuration)) {
if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) {
long seconds = left.getTypedValue(BigDecimal.class).longValue() long seconds = left.getTypedValue(BigDecimal.class).longValue()
+ right.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 (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) {
long seconds = left.getTypedValue(BigDecimal.class).longValue() long seconds = left.getTypedValue(BigDecimal.class).longValue()
- right.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())) { } else if (left.is(primDateTimeOffset)) {
if (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.ADD) { if (right.is(primDuration) && operator == BinaryOperatorKind.ADD) {
long millis = left.getTypedValue(Timestamp.class).getTime() long millis = left.getTypedValue(Timestamp.class).getTime()
+ (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); + (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 (right.is(EdmDuration.getInstance()) && operator == BinaryOperatorKind.SUB) { } else if (right.is(primDuration) && operator == BinaryOperatorKind.SUB) {
long millis = left.getTypedValue(Timestamp.class).getTime() long millis = left.getTypedValue(Timestamp.class).getTime()
- (right.getTypedValue(BigDecimal.class).longValue() * FACTOR_SECOND_INT); - (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 (right.is(EdmDateTimeOffset.getInstance()) && operator == BinaryOperatorKind.SUB) { } else if (right.is(primDateTimeOffset) && operator == BinaryOperatorKind.SUB) {
long millis = left.getTypedValue(Timestamp.class).getTime() long millis = left.getTypedValue(Timestamp.class).getTime()
- right.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);
} }
} }

View File

@ -30,21 +30,50 @@ import java.util.Locale;
import java.util.TimeZone; import java.util.TimeZone;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType; 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.edm.EdmType;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.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.ODataApplicationException; 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.TypedOperand;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand;
public class MethodCallOperator { 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<VisitorOperand> parameters; final private List<VisitorOperand> parameters;
public MethodCallOperator(List<VisitorOperand> parameters) { public MethodCallOperator(List<VisitorOperand> parameters) {
@ -57,7 +86,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).endsWith(params.get(1)); return params.get(0).endsWith(params.get(1));
} }
}, EdmBoolean.getInstance()); }, primBoolean);
} }
public VisitorOperand indexOf() throws ODataApplicationException { 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 // 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)); return params.get(0).indexOf(params.get(1));
} }
}, EdmInt32.getInstance()); }, primInt32);
} }
public VisitorOperand startsWith() throws ODataApplicationException { public VisitorOperand startsWith() throws ODataApplicationException {
@ -76,7 +105,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).startsWith(params.get(1)); return params.get(0).startsWith(params.get(1));
} }
}, EdmBoolean.getInstance()); }, primBoolean);
} }
public VisitorOperand toLower() throws ODataApplicationException { public VisitorOperand toLower() throws ODataApplicationException {
@ -85,7 +114,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).toLowerCase(); return params.get(0).toLowerCase();
} }
}, EdmString.getInstance()); }, primString);
} }
public VisitorOperand toUpper() throws ODataApplicationException { public VisitorOperand toUpper() throws ODataApplicationException {
@ -94,7 +123,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).toUpperCase(); return params.get(0).toUpperCase();
} }
}, EdmString.getInstance()); }, primString);
} }
public VisitorOperand trim() throws ODataApplicationException { public VisitorOperand trim() throws ODataApplicationException {
@ -103,7 +132,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).trim(); return params.get(0).trim();
} }
}, EdmString.getInstance()); }, primString);
} }
public VisitorOperand substring() throws ODataApplicationException { public VisitorOperand substring() throws ODataApplicationException {
@ -113,8 +142,8 @@ public class MethodCallOperator {
final TypedOperand startOperand = parameters.get(1).asTypedOperand(); final TypedOperand startOperand = parameters.get(1).asTypedOperand();
if (valueOperand.isNull() || startOperand.isNull()) { if (valueOperand.isNull() || startOperand.isNull()) {
return new TypedOperand(null, EdmString.getInstance()); return new TypedOperand(null, primString);
} else if (valueOperand.is(EdmString.getInstance()) && startOperand.isIntegerType()) { } else if (valueOperand.is(primString) && startOperand.isIntegerType()) {
final String value = valueOperand.getTypedValue(String.class); final String value = valueOperand.getTypedValue(String.class);
int start = Math.min(startOperand.getTypedValue(BigInteger.class).intValue(), value.length()); int start = Math.min(startOperand.getTypedValue(BigInteger.class).intValue(), value.length());
start = start < 0 ? 0 : start; start = start < 0 ? 0 : start;
@ -125,7 +154,7 @@ public class MethodCallOperator {
final TypedOperand lengthOperand = parameters.get(2).asTypedOperand(); final TypedOperand lengthOperand = parameters.get(2).asTypedOperand();
if (lengthOperand.isNull()) { if (lengthOperand.isNull()) {
return new TypedOperand(null, EdmString.getInstance()); return new TypedOperand(null, primString);
} else if (lengthOperand.isIntegerType()) { } else if (lengthOperand.isIntegerType()) {
end = Math.min(start + lengthOperand.getTypedValue(BigInteger.class).intValue(), value.length()); end = Math.min(start + lengthOperand.getTypedValue(BigInteger.class).intValue(), value.length());
end = end < 0 ? 0 : end; end = end < 0 ? 0 : end;
@ -136,7 +165,7 @@ public class MethodCallOperator {
} }
return new TypedOperand(value.substring(start, end), return new TypedOperand(value.substring(start, end),
EdmString.getInstance()); primString);
} else { } else {
throw new ODataApplicationException("Substring has invalid parameters. First parameter should be Edm.String," 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); + " second parameter should be Edm.Int32", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
@ -149,7 +178,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).contains(params.get(1)); return params.get(0).contains(params.get(1));
} }
}, EdmBoolean.getInstance()); }, primBoolean);
} }
public VisitorOperand concat() throws ODataApplicationException { public VisitorOperand concat() throws ODataApplicationException {
@ -158,7 +187,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0) + params.get(1); return params.get(0) + params.get(1);
} }
}, EdmString.getInstance()); }, primString);
} }
public VisitorOperand length() throws ODataApplicationException { public VisitorOperand length() throws ODataApplicationException {
@ -167,7 +196,7 @@ public class MethodCallOperator {
public Object perform(List<String> params) { public Object perform(List<String> params) {
return params.get(0).length(); return params.get(0).length();
} }
}, EdmInt32.getInstance()); }, primInt32);
} }
public VisitorOperand year() throws ODataApplicationException { public VisitorOperand year() throws ODataApplicationException {
@ -176,7 +205,7 @@ public class MethodCallOperator {
public Object perform(Calendar calendar, TypedOperand operand) { public Object perform(Calendar calendar, TypedOperand operand) {
return calendar.get(Calendar.YEAR); return calendar.get(Calendar.YEAR);
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); }, primInt32, primDateTimeOffset, primDate);
} }
public VisitorOperand month() throws ODataApplicationException { public VisitorOperand month() throws ODataApplicationException {
@ -186,7 +215,7 @@ public class MethodCallOperator {
// Month is 0-based! // Month is 0-based!
return calendar.get(Calendar.MONTH) + 1; return calendar.get(Calendar.MONTH) + 1;
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); }, primInt32, primDateTimeOffset, primDate);
} }
public VisitorOperand day() throws ODataApplicationException { public VisitorOperand day() throws ODataApplicationException {
@ -195,7 +224,7 @@ public class MethodCallOperator {
public Object perform(Calendar calendar, TypedOperand operand) { public Object perform(Calendar calendar, TypedOperand operand) {
return calendar.get(Calendar.DAY_OF_MONTH); return calendar.get(Calendar.DAY_OF_MONTH);
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmDate.getInstance()); }, primInt32, primDateTimeOffset, primDate);
} }
public VisitorOperand hour() throws ODataApplicationException { public VisitorOperand hour() throws ODataApplicationException {
@ -204,7 +233,7 @@ public class MethodCallOperator {
public Object perform(Calendar calendar, TypedOperand operand) { public Object perform(Calendar calendar, TypedOperand operand) {
return calendar.get(Calendar.HOUR_OF_DAY); return calendar.get(Calendar.HOUR_OF_DAY);
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); }, primInt32, primDateTimeOffset, primTimeOfDay);
} }
public VisitorOperand minute() throws ODataApplicationException { public VisitorOperand minute() throws ODataApplicationException {
@ -213,7 +242,7 @@ public class MethodCallOperator {
public Object perform(Calendar calendar, TypedOperand operand) { public Object perform(Calendar calendar, TypedOperand operand) {
return calendar.get(Calendar.MINUTE); return calendar.get(Calendar.MINUTE);
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); }, primInt32, primDateTimeOffset, primTimeOfDay);
} }
public VisitorOperand second() throws ODataApplicationException { public VisitorOperand second() throws ODataApplicationException {
@ -222,7 +251,7 @@ public class MethodCallOperator {
public Object perform(Calendar calendar, TypedOperand operand) { public Object perform(Calendar calendar, TypedOperand operand) {
return calendar.get(Calendar.SECOND); return calendar.get(Calendar.SECOND);
} }
}, EdmInt32.getInstance(), EdmDateTimeOffset.getInstance(), EdmTimeOfDay.getInstance()); }, primInt32, primDateTimeOffset, primTimeOfDay);
} }
public VisitorOperand fractionalseconds() throws ODataApplicationException { public VisitorOperand fractionalseconds() throws ODataApplicationException {
@ -236,7 +265,7 @@ public class MethodCallOperator {
return new BigDecimal(calendar.get(Calendar.MILLISECOND)).divide(BigDecimal.valueOf(1000)); 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 { public VisitorOperand round() throws ODataApplicationException {
@ -290,13 +319,13 @@ public class MethodCallOperator {
if (operand.is(expectedTypes)) { if (operand.is(expectedTypes)) {
if (!operand.isNull()) { if (!operand.isNull()) {
Calendar calendar = null; Calendar calendar = null;
if (operand.is(EdmDate.getInstance())) { if (operand.is(primDate)) {
calendar = operand.getTypedValue(Calendar.class); calendar = operand.getTypedValue(Calendar.class);
} else if (operand.is(EdmDateTimeOffset.getInstance())) { } else if (operand.is(primDateTimeOffset)) {
final Timestamp timestamp = operand.getTypedValue(Timestamp.class); final Timestamp timestamp = operand.getTypedValue(Timestamp.class);
calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(timestamp.getTime()); calendar.setTimeInMillis(timestamp.getTime());
} else if (operand.is(EdmTimeOfDay.getInstance())) { } else if (operand.is(primTimeOfDay)) {
calendar = operand.getTypedValue(Calendar.class); calendar = operand.getTypedValue(Calendar.class);
} else { } else {
throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT); throw new ODataApplicationException("Invalid type", HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
@ -327,7 +356,7 @@ public class MethodCallOperator {
TypedOperand operand = param.asTypedOperand(); TypedOperand operand = param.asTypedOperand();
if (operand.isNull()) { if (operand.isNull()) {
result.add(null); result.add(null);
} else if (operand.is(EdmString.getInstance())) { } else if (operand.is(primString)) {
result.add(operand.getTypedValue(String.class)); result.add(operand.getTypedValue(String.class));
} else { } else {
throw new ODataApplicationException("Invalid parameter. Expected Edm.String", HttpStatusCode.BAD_REQUEST throw new ODataApplicationException("Invalid parameter. Expected Edm.String", HttpStatusCode.BAD_REQUEST

View File

@ -23,14 +23,26 @@ import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Locale; 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.api.http.HttpStatusCode;
import org.apache.olingo.commons.core.edm.primitivetype.EdmBoolean; import org.apache.olingo.server.api.OData;
import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration;
import org.apache.olingo.server.api.ODataApplicationException; 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.TypedOperand;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand;
public class UnaryOperator { 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; final private TypedOperand operand;
public UnaryOperator(VisitorOperand operand) throws ODataApplicationException { public UnaryOperator(VisitorOperand operand) throws ODataApplicationException {
@ -42,7 +54,7 @@ public class UnaryOperator {
return operand; return operand;
} else if (operand.isIntegerType()) { } else if (operand.isIntegerType()) {
return new TypedOperand(operand.getTypedValue(BigInteger.class).negate(), operand.getType()); 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()); return new TypedOperand(operand.getTypedValue(BigDecimal.class).negate(), operand.getType());
} else { } else {
throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(), throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(),
@ -53,7 +65,7 @@ public class UnaryOperator {
public VisitorOperand notOperation() throws ODataApplicationException { public VisitorOperand notOperation() throws ODataApplicationException {
if (operand.isNull()) { if (operand.isNull()) {
return operand; return operand;
} else if (operand.is(EdmBoolean.getInstance())) { } else if (operand.is(primBoolean)) {
return new TypedOperand(!operand.getTypedValue(Boolean.class), operand.getType()); return new TypedOperand(!operand.getTypedValue(Boolean.class), operand.getType());
} else { } else {
throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(), throw new ODataApplicationException("Unsupported type", HttpStatusCode.BAD_REQUEST.getStatusCode(),

View File

@ -18,11 +18,13 @@
*/ */
package org.apache.olingo.server.tecsvc.processor.queryoptions.expression.primitive; 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.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(); private static final EdmNull instance = new EdmNull();
@ -35,7 +37,87 @@ public final class EdmNull extends SingletonPrimitiveType {
return Object.class; return Object.class;
} }
protected String uriPrefix = "";
protected String uriSuffix = "";
@Override @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> T valueOfString(final String value,
final Boolean isNullable, final Integer maxLength, final Integer precision,
final Integer scale, final Boolean isUnicode, final Class<T> 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> T internalValueOfString(String value, Boolean isNullable, Integer maxLength, Integer precision, protected <T> T internalValueOfString(String value, Boolean isNullable, Integer maxLength, Integer precision,
Integer scale, Boolean isUnicode, Class<T> returnType) throws EdmPrimitiveTypeException { Integer scale, Boolean isUnicode, Class<T> returnType) throws EdmPrimitiveTypeException {
if (!value.equals("null")) { if (!value.equals("null")) {
@ -49,10 +131,34 @@ public final class EdmNull extends SingletonPrimitiveType {
} }
} }
@Override
protected <T> String internalValueToString(T value, Boolean isNullable, Integer maxLength, Integer precision, protected <T> String internalValueToString(T value, Boolean isNullable, Integer maxLength, Integer precision,
Integer scale, Boolean isUnicode) throws EdmPrimitiveTypeException { Integer scale, Boolean isUnicode) throws EdmPrimitiveTypeException {
return "null"; 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;
}
} }

View File

@ -24,35 +24,27 @@ import java.util.Locale;
import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.data.EntitySet;
import org.apache.olingo.commons.api.edm.EdmBindingTarget; 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.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.ODataApplicationException;
import org.apache.olingo.server.api.uri.queryoption.FilterOption; import org.apache.olingo.server.api.uri.queryoption.FilterOption;
import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.ExpressionVisitorImpl; 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.TypedOperand;
import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand; import org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand.VisitorOperand;
public class FilterHandler { 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, public static void applyFilterSystemQuery(FilterOption filterOption, EntitySet entitySet,
EdmBindingTarget edmEntitySet) throws ODataApplicationException { EdmBindingTarget edmEntitySet) throws ODataApplicationException {
@ -68,7 +60,7 @@ public class FilterHandler {
.accept(new ExpressionVisitorImpl(iter.next(), edmEntitySet)); .accept(new ExpressionVisitorImpl(iter.next(), edmEntitySet));
final TypedOperand typedOperand = operand.asTypedOperand(); final TypedOperand typedOperand = operand.asTypedOperand();
if (!(typedOperand.is(EdmBoolean.getInstance()) if (!(typedOperand.is(primBoolean)
&& Boolean.TRUE.equals(typedOperand.getTypedValue(Boolean.class)))) { && Boolean.TRUE.equals(typedOperand.getTypedValue(Boolean.class)))) {
iter.remove(); iter.remove();
} }

View File

@ -25,10 +25,10 @@ import java.util.Locale;
import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.data.EntitySet;
import org.apache.olingo.commons.api.edm.EdmEntitySet; import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.http.HttpStatusCode; 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.ODataApplicationException;
import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption; import org.apache.olingo.server.api.uri.queryoption.SkipTokenOption;
import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
import org.apache.olingo.server.tecsvc.Encoder;
public class ServerSidePagingHandler { public class ServerSidePagingHandler {
private static final int MAX_PAGE_SIZE = 10; private static final int MAX_PAGE_SIZE = 10;

View File

@ -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.EdmProperty;
import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ODataFormat; 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.OData;
import org.apache.olingo.server.api.ServiceMetadata; import org.apache.olingo.server.api.ServiceMetadata;
import org.apache.olingo.server.api.edmx.EdmxReference; import org.apache.olingo.server.api.edmx.EdmxReference;
@ -615,7 +614,7 @@ public class ODataJsonSerializerTest {
public void primitivePropertyNull() throws Exception { public void primitivePropertyNull() throws Exception {
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim"); final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyString"); 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, serializer.primitive((EdmPrimitiveType) edmProperty.getType(), property,
PrimitiveSerializerOptions.with() PrimitiveSerializerOptions.with()
.contextURL(ContextURL.with() .contextURL(ContextURL.with()

View File

@ -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.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmProperty; 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.api.uri.UriParameter;
import org.apache.olingo.server.sample.edmprovider.CarsEdmProvider; import org.apache.olingo.server.sample.edmprovider.CarsEdmProvider;
@ -97,37 +94,37 @@ public class DataProvider {
} }
private EntitySet createCars() { 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("Id", 1))
.addProperty(createPrimitive("Model", "F1 W03")) .addProperty(createPrimitive("Model", "F1 W03"))
.addProperty(createPrimitive("ModelYear", "2012")) .addProperty(createPrimitive("ModelYear", "2012"))
.addProperty(createPrimitive("Price", 189189.43)) .addProperty(createPrimitive("Price", 189189.43))
.addProperty(createPrimitive("Currency", "EUR"))); .addProperty(createPrimitive("Currency", "EUR")));
entitySet.getEntities().add(new EntityImpl() entitySet.getEntities().add(new Entity()
.addProperty(createPrimitive("Id", 2)) .addProperty(createPrimitive("Id", 2))
.addProperty(createPrimitive("Model", "F1 W04")) .addProperty(createPrimitive("Model", "F1 W04"))
.addProperty(createPrimitive("ModelYear", "2013")) .addProperty(createPrimitive("ModelYear", "2013"))
.addProperty(createPrimitive("Price", 199999.99)) .addProperty(createPrimitive("Price", 199999.99))
.addProperty(createPrimitive("Currency", "EUR"))); .addProperty(createPrimitive("Currency", "EUR")));
entitySet.getEntities().add(new EntityImpl() entitySet.getEntities().add(new Entity()
.addProperty(createPrimitive("Id", 3)) .addProperty(createPrimitive("Id", 3))
.addProperty(createPrimitive("Model", "F2012")) .addProperty(createPrimitive("Model", "F2012"))
.addProperty(createPrimitive("ModelYear", "2012")) .addProperty(createPrimitive("ModelYear", "2012"))
.addProperty(createPrimitive("Price", 137285.33)) .addProperty(createPrimitive("Price", 137285.33))
.addProperty(createPrimitive("Currency", "EUR"))); .addProperty(createPrimitive("Currency", "EUR")));
entitySet.getEntities().add(new EntityImpl() entitySet.getEntities().add(new Entity()
.addProperty(createPrimitive("Id", 4)) .addProperty(createPrimitive("Id", 4))
.addProperty(createPrimitive("Model", "F2013")) .addProperty(createPrimitive("Model", "F2013"))
.addProperty(createPrimitive("ModelYear", "2013")) .addProperty(createPrimitive("ModelYear", "2013"))
.addProperty(createPrimitive("Price", 145285.00)) .addProperty(createPrimitive("Price", 145285.00))
.addProperty(createPrimitive("Currency", "EUR"))); .addProperty(createPrimitive("Currency", "EUR")));
entitySet.getEntities().add(new EntityImpl() entitySet.getEntities().add(new Entity()
.addProperty(createPrimitive("Id", 5)) .addProperty(createPrimitive("Id", 5))
.addProperty(createPrimitive("Model", "F1 W02")) .addProperty(createPrimitive("Model", "F1 W02"))
.addProperty(createPrimitive("ModelYear", "2011")) .addProperty(createPrimitive("ModelYear", "2011"))
@ -141,14 +138,14 @@ public class DataProvider {
} }
private EntitySet createManufacturers() { 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("Id", 1))
.addProperty(createPrimitive("Name", "Star Powered Racing")) .addProperty(createPrimitive("Name", "Star Powered Racing"))
.addProperty(createAddress("Star Street 137", "Stuttgart", "70173", "Germany"))); .addProperty(createAddress("Star Street 137", "Stuttgart", "70173", "Germany")));
entitySet.getEntities().add(new EntityImpl() entitySet.getEntities().add(new Entity()
.addProperty(createPrimitive("Id", 2)) .addProperty(createPrimitive("Id", 2))
.addProperty(createPrimitive("Name", "Horse Powered Racing")) .addProperty(createPrimitive("Name", "Horse Powered Racing"))
.addProperty(createAddress("Horse Street 1", "Maranello", "41053", "Italy"))); .addProperty(createAddress("Horse Street 1", "Maranello", "41053", "Italy")));
@ -165,10 +162,10 @@ public class DataProvider {
addressProperties.add(createPrimitive("City", city)); addressProperties.add(createPrimitive("City", city));
addressProperties.add(createPrimitive("ZipCode", zipCode)); addressProperties.add(createPrimitive("ZipCode", zipCode));
addressProperties.add(createPrimitive("Country", country)); 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) { 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);
} }
} }