You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by fm...@apache.org on 2014/04/29 10:33:36 UTC
[1/2] git commit: provided complex type BATCH update + removed aalto
transitive dependency exclusion
Repository: olingo-odata4
Updated Branches:
refs/heads/master e8ac1c749 -> 639941c00
provided complex type BATCH update + removed aalto transitive dependency exclusion
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/f79db0b3
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/f79db0b3
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/f79db0b3
Branch: refs/heads/master
Commit: f79db0b3c7724a17349c265de55f2caf1372d77d
Parents: 0b05798
Author: fmartelli <fa...@gmail.com>
Authored: Tue Apr 29 10:12:22 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Apr 29 10:12:22 2014 +0200
----------------------------------------------------------------------
fit/pom.xml | 14 ---
.../org/apache/olingo/fit/AbstractServices.java | 113 ++++++++++++-------
.../java/org/apache/olingo/fit/V3OpenType.java | 3 +-
.../java/org/apache/olingo/fit/V4OpenType.java | 2 +-
.../apache/olingo/fit/metadata/Metadata.java | 50 +++++---
.../olingo/fit/utils/AbstractUtilities.java | 72 ++++++------
.../org/apache/olingo/fit/utils/Commons.java | 6 +-
.../apache/olingo/fit/utils/ConstantKey.java | 3 +
.../org/apache/olingo/fit/utils/Constants.java | 12 ++
.../org/apache/olingo/fit/utils/XMLElement.java | 5 +-
.../olingo/fit/utils/XMLEventReaderWrapper.java | 29 ++---
.../apache/olingo/fit/utils/XMLUtilities.java | 73 ++++++------
fit/src/main/resources/V30/openTypeMetadata.xml | 2 +-
.../client/core/it/v4/PropertyTestITCase.java | 57 +++++++++-
14 files changed, 270 insertions(+), 171 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/pom.xml
----------------------------------------------------------------------
diff --git a/fit/pom.xml b/fit/pom.xml
index b7e4043..699541c 100644
--- a/fit/pom.xml
+++ b/fit/pom.xml
@@ -44,22 +44,8 @@
<groupId>org.apache.olingo</groupId>
<artifactId>olingo-commons-core</artifactId>
<version>${project.version}</version>
- <exclusions>
- <exclusion>
- <groupId>com.fasterxml</groupId>
- <artifactId>aalto-xml</artifactId>
- </exclusion>
- </exclusions>
</dependency>
- <!-- Stax -->
- <dependency>
- <groupId>stax</groupId>
- <artifactId>stax-api</artifactId>
- <version>1.0.1</version>
- </dependency>
- <!-- /Stax -->
-
<!-- REST services CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index a3a414d..021de16 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -67,6 +67,7 @@ import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.olingo.commons.api.data.ComplexValue;
import org.apache.olingo.commons.api.data.ResWrap;
import org.apache.olingo.commons.api.data.Entry;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -411,7 +412,7 @@ public abstract class AbstractServices {
} else {
final ResWrap<JSONEntryImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
new TypeReference<JSONEntryImpl>() {
- });
+ });
entryChanges = dataBinder.toAtomEntry(jcont.getPayload());
}
@@ -593,8 +594,8 @@ public abstract class AbstractServices {
} else {
final ResWrap<JSONEntryImpl> jcontainer =
mapper.readValue(IOUtils.toInputStream(entity, Constants.ENCODING),
- new TypeReference<JSONEntryImpl>() {
- });
+ new TypeReference<JSONEntryImpl>() {
+ });
entry = dataBinder.toAtomEntry(jcontainer.getPayload());
@@ -621,7 +622,7 @@ public abstract class AbstractServices {
ResWrap<AtomEntryImpl> result = atomDeserializer.read(serialization, AtomEntryImpl.class);
result = new ResWrap<AtomEntryImpl>(
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
- + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
+ + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
null, result.getPayload());
final String path = Commons.getEntityBasePath(entitySetName, entityKey);
@@ -684,13 +685,13 @@ public abstract class AbstractServices {
replaceAll("\"Salary\":[0-9]*,", "\"Salary\":0,").
replaceAll("\"Title\":\".*\"", "\"Title\":\"[Sacked]\"").
replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>.*\\</d:Salary\\>",
- "<d:Salary m:type=\"Edm.Int32\">0</d:Salary>").
+ "<d:Salary m:type=\"Edm.Int32\">0</d:Salary>").
replaceAll("\\<d:Title\\>.*\\</d:Title\\>", "<d:Title>[Sacked]</d:Title>");
final FSManager fsManager = FSManager.instance(version);
fsManager.putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING),
fsManager.getAbsolutePath(Commons.getEntityBasePath("Person", entityId) + Constants.get(version,
- ConstantKey.ENTITY), utils.getKey()));
+ ConstantKey.ENTITY), utils.getKey()));
return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT);
} catch (Exception e) {
@@ -742,9 +743,9 @@ public abstract class AbstractServices {
final Long newSalary = Long.valueOf(salaryMatcher.group(1)) + n;
newContent = newContent.
replaceAll("\"Salary\":" + salaryMatcher.group(1) + ",",
- "\"Salary\":" + newSalary + ",").
+ "\"Salary\":" + newSalary + ",").
replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>" + salaryMatcher.group(1) + "</d:Salary\\>",
- "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>");
+ "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>");
}
FSManager.instance(version).putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING),
@@ -893,7 +894,7 @@ public abstract class AbstractServices {
} else {
mapper.writeValue(
writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(),
- dataBinder.toJSONFeed(container.getPayload())));
+ dataBinder.toJSONFeed(container.getPayload())));
}
return xml.createResponse(
@@ -1135,6 +1136,7 @@ public abstract class AbstractServices {
private Response replaceProperty(
final String location,
final String accept,
+ final String contentType,
final String prefer,
final String entitySetName,
final String entityId,
@@ -1143,31 +1145,62 @@ public abstract class AbstractServices {
final String changes,
final boolean justValue) {
+ // if the given path is not about any link then search for property
+ LOG.info("Retrieve property {}", path);
+
try {
- Accept acceptType = null;
- if (StringUtils.isNotBlank(format)) {
- acceptType = Accept.valueOf(format.toUpperCase());
- } else if (StringUtils.isNotBlank(accept)) {
- acceptType = Accept.parse(accept, version, null);
+ final FSManager fsManager = FSManager.instance(version);
+
+ final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
+ final ResWrap<AtomEntryImpl> container = xml.readContainerEntry(Accept.ATOM,
+ fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
+
+ final AtomEntryImpl entry = container.getPayload();
+
+ Property toBeReplaced = null;
+ for (String element : path.split("/")) {
+ if (toBeReplaced == null) {
+ toBeReplaced = entry.getProperty(element.trim());
+ } else {
+ ComplexValue value = toBeReplaced.getValue().asComplex();
+ for (Property field : value.get()) {
+ if (field.getName().equalsIgnoreCase(element)) {
+ toBeReplaced = field;
+ }
+ }
+ }
}
- // if the given path is not about any link then search for property
- LOG.info("Retrieve property {}", path);
+ if (toBeReplaced == null) {
+ throw new NotFoundException();
+ }
- final AbstractUtilities utils = getUtilities(acceptType);
+ if (justValue) {
+ // just for primitive values
+ toBeReplaced.setValue(new PrimitiveValueImpl(changes));
+ } else {
+ final AtomPropertyImpl pchanges = xml.readProperty(
+ Accept.parse(contentType, version),
+ IOUtils.toInputStream(changes, Constants.ENCODING),
+ entry.getType());
- utils.replaceProperty(
- entitySetName,
- entityId,
- IOUtils.toInputStream(changes, Constants.ENCODING),
- Arrays.asList(path.split("/")),
- acceptType,
- justValue);
+ toBeReplaced.setValue(pchanges.getValue());
+ }
+
+ fsManager.putInMemory(xml.writeEntry(Accept.ATOM, container),
+ fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
final Response response;
if ("return-content".equalsIgnoreCase(prefer)) {
response = getEntityInternal(location, accept, entitySetName, entityId, format, null, null, false);
} else {
+ Accept acceptType = null;
+ if (StringUtils.isNotBlank(format)) {
+ acceptType = Accept.valueOf(format.toUpperCase());
+ } else if (StringUtils.isNotBlank(accept)) {
+ acceptType = Accept.parse(accept, version, null);
+ }
+
response = xml.createResponse(null, null, null, acceptType, Response.Status.NO_CONTENT);
}
@@ -1242,6 +1275,7 @@ public abstract class AbstractServices {
public Response replacePropertyValue(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+ @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@@ -1250,7 +1284,7 @@ public abstract class AbstractServices {
final String changes) {
return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
- accept, prefer, entitySetName, entityId, path, format, changes, true);
+ accept, contentType, prefer, entitySetName, entityId, path, format, changes, true);
}
/**
@@ -1269,6 +1303,7 @@ public abstract class AbstractServices {
public Response mergeProperty(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+ @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@@ -1277,7 +1312,7 @@ public abstract class AbstractServices {
final String changes) {
return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
- accept, prefer, entitySetName, entityId, path, format, changes, false);
+ accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
}
/**
@@ -1296,6 +1331,7 @@ public abstract class AbstractServices {
public Response patchProperty(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+ @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@@ -1304,7 +1340,7 @@ public abstract class AbstractServices {
final String changes) {
return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
- accept, prefer, entitySetName, entityId, path, format, changes, false);
+ accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
}
@PUT
@@ -1363,6 +1399,7 @@ public abstract class AbstractServices {
public Response replaceProperty(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+ @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
@PathParam("entitySetName") String entitySetName,
@PathParam("entityId") String entityId,
@@ -1374,7 +1411,7 @@ public abstract class AbstractServices {
return replaceMediaProperty(prefer, entitySetName, entityId, path, changes);
} else {
return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
- accept, prefer, entitySetName, entityId, path, format, changes, false);
+ accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
}
}
@@ -1518,8 +1555,8 @@ public abstract class AbstractServices {
mapper.writeValue(
writer,
new JSONFeedContainer(container.getContextURL(),
- container.getMetadataETag(),
- dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
+ container.getMetadataETag(),
+ dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
}
} else {
final ResWrap<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
@@ -1531,8 +1568,8 @@ public abstract class AbstractServices {
mapper.writeValue(
writer,
new JSONEntryContainer(container.getContextURL(),
- container.getMetadataETag(),
- dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
+ container.getMetadataETag(),
+ dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
}
}
@@ -1602,9 +1639,9 @@ public abstract class AbstractServices {
final ResWrap<AtomPropertyImpl> container = new ResWrap<AtomPropertyImpl>(
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
- + (version.compareTo(ODataServiceVersion.V40) >= 0
- ? entitySetName + "(" + entityId + ")/" + path
- : property.getType())),
+ + (version.compareTo(ODataServiceVersion.V40) >= 0
+ ? entitySetName + "(" + entityId + ")/" + path
+ : property.getType())),
entryContainer.getMetadataETag(),
property);
@@ -1612,9 +1649,9 @@ public abstract class AbstractServices {
null,
searchForValue
? IOUtils.toInputStream(
- container.getPayload().getValue() == null || container.getPayload().getValue().isNull()
- ? StringUtils.EMPTY
- : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING)
+ container.getPayload().getValue() == null || container.getPayload().getValue().isNull()
+ ? StringUtils.EMPTY
+ : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING)
: utils.writeProperty(acceptType, container),
Commons.getETag(Commons.getEntityBasePath(entitySetName, entityId), version),
acceptType);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java b/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
index 43e1201..32e0073 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
@@ -60,9 +60,8 @@ public class V3OpenType {
public V3OpenType() throws Exception {
this.openMetadata = new Metadata(FSManager.instance(ODataServiceVersion.V30).
readFile("openType" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V30, ConstantKey.METADATA)),
- Accept.XML));
+ Accept.XML), ODataServiceVersion.V30);
this.services = new V3Services() {
-
@Override
protected Metadata getMetadataObj() {
return openMetadata;
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java b/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
index c9690f4..7eb99d9 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
@@ -56,7 +56,7 @@ public class V4OpenType {
public V4OpenType() throws Exception {
this.openMetadata = new Metadata(FSManager.instance(ODataServiceVersion.V40).
readFile("openType" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V40, ConstantKey.METADATA)),
- Accept.XML));
+ Accept.XML), ODataServiceVersion.V40);
this.services = new V4Services() {
@Override
protected Metadata getMetadataObj() {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java b/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
index ebd599b..846a86b 100644
--- a/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
+++ b/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
@@ -31,6 +31,9 @@ import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.fit.utils.ConstantKey;
+import org.apache.olingo.fit.utils.Constants;
import org.codehaus.plexus.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,21 +45,26 @@ public class Metadata extends AbstractMetadataElement {
*/
protected static final Logger LOG = LoggerFactory.getLogger(Metadata.class);
+ protected final ODataServiceVersion version;
+
private final Map<String, Schema> schemas;
- public Metadata(final InputStream is) {
+ private final String DEF_NS;
+
+ public Metadata(final InputStream is, final ODataServiceVersion version) {
+ this.version = version;
+ this.DEF_NS = Constants.get(version, ConstantKey.EDM_NS);
this.schemas = new HashMap<String, Schema>();
try {
final XMLInputFactory ifactory = XMLInputFactory.newInstance();
- ifactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
- final XMLEventReader reader = ifactory.createXMLEventReader(is, "UTF-8");
+ final XMLEventReader reader = ifactory.createXMLEventReader(is, org.apache.olingo.commons.api.Constants.UTF8);
try {
while (reader.hasNext()) {
final XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Schema"))) {
+ if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Schema"))) {
final Schema schema = getSchema(event.asStartElement(), reader);
schemas.put(schema.getNamespace(), schema);
}
@@ -175,14 +183,15 @@ public class Metadata extends AbstractMetadataElement {
while (!completed && reader.hasNext()) {
XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("EntityType"))
- || event.isStartElement() && event.asStartElement().getName().equals(new QName("ComplexType"))) {
+ if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "EntityType"))
+ || event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "ComplexType"))) {
final EntityType entityType = getEntityType(event.asStartElement(), reader);
schema.addEntityType(entityType.getName(), entityType);
- } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("EntityContainer"))) {
+ } else if (event.isStartElement()
+ && event.asStartElement().getName().equals(new QName(DEF_NS, "EntityContainer"))) {
final org.apache.olingo.fit.metadata.Container container = getContainer(event.asStartElement(), reader);
schema.addContainer(container.getName(), container);
- } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Association"))) {
+ } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Association"))) {
// just for V3
final Association association = getAssociation(event.asStartElement(), reader);
schema.addAssociation(association.getName(), association);
@@ -205,11 +214,12 @@ public class Metadata extends AbstractMetadataElement {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()
- && (event.asStartElement().getName().equals(new QName("EntitySet"))
- || event.asStartElement().getName().equals(new QName("Singleton")))) {
+ && (event.asStartElement().getName().equals(new QName(DEF_NS, "EntitySet"))
+ || event.asStartElement().getName().equals(new QName(DEF_NS, "Singleton")))) {
final EntitySet entitySet = getEntitySet(event.asStartElement(), reader);
container.addEntitySet(entitySet.getName(), entitySet);
- } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("AssociationSet"))) {
+ } else if (event.isStartElement()
+ && event.asStartElement().getName().equals(new QName(DEF_NS, "AssociationSet"))) {
// just for V3
final AssociationSet associationSet = getAssociationSet(event.asStartElement(), reader);
container.addAssociationSet(associationSet.getAssociation(), associationSet);
@@ -230,10 +240,11 @@ public class Metadata extends AbstractMetadataElement {
while (!completed && reader.hasNext()) {
XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("End"))) {
+ if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "End"))) {
final String role = event.asStartElement().getAttributeByName(new QName("Role")).getValue();
final String type = event.asStartElement().getAttributeByName(new QName("Type")).getValue();
- final String multiplicity = event.asStartElement().getAttributeByName(new QName("Multiplicity")).getValue();
+ final String multiplicity =
+ event.asStartElement().getAttributeByName(new QName("Multiplicity")).getValue();
association.addRole(role, type, multiplicity);
} else if (event.isEndElement() && event.asEndElement().getName().equals(start.getName())) {
completed = true;
@@ -254,7 +265,7 @@ public class Metadata extends AbstractMetadataElement {
while (!completed && reader.hasNext()) {
XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("End"))) {
+ if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "End"))) {
final String role = event.asStartElement().getAttributeByName(new QName("Role")).getValue();
final String entitySet = event.asStartElement().getAttributeByName(new QName("EntitySet")).getValue();
associationSet.addRole(role, entitySet);
@@ -274,10 +285,11 @@ public class Metadata extends AbstractMetadataElement {
while (!completed && reader.hasNext()) {
XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Property"))) {
+ if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Property"))) {
final org.apache.olingo.fit.metadata.Property property = getProperty(event.asStartElement());
entityType.addProperty(property.getName(), property);
- } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("NavigationProperty"))) {
+ } else if (event.isStartElement()
+ && event.asStartElement().getName().equals(new QName(DEF_NS, "NavigationProperty"))) {
final NavigationProperty property = getNavigationProperty(event.asStartElement());
entityType.addNavigationProperty(property.getName(), property);
} else if (event.isEndElement() && event.asEndElement().getName().equals(start.getName())) {
@@ -302,7 +314,8 @@ public class Metadata extends AbstractMetadataElement {
}
private NavigationProperty getNavigationProperty(final StartElement start) throws XMLStreamException {
- final NavigationProperty property = new NavigationProperty(start.getAttributeByName(new QName("Name")).getValue());
+ final NavigationProperty property =
+ new NavigationProperty(start.getAttributeByName(new QName("Name")).getValue());
final Attribute type = start.getAttributeByName(new QName("Type"));
if (type != null) {
@@ -340,7 +353,8 @@ public class Metadata extends AbstractMetadataElement {
while (!completed && reader.hasNext()) {
XMLEvent event = reader.nextEvent();
- if (event.isStartElement() && event.asStartElement().getName().equals(new QName("NavigationPropertyBinding"))) {
+ if (event.isStartElement()
+ && event.asStartElement().getName().equals(new QName(DEF_NS, "NavigationPropertyBinding"))) {
final String path = event.asStartElement().getAttributeByName(new QName("Path")).getValue();
final String target = event.asStartElement().getAttributeByName(new QName("Target")).getValue();
entitySet.addBinding(path, target);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
index c017186..bf1e4e3 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
@@ -26,7 +26,6 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
-import java.net.URI;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Collection;
@@ -551,28 +550,35 @@ public abstract class AbstractUtilities {
} else {
mapper.writeValue(
writer, new JSONFeedContainer(container.getContextURL(),
- container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
+ container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
- public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
+ public ResWrap<AtomEntryImpl> readContainerEntry(final Accept accept, final InputStream entity)
throws XMLStreamException, IOException {
-
- final AtomEntryImpl entry;
+ final ResWrap<AtomEntryImpl> container;
if (accept == Accept.ATOM || accept == Accept.XML) {
- final ResWrap<AtomEntryImpl> container = atomDeserializer.read(entity, AtomEntryImpl.class);
- entry = container.getPayload();
+ container = atomDeserializer.read(entity, AtomEntryImpl.class);
} else {
- final ResWrap<JSONEntryImpl> container =
+ final ResWrap<JSONEntryImpl> jcontainer =
mapper.readValue(entity, new TypeReference<JSONEntryImpl>() {
- });
- entry = dataBinder.toAtomEntry(container.getPayload());
+ });
+ container = new ResWrap<AtomEntryImpl>(
+ jcontainer.getContextURL(),
+ jcontainer.getMetadataETag(),
+ dataBinder.toAtomEntry(jcontainer.getPayload()));
}
- return entry;
+ return container;
+ }
+
+ public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
+ throws XMLStreamException, IOException {
+ return readContainerEntry(accept, entity).getPayload();
+
}
public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntryImpl> container)
@@ -584,7 +590,7 @@ public abstract class AbstractUtilities {
} else {
mapper.writeValue(
writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
- dataBinder.toJSONEntry(container.getPayload())));
+ dataBinder.toJSONEntry(container.getPayload())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
@@ -605,6 +611,23 @@ public abstract class AbstractUtilities {
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
+ public AtomPropertyImpl readProperty(final Accept accept, final InputStream property, final String entryType)
+ throws XMLStreamException, IOException {
+ final AtomPropertyImpl atomProperty;
+ if (Accept.ATOM == accept || Accept.XML == accept) {
+ final ResWrap<AtomPropertyImpl> container = atomDeserializer.read(property, AtomPropertyImpl.class);
+ atomProperty = container.getPayload();
+ } else {
+ final ResWrap<JSONPropertyImpl> jcontainer = mapper.readValue(property,
+ new TypeReference<JSONPropertyImpl>() {
+ });
+
+ atomProperty = dataBinder.toAtomProperty(jcontainer.getPayload(), entryType);
+ }
+
+ return atomProperty;
+ }
+
public InputStream writeProperty(final Accept accept, final ResWrap<AtomPropertyImpl> container)
throws XMLStreamException, IOException {
@@ -614,7 +637,7 @@ public abstract class AbstractUtilities {
} else {
mapper.writeValue(
writer, new JSONPropertyContainer(container.getContextURL(), container.getMetadataETag(),
- dataBinder.toJSONProperty(container.getPayload())));
+ dataBinder.toJSONProperty(container.getPayload())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
@@ -816,29 +839,6 @@ public abstract class AbstractUtilities {
// --------------------------------
}
- public void replaceProperty(
- final String entitySetName,
- final String entityId,
- final InputStream changes,
- final List<String> path,
- final Accept accept,
- final boolean justValue) throws Exception {
-
- final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
-
- final Accept acceptType = accept == null || Accept.TEXT == accept
- ? Accept.XML : accept.getExtension().equals(Accept.JSON.getExtension()) ? Accept.JSON_FULLMETA : accept;
-
- InputStream stream = fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType);
- stream = replaceProperty(stream, changes, path, justValue);
-
- final AtomEntryImpl entry = readEntry(acceptType, stream);
- final ResWrap<AtomEntryImpl> container = new ResWrap<AtomEntryImpl>((URI) null, null, entry);
-
- fsManager.putInMemory(writeEntry(Accept.ATOM, container),
- fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
- }
-
public InputStream deleteProperty(
final String entitySetName,
final String entityId,
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
index af15f2d..bab6a0d 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
@@ -135,7 +135,7 @@ public abstract class Commons {
if (!METADATA.containsKey(version)) {
final InputStream is = Commons.class.getResourceAsStream("/" + version.name() + "/metadata.xml");
- METADATA.put(version, new Metadata(is));
+ METADATA.put(version, new Metadata(is, version));
}
return METADATA.get(version);
@@ -180,7 +180,7 @@ public abstract class Commons {
try {
return FSManager.instance(version)
.getAbsolutePath(basePath + Constants.get(version, ConstantKey.LINKS_FILE_PATH)
- + File.separatorChar + linkName, accept);
+ + File.separatorChar + linkName, accept);
} catch (Exception e) {
throw new IOException(e);
}
@@ -208,7 +208,7 @@ public abstract class Commons {
final StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
- builder.append("<links xmlns=\"" + Constants.get(version, ConstantKey.DATASERVICES_NS) + "\">");
+ builder.append("<links xmlns=\"").append(Constants.get(version, ConstantKey.DATASERVICES_NS)).append("\">");
for (String uri : link.getValue()) {
builder.append("<uri>");
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java b/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
index 40b030d..7ff1bd4 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
@@ -43,6 +43,9 @@ public enum ConstantKey {
LINK,
DATASERVICES_NS,
METADATA_NS,
+ GEORSS_NS,
+ GML_NS,
+ EDM_NS,
METADATA,
SERVICES,
FEED,
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java b/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
index 1d79c91..44bbe11 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
@@ -19,6 +19,8 @@
package org.apache.olingo.fit.utils;
import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
import java.util.EnumMap;
import java.util.Map;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
@@ -36,7 +38,11 @@ public class Constants {
public static final Charset ENCODING = Charset.forName("UTF-8");
+ public static final CharsetDecoder DECODER = ENCODING.newDecoder();
+
static {
+ DECODER.onMalformedInput(CodingErrorAction.IGNORE);
+ DECODER.onUnmappableCharacter(CodingErrorAction.IGNORE);
// -----------------------------
// V4 only
@@ -46,6 +52,9 @@ public class Constants {
v4constants.put(ConstantKey.JSON_NAVIGATION_SUFFIX, "@odata.navigationLink");
v4constants.put(ConstantKey.DATASERVICES_NS, "http://docs.oasis-open.org/odata/ns/dataservices");
v4constants.put(ConstantKey.METADATA_NS, "http://docs.oasis-open.org/odata/ns/metadata");
+ v4constants.put(ConstantKey.GEORSS_NS, "http://www.georss.org/georss");
+ v4constants.put(ConstantKey.GML_NS, "http://www.opengis.net/gml");
+ v4constants.put(ConstantKey.EDM_NS, "http://docs.oasis-open.org/odata/ns/edm");
v4constants.put(ConstantKey.ATOM_LINK_REL, "http://docs.oasis-open.org/odata/ns/related/");
v4constants.put(ConstantKey.ODATA_SERVICE_VERSION, "OData-Version");
v4constants.put(ConstantKey.DEFAULT_SERVICE_URL, "http://localhost:9080/StaticService/V40/Static.svc/");
@@ -79,6 +88,9 @@ public class Constants {
constants.put(ConstantKey.LINK, "link");
constants.put(ConstantKey.METADATA_NS, "http://schemas.microsoft.com/ado/2007/08/dataservices/metadta");
constants.put(ConstantKey.DATASERVICES_NS, "http://schemas.microsoft.com/ado/2007/08/dataservices");
+ constants.put(ConstantKey.GEORSS_NS, "http://www.georss.org/georss");
+ constants.put(ConstantKey.GML_NS, "http://www.opengis.net/gml");
+ constants.put(ConstantKey.EDM_NS, "http://schemas.microsoft.com/ado/2009/11/edm");
constants.put(ConstantKey.METADATA, "metadata");
constants.put(ConstantKey.SERVICES, "services");
constants.put(ConstantKey.FEED, "feed");
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
index 304b8ff..b412ba3 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -65,8 +66,8 @@ public class XMLElement {
return new ByteArrayInputStream(content.toByteArray());
}
- public XMLEventReader getContentReader() throws Exception {
- return new XMLEventReaderWrapper(getContent());
+ public XMLEventReader getContentReader(final ODataServiceVersion version) throws Exception {
+ return new XMLEventReaderWrapper(getContent(), version);
}
public void setContent(final InputStream content) throws IOException {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
index 5c88a42..7bae6d8 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
@@ -22,21 +22,20 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CodingErrorAction;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
public class XMLEventReaderWrapper implements XMLEventReader {
- private static final Charset ENCODING = Charset.forName("UTF-8");
+ private static final Charset ENCODING = Charset.forName(org.apache.olingo.commons.api.Constants.UTF8);
public final static String CONTENT = "CONTENT_TAG";
- public final static String CONTENT_STAG = "<" + CONTENT + ">";
+ public final String CONTENT_STAG;
public final static String CONTENT_ETAG = "</" + CONTENT + ">";
@@ -44,20 +43,24 @@ public class XMLEventReaderWrapper implements XMLEventReader {
private XMLEvent nextGivenEvent = null;
- public XMLEventReaderWrapper(final InputStream stream) throws Exception {
- final XMLInputFactory factory = XMLInputFactory.newInstance();
- factory.setProperty(XMLInputFactory.IS_VALIDATING, false);
- factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
+ public XMLEventReaderWrapper(final InputStream stream, final ODataServiceVersion version) throws Exception {
+ final StringBuilder startBuilder = new StringBuilder();
+ startBuilder.append("<").append(CONTENT).
+ append(" xmlns:m").append("=\"").append(Constants.get(version, ConstantKey.METADATA_NS)).append("\"").
+ append(" xmlns:d").append("=\"").append(Constants.get(version, ConstantKey.DATASERVICES_NS)).append("\"").
+ append(" xmlns:georss").append("=\"").append(Constants.get(version, ConstantKey.GEORSS_NS)).append("\"").
+ append(" xmlns:gml").append("=\"").append(Constants.get(version, ConstantKey.GML_NS)).append("\"").
+ append(">");
+
+ CONTENT_STAG = startBuilder.toString();
- final CharsetDecoder decoder = ENCODING.newDecoder();
- decoder.onMalformedInput(CodingErrorAction.IGNORE);
- decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+ final XMLInputFactory factory = XMLInputFactory.newInstance();
final InputStreamReader reader = new InputStreamReader(
- new ByteArrayInputStream((XMLEventReaderWrapper.CONTENT_STAG
+ new ByteArrayInputStream((CONTENT_STAG
+ IOUtils.toString(stream, ENCODING).replaceAll("^<\\?xml.*\\?>", "")
+ XMLEventReaderWrapper.CONTENT_ETAG).getBytes(ENCODING)),
- decoder);
+ Constants.DECODER);
this.wrapped = factory.createXMLEventReader(reader);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
index 162221a..ccc02fe 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
@@ -75,8 +76,8 @@ public class XMLUtilities extends AbstractUtilities {
if (ifactory == null) {
ifactory = XMLInputFactory.newInstance();
}
- ifactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
- return ifactory.createXMLEventReader(is, "UTF-8");
+
+ return ifactory.createXMLEventReader(new InputStreamReader(is, Constants.DECODER));
}
protected static XMLEventWriter getEventWriter(final OutputStream os) throws XMLStreamException {
@@ -168,7 +169,7 @@ public class XMLUtilities extends AbstractUtilities {
writer.add(eventFactory.createEndElement(new QName(Constants.get(version, ConstantKey.LINK)), null));
}
- writer.add(entry.getValue().getContentReader());
+ writer.add(entry.getValue().getContentReader(version));
writer.add(entry.getValue().getEnd());
writer.add(reader);
IOUtils.closeQuietly(is);
@@ -196,7 +197,7 @@ public class XMLUtilities extends AbstractUtilities {
while (true) {
final Map.Entry<Integer, XMLElement> linkInfo =
extractElement(reader, null,
- Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), startDepth, 2, 2);
+ Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), startDepth, 2, 2);
startDepth = linkInfo.getKey();
@@ -246,10 +247,10 @@ public class XMLUtilities extends AbstractUtilities {
try {
final XMLElement inlineElement =
- extractElement(link.getContentReader(), null,
- Collections.<String>singletonList(Constants.get(version, ConstantKey.INLINE)), 0, -1, -1).
+ extractElement(link.getContentReader(version), null,
+ Collections.<String>singletonList(Constants.get(version, ConstantKey.INLINE)), 0, -1, -1).
getValue();
- final XMLEventReader inlineReader = inlineElement.getContentReader();
+ final XMLEventReader inlineReader = inlineElement.getContentReader(version);
try {
while (true) {
@@ -373,7 +374,7 @@ public class XMLUtilities extends AbstractUtilities {
final XMLElement res = new XMLElement();
res.setStart(start);
- final Charset encoding = Charset.forName("UTF-8");
+ final Charset encoding = Charset.forName(org.apache.olingo.commons.api.Constants.UTF8);
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, encoding);
@@ -451,7 +452,7 @@ public class XMLUtilities extends AbstractUtilities {
// check edit link existence
extractElement(reader, writer, Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
Collections.<Map.Entry<String, String>>singletonList(
- new AbstractMap.SimpleEntry<String, String>("rel", "edit")), false, 0, -1, -1);
+ new AbstractMap.SimpleEntry<String, String>("rel", "edit")), false, 0, -1, -1);
addAtomElement(IOUtils.toInputStream(editLinkElement, Constants.ENCODING), writer);
writer.add(reader);
@@ -470,7 +471,7 @@ public class XMLUtilities extends AbstractUtilities {
addAtomElement(IOUtils.toInputStream(editLinkElement, Constants.ENCODING), writer);
- writer.add(entryElement.getContentReader());
+ writer.add(entryElement.getContentReader(version));
writer.add(entryElement.getEnd());
writer.add(reader);
@@ -518,7 +519,7 @@ public class XMLUtilities extends AbstractUtilities {
XMLElement contentElement =
extractElement(reader, writer, Collections.<String>singletonList("content"), 0, 2, 2).getValue();
writer.add(contentElement.getStart());
- writer.add(contentElement.getContentReader());
+ writer.add(contentElement.getContentReader(version));
writer.add(contentElement.getEnd());
writer.add(reader);
} catch (Exception e) {
@@ -533,7 +534,7 @@ public class XMLUtilities extends AbstractUtilities {
extractElement(reader, writer, Collections.<String>singletonList("entry"), 0, 1, 1).getValue();
writer.add(entryElement.getStart());
- writer.add(entryElement.getContentReader());
+ writer.add(entryElement.getContentReader(version));
addAtomElement(
IOUtils.toInputStream(String.format("<content type=\"*/*\" src=\"%s/$value\" />", href)),
@@ -544,14 +545,14 @@ public class XMLUtilities extends AbstractUtilities {
try {
final XMLElement entryElement =
extractElement(reader, writer, Collections.<String>singletonList(
- Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3).getValue();
+ Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3).getValue();
addAtomElement(
IOUtils.toInputStream("<content type=\"application/xml\">"),
writer);
writer.add(entryElement.getStart());
- writer.add(entryElement.getContentReader());
+ writer.add(entryElement.getContentReader(version));
writer.add(entryElement.getEnd());
addAtomElement(
@@ -567,7 +568,7 @@ public class XMLUtilities extends AbstractUtilities {
final XMLElement entryElement =
extractElement(reader, writer, Collections.<String>singletonList("entry"), 0, 1, 1).getValue();
writer.add(entryElement.getStart());
- writer.add(entryElement.getContentReader());
+ writer.add(entryElement.getContentReader(version));
addAtomElement(
IOUtils.toInputStream("<content type=\"application/xml\"/>"),
@@ -742,7 +743,7 @@ public class XMLUtilities extends AbstractUtilities {
writer.add(feedElement.getStart());
addAtomElement(IOUtils.toInputStream(String.format("<m:count>%d</m:count>", count), Constants.ENCODING), writer);
- writer.add(feedElement.getContentReader());
+ writer.add(feedElement.getContentReader(version));
writer.add(feedElement.getEnd());
while (reader.hasNext()) {
@@ -780,7 +781,7 @@ public class XMLUtilities extends AbstractUtilities {
if (event.getEventType() == XMLStreamConstants.START_ELEMENT
&& Constants.get(version, ConstantKey.LINK).equals(event.asStartElement().getName().getLocalPart())
&& !fieldToBeSaved.contains(
- event.asStartElement().getAttributeByName(new QName("title")).getValue())
+ event.asStartElement().getAttributeByName(new QName("title")).getValue())
&& !"edit".equals(event.asStartElement().getAttributeByName(new QName("rel")).getValue())) {
writeCurrent = false;
} else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
@@ -788,13 +789,13 @@ public class XMLUtilities extends AbstractUtilities {
writeNext = true;
} else if (event.getEventType() == XMLStreamConstants.START_ELEMENT
&& (Constants.get(version, ConstantKey.PROPERTIES)).equals(
- event.asStartElement().getName().getLocalPart())) {
+ event.asStartElement().getName().getLocalPart())) {
writeCurrent = true;
writeNext = false;
inProperties = true;
} else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
&& (Constants.get(version, ConstantKey.PROPERTIES)).equals(
- event.asEndElement().getName().getLocalPart())) {
+ event.asEndElement().getName().getLocalPart())) {
writeCurrent = true;
} else if (inProperties) {
if (event.getEventType() == XMLStreamConstants.START_ELEMENT) {
@@ -811,7 +812,7 @@ public class XMLUtilities extends AbstractUtilities {
} else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
&& StringUtils.isNotBlank(currentName)
&& (Constants.get(version, ConstantKey.ATOM_PROPERTY_PREFIX) + currentName.trim()).equals(
- event.asEndElement().getName().getLocalPart())) {
+ event.asEndElement().getName().getLocalPart())) {
writeNext = false;
currentName = null;
}
@@ -879,10 +880,10 @@ public class XMLUtilities extends AbstractUtilities {
final XMLElement entry =
extractElement(
- getEventReader(readEntity(uri.getKey(), uri.getValue(), Accept.ATOM).getValue()),
- null,
- Collections.<String>singletonList("entry"),
- 0, 1, 1).getValue();
+ getEventReader(readEntity(uri.getKey(), uri.getValue(), Accept.ATOM).getValue()),
+ null,
+ Collections.<String>singletonList("entry"),
+ 0, 1, 1).getValue();
IOUtils.copy(entry.toStream(), writer, encoding);
} catch (Exception e) {
@@ -919,10 +920,10 @@ public class XMLUtilities extends AbstractUtilities {
final Map.Entry<Integer, XMLElement> propertyElement =
extractElement(reader, null,
- Collections.<String>singletonList(Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3);
+ Collections.<String>singletonList(Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3);
reader.close();
- reader = propertyElement.getValue().getContentReader();
+ reader = propertyElement.getValue().getContentReader(version);
try {
while (true) {
@@ -943,7 +944,7 @@ public class XMLUtilities extends AbstractUtilities {
while (true) {
final Map.Entry<Integer, XMLElement> linkElement =
extractElement(reader, null,
- Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), pos, 2, 2);
+ Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), pos, 2, 2);
res.put("[Constants.get(version, ConstantKey.LINK)]"
+ linkElement.getValue().getStart().getAttributeByName(new QName("title")).getValue(),
@@ -973,9 +974,9 @@ public class XMLUtilities extends AbstractUtilities {
try {
final XMLElement linkElement =
extractElement(reader, writer,
- Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
- Collections.<Map.Entry<String, String>>singletonList(
- new SimpleEntry<String, String>("title", linkName)), false, 0, -1, -1).getValue();
+ Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
+ Collections.<Map.Entry<String, String>>singletonList(
+ new SimpleEntry<String, String>("title", linkName)), false, 0, -1, -1).getValue();
writer.add(linkElement.getStart());
// ------------------------------------------
@@ -1068,7 +1069,7 @@ public class XMLUtilities extends AbstractUtilities {
writer.add(element.getValue().getStart());
}
- final XMLEventReader changesReader = new XMLEventReaderWrapper(replacement);
+ final XMLEventReader changesReader = new XMLEventReaderWrapper(replacement, version);
while (changesReader.hasNext()) {
final XMLEvent event = changesReader.nextEvent();
@@ -1100,21 +1101,13 @@ public class XMLUtilities extends AbstractUtilities {
@Override
public InputStream deleteProperty(final InputStream src, final List<String> path) throws Exception {
- final List<String> pathElements = new ArrayList<String>();
-
- for (String element : path) {
- pathElements.add(Constants.get(version, ConstantKey.ATOM_PROPERTY_PREFIX) + element);
- }
-
final XMLEventReader reader = getEventReader(src);
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final XMLEventWriter writer = getEventWriter(bos);
- final Map.Entry<Integer, XMLElement> element = extractElement(reader, writer, pathElements, 0, 3, 4);
-
final XMLEventReader changesReader = new XMLEventReaderWrapper(IOUtils.toInputStream(
- String.format("<%s m:null=\"true\" />", path.get(path.size() - 1)), Constants.ENCODING));
+ String.format("<%s m:null=\"true\" />", path.get(path.size() - 1)), Constants.ENCODING), version);
writer.add(changesReader);
changesReader.close();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/resources/V30/openTypeMetadata.xml
----------------------------------------------------------------------
diff --git a/fit/src/main/resources/V30/openTypeMetadata.xml b/fit/src/main/resources/V30/openTypeMetadata.xml
index 42a7dea..5c9da36 100644
--- a/fit/src/main/resources/V30/openTypeMetadata.xml
+++ b/fit/src/main/resources/V30/openTypeMetadata.xml
@@ -21,7 +21,7 @@
-->
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
- <Schema Namespace="Microsoft.Test.OData.Services.OpenTypesService" xmlns="http://schemas.microsoft.com/ado/2008/01/edm">
+ <Schema Namespace="Microsoft.Test.OData.Services.OpenTypesService" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<ComplexType Name="ContactDetails">
<Property Name="FirstContacted" Type="Edm.Binary"/>
<Property Name="LastContacted" Type="Edm.DateTimeOffset" Nullable="false"/>
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
index 00247ae..78605bf 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
@@ -18,10 +18,16 @@
*/
package org.apache.olingo.client.core.it.v4;
+import java.io.IOException;
+import org.apache.olingo.client.api.communication.request.cud.ODataPropertyUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
+import org.apache.olingo.client.api.communication.response.ODataPropertyUpdateResponse;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.http.HttpMethod;
import org.apache.olingo.client.api.uri.v4.URIBuilder;
import org.apache.olingo.client.api.v4.ODataClient;
import org.apache.olingo.commons.api.domain.v4.ODataProperty;
@@ -29,7 +35,7 @@ import org.apache.olingo.commons.api.format.ODataFormat;
import org.junit.Test;
public class PropertyTestITCase extends AbstractTestITCase {
-
+
private void _enum(final ODataClient client, final ODataFormat format) {
final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Products").appendKeySegment(5).appendPropertySegment("CoverColors");
@@ -39,7 +45,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
final ODataProperty prop = req.execute().getBody();
assertNotNull(prop);
- assertEquals("Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)", prop.getValue().getTypeName());
+ assertEquals("Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)", prop.getValue().getTypeName());
}
@Test
@@ -56,7 +62,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
public void enumFromFullJSON() {
_enum(client, ODataFormat.JSON_FULL_METADATA);
}
-
+
private void geospatial(final ODataClient client, final ODataFormat format) {
final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("Home");
@@ -110,4 +116,49 @@ public class PropertyTestITCase extends AbstractTestITCase {
public void complexFromFullJSON() {
complex(client, ODataFormat.JSON_FULL_METADATA);
}
+
+ @Test
+ public void patchComplexPropertyAsJSON() throws IOException {
+ updateComplexProperty(ODataFormat.JSON_FULL_METADATA, UpdateType.PATCH);
+ }
+
+ private void updateComplexProperty(final ODataFormat format, final UpdateType type) throws IOException {
+ final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
+ appendEntitySetSegment("Customers").appendKeySegment(1).appendPropertySegment("HomeAddress");
+
+ ODataPropertyRequest<ODataProperty> retrieveReq =
+ client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+ retrieveReq.setFormat(format);
+
+ ODataRetrieveResponse<ODataProperty> retrieveRes = retrieveReq.execute();
+ assertEquals(200, retrieveRes.getStatusCode());
+
+ ODataProperty homeAddress =
+ client.getObjectFactory().newComplexProperty("HomeAddress",
+ client.getObjectFactory().newComplexValue(retrieveRes.getBody().getComplexValue().getTypeName()));
+
+ homeAddress.getComplexValue().add(client.getObjectFactory().
+ newPrimitiveProperty("City", client.getObjectFactory().newPrimitiveValueBuilder().buildString("Pescara")));
+
+ final ODataPropertyUpdateRequest updateReq = client.getCUDRequestFactory().
+ getPropertyComplexValueUpdateRequest(uriBuilder.build(), type, homeAddress);
+ if (client.getConfiguration().isUseXHTTPMethod()) {
+ assertEquals(HttpMethod.POST, updateReq.getMethod());
+ } else {
+ assertEquals(type.getMethod(), updateReq.getMethod());
+ }
+ updateReq.setFormat(format);
+
+ final ODataPropertyUpdateResponse updateRes = updateReq.execute();
+ assertEquals(204, updateRes.getStatusCode());
+
+ retrieveReq = client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+ retrieveReq.setFormat(format);
+
+ retrieveRes = retrieveReq.execute();
+ assertEquals(200, retrieveRes.getStatusCode());
+
+ homeAddress = retrieveRes.getBody();
+ assertEquals("Pescara", homeAddress.getComplexValue().get("City").getPrimitiveValue().toString());
+ }
}
[2/2] git commit: merge
Posted by fm...@apache.org.
merge
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/639941c0
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/639941c0
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/639941c0
Branch: refs/heads/master
Commit: 639941c00eca9742a28e9297329cf909bd34f91c
Parents: f79db0b e8ac1c7
Author: fmartelli <fa...@gmail.com>
Authored: Tue Apr 29 10:27:30 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Apr 29 10:27:30 2014 +0200
----------------------------------------------------------------------
.../org/apache/olingo/fit/AbstractServices.java | 113 +++++-----
.../apache/olingo/fit/V3ActionOverloading.java | 4 +-
.../java/org/apache/olingo/fit/V3Services.java | 6 +-
.../java/org/apache/olingo/fit/V4Services.java | 126 +++++++----
.../apache/olingo/fit/metadata/Metadata.java | 2 +-
.../olingo/fit/metadata/NavigationProperty.java | 10 +-
.../fit/serializer/JSONEntryContainer.java | 14 +-
.../fit/serializer/JSONFeedContainer.java | 14 +-
.../olingo/fit/utils/AbstractUtilities.java | 64 +++---
.../org/apache/olingo/fit/utils/DataBinder.java | 153 +++++++------
.../org/apache/olingo/fit/utils/FSManager.java | 6 +-
.../apache/olingo/fit/utils/XMLUtilities.java | 2 +-
fit/src/main/resources/V40/delta.full.json | 39 ++++
fit/src/main/resources/V40/delta.xml | 87 ++++++++
.../client/api/CommonEdmEnabledODataClient.java | 1 -
.../request/retrieve/ODataEntityRequest.java | 2 +-
.../request/retrieve/v4/ODataDeltaRequest.java | 29 +++
.../retrieve/v4/RetrieveRequestFactory.java | 2 +
.../request/v4/AsyncRequestFactory.java | 1 -
.../api/domain/ODataEntitySetIterator.java | 77 +++----
.../olingo/client/api/op/CommonODataBinder.java | 32 +--
.../olingo/client/api/op/CommonODataReader.java | 6 +-
.../olingo/client/api/op/v3/ODataBinder.java | 8 +-
.../olingo/client/api/op/v4/ODataBinder.java | 12 +-
.../client/api/op/v4/ODataDeserializer.java | 11 +
.../cud/ODataEntityCreateRequestImpl.java | 6 +-
.../cud/ODataEntityUpdateRequestImpl.java | 6 +-
.../retrieve/ODataEntityRequestImpl.java | 6 +-
.../ODataEntitySetIteratorRequestImpl.java | 10 +-
.../retrieve/ODataEntitySetRequestImpl.java | 6 +-
.../retrieve/ODataPropertyRequestImpl.java | 8 +-
.../retrieve/v4/ODataDeltaRequestImpl.java | 81 +++++++
.../retrieve/v4/RetrieveRequestFactoryImpl.java | 6 +
.../ODataMediaEntityCreateRequestImpl.java | 4 +-
.../ODataMediaEntityUpdateRequestImpl.java | 4 +-
.../request/v4/AsyncRequestFactoryImpl.java | 3 +-
.../client/core/op/AbstractODataBinder.java | 132 +++++------
.../client/core/op/AbstractODataReader.java | 9 +-
.../olingo/client/core/op/ODataWriterImpl.java | 6 +-
.../client/core/op/impl/v3/ODataBinderImpl.java | 10 +-
.../client/core/op/impl/v3/ODataReaderImpl.java | 4 +-
.../client/core/op/impl/v4/ODataBinderImpl.java | 79 ++++++-
.../core/op/impl/v4/ODataDeserializerImpl.java | 12 +
.../client/core/op/impl/v4/ODataReaderImpl.java | 4 +-
.../client/core/it/AbstractBaseTestITCase.java | 20 +-
.../core/it/v3/EntityRetrieveTestITCase.java | 6 +-
.../client/core/it/v3/EntitySetTestITCase.java | 2 +-
.../core/it/v3/QueryOptionsTestITCase.java | 10 +-
.../client/core/it/v4/DeltaTestITCase.java | 78 +++++++
.../apache/olingo/client/core/v3/AtomTest.java | 30 +--
.../olingo/client/core/v3/EntitySetTest.java | 10 +-
.../olingo/client/core/v3/EntityTest.java | 32 +--
.../apache/olingo/client/core/v4/AtomTest.java | 2 +-
.../olingo/client/core/v4/EntitySetTest.java | 18 +-
.../olingo/client/core/v4/EntityTest.java | 51 +++--
.../apache/olingo/client/core/v4/JSONTest.java | 97 ++++++---
.../apache/olingo/client/core/v4/Customers.json | 2 +-
.../org/apache/olingo/client/core/v4/delta.json | 39 ++++
.../org/apache/olingo/client/core/v4/delta.xml | 87 ++++++++
.../apache/olingo/commons/api/Constants.java | 22 +-
.../olingo/commons/api/data/ContextURL.java | 52 ++++-
.../olingo/commons/api/data/DeletedEntity.java | 36 +++
.../apache/olingo/commons/api/data/Delta.java | 45 ++++
.../olingo/commons/api/data/DeltaLink.java | 36 +++
.../apache/olingo/commons/api/data/Entity.java | 174 +++++++++++++++
.../olingo/commons/api/data/EntitySet.java | 74 +++++++
.../apache/olingo/commons/api/data/Entry.java | 174 ---------------
.../apache/olingo/commons/api/data/Feed.java | 74 -------
.../apache/olingo/commons/api/data/Link.java | 24 +-
.../api/domain/CommonODataEntitySet.java | 2 +-
.../olingo/commons/api/domain/ODataLinked.java | 2 +-
.../commons/api/domain/v4/ODataDelta.java | 48 ++++
.../api/domain/v4/ODataObjectFactory.java | 4 +
.../api/edm/constants/ODataServiceVersion.java | 12 +
.../commons/api/op/CommonODataDeserializer.java | 18 +-
.../olingo/commons/api/op/ODataSerializer.java | 20 +-
.../olingo/commons/api/data/ContextURLTest.java | 33 +++
.../commons/core/data/AbstractAtomDealer.java | 20 +-
.../olingo/commons/core/data/AbstractDelta.java | 65 ++++++
.../commons/core/data/AbstractEntity.java | 171 +++++++++++++++
.../commons/core/data/AbstractEntitySet.java | 61 ++++++
.../olingo/commons/core/data/AbstractEntry.java | 171 ---------------
.../core/data/AbstractJsonDeserializer.java | 20 +-
.../core/data/AbstractJsonSerializer.java | 18 +-
.../olingo/commons/core/data/AtomDeltaImpl.java | 25 +++
.../commons/core/data/AtomDeserializer.java | 218 ++++++++++++++-----
.../commons/core/data/AtomEntityImpl.java | 25 +++
.../commons/core/data/AtomEntitySetImpl.java | 28 +++
.../olingo/commons/core/data/AtomEntryImpl.java | 25 ---
.../olingo/commons/core/data/AtomFeedImpl.java | 66 ------
.../commons/core/data/AtomSerializer.java | 154 ++++++-------
.../commons/core/data/DeletedEntityImpl.java | 50 +++++
.../olingo/commons/core/data/DeltaLinkImpl.java | 64 ++++++
.../core/data/JSONDeltaDeserializer.java | 93 ++++++++
.../olingo/commons/core/data/JSONDeltaImpl.java | 28 +++
.../core/data/JSONEntityDeserializer.java | 200 +++++++++++++++++
.../commons/core/data/JSONEntityImpl.java | 33 +++
.../commons/core/data/JSONEntitySerializer.java | 123 +++++++++++
.../core/data/JSONEntitySetDeserializer.java | 93 ++++++++
.../commons/core/data/JSONEntitySetImpl.java | 35 +++
.../core/data/JSONEntitySetSerializer.java | 82 +++++++
.../core/data/JSONEntryDeserializer.java | 200 -----------------
.../olingo/commons/core/data/JSONEntryImpl.java | 33 ---
.../commons/core/data/JSONEntrySerializer.java | 123 -----------
.../commons/core/data/JSONFeedDeserializer.java | 90 --------
.../olingo/commons/core/data/JSONFeedImpl.java | 99 ---------
.../commons/core/data/JSONFeedSerializer.java | 82 -------
.../olingo/commons/core/data/LinkImpl.java | 24 +-
.../core/data/ODataJacksonDeserializer.java | 9 +
.../core/data/v3/JSONLinkCollectionImpl.java | 2 +-
.../core/domain/AbstractODataEntity.java | 2 +-
.../core/domain/AbstractODataEntitySet.java | 5 +-
.../core/domain/v4/ODataComplexValueImpl.java | 2 +-
.../commons/core/domain/v4/ODataDeltaImpl.java | 73 +++++++
.../core/domain/v4/ODataObjectFactoryImpl.java | 11 +
.../core/edm/AbstractEdmNavigationProperty.java | 1 -
.../core/op/AbstractODataDeserializer.java | 24 +-
.../core/op/AbstractODataSerializer.java | 36 +--
.../olingo/commons/core/op/ResourceFactory.java | 84 +++----
119 files changed, 3343 insertions(+), 1976 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --cc fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index 021de16,202d118..5ce5790
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@@ -67,12 -67,11 +67,12 @@@ import org.apache.cxf.jaxrs.client.WebC
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.olingo.commons.api.data.ComplexValue;
import org.apache.olingo.commons.api.data.ResWrap;
- import org.apache.olingo.commons.api.data.Entry;
+ import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.format.ContentType;
- import org.apache.olingo.commons.api.data.Feed;
+ 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.edm.constants.ODataServiceVersion;
@@@ -407,17 -405,17 +406,17 @@@ public abstract class AbstractServices
if (contentTypeValue == Accept.XML || contentTypeValue == Accept.TEXT) {
throw new UnsupportedMediaTypeException("Unsupported media type");
} else if (contentTypeValue == Accept.ATOM) {
- entryChanges = atomDeserializer.<AtomEntryImpl, AtomEntryImpl>read(
- IOUtils.toInputStream(changes, Constants.ENCODING), AtomEntryImpl.class).getPayload();
+ entryChanges = atomDeserializer.<AtomEntityImpl, AtomEntityImpl>read(
+ IOUtils.toInputStream(changes, Constants.ENCODING), AtomEntityImpl.class).getPayload();
} else {
- final ResWrap<JSONEntryImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
- new TypeReference<JSONEntryImpl>() {
+ final ResWrap<JSONEntityImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
+ new TypeReference<JSONEntityImpl>() {
- });
+ });
- entryChanges = dataBinder.toAtomEntry(jcont.getPayload());
+ entryChanges = dataBinder.toAtomEntity(jcont.getPayload());
}
- final ResWrap<AtomEntryImpl> container = atomDeserializer.read(entityInfo.getValue(), AtomEntryImpl.class);
+ final ResWrap<AtomEntityImpl> container = atomDeserializer.read(entityInfo.getValue(), AtomEntityImpl.class);
for (Property property : entryChanges.getProperties()) {
container.getPayload().getProperty(property.getName()).setValue(property.getValue());
@@@ -589,17 -587,17 +588,17 @@@
} else {
final Accept contentTypeValue = Accept.parse(contentType, version);
if (Accept.ATOM == contentTypeValue) {
- container = atomDeserializer.read(IOUtils.toInputStream(entity, Constants.ENCODING), AtomEntryImpl.class);
+ container = atomDeserializer.read(IOUtils.toInputStream(entity, Constants.ENCODING), AtomEntityImpl.class);
entry = container.getPayload();
} else {
- final ResWrap<JSONEntryImpl> jcontainer =
+ final ResWrap<JSONEntityImpl> jcontainer =
mapper.readValue(IOUtils.toInputStream(entity, Constants.ENCODING),
- new TypeReference<JSONEntryImpl>() {
- new TypeReference<JSONEntityImpl>() {
- });
++ new TypeReference<JSONEntityImpl>() {
+ });
- entry = dataBinder.toAtomEntry(jcontainer.getPayload());
+ entry = dataBinder.toAtomEntity(jcontainer.getPayload());
- container = new ResWrap<AtomEntryImpl>(
+ container = new ResWrap<AtomEntityImpl>(
jcontainer.getContextURL(),
jcontainer.getMetadataETag(),
entry);
@@@ -619,10 -617,10 +618,10 @@@
final InputStream serialization =
xml.addOrReplaceEntity(null, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
- ResWrap<AtomEntryImpl> result = atomDeserializer.read(serialization, AtomEntryImpl.class);
- result = new ResWrap<AtomEntryImpl>(
+ ResWrap<AtomEntityImpl> result = atomDeserializer.read(serialization, AtomEntityImpl.class);
+ result = new ResWrap<AtomEntityImpl>(
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
- + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
+ + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
null, result.getPayload());
final String path = Commons.getEntityBasePath(entitySetName, entityKey);
@@@ -894,7 -892,7 +893,7 @@@
} else {
mapper.writeValue(
writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(),
- dataBinder.toJSONFeed(container.getPayload())));
- dataBinder.toJSONEntitySet(container.getPayload())));
++ dataBinder.toJSONEntitySet(container.getPayload())));
}
return xml.createResponse(
@@@ -1145,50 -1142,26 +1144,50 @@@
final String changes,
final boolean justValue) {
+ // if the given path is not about any link then search for property
+ LOG.info("Retrieve property {}", path);
+
try {
- Accept acceptType = null;
- if (StringUtils.isNotBlank(format)) {
- acceptType = Accept.valueOf(format.toUpperCase());
- } else if (StringUtils.isNotBlank(accept)) {
- acceptType = Accept.parse(accept, version, null);
+ final FSManager fsManager = FSManager.instance(version);
+
+ final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
- final ResWrap<AtomEntryImpl> container = xml.readContainerEntry(Accept.ATOM,
++ final ResWrap<AtomEntityImpl> container = xml.readContainerEntry(Accept.ATOM,
+ fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
+
- final AtomEntryImpl entry = container.getPayload();
++ final AtomEntityImpl entry = container.getPayload();
+
+ Property toBeReplaced = null;
+ for (String element : path.split("/")) {
+ if (toBeReplaced == null) {
+ toBeReplaced = entry.getProperty(element.trim());
+ } else {
+ ComplexValue value = toBeReplaced.getValue().asComplex();
+ for (Property field : value.get()) {
+ if (field.getName().equalsIgnoreCase(element)) {
+ toBeReplaced = field;
+ }
+ }
+ }
}
- // if the given path is not about any link then search for property
- LOG.info("Retrieve property {}", path);
+ if (toBeReplaced == null) {
+ throw new NotFoundException();
+ }
- final AbstractUtilities utils = getUtilities(acceptType);
+ if (justValue) {
+ // just for primitive values
+ toBeReplaced.setValue(new PrimitiveValueImpl(changes));
+ } else {
+ final AtomPropertyImpl pchanges = xml.readProperty(
+ Accept.parse(contentType, version),
+ IOUtils.toInputStream(changes, Constants.ENCODING),
+ entry.getType());
- utils.replaceProperty(
- entitySetName,
- entityId,
- IOUtils.toInputStream(changes, Constants.ENCODING),
- Arrays.asList(path.split("/")),
- acceptType,
- justValue);
+ toBeReplaced.setValue(pchanges.getValue());
+ }
+
+ fsManager.putInMemory(xml.writeEntry(Accept.ATOM, container),
+ fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
final Response response;
if ("return-content".equalsIgnoreCase(prefer)) {
@@@ -1545,7 -1507,8 +1544,8 @@@
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
if (linkInfo.isFeed()) {
- final ResWrap<Feed> container = atomDeserializer.<Feed, AtomFeedImpl>read(stream, AtomFeedImpl.class);
- final ResWrap<EntitySet> container =
++ final ResWrap<EntitySet> container =
+ atomDeserializer.<EntitySet, AtomEntitySetImpl>read(stream, AtomEntitySetImpl.class);
if (acceptType == Accept.ATOM) {
atomSerializer.write(writer, container);
@@@ -1555,11 -1518,12 +1555,12 @@@
mapper.writeValue(
writer,
new JSONFeedContainer(container.getContextURL(),
- container.getMetadataETag(),
- dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload())));
+ container.getMetadataETag(),
- dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
++ dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload())));
}
} else {
- final ResWrap<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
- final ResWrap<Entity> container =
++ final ResWrap<Entity> container =
+ atomDeserializer.<Entity, AtomEntityImpl>read(stream, AtomEntityImpl.class);
if (acceptType == Accept.ATOM) {
atomSerializer.write(writer, container);
writer.flush();
@@@ -1568,8 -1532,8 +1569,8 @@@
mapper.writeValue(
writer,
new JSONEntryContainer(container.getContextURL(),
- container.getMetadataETag(),
- dataBinder.toJSONEntityType((AtomEntityImpl) container.getPayload())));
+ container.getMetadataETag(),
- dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
++ dataBinder.toJSONEntityType((AtomEntityImpl) container.getPayload())));
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
----------------------------------------------------------------------
diff --cc fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
index bf1e4e3,57e2049..2882784
--- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
@@@ -550,38 -551,31 +550,38 @@@ public abstract class AbstractUtilitie
} else {
mapper.writeValue(
writer, new JSONFeedContainer(container.getContextURL(),
- container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
- container.getMetadataETag(), dataBinder.toJSONEntitySet(container.getPayload())));
++ container.getMetadataETag(), dataBinder.toJSONEntitySet(container.getPayload())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
- public ResWrap<AtomEntryImpl> readContainerEntry(final Accept accept, final InputStream entity)
- public AtomEntityImpl readEntry(final Accept accept, final InputStream entity)
++ public ResWrap<AtomEntityImpl> readContainerEntry(final Accept accept, final InputStream entity)
throws XMLStreamException, IOException {
- final ResWrap<AtomEntryImpl> container;
-
- final AtomEntityImpl entry;
++ final ResWrap<AtomEntityImpl> container;
if (accept == Accept.ATOM || accept == Accept.XML) {
- container = atomDeserializer.read(entity, AtomEntryImpl.class);
- final ResWrap<AtomEntityImpl> container = atomDeserializer.read(entity, AtomEntityImpl.class);
- entry = container.getPayload();
++ container = atomDeserializer.read(entity, AtomEntityImpl.class);
} else {
- final ResWrap<JSONEntryImpl> jcontainer =
- mapper.readValue(entity, new TypeReference<JSONEntryImpl>() {
- final ResWrap<JSONEntityImpl> container =
++ final ResWrap<JSONEntityImpl> jcontainer =
+ mapper.readValue(entity, new TypeReference<JSONEntityImpl>() {
- });
- entry = dataBinder.toAtomEntity(container.getPayload());
+ });
- container = new ResWrap<AtomEntryImpl>(
++ container = new ResWrap<AtomEntityImpl>(
+ jcontainer.getContextURL(),
+ jcontainer.getMetadataETag(),
- dataBinder.toAtomEntry(jcontainer.getPayload()));
++ dataBinder.toAtomEntity(jcontainer.getPayload()));
}
- return entry;
+ return container;
+ }
+
- public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
++ public AtomEntityImpl readEntry(final Accept accept, final InputStream entity)
+ throws XMLStreamException, IOException {
+ return readContainerEntry(accept, entity).getPayload();
+
}
- public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntryImpl> container)
+ public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntityImpl> container)
throws XMLStreamException, IOException {
final StringWriter writer = new StringWriter();
@@@ -590,7 -584,7 +590,7 @@@
} else {
mapper.writeValue(
writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
- dataBinder.toJSONEntry(container.getPayload())));
- dataBinder.toJSONEntityType(container.getPayload())));
++ dataBinder.toJSONEntityType(container.getPayload())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
----------------------------------------------------------------------