You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/02/27 15:25:12 UTC
[1/2] olingo-odata4 git commit: [OLINGO-575] Start removing
unnecessary common classes in client
Repository: olingo-odata4
Updated Branches:
refs/heads/master d088866e9 -> 68b14ffe4
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java
index e291782..b23878b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataBinderImpl.java
@@ -1,34 +1,41 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.core.serialization;
+import java.io.StringWriter;
import java.net.URI;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
import java.util.List;
+import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.client.api.EdmEnabledODataClient;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.data.ServiceDocument;
import org.apache.olingo.client.api.data.ServiceDocumentItem;
import org.apache.olingo.client.api.serialization.ODataBinder;
import org.apache.olingo.client.core.uri.URIUtils;
+import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.Annotatable;
import org.apache.olingo.commons.api.data.Annotation;
+import org.apache.olingo.commons.api.data.ContextURL;
import org.apache.olingo.commons.api.data.DeletedEntity;
import org.apache.olingo.commons.api.data.Delta;
import org.apache.olingo.commons.api.data.DeltaLink;
@@ -41,31 +48,50 @@ import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.data.Valuable;
import org.apache.olingo.commons.api.data.ValueType;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataProperty;
import org.apache.olingo.commons.api.domain.ODataAnnotatable;
import org.apache.olingo.commons.api.domain.ODataAnnotation;
import org.apache.olingo.commons.api.domain.ODataCollectionValue;
+import org.apache.olingo.commons.api.domain.ODataComplexValue;
+import org.apache.olingo.commons.api.domain.ODataDeletedEntity.Reason;
import org.apache.olingo.commons.api.domain.ODataDelta;
import org.apache.olingo.commons.api.domain.ODataDeltaLink;
+import org.apache.olingo.commons.api.domain.ODataEntity;
+import org.apache.olingo.commons.api.domain.ODataEntitySet;
import org.apache.olingo.commons.api.domain.ODataInlineEntity;
import org.apache.olingo.commons.api.domain.ODataInlineEntitySet;
import org.apache.olingo.commons.api.domain.ODataLink;
+import org.apache.olingo.commons.api.domain.ODataLinkType;
import org.apache.olingo.commons.api.domain.ODataLinked;
import org.apache.olingo.commons.api.domain.ODataLinkedComplexValue;
+import org.apache.olingo.commons.api.domain.ODataOperation;
+import org.apache.olingo.commons.api.domain.ODataProperty;
import org.apache.olingo.commons.api.domain.ODataServiceDocument;
import org.apache.olingo.commons.api.domain.ODataValuable;
import org.apache.olingo.commons.api.domain.ODataValue;
-import org.apache.olingo.commons.api.domain.ODataDeletedEntity.Reason;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmBindingTarget;
import org.apache.olingo.commons.api.edm.EdmComplexType;
import org.apache.olingo.commons.api.edm.EdmElement;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmEnumType;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.EdmSchema;
+import org.apache.olingo.commons.api.edm.EdmStructuredType;
import org.apache.olingo.commons.api.edm.EdmTerm;
import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.geo.Geospatial;
+import org.apache.olingo.commons.api.format.ODataFormat;
+import org.apache.olingo.commons.api.serialization.ODataSerializerException;
import org.apache.olingo.commons.core.data.AnnotationImpl;
+import org.apache.olingo.commons.core.data.EntityImpl;
+import org.apache.olingo.commons.core.data.EntitySetImpl;
+import org.apache.olingo.commons.core.data.LinkImpl;
import org.apache.olingo.commons.core.data.LinkedComplexValueImpl;
import org.apache.olingo.commons.core.data.PropertyImpl;
import org.apache.olingo.commons.core.domain.ODataAnnotationImpl;
@@ -73,12 +99,22 @@ import org.apache.olingo.commons.core.domain.ODataDeletedEntityImpl;
import org.apache.olingo.commons.core.domain.ODataDeltaLinkImpl;
import org.apache.olingo.commons.core.domain.ODataPropertyImpl;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.commons.core.serialization.ContextURLParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ODataBinderImpl implements ODataBinder {
+
+ /**
+ * Logger.
+ */
+ protected static final Logger LOG = LoggerFactory.getLogger(ODataBinderImpl.class);
-public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder {
+ protected final ODataClient client;
public ODataBinderImpl(final ODataClient client) {
- super(client);
+ this.client = client;
}
@Override
@@ -86,29 +122,32 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
return ((ODataEntity) entity).getProperties().add((ODataProperty) property);
}
- @Override
protected boolean add(final ODataEntitySet entitySet, final ODataEntity entity) {
return ((ODataEntitySet) entitySet).getEntities().add((ODataEntity) entity);
}
@Override
public ODataServiceDocument getODataServiceDocument(final ServiceDocument resource) {
- final ODataServiceDocument serviceDocument = super.getODataServiceDocument(resource);
+ final ODataServiceDocument serviceDocument = new ODataServiceDocument();
+ for (ServiceDocumentItem entitySet : resource.getEntitySets()) {
+ serviceDocument.getEntitySets().
+ put(entitySet.getName(), URIUtils.getURI(resource.getBaseURI(), entitySet.getUrl()));
+ }
for (ServiceDocumentItem functionImport : resource.getFunctionImports()) {
serviceDocument.getFunctionImports().put(
- functionImport.getName() == null ? functionImport.getUrl() : functionImport.getName(),
- URIUtils.getURI(resource.getBaseURI(), functionImport.getUrl()));
+ functionImport.getName() == null ? functionImport.getUrl() : functionImport.getName(),
+ URIUtils.getURI(resource.getBaseURI(), functionImport.getUrl()));
}
for (ServiceDocumentItem singleton : resource.getSingletons()) {
serviceDocument.getSingletons().put(
- singleton.getName() == null ? singleton.getUrl() : singleton.getName(),
- URIUtils.getURI(resource.getBaseURI(), singleton.getUrl()));
+ singleton.getName() == null ? singleton.getUrl() : singleton.getName(),
+ URIUtils.getURI(resource.getBaseURI(), singleton.getUrl()));
}
for (ServiceDocumentItem sdoc : resource.getRelatedServiceDocuments()) {
serviceDocument.getRelatedServiceDocuments().put(
- sdoc.getName() == null ? sdoc.getUrl() : sdoc.getName(),
- URIUtils.getURI(resource.getBaseURI(), sdoc.getUrl()));
+ sdoc.getName() == null ? sdoc.getUrl() : sdoc.getName(),
+ URIUtils.getURI(resource.getBaseURI(), sdoc.getUrl()));
}
return serviceDocument;
@@ -119,28 +158,28 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
if (odataValuable.hasPrimitiveValue()) {
propertyResource.setType(odataValuable.getPrimitiveValue().getTypeName());
propertyResource.setValue(
- propertyValue instanceof Geospatial ? ValueType.GEOSPATIAL : ValueType.PRIMITIVE,
- propertyValue);
+ propertyValue instanceof Geospatial ? ValueType.GEOSPATIAL : ValueType.PRIMITIVE,
+ propertyValue);
} else if (odataValuable.hasEnumValue()) {
propertyResource.setType(odataValuable.getEnumValue().getTypeName());
propertyResource.setValue(ValueType.ENUM, propertyValue);
} else if (odataValuable.hasComplexValue()) {
propertyResource.setType(odataValuable.getComplexValue().getTypeName());
propertyResource.setValue(
- propertyValue instanceof LinkedComplexValue ? ValueType.LINKED_COMPLEX : ValueType.COMPLEX,
- propertyValue);
+ propertyValue instanceof LinkedComplexValue ? ValueType.LINKED_COMPLEX : ValueType.COMPLEX,
+ propertyValue);
} else if (odataValuable.hasCollectionValue()) {
final ODataCollectionValue<org.apache.olingo.commons.api.domain.ODataValue> collectionValue =
- odataValuable.getCollectionValue();
+ odataValuable.getCollectionValue();
propertyResource.setType(collectionValue.getTypeName());
final org.apache.olingo.commons.api.domain.ODataValue value =
- collectionValue.iterator().hasNext() ? collectionValue.iterator().next() : null;
+ collectionValue.iterator().hasNext() ? collectionValue.iterator().next() : null;
ValueType valueType = ValueType.COLLECTION_PRIMITIVE;
if (value == null) {
valueType = ValueType.COLLECTION_PRIMITIVE;
} else if (value.isPrimitive()) {
valueType = value.asPrimitive().toValue() instanceof Geospatial
- ? ValueType.COLLECTION_GEOSPATIAL : ValueType.COLLECTION_PRIMITIVE;
+ ? ValueType.COLLECTION_GEOSPATIAL : ValueType.COLLECTION_PRIMITIVE;
} else if (value.isEnum()) {
valueType = ValueType.COLLECTION_ENUM;
} else if (value.isLinkedComplex()) {
@@ -166,18 +205,47 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
@Override
public EntitySet getEntitySet(final ODataEntitySet odataEntitySet) {
- final EntitySet entitySet = super.getEntitySet(odataEntitySet);
+ final EntitySet entitySet = new EntitySetImpl();
+
+ entitySet.setCount(odataEntitySet.getCount());
+
+ final URI next = odataEntitySet.getNext();
+ if (next != null) {
+ entitySet.setNext(next);
+ }
+
+ for (ODataEntity entity : odataEntitySet.getEntities()) {
+ entitySet.getEntities().add(getEntity(entity));
+ }
+
entitySet.setDeltaLink(((ODataEntitySet) odataEntitySet).getDeltaLink());
annotations((ODataEntitySet) odataEntitySet, entitySet);
return entitySet;
}
- @Override
protected void links(final ODataLinked odataLinked, final Linked linked) {
- super.links(odataLinked, linked);
+ // -------------------------------------------------------------
+ // Append navigation links (handling inline entity / entity set as well)
+ // -------------------------------------------------------------
+ // handle navigation links
+ for (ODataLink link : odataLinked.getNavigationLinks()) {
+ // append link
+ LOG.debug("Append navigation link\n{}", link);
+ linked.getNavigationLinks().add(getLink(link));
+ }
+ // -------------------------------------------------------------
+
+ // -------------------------------------------------------------
+ // Append association links
+ // -------------------------------------------------------------
+ for (ODataLink link : odataLinked.getAssociationLinks()) {
+ LOG.debug("Append association link\n{}", link);
+ linked.getAssociationLinks().add(getLink(link));
+ }
+ // -------------------------------------------------------------
for (Link link : linked.getNavigationLinks()) {
- final org.apache.olingo.commons.api.domain.ODataLink odataLink = odataLinked.getNavigationLink(link.getTitle());
+ final ODataLink odataLink = odataLinked.getNavigationLink(link.getTitle());
if (!(odataLink instanceof ODataInlineEntity) && !(odataLink instanceof ODataInlineEntitySet)) {
annotations((ODataLink) odataLink, link);
}
@@ -186,13 +254,84 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
@Override
public Entity getEntity(final ODataEntity odataEntity) {
- final Entity entity = super.getEntity(odataEntity);
+ final Entity entity = new EntityImpl();
+
+ entity.setType(odataEntity.getTypeName() == null ? null : odataEntity.getTypeName().toString());
+
+ // -------------------------------------------------------------
+ // Add edit and self link
+ // -------------------------------------------------------------
+ final URI odataEditLink = odataEntity.getEditLink();
+ if (odataEditLink != null) {
+ final LinkImpl editLink = new LinkImpl();
+ editLink.setTitle(entity.getType());
+ editLink.setHref(odataEditLink.toASCIIString());
+ editLink.setRel(Constants.EDIT_LINK_REL);
+ entity.setEditLink(editLink);
+ }
+
+ if (odataEntity.isReadOnly()) {
+ final LinkImpl selfLink = new LinkImpl();
+ selfLink.setTitle(entity.getType());
+ selfLink.setHref(odataEntity.getLink().toASCIIString());
+ selfLink.setRel(Constants.SELF_LINK_REL);
+ entity.setSelfLink(selfLink);
+ }
+ // -------------------------------------------------------------
+
+ links(odataEntity, entity);
+
+ // -------------------------------------------------------------
+ // Append edit-media links
+ // -------------------------------------------------------------
+ for (ODataLink link : odataEntity.getMediaEditLinks()) {
+ LOG.debug("Append edit-media link\n{}", link);
+ entity.getMediaEditLinks().add(getLink(link));
+ }
+ // -------------------------------------------------------------
+
+ if (odataEntity.isMediaEntity()) {
+ entity.setMediaContentSource(odataEntity.getMediaContentSource());
+ entity.setMediaContentType(odataEntity.getMediaContentType());
+ entity.setMediaETag(odataEntity.getMediaETag());
+ }
+
+ for (ODataProperty property : odataEntity.getProperties()) {
+ entity.getProperties().add(getProperty(property));
+ }
+
entity.setId(((ODataEntity) odataEntity).getId());
annotations((ODataEntity) odataEntity, entity);
return entity;
}
@Override
+ public Link getLink(final ODataLink link) {
+ final Link linkResource = new LinkImpl();
+ linkResource.setRel(link.getRel());
+ linkResource.setTitle(link.getName());
+ linkResource.setHref(link.getLink() == null ? null : link.getLink().toASCIIString());
+ linkResource.setType(link.getType().toString());
+ linkResource.setMediaETag(link.getMediaETag());
+
+ if (link instanceof ODataInlineEntity) {
+ // append inline entity
+ final ODataEntity inlineEntity = ((ODataInlineEntity) link).getEntity();
+ LOG.debug("Append in-line entity\n{}", inlineEntity);
+
+ linkResource.setInlineEntity(getEntity(inlineEntity));
+ } else if (link instanceof ODataInlineEntitySet) {
+ // append inline entity set
+ final ODataEntitySet InlineEntitySet = ((ODataInlineEntitySet) link).getEntitySet();
+ LOG.debug("Append in-line entity set\n{}", InlineEntitySet);
+
+ linkResource.setInlineEntitySet(getEntitySet(InlineEntitySet));
+ }
+
+ return linkResource;
+ }
+
+ @Override
public Property getProperty(final ODataProperty property) {
final ODataProperty _property = (ODataProperty) property;
@@ -204,26 +343,26 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
return propertyResource;
}
- @Override
+ // TODO: Refactor away the v3 code
@SuppressWarnings("unchecked")
protected Object getValue(final ODataValue value) {
Object valueResource;
if (value instanceof org.apache.olingo.commons.api.domain.ODataValue
- && ((org.apache.olingo.commons.api.domain.ODataValue) value).isEnum()) {
+ && ((org.apache.olingo.commons.api.domain.ODataValue) value).isEnum()) {
valueResource =
- ((org.apache.olingo.commons.api.domain.ODataValue) value).asEnum().getValue();
+ ((org.apache.olingo.commons.api.domain.ODataValue) value).asEnum().getValue();
} else {
- valueResource = super.getValue(value);
+ valueResource = getValueInternal(value);
if (value instanceof org.apache.olingo.commons.api.domain.ODataValue
- && ((org.apache.olingo.commons.api.domain.ODataValue) value).isLinkedComplex()) {
+ && ((org.apache.olingo.commons.api.domain.ODataValue) value).isLinkedComplex()) {
final LinkedComplexValue lcValueResource = new LinkedComplexValueImpl();
lcValueResource.getValue().addAll((List<Property>) valueResource);
final ODataLinkedComplexValue linked =
- ((org.apache.olingo.commons.api.domain.ODataValue) value).asLinkedComplex();
+ ((org.apache.olingo.commons.api.domain.ODataValue) value).asLinkedComplex();
annotations(linked, lcValueResource);
links(linked, lcValueResource);
@@ -233,12 +372,37 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
return valueResource;
}
+ protected Object getValueInternal(final ODataValue value) {
+ if (value == null) {
+ return null;
+ } else if (value.isPrimitive()) {
+ return value.asPrimitive().toValue();
+ } else if (value.isComplex()) {
+ final ODataComplexValue<? extends ODataProperty> _value = value.asComplex();
+ List<Property> valueResource = new ArrayList<Property>();
+
+ for (final ODataProperty propertyValue : _value) {
+ valueResource.add(getProperty(propertyValue));
+ }
+ return valueResource;
+ } else if (value.isCollection()) {
+ final ODataCollectionValue<? extends ODataValue> _value = value.asCollection();
+ ArrayList<Object> valueResource = new ArrayList<Object>();
+
+ for (final ODataValue collectionValue : _value) {
+ valueResource.add(getValue(collectionValue));
+ }
+ return valueResource;
+ }
+ return null;
+ }
+
private void odataAnnotations(final Annotatable annotatable, final ODataAnnotatable odataAnnotatable) {
for (Annotation annotation : annotatable.getAnnotations()) {
FullQualifiedName fqn = null;
if (client instanceof EdmEnabledODataClient) {
final EdmTerm term = ((EdmEnabledODataClient) client).getCachedEdm().
- getTerm(new FullQualifiedName(annotation.getTerm()));
+ getTerm(new FullQualifiedName(annotation.getTerm()));
if (term != null) {
fqn = term.getType().getFullQualifiedName();
}
@@ -252,19 +416,42 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
}
final ODataAnnotation odataAnnotation = new ODataAnnotationImpl(annotation.getTerm(),
- (org.apache.olingo.commons.api.domain.ODataValue) getODataValue(fqn, annotation, null, null));
+ (org.apache.olingo.commons.api.domain.ODataValue) getODataValue(fqn, annotation, null, null));
odataAnnotatable.getAnnotations().add(odataAnnotation);
}
}
@Override
public ODataEntitySet getODataEntitySet(final ResWrap<EntitySet> resource) {
- final ODataEntitySet entitySet = (ODataEntitySet) super.getODataEntitySet(resource);
+ if (LOG.isDebugEnabled()) {
+ final StringWriter writer = new StringWriter();
+ try {
+ client.getSerializer(ODataFormat.JSON).write(writer, resource.getPayload());
+ } catch (final ODataSerializerException e) {}
+ writer.flush();
+ LOG.debug("EntitySet -> ODataEntitySet:\n{}", writer.toString());
+ }
+
+ final URI base = resource.getContextURL() == null
+ ? resource.getPayload().getBaseURI()
+ : ContextURLParser.parse(resource.getContextURL()).getServiceRoot();
+
+ final URI next = resource.getPayload().getNext();
+
+ final ODataEntitySet entitySet = next == null
+ ? client.getObjectFactory().newEntitySet()
+ : client.getObjectFactory().newEntitySet(URIUtils.getURI(base, next.toASCIIString()));
+
+ if (resource.getPayload().getCount() != null) {
+ entitySet.setCount(resource.getPayload().getCount());
+ }
+
+ for (Entity entityResource : resource.getPayload().getEntities()) {
+ add(entitySet, getODataEntity(
+ new ResWrap<Entity>(resource.getContextURL(), resource.getMetadataETag(), entityResource)));
+ }
if (resource.getPayload().getDeltaLink() != null) {
- final URI base = resource.getContextURL() == null
- ? resource.getPayload().getBaseURI()
- : ContextURLParser.parse(resource.getContextURL()).getServiceRoot();
entitySet.setDeltaLink(URIUtils.getURI(base, resource.getPayload().getDeltaLink()));
}
odataAnnotations(resource.getPayload(), entitySet);
@@ -272,11 +459,41 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
return entitySet;
}
- @Override
protected void odataNavigationLinks(final EdmType edmType,
- final Linked linked, final ODataLinked odataLinked, final String metadataETag, final URI base) {
+ final Linked linked, final ODataLinked odataLinked, final String metadataETag, final URI base) {
+ for (Link link : linked.getNavigationLinks()) {
+ final String href = link.getHref();
+ final String title = link.getTitle();
+ final Entity inlineEntity = link.getInlineEntity();
+ final EntitySet inlineEntitySet = link.getInlineEntitySet();
+ if (inlineEntity == null && inlineEntitySet == null) {
+ ODataLinkType linkType = null;
+ if (edmType instanceof EdmStructuredType) {
+ final EdmNavigationProperty navProp = ((EdmStructuredType) edmType).getNavigationProperty(title);
+ if (navProp != null) {
+ linkType = navProp.isCollection() ?
+ ODataLinkType.ENTITY_SET_NAVIGATION :
+ ODataLinkType.ENTITY_NAVIGATION;
+ }
+ }
+ if (linkType == null) {
+ linkType = link.getType() == null ?
+ ODataLinkType.ENTITY_NAVIGATION :
+ ODataLinkType.fromString(client.getServiceVersion(), link.getRel(), link.getType());
+ }
+
+ odataLinked.addLink(linkType == ODataLinkType.ENTITY_NAVIGATION ?
+ client.getObjectFactory().newEntityNavigationLink(title, URIUtils.getURI(base, href)) :
+ client.getObjectFactory().newEntitySetNavigationLink(title, URIUtils.getURI(base, href)));
+ } else if (inlineEntity != null) {
+ odataLinked.addLink(createODataInlineEntity(inlineEntity,
+ URIUtils.getURI(base, href), title, metadataETag));
+ } else {
+ odataLinked.addLink(createODataInlineEntitySet(inlineEntitySet,
+ URIUtils.getURI(base, href), title, metadataETag));
+ }
+ }
- super.odataNavigationLinks(edmType, linked, odataLinked, metadataETag, base);
for (org.apache.olingo.commons.api.domain.ODataLink link : odataLinked.getNavigationLinks()) {
if (!(link instanceof ODataInlineEntity) && !(link instanceof ODataInlineEntitySet)) {
odataAnnotations(linked.getNavigationLink(link.getName()), (ODataAnnotatable) link);
@@ -284,9 +501,201 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
}
}
+ private ODataInlineEntity createODataInlineEntity(final Entity inlineEntity,
+ final URI uri, final String title, final String metadataETag) {
+ return new ODataInlineEntity(client.getServiceVersion(), uri, ODataLinkType.ENTITY_NAVIGATION, title,
+ getODataEntity(new ResWrap<Entity>(
+ inlineEntity.getBaseURI() == null ? null : inlineEntity.getBaseURI(), metadataETag,
+ inlineEntity)));
+ }
+
+ private ODataInlineEntitySet createODataInlineEntitySet(final EntitySet inlineEntitySet,
+ final URI uri, final String title, final String metadataETag) {
+ return new ODataInlineEntitySet(client.getServiceVersion(), uri, ODataLinkType.ENTITY_SET_NAVIGATION, title,
+ getODataEntitySet(new ResWrap<EntitySet>(
+ inlineEntitySet.getBaseURI() == null ? null : inlineEntitySet.getBaseURI(), metadataETag,
+ inlineEntitySet)));
+ }
+
+ private EdmEntityType findEntityType(
+ final String entitySetOrSingletonOrType, final EdmEntityContainer container) {
+
+ EdmEntityType type = null;
+
+ final String firstToken = StringUtils.substringBefore(entitySetOrSingletonOrType, "/");
+ EdmBindingTarget bindingTarget = container.getEntitySet(firstToken);
+ if (bindingTarget == null) {
+ bindingTarget = container.getSingleton(firstToken);
+ }
+ if (bindingTarget != null) {
+ type = bindingTarget.getEntityType();
+ }
+
+ if (entitySetOrSingletonOrType.indexOf('/') != -1) {
+ final String[] splitted = entitySetOrSingletonOrType.split("/");
+ if (splitted.length > 1) {
+ for (int i = 1; i < splitted.length && type != null; i++) {
+ final EdmNavigationProperty navProp = type.getNavigationProperty(splitted[i]);
+ if (navProp == null) {
+ type = null;
+ } else {
+ type = navProp.getType();
+ }
+ }
+ }
+ }
+
+ return type;
+ }
+
+ /**
+ * Infer type name from various sources of information including Edm and context URL, if available.
+ *
+ * @param candidateTypeName type name as provided by the service
+ * @param contextURL context URL
+ * @param metadataETag metadata ETag
+ * @return Edm type information
+ */
+ private EdmType findType(final String candidateTypeName, final ContextURL contextURL, final String metadataETag) {
+ EdmType type = null;
+
+ if (client instanceof EdmEnabledODataClient) {
+ final Edm edm = ((EdmEnabledODataClient) client).getEdm(metadataETag);
+ if (StringUtils.isNotBlank(candidateTypeName)) {
+ type = edm.getEntityType(new FullQualifiedName(candidateTypeName));
+ }
+ if (type == null && contextURL != null) {
+ if (contextURL.getDerivedEntity() == null) {
+ for (EdmSchema schema : edm.getSchemas()) {
+ final EdmEntityContainer container = schema.getEntityContainer();
+ if (container != null) {
+ final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
+
+ if (entityType != null) {
+ if (contextURL.getNavOrPropertyPath() == null) {
+ type = entityType;
+ } else {
+ final EdmNavigationProperty navProp =
+ entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
+
+ type = navProp == null
+ ? entityType
+ : navProp.getType();
+ }
+ }
+ }
+ }
+ if (type == null) {
+ type = new EdmTypeInfo.Builder().setEdm(edm).
+ setTypeExpression(contextURL.getEntitySetOrSingletonOrType()).build().getType();
+ }
+ } else {
+ type = edm.getEntityType(new FullQualifiedName(contextURL.getDerivedEntity()));
+ }
+ }
+ }
+
+ return type;
+ }
+
+ private ODataLink createLinkFromNavigationProperty(final Property property, final String propertyTypeName) {
+ if (property.isCollection()) {
+ EntitySet inlineEntitySet = new EntitySetImpl();
+ for (final Object inlined : property.asCollection()) {
+ Entity inlineEntity = new EntityImpl();
+ inlineEntity.setType(propertyTypeName);
+ inlineEntity.getProperties().addAll(
+ inlined instanceof LinkedComplexValue ? ((LinkedComplexValue) inlined).getValue() :
+ inlined instanceof Property ? ((Property) inlined).asComplex() : null);
+ inlineEntitySet.getEntities().add(inlineEntity);
+ }
+ return createODataInlineEntitySet(inlineEntitySet, null, property.getName(), null);
+ } else {
+ Entity inlineEntity = new EntityImpl();
+ inlineEntity.setType(propertyTypeName);
+ inlineEntity.getProperties().addAll(
+ property.isLinkedComplex() ? property.asLinkedComplex().getValue() : property.asComplex());
+ return createODataInlineEntity(inlineEntity, null, property.getName(), null);
+ }
+ }
+
@Override
public ODataEntity getODataEntity(final ResWrap<Entity> resource) {
- final ODataEntity entity = (ODataEntity) super.getODataEntity(resource);
+ if (LOG.isDebugEnabled()) {
+ final StringWriter writer = new StringWriter();
+ try {
+ client.getSerializer(ODataFormat.JSON).write(writer, resource.getPayload());
+ } catch (final ODataSerializerException e) {}
+ writer.flush();
+ LOG.debug("EntityResource -> ODataEntity:\n{}", writer.toString());
+ }
+
+ final ContextURL contextURL = ContextURLParser.parse(resource.getContextURL());
+ final URI base = resource.getContextURL() == null
+ ? resource.getPayload().getBaseURI()
+ : contextURL.getServiceRoot();
+ final EdmType edmType = findType(resource.getPayload().getType(), contextURL, resource.getMetadataETag());
+ FullQualifiedName typeName = null;
+ if (resource.getPayload().getType() == null) {
+ if (edmType != null) {
+ typeName = edmType.getFullQualifiedName();
+ }
+ } else {
+ typeName = new FullQualifiedName(resource.getPayload().getType());
+ }
+
+ final ODataEntity entity = resource.getPayload().getSelfLink() == null
+ ? client.getObjectFactory().newEntity(typeName)
+ : client.getObjectFactory().newEntity(typeName,
+ URIUtils.getURI(base, resource.getPayload().getSelfLink().getHref()));
+
+ if (StringUtils.isNotBlank(resource.getPayload().getETag())) {
+ entity.setETag(resource.getPayload().getETag());
+ }
+
+ if (resource.getPayload().getEditLink() != null) {
+ entity.setEditLink(URIUtils.getURI(base, resource.getPayload().getEditLink().getHref()));
+ }
+
+ for (Link link : resource.getPayload().getAssociationLinks()) {
+ entity.addLink(client.getObjectFactory().
+ newAssociationLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
+ }
+
+ odataNavigationLinks(edmType, resource.getPayload(), entity, resource.getMetadataETag(), base);
+
+ for (Link link : resource.getPayload().getMediaEditLinks()) {
+ entity.addLink(client.getObjectFactory().
+ newMediaEditLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
+ }
+
+ for (ODataOperation operation : resource.getPayload().getOperations()) {
+ operation.setTarget(URIUtils.getURI(base, operation.getTarget()));
+ entity.getOperations().add(operation);
+ }
+
+ if (resource.getPayload().isMediaEntity()) {
+ entity.setMediaEntity(true);
+ entity.setMediaContentSource(URIUtils.getURI(base, resource.getPayload().getMediaContentSource()));
+ entity.setMediaContentType(resource.getPayload().getMediaContentType());
+ entity.setMediaETag(resource.getPayload().getMediaETag());
+ }
+
+ for (final Property property : resource.getPayload().getProperties()) {
+ EdmType propertyType = null;
+ if (edmType instanceof EdmEntityType) {
+ final EdmElement edmProperty = ((EdmEntityType) edmType).getProperty(property.getName());
+ if (edmProperty != null) {
+ propertyType = edmProperty.getType();
+ if (edmProperty instanceof EdmNavigationProperty) {
+ final String propertyTypeName = propertyType.getFullQualifiedName().getFullQualifiedNameAsString();
+ entity.addLink(createLinkFromNavigationProperty(property, propertyTypeName));
+ break;
+ }
+ }
+ }
+ add(entity, getODataProperty(propertyType, property));
+ }
entity.setId(resource.getPayload().getId());
odataAnnotations(resource.getPayload(), entity);
@@ -298,31 +707,63 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
public ODataProperty getODataProperty(final ResWrap<Property> resource) {
final Property payload = resource.getPayload();
final EdmTypeInfo typeInfo = buildTypeInfo(ContextURLParser.parse(resource.getContextURL()),
- resource.getMetadataETag(), payload.getName(), payload.getType());
+ resource.getMetadataETag(), payload.getName(), payload.getType());
final ODataProperty property = new ODataPropertyImpl(payload.getName(),
- getODataValue(typeInfo == null ? null : typeInfo.getFullQualifiedName(),
- payload, resource.getContextURL(), resource.getMetadataETag()));
+ getODataValue(typeInfo == null ? null : typeInfo.getFullQualifiedName(),
+ payload, resource.getContextURL(), resource.getMetadataETag()));
odataAnnotations(payload, property);
return property;
}
- @Override
+ private EdmTypeInfo buildTypeInfo(final ContextURL contextURL, final String metadataETag,
+ final String propertyName, final String propertyType) {
+
+ FullQualifiedName typeName = null;
+ final EdmType type = findType(null, contextURL, metadataETag);
+ if (type instanceof EdmStructuredType) {
+ final EdmProperty edmProperty = ((EdmStructuredType) type).getStructuralProperty(propertyName);
+ if (edmProperty != null) {
+ typeName = edmProperty.getType().getFullQualifiedName();
+ }
+ }
+ if (typeName == null && type != null) {
+ typeName = type.getFullQualifiedName();
+ }
+
+ return buildTypeInfo(typeName, propertyType);
+ }
+
+ private EdmTypeInfo buildTypeInfo(final FullQualifiedName typeName, final String propertyType) {
+ EdmTypeInfo typeInfo = null;
+ if (typeName == null) {
+ if (propertyType != null) {
+ typeInfo = new EdmTypeInfo.Builder().setTypeExpression(propertyType).build();
+ }
+ } else {
+ if (propertyType == null || propertyType.equals(EdmPrimitiveTypeKind.String.getFullQualifiedName().toString())) {
+ typeInfo = new EdmTypeInfo.Builder().setTypeExpression(typeName.toString()).build();
+ } else {
+ typeInfo = new EdmTypeInfo.Builder().setTypeExpression(propertyType).build();
+ }
+ }
+ return typeInfo;
+ }
+
protected ODataProperty getODataProperty(final EdmType type, final Property resource) {
final EdmTypeInfo typeInfo = buildTypeInfo(type == null ? null : type.getFullQualifiedName(), resource.getType());
final ODataProperty property = new ODataPropertyImpl(resource.getName(),
- getODataValue(typeInfo == null ? null : typeInfo.getFullQualifiedName(),
- resource, null, null));
+ getODataValue(typeInfo == null ? null : typeInfo.getFullQualifiedName(),
+ resource, null, null));
odataAnnotations(resource, property);
return property;
}
- @Override
protected ODataValue getODataValue(final FullQualifiedName type,
- final Valuable valuable, final URI contextURL, final String metadataETag) {
+ final Valuable valuable, final URI contextURL, final String metadataETag) {
// fixes enum values treated as primitive when no type information is available
if (client instanceof EdmEnabledODataClient && type != null) {
@@ -332,13 +773,13 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
}
}
- ODataValue value;
+ ODataValue value = null;
if (valuable.isEnum()) {
value = ((ODataClient) client).getObjectFactory().newEnumValue(type == null ? null : type.toString(),
- valuable.asEnum().toString());
+ valuable.asEnum().toString());
} else if (valuable.isLinkedComplex()) {
final ODataLinkedComplexValue lcValue =
- ((ODataClient) client).getObjectFactory().newLinkedComplexValue(type == null ? null : type.toString());
+ ((ODataClient) client).getObjectFactory().newLinkedComplexValue(type == null ? null : type.toString());
EdmComplexType edmType = null;
if (client instanceof EdmEnabledODataClient && type != null) {
@@ -361,7 +802,76 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
value = lcValue;
} else {
- value = super.getODataValue(type, valuable, contextURL, metadataETag);
+ if (valuable.isGeospatial()) {
+ value = client.getObjectFactory().newPrimitiveValueBuilder().
+ setValue(valuable.asGeospatial()).
+ setType(type == null
+ || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(type)
+ || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(type)
+ ? valuable.asGeospatial().getEdmPrimitiveTypeKind()
+ : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).
+ build();
+ } else if (valuable.isPrimitive() || valuable.getValueType() == null) {
+ // fixes non-string values treated as string when no type information is available at de-serialization level
+ if (type != null && !EdmPrimitiveTypeKind.String.getFullQualifiedName().equals(type)
+ && EdmPrimitiveType.EDM_NAMESPACE.equals(type.getNamespace())
+ && valuable.asPrimitive() instanceof String) {
+
+ final EdmPrimitiveType primitiveType =
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.valueOf(type.getName()));
+ final Class<?> returnType = primitiveType.getDefaultType().isAssignableFrom(Calendar.class)
+ ? Timestamp.class : primitiveType.getDefaultType();
+ try {
+ valuable.setValue(valuable.getValueType(),
+ primitiveType.valueOfString(valuable.asPrimitive().toString(),
+ null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null,
+ returnType));
+ } catch (EdmPrimitiveTypeException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ value = client.getObjectFactory().newPrimitiveValueBuilder().
+ setValue(valuable.asPrimitive()).
+ setType(type == null || !EdmPrimitiveType.EDM_NAMESPACE.equals(type.getNamespace())
+ ? null
+ : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).
+ build();
+ } else if (valuable.isComplex()) {
+ final ODataComplexValue<ODataProperty> cValue =
+ (ODataComplexValue<ODataProperty>) client.getObjectFactory().
+ newComplexValue(type == null ? null : type.toString());
+
+ if (!valuable.isNull()) {
+ EdmComplexType edmType = null;
+ if (client instanceof EdmEnabledODataClient && type != null) {
+ edmType = ((EdmEnabledODataClient) client).getEdm(metadataETag).getComplexType(type);
+ }
+
+ for (Property property : valuable.asComplex()) {
+ EdmType edmPropertyType = null;
+ if (edmType != null) {
+ final EdmElement edmProp = edmType.getProperty(property.getName());
+ if (edmProp != null) {
+ edmPropertyType = edmProp.getType();
+ }
+ }
+
+ cValue.add(getODataProperty(edmPropertyType, property));
+ }
+ }
+
+ value = cValue;
+ } else if (valuable.isCollection()) {
+ value =
+ client.getObjectFactory().newCollectionValue(type == null ? null : "Collection(" + type.toString() + ")");
+
+ for (Object _value : valuable.asCollection()) {
+ final Property fake = new PropertyImpl();
+ fake.setValue(valuable.getValueType().getBaseType(), _value);
+ value.asCollection().add(getODataValue(type, fake, contextURL, metadataETag));
+ }
+ }
}
return value;
@@ -370,14 +880,14 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
@Override
public ODataDelta getODataDelta(final ResWrap<Delta> resource) {
final URI base = resource.getContextURL() == null
- ? resource.getPayload().getBaseURI()
- : ContextURLParser.parse(resource.getContextURL()).getServiceRoot();
+ ? resource.getPayload().getBaseURI()
+ : ContextURLParser.parse(resource.getContextURL()).getServiceRoot();
final URI next = resource.getPayload().getNext();
final ODataDelta delta = next == null
- ? ((ODataClient) client).getObjectFactory().newDelta()
- : ((ODataClient) client).getObjectFactory().newDelta(URIUtils.getURI(base, next.toASCIIString()));
+ ? ((ODataClient) client).getObjectFactory().newDelta()
+ : ((ODataClient) client).getObjectFactory().newDelta(URIUtils.getURI(base, next.toASCIIString()));
if (resource.getPayload().getCount() != null) {
delta.setCount(resource.getPayload().getCount());
@@ -389,7 +899,7 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
for (Entity entityResource : resource.getPayload().getEntities()) {
add(delta, getODataEntity(
- new ResWrap<Entity>(resource.getContextURL(), resource.getMetadataETag(), entityResource)));
+ new ResWrap<Entity>(resource.getContextURL(), resource.getMetadataETag(), entityResource)));
}
for (DeletedEntity deletedEntity : resource.getPayload().getDeletedEntities()) {
final ODataDeletedEntityImpl impl = new ODataDeletedEntityImpl();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataReaderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataReaderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataReaderImpl.java
index f9a7893..22b1798 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataReaderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ODataReaderImpl.java
@@ -19,22 +19,143 @@
package org.apache.olingo.client.core.serialization;
import java.io.InputStream;
+import java.net.URI;
+import java.util.Map;
+import org.apache.commons.io.IOUtils;
+import org.apache.olingo.client.api.CommonODataClient;
import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.client.api.data.ServiceDocument;
+import org.apache.olingo.client.api.domain.ODataEntitySetIterator;
+import org.apache.olingo.client.api.edm.xml.Schema;
+import org.apache.olingo.client.api.edm.xml.XMLMetadata;
import org.apache.olingo.client.api.serialization.ODataReader;
+import org.apache.olingo.client.core.edm.EdmClientImpl;
+import org.apache.olingo.commons.api.data.Entity;
+import org.apache.olingo.commons.api.data.EntitySet;
+import org.apache.olingo.commons.api.data.Property;
+import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.domain.ODataEntity;
import org.apache.olingo.commons.api.domain.ODataEntitySet;
+import org.apache.olingo.commons.api.domain.ODataError;
import org.apache.olingo.commons.api.domain.ODataProperty;
+import org.apache.olingo.commons.api.domain.ODataServiceDocument;
+import org.apache.olingo.commons.api.domain.ODataValue;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.serialization.ODataDeserializerException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-public class ODataReaderImpl extends AbstractODataReader implements ODataReader {
+public class ODataReaderImpl implements ODataReader {
- public ODataReaderImpl(final ODataClient client) {
- super(client);
+ /**
+ * Logger.
+ */
+ protected static final Logger LOG = LoggerFactory.getLogger(ODataReaderImpl.class);
+
+ protected final CommonODataClient<?> client;
+
+ public ODataReaderImpl(final CommonODataClient<?> client) {
+ this.client = client;
+ }
+
+ @Override
+ public Edm readMetadata(final InputStream input) {
+ return readMetadata(client.getDeserializer(ODataFormat.XML).toMetadata(input).getSchemaByNsOrAlias());
}
@Override
+ public Edm readMetadata(final Map<String, Schema> xmlSchemas) {
+ return new EdmClientImpl(client.getServiceVersion(), xmlSchemas);
+ }
+
+ @Override
+ public ODataServiceDocument readServiceDocument(final InputStream input, final ODataFormat format)
+ throws ODataDeserializerException {
+ return client.getBinder().getODataServiceDocument(
+ client.getDeserializer(format).toServiceDocument(input).getPayload());
+ }
+
+ @Override
+ public ODataError readError(final InputStream inputStream, final ODataFormat format )
+ throws ODataDeserializerException {
+ return client.getDeserializer(format).toError(inputStream);
+ }
+
+ @Override
+ public <T> ResWrap<T> read(final InputStream src, final String format, final Class<T> reference)
+ throws ODataDeserializerException {
+ ResWrap<T> res;
+
+ try {
+ if (ODataEntitySetIterator.class.isAssignableFrom(reference)) {
+ res = new ResWrap<T>(
+ (URI) null,
+ null,
+ reference.cast(new ODataEntitySetIterator<ODataEntitySet, ODataEntity>(
+ client, src, ODataFormat.fromString(format))));
+ } else if (ODataEntitySet.class.isAssignableFrom(reference)) {
+ final ResWrap<EntitySet> resource = client.getDeserializer(ODataFormat.fromString(format))
+ .toEntitySet(src);
+ res = new ResWrap<T>(
+ resource.getContextURL(),
+ resource.getMetadataETag(),
+ reference.cast(client.getBinder().getODataEntitySet(resource)));
+ } else if (ODataEntity.class.isAssignableFrom(reference)) {
+ final ResWrap<Entity> container = client.getDeserializer(ODataFormat.fromString(format)).toEntity(src);
+ res = new ResWrap<T>(
+ container.getContextURL(),
+ container.getMetadataETag(),
+ reference.cast(client.getBinder().getODataEntity(container)));
+ } else if (ODataProperty.class.isAssignableFrom(reference)) {
+ final ResWrap<Property> container = client.getDeserializer(ODataFormat.fromString(format)).toProperty(src);
+ res = new ResWrap<T>(
+ container.getContextURL(),
+ container.getMetadataETag(),
+ reference.cast(client.getBinder().getODataProperty(container)));
+ } else if (ODataValue.class.isAssignableFrom(reference)) {
+ res = new ResWrap<T>(
+ (URI) null,
+ null,
+ reference.cast(client.getObjectFactory().newPrimitiveValueBuilder().
+ setType(ODataFormat.fromString(format) == ODataFormat.TEXT_PLAIN
+ ? EdmPrimitiveTypeKind.String : EdmPrimitiveTypeKind.Stream).
+ setValue(IOUtils.toString(src)) // TODO: set correct value
+ .build()));
+ } else if (XMLMetadata.class.isAssignableFrom(reference)) {
+ res = new ResWrap<T>(
+ (URI) null,
+ null,
+ reference.cast(readMetadata(src)));
+ } else if (ODataServiceDocument.class.isAssignableFrom(reference)) {
+ final ResWrap<ServiceDocument> resource =
+ client.getDeserializer(ODataFormat.fromString(format)).toServiceDocument(src);
+ res = new ResWrap<T>(
+ resource.getContextURL(),
+ resource.getMetadataETag(),
+ reference.cast(client.getBinder().getODataServiceDocument(resource.getPayload())));
+ } else if (ODataError.class.isAssignableFrom(reference)) {
+ res = new ResWrap<T>(
+ (URI) null,
+ null,
+ reference.cast(readError(src, ODataFormat.fromString(format))));
+ } else {
+ throw new IllegalArgumentException("Invalid reference type " + reference);
+ }
+ } catch (Exception e) {
+ LOG.warn("Cast error", e);
+ res = null;
+ } finally {
+ if (!ODataEntitySetIterator.class.isAssignableFrom(reference)) {
+ IOUtils.closeQuietly(src);
+ }
+ }
+
+ return res;
+ }
+ @Override
public ODataEntitySet readEntitySet(final InputStream input, final ODataFormat format)
throws ODataDeserializerException {
return ((ODataClient) client).getBinder().getODataEntitySet(client.getDeserializer(format).toEntitySet(input));
[2/2] olingo-odata4 git commit: [OLINGO-575] Start removing
unnecessary common classes in client
Posted by ch...@apache.org.
[OLINGO-575] Start removing unnecessary common classes in client
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/68b14ffe
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/68b14ffe
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/68b14ffe
Branch: refs/heads/master
Commit: 68b14ffe4eeeba786655c384f3a82bccb5560915
Parents: d088866
Author: Christian Amend <ch...@apache.org>
Authored: Fri Feb 27 15:24:29 2015 +0100
Committer: Christian Amend <ch...@apache.org>
Committed: Fri Feb 27 15:24:29 2015 +0100
----------------------------------------------------------------------
.../olingo/client/api/CommonODataClient.java | 8 +-
.../api/serialization/CommonODataBinder.java | 107 ----
.../api/serialization/CommonODataReader.java | 122 ----
.../client/api/serialization/ODataBinder.java | 76 ++-
.../client/api/serialization/ODataReader.java | 104 ++-
.../retrieve/XMLMetadataRequestImpl.java | 4 +-
.../core/serialization/AbstractODataBinder.java | 637 ------------------
.../core/serialization/AbstractODataReader.java | 157 -----
.../core/serialization/ODataBinderImpl.java | 642 +++++++++++++++++--
.../core/serialization/ODataReaderImpl.java | 127 +++-
10 files changed, 871 insertions(+), 1113 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
index cdfcff6..e9fb6a8 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
@@ -26,8 +26,8 @@ import org.apache.olingo.client.api.communication.request.cud.CommonUpdateType;
import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
import org.apache.olingo.client.api.communication.request.retrieve.CommonRetrieveRequestFactory;
import org.apache.olingo.client.api.serialization.ClientODataDeserializer;
-import org.apache.olingo.client.api.serialization.CommonODataBinder;
-import org.apache.olingo.client.api.serialization.CommonODataReader;
+import org.apache.olingo.client.api.serialization.ODataBinder;
+import org.apache.olingo.client.api.serialization.ODataReader;
import org.apache.olingo.client.api.serialization.ODataWriter;
import org.apache.olingo.client.api.uri.CommonFilterFactory;
import org.apache.olingo.client.api.uri.CommonURIBuilder;
@@ -59,11 +59,11 @@ public interface CommonODataClient<UT extends CommonUpdateType> {
ClientODataDeserializer getDeserializer(ODataFormat format);
- CommonODataReader getReader();
+ ODataReader getReader();
ODataWriter getWriter();
- CommonODataBinder getBinder();
+ ODataBinder getBinder();
ODataObjectFactory getObjectFactory();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataBinder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataBinder.java
deleted file mode 100644
index d0c7814..0000000
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataBinder.java
+++ /dev/null
@@ -1,107 +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.client.api.serialization;
-
-import org.apache.olingo.client.api.data.ServiceDocument;
-import org.apache.olingo.commons.api.data.Entity;
-import org.apache.olingo.commons.api.data.EntitySet;
-import org.apache.olingo.commons.api.data.Link;
-import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataProperty;
-import org.apache.olingo.commons.api.domain.ODataLink;
-import org.apache.olingo.commons.api.domain.ODataServiceDocument;
-
-public interface CommonODataBinder {
-
- /**
- * Gets a <tt>EntitySet</tt> from the given OData entity set.
- *
- * @param entitySet OData entity set.
- * @return {@link EntitySet} object.
- */
- EntitySet getEntitySet(ODataEntitySet entitySet);
-
- /**
- * Gets an <tt>Entity</tt> from the given OData entity.
- *
- * @param entity OData entity.
- * @return {@link Entity} object.
- */
- Entity getEntity(ODataEntity entity);
-
- /**
- * Gets a <tt>Link</tt> from the given OData link.
- *
- * @param link OData link.
- * @return <tt>Link</tt> object.
- */
- Link getLink(ODataLink link);
-
- /**
- * Gets a <tt>Property</tt> from the given OData property.
- *
- * @param property OData property.
- * @return <tt>Property</tt> object.
- */
- Property getProperty(ODataProperty property);
-
- /**
- * Adds the given property to the given entity.
- *
- * @param entity OData entity.
- * @param property OData property.
- * @return whether add was successful or not.
- */
- boolean add(ODataEntity entity, ODataProperty property);
-
- /**
- * Gets <tt>ODataServiceDocument</tt> from the given service document resource.
- *
- * @param resource service document resource.
- * @return <tt>ODataServiceDocument</tt> object.
- */
- ODataServiceDocument getODataServiceDocument(ServiceDocument resource);
-
- /**
- * Gets <tt>ODataEntitySet</tt> from the given entity set resource.
- *
- * @param resource entity set resource.
- * @return {@link org.apache.olingo.commons.api.domain.ODataEntitySet} object.
- */
- ODataEntitySet getODataEntitySet(ResWrap<EntitySet> resource);
-
- /**
- * Gets <tt>ODataEntity</tt> from the given entity resource.
- *
- * @param resource entity resource.
- * @return {@link org.apache.olingo.commons.api.domain.ODataEntity} object.
- */
- ODataEntity getODataEntity(ResWrap<Entity> resource);
-
- /**
- * Gets an <tt>ODataProperty</tt> from the given property resource.
- *
- * @param resource property resource.
- * @return {@link org.apache.olingo.commons.api.domain.ODataProperty} object.
- */
- ODataProperty getODataProperty(ResWrap<Property> resource);
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataReader.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataReader.java
deleted file mode 100644
index 7ad713d..0000000
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/CommonODataReader.java
+++ /dev/null
@@ -1,122 +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.client.api.serialization;
-
-import java.io.InputStream;
-import java.util.Map;
-
-import org.apache.olingo.client.api.edm.xml.Schema;
-import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataProperty;
-import org.apache.olingo.commons.api.domain.ODataError;
-import org.apache.olingo.commons.api.domain.ODataServiceDocument;
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.format.ODataFormat;
-import org.apache.olingo.commons.api.serialization.ODataDeserializerException;
-
-/**
- * OData reader.
- * <br/>
- * Use this class to de-serialize an OData response body.
- * <br/>
- * This class provides method helpers to de-serialize an entire entity set, a set of entities or a single entity.
- */
-public interface CommonODataReader {
-
- /**
- * Parses a stream into metadata representation.
- *
- * @param input stream to de-serialize.
- * @return metadata representation.
- */
- Edm readMetadata(InputStream input);
-
- /**
- * Parses a stream into metadata representation, including referenced metadata documents.
- *
- * @param xmlSchemas XML representation of the requested metadata document + any other referenced (via
- * <tt><edmx:Reference/></tt>) metadata document
- * @return metadata representation.
- */
- Edm readMetadata(Map<String, Schema> xmlSchemas);
-
- /**
- * Parses an OData service document.
- *
- * @param input stream to de-serialize.
- * @param format de-serialize as XML or JSON
- * @return List of URIs.
- * @throws ODataDeserializerException
- */
- ODataServiceDocument readServiceDocument(InputStream input, ODataFormat format) throws ODataDeserializerException;
-
- /**
- * De-Serializes a stream into an OData entity set.
- *
- * @param input stream to de-serialize.
- * @param format de-serialize format
- * @return de-serialized entity set.
- * @throws ODataDeserializerException
- */
- ODataEntitySet readEntitySet(InputStream input, ODataFormat format) throws ODataDeserializerException;
-
- /**
- * Parses a stream taking care to de-serializes the first OData entity found.
- *
- * @param input stream to de-serialize.
- * @param format de-serialize format
- * @return entity de-serialized.
- * @throws ODataDeserializerException
- */
- ODataEntity readEntity(InputStream input, ODataFormat format) throws ODataDeserializerException;
-
- /**
- * Parses a stream taking care to de-serialize the first OData entity property found.
- *
- * @param input stream to de-serialize.
- * @param format de-serialize as XML or JSON
- * @return OData entity property de-serialized.
- * @throws ODataDeserializerException
- */
- ODataProperty readProperty(InputStream input, ODataFormat format) throws ODataDeserializerException;
-
- /**
- * Parses a stream into an OData error.
- *
- * @param inputStream stream to de-serialize.
- * @param format format
- * @return OData error.
- * @throws ODataDeserializerException
- */
- ODataError readError(InputStream inputStream, ODataFormat format) throws ODataDeserializerException;
-
- /**
- * Parses a stream into the object type specified by the given reference.
- *
- * @param <T> expected object type.
- * @param src input stream.
- * @param format format
- * @param reference reference.
- * @return read object.
- * @throws ODataDeserializerException
- */
- <T> ResWrap<T> read(InputStream src, String format, Class<T> reference) throws ODataDeserializerException;
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataBinder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataBinder.java
index d7b3685..289c0cb 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataBinder.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataBinder.java
@@ -18,25 +18,93 @@
*/
package org.apache.olingo.client.api.serialization;
+import org.apache.olingo.client.api.data.ServiceDocument;
import org.apache.olingo.commons.api.data.Delta;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet;
+import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.domain.ODataDelta;
import org.apache.olingo.commons.api.domain.ODataEntity;
import org.apache.olingo.commons.api.domain.ODataEntitySet;
+import org.apache.olingo.commons.api.domain.ODataLink;
import org.apache.olingo.commons.api.domain.ODataProperty;
+import org.apache.olingo.commons.api.domain.ODataServiceDocument;
-public interface ODataBinder extends CommonODataBinder {
+public interface ODataBinder {
- @Override
+ /**
+ * Gets a <tt>EntitySet</tt> from the given OData entity set.
+ *
+ * @param entitySet OData entity set.
+ * @return {@link EntitySet} object.
+ */
+ EntitySet getEntitySet(ODataEntitySet entitySet);
+
+ /**
+ * Gets an <tt>Entity</tt> from the given OData entity.
+ *
+ * @param entity OData entity.
+ * @return {@link Entity} object.
+ */
+ Entity getEntity(ODataEntity entity);
+
+ /**
+ * Gets a <tt>Link</tt> from the given OData link.
+ *
+ * @param link OData link.
+ * @return <tt>Link</tt> object.
+ */
+ Link getLink(ODataLink link);
+
+ /**
+ * Gets a <tt>Property</tt> from the given OData property.
+ *
+ * @param property OData property.
+ * @return <tt>Property</tt> object.
+ */
+ Property getProperty(ODataProperty property);
+
+ /**
+ * Adds the given property to the given entity.
+ *
+ * @param entity OData entity.
+ * @param property OData property.
+ * @return whether add was successful or not.
+ */
+ boolean add(ODataEntity entity, ODataProperty property);
+
+ /**
+ * Gets <tt>ODataServiceDocument</tt> from the given service document resource.
+ *
+ * @param resource service document resource.
+ * @return <tt>ODataServiceDocument</tt> object.
+ */
+ ODataServiceDocument getODataServiceDocument(ServiceDocument resource);
+
+ /**
+ * Gets <tt>ODataEntitySet</tt> from the given entity set resource.
+ *
+ * @param resource entity set resource.
+ * @return {@link org.apache.olingo.commons.api.domain.ODataEntitySet} object.
+ */
ODataEntitySet getODataEntitySet(ResWrap<EntitySet> resource);
- @Override
+ /**
+ * Gets <tt>ODataEntity</tt> from the given entity resource.
+ *
+ * @param resource entity resource.
+ * @return {@link org.apache.olingo.commons.api.domain.ODataEntity} object.
+ */
ODataEntity getODataEntity(ResWrap<Entity> resource);
- @Override
+ /**
+ * Gets an <tt>ODataProperty</tt> from the given property resource.
+ *
+ * @param resource property resource.
+ * @return {@link org.apache.olingo.commons.api.domain.ODataProperty} object.
+ */
ODataProperty getODataProperty(ResWrap<Property> resource);
ODataDelta getODataDelta(ResWrap<Delta> resource);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataReader.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataReader.java
index 2ba39a8..611666a 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataReader.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/serialization/ODataReader.java
@@ -1,39 +1,121 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "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
- *
+ * 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
+ * KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.client.api.serialization;
import java.io.InputStream;
+import java.util.Map;
+import org.apache.olingo.client.api.edm.xml.Schema;
+import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.domain.ODataEntity;
import org.apache.olingo.commons.api.domain.ODataEntitySet;
+import org.apache.olingo.commons.api.domain.ODataError;
import org.apache.olingo.commons.api.domain.ODataProperty;
+import org.apache.olingo.commons.api.domain.ODataServiceDocument;
+import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.serialization.ODataDeserializerException;
-public interface ODataReader extends CommonODataReader {
+/**
+ * OData reader.
+ * <br/>
+ * Use this class to de-serialize an OData response body.
+ * <br/>
+ * This class provides method helpers to de-serialize an entire entity set, a set of entities or a single entity.
+ */
+public interface ODataReader {
+ /**
+ * Parses a stream into metadata representation.
+ *
+ * @param input stream to de-serialize.
+ * @return metadata representation.
+ */
+ Edm readMetadata(InputStream input);
+
+ /**
+ * Parses a stream into metadata representation, including referenced metadata documents.
+ *
+ * @param xmlSchemas XML representation of the requested metadata document + any other referenced (via
+ * <tt><edmx:Reference/></tt>) metadata document
+ * @return metadata representation.
+ */
+ Edm readMetadata(Map<String, Schema> xmlSchemas);
+
+ /**
+ * Parses an OData service document.
+ *
+ * @param input stream to de-serialize.
+ * @param format de-serialize as XML or JSON
+ * @return List of URIs.
+ * @throws ODataDeserializerException
+ */
+ ODataServiceDocument readServiceDocument(InputStream input, ODataFormat format) throws ODataDeserializerException;
- @Override
+ /**
+ * De-Serializes a stream into an OData entity set.
+ *
+ * @param input stream to de-serialize.
+ * @param format de-serialize format
+ * @return de-serialized entity set.
+ * @throws ODataDeserializerException
+ */
ODataEntitySet readEntitySet(InputStream input, ODataFormat format) throws ODataDeserializerException;
- @Override
+ /**
+ * Parses a stream taking care to de-serializes the first OData entity found.
+ *
+ * @param input stream to de-serialize.
+ * @param format de-serialize format
+ * @return entity de-serialized.
+ * @throws ODataDeserializerException
+ */
ODataEntity readEntity(InputStream input, ODataFormat format) throws ODataDeserializerException;
- @Override
+ /**
+ * Parses a stream taking care to de-serialize the first OData entity property found.
+ *
+ * @param input stream to de-serialize.
+ * @param format de-serialize as XML or JSON
+ * @return OData entity property de-serialized.
+ * @throws ODataDeserializerException
+ */
ODataProperty readProperty(InputStream input, ODataFormat format) throws ODataDeserializerException;
+
+ /**
+ * Parses a stream into an OData error.
+ *
+ * @param inputStream stream to de-serialize.
+ * @param format format
+ * @return OData error.
+ * @throws ODataDeserializerException
+ */
+ ODataError readError(InputStream inputStream, ODataFormat format) throws ODataDeserializerException;
+
+ /**
+ * Parses a stream into the object type specified by the given reference.
+ *
+ * @param <T> expected object type.
+ * @param src input stream.
+ * @param format format
+ * @param reference reference.
+ * @return read object.
+ * @throws ODataDeserializerException
+ */
+ <T> ResWrap<T> read(InputStream src, String format, Class<T> reference) throws ODataDeserializerException;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/XMLMetadataRequestImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/XMLMetadataRequestImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/XMLMetadataRequestImpl.java
index 3b326e5..ff2b0ea 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/XMLMetadataRequestImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/XMLMetadataRequestImpl.java
@@ -40,7 +40,7 @@ import org.apache.olingo.client.core.edm.xml.SchemaImpl;
import org.apache.olingo.commons.api.format.ODataFormat;
public class XMLMetadataRequestImpl
- extends AbstractMetadataRequestImpl<org.apache.olingo.client.api.edm.xml.XMLMetadata>
+ extends AbstractMetadataRequestImpl<XMLMetadata>
implements XMLMetadataRequest {
XMLMetadataRequestImpl(final ODataClient odataClient, final URI uri) {
@@ -48,7 +48,7 @@ public class XMLMetadataRequestImpl
}
@Override
- public ODataRetrieveResponse<org.apache.olingo.client.api.edm.xml.XMLMetadata> execute() {
+ public ODataRetrieveResponse<XMLMetadata> execute() {
final SingleXMLMetadatRequestImpl rootReq = new SingleXMLMetadatRequestImpl((ODataClient) odataClient, uri, null);
final ODataRetrieveResponse<XMLMetadata> rootRes = rootReq.execute();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
deleted file mode 100644
index cc4594d..0000000
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataBinder.java
+++ /dev/null
@@ -1,637 +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.client.core.serialization;
-
-import java.io.StringWriter;
-import java.net.URI;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.olingo.client.api.CommonODataClient;
-import org.apache.olingo.client.api.EdmEnabledODataClient;
-import org.apache.olingo.client.api.data.ServiceDocument;
-import org.apache.olingo.client.api.data.ServiceDocumentItem;
-import org.apache.olingo.client.api.serialization.CommonODataBinder;
-import org.apache.olingo.client.core.uri.URIUtils;
-import org.apache.olingo.commons.api.Constants;
-import org.apache.olingo.commons.api.data.ContextURL;
-import org.apache.olingo.commons.api.data.Entity;
-import org.apache.olingo.commons.api.data.EntitySet;
-import org.apache.olingo.commons.api.data.Link;
-import org.apache.olingo.commons.api.data.Linked;
-import org.apache.olingo.commons.api.data.LinkedComplexValue;
-import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.data.Valuable;
-import org.apache.olingo.commons.api.domain.ODataCollectionValue;
-import org.apache.olingo.commons.api.domain.ODataComplexValue;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataInlineEntity;
-import org.apache.olingo.commons.api.domain.ODataInlineEntitySet;
-import org.apache.olingo.commons.api.domain.ODataLink;
-import org.apache.olingo.commons.api.domain.ODataLinkType;
-import org.apache.olingo.commons.api.domain.ODataLinked;
-import org.apache.olingo.commons.api.domain.ODataOperation;
-import org.apache.olingo.commons.api.domain.ODataProperty;
-import org.apache.olingo.commons.api.domain.ODataServiceDocument;
-import org.apache.olingo.commons.api.domain.ODataValue;
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmBindingTarget;
-import org.apache.olingo.commons.api.edm.EdmComplexType;
-import org.apache.olingo.commons.api.edm.EdmElement;
-import org.apache.olingo.commons.api.edm.EdmEntityContainer;
-import org.apache.olingo.commons.api.edm.EdmEntityType;
-import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
-import org.apache.olingo.commons.api.edm.EdmProperty;
-import org.apache.olingo.commons.api.edm.EdmSchema;
-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.format.ODataFormat;
-import org.apache.olingo.commons.api.serialization.ODataSerializerException;
-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.EdmTypeInfo;
-import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
-import org.apache.olingo.commons.core.serialization.ContextURLParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractODataBinder implements CommonODataBinder {
-
- /**
- * Logger.
- */
- protected static final Logger LOG = LoggerFactory.getLogger(AbstractODataBinder.class);
-
- protected final CommonODataClient<?> client;
-
- protected AbstractODataBinder(final CommonODataClient<?> client) {
- this.client = client;
- }
-
- @Override
- public ODataServiceDocument getODataServiceDocument(final ServiceDocument resource) {
- final ODataServiceDocument serviceDocument = new ODataServiceDocument();
-
- for (ServiceDocumentItem entitySet : resource.getEntitySets()) {
- serviceDocument.getEntitySets().
- put(entitySet.getName(), URIUtils.getURI(resource.getBaseURI(), entitySet.getUrl()));
- }
-
- return serviceDocument;
- }
-
- @Override
- public EntitySet getEntitySet(final ODataEntitySet odataEntitySet) {
- final EntitySet entitySet = new EntitySetImpl();
-
- entitySet.setCount(odataEntitySet.getCount());
-
- final URI next = odataEntitySet.getNext();
- if (next != null) {
- entitySet.setNext(next);
- }
-
- for (ODataEntity entity : odataEntitySet.getEntities()) {
- entitySet.getEntities().add(getEntity(entity));
- }
-
- return entitySet;
- }
-
- protected void links(final ODataLinked odataLinked, final Linked linked) {
- // -------------------------------------------------------------
- // Append navigation links (handling inline entity / entity set as well)
- // -------------------------------------------------------------
- // handle navigation links
- for (ODataLink link : odataLinked.getNavigationLinks()) {
- // append link
- LOG.debug("Append navigation link\n{}", link);
- linked.getNavigationLinks().add(getLink(link));
- }
- // -------------------------------------------------------------
-
- // -------------------------------------------------------------
- // Append association links
- // -------------------------------------------------------------
- for (ODataLink link : odataLinked.getAssociationLinks()) {
- LOG.debug("Append association link\n{}", link);
- linked.getAssociationLinks().add(getLink(link));
- }
- // -------------------------------------------------------------
- }
-
- @Override
- public Entity getEntity(final ODataEntity odataEntity) {
- final Entity entity = new EntityImpl();
-
- entity.setType(odataEntity.getTypeName() == null ? null : odataEntity.getTypeName().toString());
-
- // -------------------------------------------------------------
- // Add edit and self link
- // -------------------------------------------------------------
- final URI odataEditLink = odataEntity.getEditLink();
- if (odataEditLink != null) {
- final LinkImpl editLink = new LinkImpl();
- editLink.setTitle(entity.getType());
- editLink.setHref(odataEditLink.toASCIIString());
- editLink.setRel(Constants.EDIT_LINK_REL);
- entity.setEditLink(editLink);
- }
-
- if (odataEntity.isReadOnly()) {
- final LinkImpl selfLink = new LinkImpl();
- selfLink.setTitle(entity.getType());
- selfLink.setHref(odataEntity.getLink().toASCIIString());
- selfLink.setRel(Constants.SELF_LINK_REL);
- entity.setSelfLink(selfLink);
- }
- // -------------------------------------------------------------
-
- links(odataEntity, entity);
-
- // -------------------------------------------------------------
- // Append edit-media links
- // -------------------------------------------------------------
- for (ODataLink link : odataEntity.getMediaEditLinks()) {
- LOG.debug("Append edit-media link\n{}", link);
- entity.getMediaEditLinks().add(getLink(link));
- }
- // -------------------------------------------------------------
-
- if (odataEntity.isMediaEntity()) {
- entity.setMediaContentSource(odataEntity.getMediaContentSource());
- entity.setMediaContentType(odataEntity.getMediaContentType());
- entity.setMediaETag(odataEntity.getMediaETag());
- }
-
- for (ODataProperty property : odataEntity.getProperties()) {
- entity.getProperties().add(getProperty(property));
- }
-
- return entity;
- }
-
- @Override
- public Link getLink(final ODataLink link) {
- final Link linkResource = new LinkImpl();
- linkResource.setRel(link.getRel());
- linkResource.setTitle(link.getName());
- linkResource.setHref(link.getLink() == null ? null : link.getLink().toASCIIString());
- linkResource.setType(link.getType().toString());
- linkResource.setMediaETag(link.getMediaETag());
-
- if (link instanceof ODataInlineEntity) {
- // append inline entity
- final ODataEntity inlineEntity = ((ODataInlineEntity) link).getEntity();
- LOG.debug("Append in-line entity\n{}", inlineEntity);
-
- linkResource.setInlineEntity(getEntity(inlineEntity));
- } else if (link instanceof ODataInlineEntitySet) {
- // append inline entity set
- final ODataEntitySet InlineEntitySet = ((ODataInlineEntitySet) link).getEntitySet();
- LOG.debug("Append in-line entity set\n{}", InlineEntitySet);
-
- linkResource.setInlineEntitySet(getEntitySet(InlineEntitySet));
- }
-
- return linkResource;
- }
-
- protected Object getValue(final ODataValue value) {
- if (value == null) {
- return null;
- } else if (value.isPrimitive()) {
- return value.asPrimitive().toValue();
- } else if (value.isComplex()) {
- final ODataComplexValue<? extends ODataProperty> _value = value.asComplex();
- List<Property> valueResource = new ArrayList<Property>();
-
- for (final ODataProperty propertyValue : _value) {
- valueResource.add(getProperty(propertyValue));
- }
- return valueResource;
- } else if (value.isCollection()) {
- final ODataCollectionValue<? extends ODataValue> _value = value.asCollection();
- ArrayList<Object> valueResource = new ArrayList<Object>();
-
- for (final ODataValue collectionValue : _value) {
- valueResource.add(getValue(collectionValue));
- }
- return valueResource;
- }
- return null;
- }
-
- protected abstract boolean add(ODataEntitySet entitySet, ODataEntity entity);
-
- @Override
- public ODataEntitySet getODataEntitySet(final ResWrap<EntitySet> resource) {
- if (LOG.isDebugEnabled()) {
- final StringWriter writer = new StringWriter();
- try {
- client.getSerializer(ODataFormat.JSON).write(writer, resource.getPayload());
- } catch (final ODataSerializerException e) {
- }
- writer.flush();
- LOG.debug("EntitySet -> ODataEntitySet:\n{}", writer.toString());
- }
-
- final URI base = resource.getContextURL() == null
- ? resource.getPayload().getBaseURI()
- : ContextURLParser.parse(resource.getContextURL()).getServiceRoot();
-
- final URI next = resource.getPayload().getNext();
-
- final ODataEntitySet entitySet = next == null
- ? client.getObjectFactory().newEntitySet()
- : client.getObjectFactory().newEntitySet(URIUtils.getURI(base, next.toASCIIString()));
-
- if (resource.getPayload().getCount() != null) {
- entitySet.setCount(resource.getPayload().getCount());
- }
-
- for (Entity entityResource : resource.getPayload().getEntities()) {
- add(entitySet, getODataEntity(
- new ResWrap<Entity>(resource.getContextURL(), resource.getMetadataETag(), entityResource)));
- }
-
- return entitySet;
- }
-
- protected void odataNavigationLinks(final EdmType edmType,
- final Linked linked, final ODataLinked odataLinked, final String metadataETag, final URI base) {
-
- for (Link link : linked.getNavigationLinks()) {
- final String href = link.getHref();
- final String title = link.getTitle();
- final Entity inlineEntity = link.getInlineEntity();
- final EntitySet inlineEntitySet = link.getInlineEntitySet();
- if (inlineEntity == null && inlineEntitySet == null) {
- ODataLinkType linkType = null;
- if (edmType instanceof EdmStructuredType) {
- final EdmNavigationProperty navProp = ((EdmStructuredType) edmType).getNavigationProperty(title);
- if (navProp != null) {
- linkType = navProp.isCollection() ?
- ODataLinkType.ENTITY_SET_NAVIGATION :
- ODataLinkType.ENTITY_NAVIGATION;
- }
- }
- if (linkType == null) {
- linkType = link.getType() == null ?
- ODataLinkType.ENTITY_NAVIGATION :
- ODataLinkType.fromString(client.getServiceVersion(), link.getRel(), link.getType());
- }
-
- odataLinked.addLink(linkType == ODataLinkType.ENTITY_NAVIGATION ?
- client.getObjectFactory().newEntityNavigationLink(title, URIUtils.getURI(base, href)) :
- client.getObjectFactory().newEntitySetNavigationLink(title, URIUtils.getURI(base, href)));
- } else if (inlineEntity != null) {
- odataLinked.addLink(createODataInlineEntity(inlineEntity,
- URIUtils.getURI(base, href), title, metadataETag));
- } else {
- odataLinked.addLink(createODataInlineEntitySet(inlineEntitySet,
- URIUtils.getURI(base, href), title, metadataETag));
- }
- }
- }
-
- private ODataInlineEntity createODataInlineEntity(final Entity inlineEntity,
- final URI uri, final String title, final String metadataETag) {
- return new ODataInlineEntity(client.getServiceVersion(), uri, ODataLinkType.ENTITY_NAVIGATION, title,
- getODataEntity(new ResWrap<Entity>(
- inlineEntity.getBaseURI() == null ? null : inlineEntity.getBaseURI(), metadataETag,
- inlineEntity)));
- }
-
- private ODataInlineEntitySet createODataInlineEntitySet(final EntitySet inlineEntitySet,
- final URI uri, final String title, final String metadataETag) {
- return new ODataInlineEntitySet(client.getServiceVersion(), uri, ODataLinkType.ENTITY_SET_NAVIGATION, title,
- getODataEntitySet(new ResWrap<EntitySet>(
- inlineEntitySet.getBaseURI() == null ? null : inlineEntitySet.getBaseURI(), metadataETag,
- inlineEntitySet)));
- }
-
- private EdmEntityType findEntityType(
- final String entitySetOrSingletonOrType, final EdmEntityContainer container) {
-
- EdmEntityType type = null;
-
- final String firstToken = StringUtils.substringBefore(entitySetOrSingletonOrType, "/");
- EdmBindingTarget bindingTarget = container.getEntitySet(firstToken);
- if (bindingTarget == null) {
- bindingTarget = container.getSingleton(firstToken);
- }
- if (bindingTarget != null) {
- type = bindingTarget.getEntityType();
- }
-
- if (entitySetOrSingletonOrType.indexOf('/') != -1) {
- final String[] splitted = entitySetOrSingletonOrType.split("/");
- if (splitted.length > 1) {
- for (int i = 1; i < splitted.length && type != null; i++) {
- final EdmNavigationProperty navProp = type.getNavigationProperty(splitted[i]);
- if (navProp == null) {
- type = null;
- } else {
- type = navProp.getType();
- }
- }
- }
- }
-
- return type;
- }
-
- /**
- * Infer type name from various sources of information including Edm and context URL, if available.
- *
- * @param candidateTypeName type name as provided by the service
- * @param contextURL context URL
- * @param metadataETag metadata ETag
- * @return Edm type information
- */
- private EdmType findType(final String candidateTypeName, final ContextURL contextURL, final String metadataETag) {
- EdmType type = null;
-
- if (client instanceof EdmEnabledODataClient) {
- final Edm edm = ((EdmEnabledODataClient) client).getEdm(metadataETag);
- if (StringUtils.isNotBlank(candidateTypeName)) {
- type = edm.getEntityType(new FullQualifiedName(candidateTypeName));
- }
- if (type == null && contextURL != null) {
- if (contextURL.getDerivedEntity() == null) {
- for (EdmSchema schema : edm.getSchemas()) {
- final EdmEntityContainer container = schema.getEntityContainer();
- if (container != null) {
- final EdmEntityType entityType = findEntityType(contextURL.getEntitySetOrSingletonOrType(), container);
-
- if (entityType != null) {
- if (contextURL.getNavOrPropertyPath() == null) {
- type = entityType;
- } else {
- final EdmNavigationProperty navProp =
- entityType.getNavigationProperty(contextURL.getNavOrPropertyPath());
-
- type = navProp == null
- ? entityType
- : navProp.getType();
- }
- }
- }
- }
- if (type == null) {
- type = new EdmTypeInfo.Builder().setEdm(edm).
- setTypeExpression(contextURL.getEntitySetOrSingletonOrType()).build().getType();
- }
- } else {
- type = edm.getEntityType(new FullQualifiedName(contextURL.getDerivedEntity()));
- }
- }
- }
-
- return type;
- }
-
- @Override
- public ODataEntity getODataEntity(final ResWrap<Entity> resource) {
- if (LOG.isDebugEnabled()) {
- final StringWriter writer = new StringWriter();
- try {
- client.getSerializer(ODataFormat.JSON).write(writer, resource.getPayload());
- } catch (final ODataSerializerException e) {
- }
- writer.flush();
- LOG.debug("EntityResource -> ODataEntity:\n{}", writer.toString());
- }
-
- final ContextURL contextURL = ContextURLParser.parse(resource.getContextURL());
- final URI base = resource.getContextURL() == null
- ? resource.getPayload().getBaseURI()
- : contextURL.getServiceRoot();
- final EdmType edmType = findType(resource.getPayload().getType(), contextURL, resource.getMetadataETag());
- FullQualifiedName typeName = null;
- if (resource.getPayload().getType() == null) {
- if (edmType != null) {
- typeName = edmType.getFullQualifiedName();
- }
- } else {
- typeName = new FullQualifiedName(resource.getPayload().getType());
- }
-
- final ODataEntity entity = resource.getPayload().getSelfLink() == null
- ? client.getObjectFactory().newEntity(typeName)
- : client.getObjectFactory().newEntity(typeName,
- URIUtils.getURI(base, resource.getPayload().getSelfLink().getHref()));
-
- if (StringUtils.isNotBlank(resource.getPayload().getETag())) {
- entity.setETag(resource.getPayload().getETag());
- }
-
- if (resource.getPayload().getEditLink() != null) {
- entity.setEditLink(URIUtils.getURI(base, resource.getPayload().getEditLink().getHref()));
- }
-
- for (Link link : resource.getPayload().getAssociationLinks()) {
- entity.addLink(client.getObjectFactory().
- newAssociationLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
- }
-
- odataNavigationLinks(edmType, resource.getPayload(), entity, resource.getMetadataETag(), base);
-
- for (Link link : resource.getPayload().getMediaEditLinks()) {
- entity.addLink(client.getObjectFactory().
- newMediaEditLink(link.getTitle(), URIUtils.getURI(base, link.getHref())));
- }
-
- for (ODataOperation operation : resource.getPayload().getOperations()) {
- operation.setTarget(URIUtils.getURI(base, operation.getTarget()));
- entity.getOperations().add(operation);
- }
-
- if (resource.getPayload().isMediaEntity()) {
- entity.setMediaEntity(true);
- entity.setMediaContentSource(URIUtils.getURI(base, resource.getPayload().getMediaContentSource()));
- entity.setMediaContentType(resource.getPayload().getMediaContentType());
- entity.setMediaETag(resource.getPayload().getMediaETag());
- }
-
- for (final Property property : resource.getPayload().getProperties()) {
- EdmType propertyType = null;
- if (edmType instanceof EdmEntityType) {
- final EdmElement edmProperty = ((EdmEntityType) edmType).getProperty(property.getName());
- if (edmProperty != null) {
- propertyType = edmProperty.getType();
- if (edmProperty instanceof EdmNavigationProperty) {
- final String propertyTypeName = propertyType.getFullQualifiedName().getFullQualifiedNameAsString();
- entity.addLink(createLinkFromNavigationProperty(property, propertyTypeName));
- break;
- }
- }
- }
- add(entity, getODataProperty(propertyType, property));
- }
-
- return entity;
- }
-
- private ODataLink createLinkFromNavigationProperty(final Property property, final String propertyTypeName) {
- if (property.isCollection()) {
- EntitySet inlineEntitySet = new EntitySetImpl();
- for (final Object inlined : property.asCollection()) {
- Entity inlineEntity = new EntityImpl();
- inlineEntity.setType(propertyTypeName);
- inlineEntity.getProperties().addAll(
- inlined instanceof LinkedComplexValue ? ((LinkedComplexValue) inlined).getValue() :
- inlined instanceof Property ? ((Property) inlined).asComplex() : null);
- inlineEntitySet.getEntities().add(inlineEntity);
- }
- return createODataInlineEntitySet(inlineEntitySet, null, property.getName(), null);
- } else {
- Entity inlineEntity = new EntityImpl();
- inlineEntity.setType(propertyTypeName);
- inlineEntity.getProperties().addAll(
- property.isLinkedComplex() ? property.asLinkedComplex().getValue() : property.asComplex());
- return createODataInlineEntity(inlineEntity, null, property.getName(), null);
- }
- }
-
- protected EdmTypeInfo buildTypeInfo(final ContextURL contextURL, final String metadataETag,
- final String propertyName, final String propertyType) {
-
- FullQualifiedName typeName = null;
- final EdmType type = findType(null, contextURL, metadataETag);
- if (type instanceof EdmStructuredType) {
- final EdmProperty edmProperty = ((EdmStructuredType) type).getStructuralProperty(propertyName);
- if (edmProperty != null) {
- typeName = edmProperty.getType().getFullQualifiedName();
- }
- }
- if (typeName == null && type != null) {
- typeName = type.getFullQualifiedName();
- }
-
- return buildTypeInfo(typeName, propertyType);
- }
-
- protected EdmTypeInfo buildTypeInfo(final FullQualifiedName typeName, final String propertyType) {
- EdmTypeInfo typeInfo = null;
- if (typeName == null) {
- if (propertyType != null) {
- typeInfo = new EdmTypeInfo.Builder().setTypeExpression(propertyType).build();
- }
- } else {
- if (propertyType == null || propertyType.equals(EdmPrimitiveTypeKind.String.getFullQualifiedName().toString())) {
- typeInfo = new EdmTypeInfo.Builder().setTypeExpression(typeName.toString()).build();
- } else {
- typeInfo = new EdmTypeInfo.Builder().setTypeExpression(propertyType).build();
- }
- }
- return typeInfo;
- }
-
- protected abstract ODataProperty getODataProperty(EdmType type, Property resource);
-
- protected ODataValue getODataValue(final FullQualifiedName type,
- final Valuable valuable, final URI contextURL, final String metadataETag) {
-
- ODataValue value = null;
- if (valuable.isGeospatial()) {
- value = client.getObjectFactory().newPrimitiveValueBuilder().
- setValue(valuable.asGeospatial()).
- setType(type == null
- || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(type)
- || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(type)
- ? valuable.asGeospatial().getEdmPrimitiveTypeKind()
- : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).
- build();
- } else if (valuable.isPrimitive() || valuable.getValueType() == null) {
- // fixes non-string values treated as string when no type information is available at de-serialization level
- if (type != null && !EdmPrimitiveTypeKind.String.getFullQualifiedName().equals(type)
- && EdmPrimitiveType.EDM_NAMESPACE.equals(type.getNamespace())
- && valuable.asPrimitive() instanceof String) {
-
- final EdmPrimitiveType primitiveType =
- EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.valueOf(type.getName()));
- final Class<?> returnType = primitiveType.getDefaultType().isAssignableFrom(Calendar.class)
- ? Timestamp.class : primitiveType.getDefaultType();
- try {
- valuable.setValue(valuable.getValueType(),
- primitiveType.valueOfString(valuable.asPrimitive().toString(),
- null, null, Constants.DEFAULT_PRECISION, Constants.DEFAULT_SCALE, null,
- returnType));
- } catch (EdmPrimitiveTypeException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- value = client.getObjectFactory().newPrimitiveValueBuilder().
- setValue(valuable.asPrimitive()).
- setType(type == null || !EdmPrimitiveType.EDM_NAMESPACE.equals(type.getNamespace())
- ? null
- : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), type.toString())).
- build();
- } else if (valuable.isComplex()) {
- final ODataComplexValue<ODataProperty> cValue =
- (ODataComplexValue<ODataProperty>) client.getObjectFactory().
- newComplexValue(type == null ? null : type.toString());
-
- if (!valuable.isNull()) {
- EdmComplexType edmType = null;
- if (client instanceof EdmEnabledODataClient && type != null) {
- edmType = ((EdmEnabledODataClient) client).getEdm(metadataETag).getComplexType(type);
- }
-
- for (Property property : valuable.asComplex()) {
- EdmType edmPropertyType = null;
- if (edmType != null) {
- final EdmElement edmProp = edmType.getProperty(property.getName());
- if (edmProp != null) {
- edmPropertyType = edmProp.getType();
- }
- }
-
- cValue.add(getODataProperty(edmPropertyType, property));
- }
- }
-
- value = cValue;
- } else if (valuable.isCollection()) {
- value = client.getObjectFactory().newCollectionValue(type == null ? null : "Collection(" + type.toString() + ")");
-
- for (Object _value : valuable.asCollection()) {
- final Property fake = new PropertyImpl();
- fake.setValue(valuable.getValueType().getBaseType(), _value);
- value.asCollection().add(getODataValue(type, fake, contextURL, metadataETag));
- }
- }
-
- return value;
- }
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/68b14ffe/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataReader.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataReader.java
deleted file mode 100644
index 876581d..0000000
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/AbstractODataReader.java
+++ /dev/null
@@ -1,157 +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.client.core.serialization;
-
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Map;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.olingo.client.api.CommonODataClient;
-import org.apache.olingo.client.api.data.ServiceDocument;
-import org.apache.olingo.client.api.domain.ODataEntitySetIterator;
-import org.apache.olingo.client.api.edm.xml.Schema;
-import org.apache.olingo.client.api.edm.xml.XMLMetadata;
-import org.apache.olingo.client.api.serialization.CommonODataReader;
-import org.apache.olingo.client.core.edm.EdmClientImpl;
-import org.apache.olingo.commons.api.data.Entity;
-import org.apache.olingo.commons.api.data.EntitySet;
-import org.apache.olingo.commons.api.data.Property;
-import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataProperty;
-import org.apache.olingo.commons.api.domain.ODataError;
-import org.apache.olingo.commons.api.domain.ODataServiceDocument;
-import org.apache.olingo.commons.api.domain.ODataValue;
-import org.apache.olingo.commons.api.edm.Edm;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
-import org.apache.olingo.commons.api.format.ODataFormat;
-import org.apache.olingo.commons.api.serialization.ODataDeserializerException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractODataReader implements CommonODataReader {
-
- /**
- * Logger.
- */
- protected static final Logger LOG = LoggerFactory.getLogger(AbstractODataReader.class);
-
- protected final CommonODataClient<?> client;
-
- protected AbstractODataReader(final CommonODataClient<?> client) {
- this.client = client;
- }
-
- @Override
- public Edm readMetadata(final InputStream input) {
- return readMetadata(client.getDeserializer(ODataFormat.XML).toMetadata(input).getSchemaByNsOrAlias());
- }
-
- @Override
- public Edm readMetadata(final Map<String, Schema> xmlSchemas) {
- return new EdmClientImpl(client.getServiceVersion(), xmlSchemas);
- }
-
- @Override
- public ODataServiceDocument readServiceDocument(final InputStream input, final ODataFormat format)
- throws ODataDeserializerException {
- return client.getBinder().getODataServiceDocument(
- client.getDeserializer(format).toServiceDocument(input).getPayload());
- }
-
- @Override
- public ODataError readError(final InputStream inputStream, final ODataFormat format )
- throws ODataDeserializerException {
- return client.getDeserializer(format).toError(inputStream);
- }
-
- @Override
- public <T> ResWrap<T> read(final InputStream src, final String format, final Class<T> reference)
- throws ODataDeserializerException {
- ResWrap<T> res;
-
- try {
- if (ODataEntitySetIterator.class.isAssignableFrom(reference)) {
- res = new ResWrap<T>(
- (URI) null,
- null,
- reference.cast(new ODataEntitySetIterator<ODataEntitySet, ODataEntity>(
- client, src, ODataFormat.fromString(format))));
- } else if (ODataEntitySet.class.isAssignableFrom(reference)) {
- final ResWrap<EntitySet> resource = client.getDeserializer(ODataFormat.fromString(format))
- .toEntitySet(src);
- res = new ResWrap<T>(
- resource.getContextURL(),
- resource.getMetadataETag(),
- reference.cast(client.getBinder().getODataEntitySet(resource)));
- } else if (ODataEntity.class.isAssignableFrom(reference)) {
- final ResWrap<Entity> container = client.getDeserializer(ODataFormat.fromString(format)).toEntity(src);
- res = new ResWrap<T>(
- container.getContextURL(),
- container.getMetadataETag(),
- reference.cast(client.getBinder().getODataEntity(container)));
- } else if (ODataProperty.class.isAssignableFrom(reference)) {
- final ResWrap<Property> container = client.getDeserializer(ODataFormat.fromString(format)).toProperty(src);
- res = new ResWrap<T>(
- container.getContextURL(),
- container.getMetadataETag(),
- reference.cast(client.getBinder().getODataProperty(container)));
- } else if (ODataValue.class.isAssignableFrom(reference)) {
- res = new ResWrap<T>(
- (URI) null,
- null,
- reference.cast(client.getObjectFactory().newPrimitiveValueBuilder().
- setType(ODataFormat.fromString(format) == ODataFormat.TEXT_PLAIN
- ? EdmPrimitiveTypeKind.String : EdmPrimitiveTypeKind.Stream).
- setValue(IOUtils.toString(src)) // TODO: set correct value
- .build()));
- } else if (XMLMetadata.class.isAssignableFrom(reference)) {
- res = new ResWrap<T>(
- (URI) null,
- null,
- reference.cast(readMetadata(src)));
- } else if (ODataServiceDocument.class.isAssignableFrom(reference)) {
- final ResWrap<ServiceDocument> resource =
- client.getDeserializer(ODataFormat.fromString(format)).toServiceDocument(src);
- res = new ResWrap<T>(
- resource.getContextURL(),
- resource.getMetadataETag(),
- reference.cast(client.getBinder().getODataServiceDocument(resource.getPayload())));
- } else if (ODataError.class.isAssignableFrom(reference)) {
- res = new ResWrap<T>(
- (URI) null,
- null,
- reference.cast(readError(src, ODataFormat.fromString(format))));
- } else {
- throw new IllegalArgumentException("Invalid reference type " + reference);
- }
- } catch (Exception e) {
- LOG.warn("Cast error", e);
- res = null;
- } finally {
- if (!ODataEntitySetIterator.class.isAssignableFrom(reference)) {
- IOUtils.closeQuietly(src);
- }
- }
-
- return res;
- }
-}