[OLINGO-234] All tests moved to fit

This commit is contained in:
Francesco Chicchiriccò 2014-04-23 18:27:55 +02:00
parent f87321f98e
commit 713ed0efa5
26 changed files with 821 additions and 242 deletions

View File

@ -80,7 +80,6 @@ import org.apache.olingo.commons.core.data.AtomEntryImpl;
import org.apache.olingo.commons.core.data.AtomPropertyImpl;
import org.apache.olingo.commons.core.data.AtomSerializer;
import org.apache.olingo.commons.core.data.JSONEntryImpl;
import org.apache.olingo.commons.core.data.JSONFeedImpl;
import org.apache.olingo.commons.core.data.NullValueImpl;
import org.apache.olingo.commons.core.data.PrimitiveValueImpl;
import org.apache.olingo.fit.metadata.EntitySet;
@ -97,8 +96,8 @@ import org.apache.olingo.fit.utils.AbstractUtilities;
import org.apache.olingo.fit.utils.AbstractXMLUtilities;
import org.apache.olingo.fit.utils.LinkInfo;
import org.apache.olingo.fit.metadata.Metadata;
import org.apache.olingo.fit.serializer.JsonFeedContainer;
import org.apache.olingo.fit.serializer.JsonEntryContainer;
import org.apache.olingo.fit.serializer.JSONFeedContainer;
import org.apache.olingo.fit.serializer.JSONEntryContainer;
import org.apache.olingo.fit.utils.ConstantKey;
import org.apache.olingo.fit.utils.Constants;
import org.apache.olingo.fit.utils.DataBinder;
@ -138,7 +137,7 @@ public abstract class AbstractServices {
this.version = version;
this.atomDeserializer = Commons.getAtomDeserializer(version);
this.atomSerializer = Commons.getAtomSerializer(version);
this.mapper = Commons.getJsonMapper(version);
this.mapper = Commons.getJSONMapper(version);
this.dataBinder = new DataBinder(version);
if (version.compareTo(ODataServiceVersion.V30) <= 0) {
@ -421,7 +420,7 @@ public abstract class AbstractServices {
mapper.readValue(IOUtils.toInputStream(changes), new TypeReference<JSONEntryImpl>() {
});
entryChanges = dataBinder.getAtomEntry(jcont.getObject());
entryChanges = dataBinder.toAtomEntry(jcont.getObject());
}
final Container<AtomEntryImpl> container = atomDeserializer.read(entityInfo.getValue(), AtomEntryImpl.class);
@ -511,7 +510,7 @@ public abstract class AbstractServices {
final Container<JSONEntryImpl> jcont = mapper.readValue(res, new TypeReference<JSONEntryImpl>() {
});
cres = new Container<AtomEntryImpl>(jcont.getContextURL(), jcont.getMetadataETag(),
dataBinder.getAtomEntry(jcont.getObject()));
dataBinder.toAtomEntry(jcont.getObject()));
}
final String path = Commons.getEntityBasePath(entitySetName, entityId);
@ -611,7 +610,7 @@ public abstract class AbstractServices {
mapper.readValue(IOUtils.toInputStream(entity), new TypeReference<JSONEntryImpl>() {
});
entry = dataBinder.getAtomEntry(jcontainer.getObject());
entry = dataBinder.toAtomEntry(jcontainer.getObject());
container = new Container<AtomEntryImpl>(
jcontainer.getContextURL(),
@ -887,8 +886,8 @@ public abstract class AbstractServices {
writer.close();
} else {
mapper.writeValue(
writer, new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(), container.getMetadataETag(),
dataBinder.getJsonFeed(container.getObject())));
writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(),
dataBinder.toJSONFeed(container.getObject())));
}
return xml.createResponse(
@ -1076,7 +1075,6 @@ public abstract class AbstractServices {
xml.writeEntry(utils.getKey(), container),
Commons.getETag(entityInfo.getKey(), version),
utils.getKey());
} catch (Exception e) {
LOG.error("Error retrieving entity", e);
return xml.createFaultResponse(accept, e);
@ -1502,9 +1500,9 @@ public abstract class AbstractServices {
} else {
mapper.writeValue(
writer,
new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(),
new JSONFeedContainer(container.getContextURL(),
container.getMetadataETag(),
dataBinder.getJsonFeed((AtomFeedImpl) container.getObject())));
dataBinder.toJSONFeed((AtomFeedImpl) container.getObject())));
}
} else {
final Container<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
@ -1515,9 +1513,9 @@ public abstract class AbstractServices {
} else {
mapper.writeValue(
writer,
new JsonEntryContainer<JSONEntryImpl>(container.getContextURL(),
new JSONEntryContainer(container.getContextURL(),
container.getMetadataETag(),
dataBinder.getJsonEntry((AtomEntryImpl) container.getObject())));
dataBinder.toJSONEntry((AtomEntryImpl) container.getObject())));
}
}

View File

@ -25,7 +25,6 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
@ -62,13 +61,10 @@ import org.apache.olingo.commons.core.data.AtomPropertyImpl;
import org.apache.olingo.commons.core.data.CollectionValueImpl;
import org.apache.olingo.commons.core.data.EnumValueImpl;
import org.apache.olingo.commons.core.data.JSONEntryImpl;
import org.apache.olingo.commons.core.data.JSONFeedImpl;
import org.apache.olingo.commons.core.data.JSONPropertyImpl;
import org.apache.olingo.commons.core.data.PrimitiveValueImpl;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
import org.apache.olingo.fit.methods.PATCH;
import org.apache.olingo.fit.serializer.JsonFeedContainer;
import org.apache.olingo.fit.serializer.JsonPropertyContainer;
import org.apache.olingo.fit.utils.AbstractUtilities;
import org.apache.olingo.fit.utils.Accept;
import org.apache.olingo.fit.utils.ConstantKey;
@ -180,6 +176,266 @@ public class V4Services extends AbstractServices {
return new ByteArrayInputStream(bos.toByteArray());
}
@GET
@Path("/Company")
public Response getSingletonCompany(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getEntityInternal(
uriInfo.getRequestUri().toASCIIString(), accept, "Company", StringUtils.EMPTY, format, null, null, false);
}
@GET
@Path("/Company/Microsoft.Test.OData.Services.ODataWCFService.GetEmployeesCount")
public Response functionGetEmployeesCount(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
acceptType = Accept.valueOf(format.toUpperCase());
} else {
acceptType = Accept.parse(accept, version);
}
final AtomPropertyImpl property = new AtomPropertyImpl();
property.setType("Edm.Int32");
property.setValue(new PrimitiveValueImpl("2"));
final Container<AtomPropertyImpl> container = new Container<AtomPropertyImpl>(
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + property.getType()), null,
property);
return xml.createResponse(
null,
xml.writeProperty(acceptType, container),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/Company/Microsoft.Test.OData.Services.ODataWCFService.IncreaseRevenue")
public Response actionIncreaseRevenue(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
final String param) {
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
acceptType = Accept.valueOf(format.toUpperCase());
} else {
acceptType = Accept.parse(accept, version);
}
final Accept contentTypeValue = Accept.parse(contentType, version);
final Entry entry = xml.readEntry(contentTypeValue, IOUtils.toInputStream(param, Constants.ENCODING));
return xml.createResponse(
null,
xml.writeProperty(acceptType, entry.getProperty("IncreaseValue")),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/Products({entityId})/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails({param:.*})")
public Response functionGetProductDetails(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("entityId") String entityId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
acceptType = Accept.valueOf(format.toUpperCase());
} else {
acceptType = Accept.parse(accept, version);
}
final AtomEntryImpl entry = new AtomEntryImpl();
entry.setType("Microsoft.Test.OData.Services.ODataWCFService.ProductDetail");
final Property productId = new AtomPropertyImpl();
productId.setName("ProductID");
productId.setType("Edm.Int32");
productId.setValue(new PrimitiveValueImpl(entityId));
entry.getProperties().add(productId);
final Property productDetailId = new AtomPropertyImpl();
productDetailId.setName("ProductDetailID");
productDetailId.setType("Edm.Int32");
productDetailId.setValue(new PrimitiveValueImpl("2"));
entry.getProperties().add(productDetailId);
final AtomFeedImpl feed = new AtomFeedImpl();
feed.getEntries().add(entry);
final Container<AtomFeedImpl> container = new Container<AtomFeedImpl>(
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + "ProductDetail"), null,
feed);
return xml.createResponse(
null,
xml.writeFeed(acceptType, container),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/Products({entityId})/Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight")
public Response actionAddAccessRight(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
final String param) {
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
acceptType = Accept.valueOf(format.toUpperCase());
} else {
acceptType = Accept.parse(accept, version);
}
final Accept contentTypeValue = Accept.parse(contentType, version);
final Entry entry = xml.readEntry(contentTypeValue, IOUtils.toInputStream(param, Constants.ENCODING));
assert 1 == entry.getProperties().size();
assert entry.getProperty("accessRight") != null;
entry.getProperty("accessRight").setType("Microsoft.Test.OData.Services.ODataWCFService.AccessLevel");
return xml.createResponse(
null,
xml.writeProperty(acceptType, entry.getProperty("accessRight")),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/Customers(PersonID={personId})/Microsoft.Test.OData.Services.ODataWCFService.ResetAddress")
public Response actionResetAddress(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("personId") String personId,
@HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
final String param) {
try {
final Accept contentTypeValue = Accept.parse(contentType, version);
final Entry entry = xml.readEntry(contentTypeValue, IOUtils.toInputStream(param, Constants.ENCODING));
assert 2 == entry.getProperties().size();
assert entry.getProperty("addresses") != null;
assert entry.getProperty("index") != null;
return getEntityInternal(
uriInfo.getRequestUri().toASCIIString(), accept, "Customers", personId, format, null, null, false);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/ProductDetails(ProductID={productId},ProductDetailID={productDetailId})"
+ "/Microsoft.Test.OData.Services.ODataWCFService.GetRelatedProduct")
public Response functionGetRelatedProduct(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("productId") String productId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getEntityInternal(
uriInfo.getRequestUri().toASCIIString(), accept, "Products", productId, format, null, null, false);
}
@POST
@Path("/Accounts(101)/Microsoft.Test.OData.Services.ODataWCFService.RefreshDefaultPI")
public Response actionRefreshDefaultPI(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
final String param) {
try {
final Accept contentTypeValue = Accept.parse(contentType, version);
final Entry entry = xml.readEntry(contentTypeValue, IOUtils.toInputStream(param, Constants.ENCODING));
assert 1 == entry.getProperties().size();
assert entry.getProperty("newDate") != null;
return functionGetDefaultPI(accept, format);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/Accounts(101)/Microsoft.Test.OData.Services.ODataWCFService.GetDefaultPI")
public Response functionGetDefaultPI(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getContainedEntity(accept, "101", "MyPaymentInstruments", "101901", format);
}
@GET
@Path("/Accounts({entityId})/Microsoft.Test.OData.Services.ODataWCFService.GetAccountInfo")
public Response functionGetAccountInfo(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("entityId") String entityId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getPath(accept, "Accounts", entityId, "AccountInfo", format);
}
@GET
@Path("/Accounts({entityId})/MyGiftCard/Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount({param:.*})")
public Response functionGetActualAmount(
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@PathParam("entityId") String entityId,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
acceptType = Accept.valueOf(format.toUpperCase());
} else {
acceptType = Accept.parse(accept, version);
}
final AtomPropertyImpl property = new AtomPropertyImpl();
property.setType("Edm.Double");
property.setValue(new PrimitiveValueImpl("41.79"));
final Container<AtomPropertyImpl> container = new Container<AtomPropertyImpl>(null, null, property);
return xml.createResponse(
null,
xml.writeProperty(acceptType, container),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
/**
* Retrieve entity reference sample.
*
@ -280,9 +536,11 @@ public class V4Services extends AbstractServices {
throw new UnsupportedMediaTypeException("Unsupported media type");
}
final InputStream entry = FSManager.instance(version).
readFile(containedPath(entityId, containedEntitySetName).
append('(').append(containedEntityId).append(')').toString(), Accept.ATOM);
final StringBuilder containedPath = containedPath(entityId, containedEntitySetName);
if (StringUtils.isNotBlank(containedEntityId)) {
containedPath.append('(').append(containedEntityId).append(')');
}
final InputStream entry = FSManager.instance(version).readFile(containedPath.toString(), Accept.ATOM);
final Container<AtomEntryImpl> container = atomDeserializer.read(entry, AtomEntryImpl.class);
@ -306,7 +564,6 @@ public class V4Services extends AbstractServices {
@PathParam("containedEntitySetName") String containedEntitySetName,
final String entity) {
// default
try {
final Accept acceptType = Accept.parse(accept, version);
if (acceptType == Accept.XML || acceptType == Accept.TEXT) {
@ -327,7 +584,7 @@ public class V4Services extends AbstractServices {
mapper.readValue(IOUtils.toInputStream(entity), new TypeReference<JSONEntryImpl>() {
});
entry = dataBinder.getAtomEntry(jcontainer.getObject());
entry = dataBinder.toAtomEntry(jcontainer.getObject());
entryContainer = new Container<AtomEntryImpl>(
jcontainer.getContextURL(),
@ -425,7 +682,7 @@ public class V4Services extends AbstractServices {
new TypeReference<JSONEntryImpl>() {
});
jsonContainer.getObject().setType(typeInfo.getFullQualifiedName().toString());
entryChanges = dataBinder.getAtomEntry(jsonContainer.getObject());
entryChanges = dataBinder.toAtomEntry(jsonContainer.getObject());
}
for (Property property : entryChanges.getProperties()) {
@ -494,6 +751,10 @@ public class V4Services extends AbstractServices {
@PathParam("containedEntitySetName") String containedEntitySetName,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
if ("MyGiftCard".equals(containedEntitySetName)) {
return getContainedEntity(accept, entityId, containedEntitySetName, null, format);
}
try {
final Accept acceptType;
if (StringUtils.isNotBlank(format)) {
@ -510,22 +771,9 @@ public class V4Services extends AbstractServices {
final Container<AtomFeedImpl> container = atomDeserializer.read(feed, AtomFeedImpl.class);
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
if (acceptType == Accept.ATOM) {
atomSerializer.write(writer, container);
writer.flush();
writer.close();
} else {
mapper.writeValue(
writer, new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(), container.getMetadataETag(),
dataBinder.getJsonFeed(container.getObject())));
}
return xml.createResponse(
null,
new ByteArrayInputStream(content.toByteArray()),
xml.writeFeed(acceptType, container),
null,
acceptType);
} catch (Exception e) {
@ -554,22 +802,9 @@ public class V4Services extends AbstractServices {
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + property.getType()), null,
property);
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
if (acceptType == Accept.XML) {
atomSerializer.write(writer, container);
writer.flush();
writer.close();
} else {
mapper.writeValue(
writer, new JsonPropertyContainer<JSONPropertyImpl>(container.getContextURL(),
container.getMetadataETag(), dataBinder.getJsonProperty(container.getObject())));
}
return xml.createResponse(
null,
new ByteArrayInputStream(content.toByteArray()),
xml.writeProperty(acceptType, container),
null,
acceptType);
} catch (Exception e) {
@ -637,22 +872,9 @@ public class V4Services extends AbstractServices {
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + property.getType()), null,
property);
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
if (acceptType == Accept.XML) {
atomSerializer.write(writer, container);
writer.flush();
writer.close();
} else {
mapper.writeValue(
writer, new JsonPropertyContainer<JSONPropertyImpl>(container.getContextURL(),
container.getMetadataETag(), dataBinder.getJsonProperty(container.getObject())));
}
return xml.createResponse(
null,
new ByteArrayInputStream(content.toByteArray()),
xml.writeProperty(acceptType, container),
null,
acceptType);
} catch (Exception e) {
@ -685,22 +907,9 @@ public class V4Services extends AbstractServices {
URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + property.getType()), null,
property);
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
if (acceptType == Accept.XML) {
atomSerializer.write(writer, container);
writer.flush();
writer.close();
} else {
mapper.writeValue(
writer, new JsonPropertyContainer<JSONPropertyImpl>(container.getContextURL(),
container.getMetadataETag(), dataBinder.getJsonProperty(container.getObject())));
}
return xml.createResponse(
null,
new ByteArrayInputStream(content.toByteArray()),
xml.writeProperty(acceptType, container),
null,
acceptType);
} catch (Exception e) {
@ -785,7 +994,7 @@ public class V4Services extends AbstractServices {
return xml.createResponse(
null,
new ByteArrayInputStream(param.getBytes(Constants.ENCODING)),
IOUtils.toInputStream(param, Constants.ENCODING),
null,
acceptType);
} catch (Exception e) {
@ -810,33 +1019,15 @@ public class V4Services extends AbstractServices {
}
final Accept contentTypeValue = Accept.parse(contentType, version);
Entry entry;
if (contentTypeValue == Accept.XML) {
final Container<AtomEntryImpl> paramContainer = atomDeserializer.read(
IOUtils.toInputStream(param, Constants.ENCODING), AtomEntryImpl.class);
entry = paramContainer.getObject();
} else {
final Container<JSONEntryImpl> paramContainer =
mapper.readValue(IOUtils.toInputStream(param, Constants.ENCODING),
new TypeReference<JSONEntryImpl>() {
});
entry = paramContainer.getObject();
}
final Entry entry = xml.readEntry(contentTypeValue, IOUtils.toInputStream(param, Constants.ENCODING));
assert 1 == entry.getProperties().size();
assert "Collection(Edm.String)".equals(entry.getProperty("emails").getType());
assert entry.getProperty("emails").getValue().isCollection();
final StringWriter writer = new StringWriter();
if (acceptType == Accept.XML) {
atomSerializer.write(writer, entry.getProperty("emails"));
} else {
mapper.writeValue(writer, entry.getProperty("emails"));
}
return xml.createResponse(
null,
new ByteArrayInputStream(writer.toString().getBytes(Constants.ENCODING)),
xml.writeProperty(acceptType, entry.getProperty("emails")),
null,
acceptType);
} catch (Exception e) {

View File

@ -23,13 +23,14 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.net.URI;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.core.data.JSONEntryDeserializer;
import org.apache.olingo.commons.core.data.JSONEntryImpl;
import org.apache.olingo.commons.core.data.JSONEntrySerializer;
@JsonDeserialize(using = JSONEntryDeserializer.class)
@JsonSerialize(using = JSONEntrySerializer.class)
public class JsonEntryContainer<T> extends Container<T> {
public class JSONEntryContainer extends Container<JSONEntryImpl> {
public JsonEntryContainer(final URI contextURL, final String metadataETag, final T object) {
public JSONEntryContainer(final URI contextURL, final String metadataETag, final JSONEntryImpl object) {
super(contextURL, metadataETag, object);
}
}

View File

@ -23,13 +23,14 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.net.URI;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.core.data.JSONFeedDeserializer;
import org.apache.olingo.commons.core.data.JSONFeedImpl;
import org.apache.olingo.commons.core.data.JSONFeedSerializer;
@JsonDeserialize(using = JSONFeedDeserializer.class)
@JsonSerialize(using = JSONFeedSerializer.class)
public class JsonFeedContainer<T> extends Container<T> {
public class JSONFeedContainer extends Container<JSONFeedImpl> {
public JsonFeedContainer(final URI contextURL, final String metadataETag, final T object) {
public JSONFeedContainer(final URI contextURL, final String metadataETag, final JSONFeedImpl object) {
super(contextURL, metadataETag, object);
}
}

View File

@ -23,13 +23,14 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.net.URI;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.core.data.JSONPropertyDeserializer;
import org.apache.olingo.commons.core.data.JSONPropertyImpl;
import org.apache.olingo.commons.core.data.JSONPropertySerializer;
@JsonDeserialize(using = JSONPropertyDeserializer.class)
@JsonSerialize(using = JSONPropertySerializer.class)
public class JsonPropertyContainer<T> extends Container<T> {
public class JSONPropertyContainer extends Container<JSONPropertyImpl> {
public JsonPropertyContainer(final URI contextURL, final String metadataETag, final T object) {
public JSONPropertyContainer(final URI contextURL, final String metadataETag, final JSONPropertyImpl object) {
super(contextURL, metadataETag, object);
}
}

View File

@ -201,7 +201,7 @@ public abstract class AbstractJSONUtilities extends AbstractUtilities {
final ObjectNode propertyNode = new ObjectNode(JsonNodeFactory.instance);
if (StringUtils.isNotBlank(edmType)) {
if (StringUtils.isNotBlank(edmType) && version.compareTo(ODataServiceVersion.V40) < 0) {
propertyNode.put(Constants.get(
version, ConstantKey.JSON_ODATAMETADATA_NAME),
Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX) + edmType);

View File

@ -25,7 +25,6 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
@ -46,13 +45,21 @@ import org.apache.commons.vfs2.FileObject;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.api.data.Entry;
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;
import org.apache.olingo.commons.core.data.AtomEntryImpl;
import org.apache.olingo.commons.core.data.AtomFeedImpl;
import org.apache.olingo.commons.core.data.AtomPropertyImpl;
import org.apache.olingo.commons.core.data.AtomSerializer;
import org.apache.olingo.commons.core.data.JSONEntryImpl;
import org.apache.olingo.commons.core.data.JSONPropertyImpl;
import org.apache.olingo.fit.UnsupportedMediaTypeException;
import org.apache.olingo.fit.metadata.Metadata;
import org.apache.olingo.fit.metadata.NavigationProperty;
import org.apache.olingo.fit.serializer.JsonEntryContainer;
import org.apache.olingo.fit.serializer.FITAtomDeserializer;
import org.apache.olingo.fit.serializer.JSONEntryContainer;
import org.apache.olingo.fit.serializer.JSONFeedContainer;
import org.apache.olingo.fit.serializer.JSONPropertyContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -63,10 +70,6 @@ public abstract class AbstractUtilities {
*/
protected static final Logger LOG = LoggerFactory.getLogger(AbstractUtilities.class);
protected final ODataServiceVersion version;
protected final FSManager fsManager;
protected static final Pattern ENTITY_URI_PATTERN = Pattern.compile(".*\\/.*\\(.*\\)");
/**
@ -84,9 +87,25 @@ public abstract class AbstractUtilities {
*/
public static final String BOUNDARY = "boundary";
protected final ODataServiceVersion version;
protected final FSManager fsManager;
protected final DataBinder dataBinder;
protected final FITAtomDeserializer atomDeserializer;
protected final AtomSerializer atomSerializer;
protected final ObjectMapper mapper;
public AbstractUtilities(final ODataServiceVersion version) throws Exception {
this.version = version;
this.fsManager = FSManager.instance(version);
this.dataBinder = new DataBinder(version);
this.atomDeserializer = Commons.getAtomDeserializer(version);
this.atomSerializer = Commons.getAtomSerializer(version);
this.mapper = Commons.getJSONMapper(version);
}
public boolean isMediaContent(final String entityName) {
@ -181,7 +200,7 @@ public abstract class AbstractUtilities {
private InputStream toInputStream(final AtomEntryImpl entry) throws XMLStreamException {
final StringWriter writer = new StringWriter();
Commons.getAtomSerializer(version).write(writer, entry);
atomSerializer.write(writer, entry);
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
@ -273,7 +292,8 @@ public abstract class AbstractUtilities {
final List<String> hrefs = new ArrayList<String>();
for (final Link link : entry.getNavigationLinks()) {
final NavigationProperty navProp = navigationProperties == null? null: navigationProperties.get(link.getTitle());
final NavigationProperty navProp = navigationProperties == null
? null : navigationProperties.get(link.getTitle());
if (navProp != null) {
final String inlineEntitySetName = navProp.getTarget();
if (link.getInlineEntry() != null) {
@ -555,20 +575,36 @@ public abstract class AbstractUtilities {
return builder.build();
}
public InputStream writeFeed(final Accept accept, final Container<AtomFeedImpl> container)
throws XMLStreamException, IOException {
final StringWriter writer = new StringWriter();
if (accept == Accept.ATOM) {
atomSerializer.write(writer, container);
writer.flush();
writer.close();
} else {
mapper.writeValue(
writer, new JSONFeedContainer(container.getContextURL(),
container.getMetadataETag(), dataBinder.toJSONFeed(container.getObject())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
public AtomEntryImpl readEntry(final Accept contentTypeValue, final InputStream entity)
throws XMLStreamException, IOException {
final AtomEntryImpl entry;
if (Accept.ATOM == contentTypeValue) {
final Container<AtomEntryImpl> container = Commons.getAtomDeserializer(version).
read(entity, AtomEntryImpl.class);
if (Accept.ATOM == contentTypeValue || Accept.XML == contentTypeValue) {
final Container<AtomEntryImpl> container = atomDeserializer.read(entity, AtomEntryImpl.class);
entry = container.getObject();
} else {
final Container<JSONEntryImpl> jcontainer =
Commons.getJsonMapper(version).readValue(entity, new TypeReference<JSONEntryImpl>() {
final Container<JSONEntryImpl> container =
mapper.readValue(entity, new TypeReference<JSONEntryImpl>() {
});
entry = new DataBinder(version).getAtomEntry(jcontainer.getObject());
entry = dataBinder.toAtomEntry(container.getObject());
}
return entry;
@ -577,21 +613,46 @@ public abstract class AbstractUtilities {
public InputStream writeEntry(final Accept accept, final Container<AtomEntryImpl> container)
throws XMLStreamException, IOException {
final ByteArrayOutputStream content = new ByteArrayOutputStream();
final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
final StringWriter writer = new StringWriter();
if (accept == Accept.ATOM) {
Commons.getAtomSerializer(version).write(writer, container);
writer.flush();
writer.close();
atomSerializer.write(writer, container);
} else {
final ObjectMapper mapper = Commons.getJsonMapper(version);
mapper.writeValue(
writer, new JsonEntryContainer<JSONEntryImpl>(container.getContextURL(), container.getMetadataETag(),
new DataBinder(version).getJsonEntry((AtomEntryImpl) container.getObject())));
writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
dataBinder.toJSONEntry(container.getObject())));
}
return new ByteArrayInputStream(content.toByteArray());
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
public InputStream writeProperty(final Accept accept, final Property property)
throws XMLStreamException, IOException {
final StringWriter writer = new StringWriter();
if (accept == Accept.XML || accept == Accept.ATOM) {
atomSerializer.write(writer, property instanceof AtomPropertyImpl
? property : dataBinder.toAtomProperty((JSONPropertyImpl) property, property.getType()));
} else {
mapper.writeValue(writer, property instanceof JSONPropertyImpl
? property : dataBinder.toJSONProperty((AtomPropertyImpl) property));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
public InputStream writeProperty(final Accept accept, final Container<AtomPropertyImpl> container)
throws XMLStreamException, IOException {
final StringWriter writer = new StringWriter();
if (accept == Accept.XML) {
atomSerializer.write(writer, container);
} else {
mapper.writeValue(
writer, new JSONPropertyContainer(container.getContextURL(), container.getMetadataETag(),
dataBinder.toJSONProperty(container.getObject())));
}
return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
}
private String getDefaultEntryKey(final String entitySetName, final AtomEntryImpl entry, final String propertyName)

View File

@ -111,7 +111,7 @@ public abstract class Commons {
return ATOM_SERIALIZER.get(version);
}
public static ObjectMapper getJsonMapper(final ODataServiceVersion version) {
public static ObjectMapper getJSONMapper(final ODataServiceVersion version) {
if (!JSON_MAPPER.containsKey(version)) {
final ObjectMapper mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);

View File

@ -52,7 +52,7 @@ public class DataBinder {
this.version = version;
}
public JSONFeedImpl getJsonFeed(final AtomFeedImpl atomfeed) {
public JSONFeedImpl toJSONFeed(final AtomFeedImpl atomfeed) {
final JSONFeedImpl jsonfeed = new JSONFeedImpl();
BeanUtils.copyProperties(atomfeed, jsonfeed, "baseURI", "metadataContextURL");
@ -62,13 +62,13 @@ public class DataBinder {
final Collection<Entry> entries = jsonfeed.getEntries();
for (Entry entry : atomfeed.getEntries()) {
entries.add(getJsonEntry((AtomEntryImpl) entry));
entries.add(toJSONEntry((AtomEntryImpl) entry));
}
return jsonfeed;
}
public AtomFeedImpl getAtomFeed(final JSONFeedImpl jsonfeed) {
public AtomFeedImpl toAtomFeed(final JSONFeedImpl jsonfeed) {
final AtomFeedImpl atomfeed = new AtomFeedImpl();
BeanUtils.copyProperties(jsonfeed, atomfeed, "baseURI", "metadataContextURL");
@ -78,17 +78,18 @@ public class DataBinder {
final Collection<Entry> entries = atomfeed.getEntries();
for (Entry entry : jsonfeed.getEntries()) {
entries.add(getAtomEntry((JSONEntryImpl) entry));
entries.add(toAtomEntry((JSONEntryImpl) entry));
}
return atomfeed;
}
public JSONEntryImpl getJsonEntry(final AtomEntryImpl atomentry) {
public JSONEntryImpl toJSONEntry(final AtomEntryImpl atomentry) {
final JSONEntryImpl jsonentry = new JSONEntryImpl();
BeanUtils.copyProperties(atomentry, jsonentry, "baseURI", "properties", "links");
jsonentry.setBaseURI(atomentry.getBaseURI() == null ? null : atomentry.getBaseURI().toASCIIString());
jsonentry.getOperations().addAll(atomentry.getOperations());
for (Link link : atomentry.getNavigationLinks()) {
final Link jlink = new LinkImpl();
@ -100,12 +101,12 @@ public class DataBinder {
if (link.getInlineEntry() instanceof AtomEntryImpl) {
final Entry inlineEntry = link.getInlineEntry();
if (inlineEntry instanceof AtomEntryImpl) {
jlink.setInlineEntry(getJsonEntry((AtomEntryImpl) link.getInlineEntry()));
jlink.setInlineEntry(toJSONEntry((AtomEntryImpl) link.getInlineEntry()));
}
} else if (link.getInlineFeed() instanceof AtomFeedImpl) {
final Feed inlineFeed = link.getInlineFeed();
if (inlineFeed instanceof AtomFeedImpl) {
jlink.setInlineFeed(getJsonFeed((AtomFeedImpl) link.getInlineFeed()));
jlink.setInlineFeed(toJSONFeed((AtomFeedImpl) link.getInlineFeed()));
}
}
@ -114,13 +115,13 @@ public class DataBinder {
final Collection<Property> properties = jsonentry.getProperties();
for (Property property : atomentry.getProperties()) {
properties.add(getJsonProperty((AtomPropertyImpl) property));
properties.add(toJSONProperty((AtomPropertyImpl) property));
}
return jsonentry;
}
public AtomEntryImpl getAtomEntry(final JSONEntryImpl jsonentry) {
public AtomEntryImpl toAtomEntry(final JSONEntryImpl jsonentry) {
final AtomEntryImpl atomentry = new AtomEntryImpl();
final Metadata metadata = Commons.getMetadata(version);
@ -143,12 +144,12 @@ public class DataBinder {
if (link.getInlineEntry() instanceof JSONEntryImpl) {
final Entry inlineEntry = link.getInlineEntry();
if (inlineEntry instanceof JSONEntryImpl) {
alink.setInlineEntry(getAtomEntry((JSONEntryImpl) link.getInlineEntry()));
alink.setInlineEntry(toAtomEntry((JSONEntryImpl) link.getInlineEntry()));
}
} else if (link.getInlineFeed() instanceof JSONFeedImpl) {
final Feed inlineFeed = link.getInlineFeed();
if (inlineFeed instanceof JSONFeedImpl) {
alink.setInlineFeed(getAtomFeed((JSONFeedImpl) link.getInlineFeed()));
alink.setInlineFeed(toAtomFeed((JSONFeedImpl) link.getInlineFeed()));
}
}
@ -187,7 +188,7 @@ public class DataBinder {
final Entry inlineEntry = new AtomEntryImpl();
inlineEntry.setType(navProperties.get(property.getName()).getType());
for (Property prop : entry.asComplex().get()) {
inlineEntry.getProperties().add(getAtomProperty((JSONPropertyImpl) prop, inlineEntry.getType()));
inlineEntry.getProperties().add(toAtomProperty((JSONPropertyImpl) prop, inlineEntry.getType()));
}
inline.getEntries().add(inlineEntry);
}
@ -197,14 +198,14 @@ public class DataBinder {
}
atomentry.getNavigationLinks().add(alink);
} else {
properties.add(getAtomProperty((JSONPropertyImpl) property, atomentry.getType()));
properties.add(toAtomProperty((JSONPropertyImpl) property, atomentry.getType()));
}
}
return atomentry;
}
public JSONPropertyImpl getJsonProperty(final AtomPropertyImpl atomproperty) {
public JSONPropertyImpl toJSONProperty(final AtomPropertyImpl atomproperty) {
final JSONPropertyImpl jsonproperty = new JSONPropertyImpl();
BeanUtils.copyProperties(atomproperty, jsonproperty, "value");
@ -213,7 +214,7 @@ public class DataBinder {
jsonproperty.setValue(complex);
for (Property field : atomproperty.getValue().asComplex().get()) {
complex.get().add(getJsonProperty((AtomPropertyImpl) field));
complex.get().add(toJSONProperty((AtomPropertyImpl) field));
}
} else if (atomproperty.getValue().isCollection()) {
final CollectionValueImpl collection = new CollectionValueImpl();
@ -225,7 +226,7 @@ public class DataBinder {
collection.get().add(complex);
for (Property field : element.asComplex().get()) {
complex.get().add(getJsonProperty((AtomPropertyImpl) field));
complex.get().add(toJSONProperty((AtomPropertyImpl) field));
}
} else {
collection.get().add(element);
@ -238,14 +239,14 @@ public class DataBinder {
return jsonproperty;
}
public AtomPropertyImpl getAtomProperty(final JSONPropertyImpl jsonproperty, final String entryType) {
public AtomPropertyImpl toAtomProperty(final JSONPropertyImpl jsonproperty, final String entryType) {
final AtomPropertyImpl atomproperty = new AtomPropertyImpl();
atomproperty.setName(jsonproperty.getName());
if (StringUtils.isNotBlank(jsonproperty.getType())) {
atomproperty.setType(jsonproperty.getType());
} else {
final EntityType entityType = Commons.getMetadata(version).getEntityType(entryType);
final EntityType entityType = entryType == null ? null : Commons.getMetadata(version).getEntityType(entryType);
if (entityType != null) {
atomproperty.setType(entityType.getProperty(jsonproperty.getName()).getType());
}
@ -256,7 +257,7 @@ public class DataBinder {
atomproperty.setValue(complex);
for (Property field : jsonproperty.getValue().asComplex().get()) {
complex.get().add(getAtomProperty((JSONPropertyImpl) field, atomproperty.getType()));
complex.get().add(toAtomProperty((JSONPropertyImpl) field, atomproperty.getType()));
}
} else if (jsonproperty.getValue().isCollection()) {
final CollectionValueImpl collection = new CollectionValueImpl();
@ -268,8 +269,10 @@ public class DataBinder {
collection.get().add(complex);
for (Property field : element.asComplex().get()) {
complex.get().add(getAtomProperty((JSONPropertyImpl) field,
atomproperty.getType().replaceAll("^Collection\\(", "").replaceAll("\\)$", "")));
complex.get().add(toAtomProperty((JSONPropertyImpl) field,
atomproperty.getType() == null
? null
: atomproperty.getType().replaceAll("^Collection\\(", "").replaceAll("\\)$", "")));
}
} else {
collection.get().add(element);

View File

@ -40,8 +40,7 @@ import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.core.data.AtomEntryImpl;
import org.apache.olingo.commons.core.data.AtomSerializer;
import org.apache.olingo.commons.core.data.JSONEntryImpl;
import org.apache.olingo.fit.serializer.JsonEntryContainer;
import org.apache.olingo.fit.serializer.JSONEntryContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -113,12 +112,12 @@ public class FSManager {
putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.ATOM));
content.reset();
final ObjectMapper mapper = Commons.getJsonMapper(version);
final ObjectMapper mapper = Commons.getJSONMapper(version);
mapper.writeValue(
writer, new JsonEntryContainer<JSONEntryImpl>(
writer, new JSONEntryContainer(
container.getContextURL(),
container.getMetadataETag(),
new DataBinder(version).getJsonEntry(container.getObject())));
new DataBinder(version).toJSONEntry(container.getObject())));
putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.JSON_FULLMETA));
} catch (Exception e) {

View File

@ -32,6 +32,15 @@
<author>
<name/>
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.RefreshDefaultPI"
title="Microsoft.Test.OData.Services.ODataWCFService.RefreshDefaultPI"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Accounts(101)/Microsoft.Test.OData.Services.ODataWCFService.RefreshDefaultPI"/>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetDefaultPI"
title="Microsoft.Test.OData.Services.ODataWCFService.GetDefaultPI"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Accounts(101)/Microsoft.Test.OData.Services.ODataWCFService.GetDefaultPI"/>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetAccountInfo"
title="Microsoft.Test.OData.Services.ODataWCFService.GetAccountInfo"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Accounts(101)/Microsoft.Test.OData.Services.ODataWCFService.GetAccountInfo"/>
<content type="application/xml">
<m:properties>
<d:AccountID m:type="Int32">101</d:AccountID>

View File

@ -0,0 +1,15 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Accounts(101)/MyGiftCard/$entity",
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.GiftCard",
"@odata.id": "Accounts(101)/MyGiftCard",
"@odata.editLink": "Accounts(101)/MyGiftCard",
"GiftCardID": 301,
"GiftCardNO": "AAA123A",
"Amount": 19.9,
"ExperationDate@odata.type": "#DateTimeOffset",
"ExperationDate": "2013-12-30T00:00:00Z",
"#Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Accounts(101)/MyGiftCard/Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount"
}
}

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<entry xml:base="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Accounts(101)/MyGiftCard/$entity">
<category term="#Microsoft.Test.OData.Services.ODataWCFService.GiftCard" scheme="http://docs.oasis-open.org/odata/ns/scheme" />
<id />
<title />
<updated>2014-04-23T13:48:48Z</updated>
<author>
<name />
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount"
title="Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Accounts(101)/MyGiftCard/Microsoft.Test.OData.Services.ODataWCFService.GetActualAmount"/>
<content type="application/xml">
<m:properties>
<d:GiftCardID m:type="Int32">301</d:GiftCardID>
<d:GiftCardNO>AAA123A</d:GiftCardNO>
<d:Amount m:type="Double">19.9</d:Amount>
<d:ExperationDate m:type="DateTimeOffset">2013-12-30T00:00:00Z</d:ExperationDate>
</m:properties>
</content>
</entry>

View File

@ -32,6 +32,12 @@
<author>
<name />
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.IncreaseRevenue"
title="Microsoft.Test.OData.Services.ODataWCFService.IncreaseRevenue"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Company/Microsoft.Test.OData.Services.ODataWCFService.IncreaseRevenue"/>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetEmployeesCount"
title="Microsoft.Test.OData.Services.ODataWCFService.GetEmployeesCount"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Company/Microsoft.Test.OData.Services.ODataWCFService.GetEmployeesCount"/>
<content type="application/xml">
<m:properties>
<d:CompanyID m:type="Int32">0</d:CompanyID>

View File

@ -0,0 +1,50 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Customers/$entity",
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Customer",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)",
"PersonID": 2,
"FirstName": "Jill",
"LastName": "Jones",
"MiddleName": null,
"HomeAddress": {
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Address",
"Street": "Piazza La Bomba E Scappa",
"City": "Tollo",
"PostalCode": "66010"
},
"Home@odata.type": "#GeographyPoint",
"Home": {
"type": "Point",
"coordinates": [161.8, 15.0],
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
}
},
"Numbers@odata.type": "#Collection(String)",
"Numbers": [],
"Emails@odata.type": "#Collection(String)",
"Emails": [],
"City": "Sydney",
"Birthday@odata.type": "#DateTimeOffset",
"Birthday": "1983-01-15T00:00:00Z",
"TimeBetweenLastTwoOrders@odata.type": "#Duration",
"TimeBetweenLastTwoOrders": "PT0.0000002S",
"Parent@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Parent/$ref",
"Parent@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Parent",
"Orders@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Orders/$ref",
"Orders@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Orders",
"Company@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Company/$ref",
"Company@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Company",
"#Microsoft.Test.OData.Services.ODataWCFService.ResetAddress": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.ResetAddress",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Microsoft.Test.OData.Services.ODataWCFService.ResetAddress"
},
"#Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress"
}
}

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<entry xml:base="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Customers/$entity">
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)</id>
<category term="#Microsoft.Test.OData.Services.ODataWCFService.Customer" scheme="http://docs.oasis-open.org/odata/ns/scheme" />
<link rel="edit" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)" />
<link rel="http://docs.oasis-open.org/odata/ns/related/Parent" type="application/atom+xml;type=entry" title="Parent" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Parent" />
<link rel="http://docs.oasis-open.org/odata/ns/related/Orders" type="application/atom+xml;type=feed" title="Orders" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Orders" />
<link rel="http://docs.oasis-open.org/odata/ns/related/Company" type="application/atom+xml;type=entry" title="Company" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Company" />
<title />
<updated>2014-04-23T15:27:13Z</updated>
<author>
<name />
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.ResetAddress"
title="Microsoft.Test.OData.Services.ODataWCFService.ResetAddress"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Microsoft.Test.OData.Services.ODataWCFService.ResetAddress"/>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress"
title="Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Customers(PersonID=2)/Microsoft.Test.OData.Services.ODataWCFService.GetHomeAddress"/>
<content type="application/xml">
<m:properties>
<d:PersonID m:type="Int32">2</d:PersonID>
<d:FirstName>Jill</d:FirstName>
<d:LastName>Jones</d:LastName>
<d:MiddleName m:null="true" />
<d:HomeAddress m:type="#Microsoft.Test.OData.Services.ODataWCFService.Address">
<d:Street>Piazza La Bomba E Scappa</d:Street>
<d:City>Tollo</d:City>
<d:PostalCode>66010</d:PostalCode>
</d:HomeAddress>
<d:Home m:type="GeographyPoint">
<gml:Point gml:srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
<gml:pos>15 161.8</gml:pos>
</gml:Point>
</d:Home>
<d:Numbers m:type="#Collection(String)" />
<d:Emails m:type="#Collection(String)" />
<d:City>Sydney</d:City>
<d:Birthday m:type="DateTimeOffset">1983-01-15T00:00:00Z</d:Birthday>
<d:TimeBetweenLastTwoOrders m:type="Duration">PT0.0000002S</d:TimeBetweenLastTwoOrders>
</m:properties>
</content>
</entry>

View File

@ -30,6 +30,9 @@
<author>
<name />
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetRelatedProduct"
title="Microsoft.Test.OData.Services.ODataWCFService.GetRelatedProduct"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/ProductDetails(ProductID=6,ProductDetailID=1)/Microsoft.Test.OData.Services.ODataWCFService.GetRelatedProduct"/>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">6</d:ProductID>

View File

@ -0,0 +1,29 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Products/$entity",
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Product",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)",
"ProductID": 5,
"Name": "Cheetos",
"QuantityPerUnit": "100g Bag",
"UnitPrice@odata.type": "#Single",
"UnitPrice": 3.24,
"QuantityInStock": 100,
"Discontinued": true,
"UserAccess@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel",
"UserAccess": "None",
"SkinColor@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Color",
"SkinColor": "Red",
"CoverColors@odata.type": "#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
"CoverColors": ["Green", "Blue", "Blue"],
"Details@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Details/$ref",
"Details@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Details",
"#Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight"
},
"#Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
}
}

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<entry xml:base="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Products/$entity">
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)</id>
<category term="#Microsoft.Test.OData.Services.ODataWCFService.Product" scheme="http://docs.oasis-open.org/odata/ns/scheme" />
<link rel="edit" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)" />
<link rel="http://docs.oasis-open.org/odata/ns/related/Details" type="application/atom+xml;type=feed" title="Details" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Details" />
<title />
<updated>2014-04-23T11:54:53Z</updated>
<author>
<name />
</author>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight"
title="Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight"/>
<m:action metadata="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
title="Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
target="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(5)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"/>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">5</d:ProductID>
<d:Name>Cheetos</d:Name>
<d:QuantityPerUnit>100g Bag</d:QuantityPerUnit>
<d:UnitPrice m:type="Single">3.24</d:UnitPrice>
<d:QuantityInStock m:type="Int32">100</d:QuantityInStock>
<d:Discontinued m:type="Boolean">true</d:Discontinued>
<d:UserAccess m:type="#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel">None</d:UserAccess>
<d:SkinColor m:type="#Microsoft.Test.OData.Services.ODataWCFService.Color">Red</d:SkinColor>
<d:CoverColors m:type="#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)">
<m:element>Green</m:element>
<m:element>Blue</m:element>
<m:element>Blue</m:element>
</d:CoverColors>
</m:properties>
</content>
</entry>

View File

@ -0,0 +1,29 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Products/$entity",
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Product",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)",
"ProductID": 6,
"Name": "Mushrooms",
"QuantityPerUnit": "Pound",
"UnitPrice@odata.type": "#Single",
"UnitPrice": 3.24,
"QuantityInStock": 100,
"Discontinued": false,
"UserAccess@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel",
"UserAccess": "ReadWrite",
"SkinColor@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Color",
"SkinColor": "Blue",
"CoverColors@odata.type": "#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
"CoverColors": ["Red", "Blue"],
"Details@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)/Details/$ref",
"Details@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)/Details",
"#Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)/Microsoft.Test.OData.Services.ODataWCFService.AddAccessRight"
},
"#Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails": {
"title": "Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails",
"target": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
}
}

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<entry xml:base="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Products/$entity">
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)</id>
<category term="#Microsoft.Test.OData.Services.ODataWCFService.Product" scheme="http://docs.oasis-open.org/odata/ns/scheme" />
<link rel="edit" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)" />
<link rel="http://docs.oasis-open.org/odata/ns/related/Details" type="application/atom+xml;type=feed" title="Details" href="http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(6)/Details" />
<title />
<updated>2014-04-23T11:58:19Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">6</d:ProductID>
<d:Name>Mushrooms</d:Name>
<d:QuantityPerUnit>Pound</d:QuantityPerUnit>
<d:UnitPrice m:type="Single">3.24</d:UnitPrice>
<d:QuantityInStock m:type="Int32">100</d:QuantityInStock>
<d:Discontinued m:type="Boolean">false</d:Discontinued>
<d:UserAccess m:type="#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel">ReadWrite</d:UserAccess>
<d:SkinColor m:type="#Microsoft.Test.OData.Services.ODataWCFService.Color">Blue</d:SkinColor>
<d:CoverColors m:type="#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)">
<m:element>Red</m:element>
<m:element>Blue</m:element>
</d:CoverColors>
</m:properties>
</content>
</entry>

View File

@ -185,6 +185,7 @@ public abstract class AbstractODataInvokeRequest<T extends ODataInvokeResult>
* Just to create response templates to be initialized from batch.
*/
private ODataInvokeResponseImpl() {
super();
}
/**
@ -203,20 +204,16 @@ public abstract class AbstractODataInvokeRequest<T extends ODataInvokeResult>
@Override
public T getBody() {
if (invokeResult == null) {
if (ODataNoContent.class.isAssignableFrom(reference)) {
invokeResult = reference.cast(new ODataNoContent());
}
try {
if (CommonODataEntitySet.class.isAssignableFrom(reference)) {
if (ODataNoContent.class.isAssignableFrom(reference)) {
invokeResult = reference.cast(new ODataNoContent());
} else if (CommonODataEntitySet.class.isAssignableFrom(reference)) {
invokeResult = reference.cast(odataClient.getReader().readEntitySet(res.getEntity().getContent(),
ODataPubFormat.fromString(getContentType())));
}
if (CommonODataEntity.class.isAssignableFrom(reference)) {
} else if (CommonODataEntity.class.isAssignableFrom(reference)) {
invokeResult = reference.cast(odataClient.getReader().readEntity(res.getEntity().getContent(),
ODataPubFormat.fromString(getContentType())));
}
if (CommonODataProperty.class.isAssignableFrom(reference)) {
} else if (CommonODataProperty.class.isAssignableFrom(reference)) {
invokeResult = reference.cast(odataClient.getReader().readProperty(res.getEntity().getContent(),
ODataFormat.fromString(getContentType())));
}

View File

@ -22,14 +22,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.uri.v4.URIBuilder;
@ -50,34 +45,13 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ODataPubFormat;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
private static final String serviceRoot = "http://odatae2etest.azurewebsites.net/javatest/DefaultService";
// TODO: remove once fit provides function / action imports
@BeforeClass
public static void checkServerIsOnline() throws IOException {
final Socket socket = new Socket();
boolean reachable = false;
try {
socket.connect(new InetSocketAddress("odatae2etest.azurewebsites.net", 80), 2000);
reachable = true;
} catch (Exception e) {
LOG.warn("External test service not reachable, ignoring this whole class: {}",
OperationImportInvokeTestITCase.class.getName());
} finally {
IOUtils.closeQuietly(socket);
}
Assume.assumeTrue(reachable);
}
private Edm getEdm() {
final Edm edm = getClient().getRetrieveRequestFactory().
getMetadataRequest(serviceRoot).execute().getBody();
getMetadataRequest(testStaticServiceRootURL).execute().getBody();
assertNotNull(edm);
return edm;
@ -89,11 +63,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertNotNull(container);
// GetEmployeesCount
URIBuilder builder = getClient().getURIBuilder(serviceRoot).appendSingletonSegment("Company");
URIBuilder builder = getClient().getURIBuilder(testStaticServiceRootURL).appendSingletonSegment("Company");
ODataEntityRequest<ODataEntity> entityReq =
getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
ODataEntity entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -112,10 +85,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertTrue(getEmployeesCountRes.hasPrimitiveValue());
// GetProductDetails
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("Products").appendKeySegment(5);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Products").appendKeySegment(5);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -135,14 +108,13 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertEquals(1, getProductDetailsRes.getCount());
// GetRelatedProduct
final Map<String, Object> keyMap = new HashMap<String, Object>();
final Map<String, Object> keyMap = new LinkedHashMap<String, Object>();
keyMap.put("ProductID", 6);
keyMap.put("ProductDetailID", 1);
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("ProductDetails").
appendKeySegment(keyMap);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("ProductDetails").appendKeySegment(keyMap);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -155,22 +127,17 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
final ODataInvokeRequest<ODataEntity> getRelatedProductReq =
getClient().getInvokeRequestFactory().getInvokeRequest(boundOp.getTarget(), func);
getRelatedProductReq.setFormat(format);
//TODO test service returns error instead of Products(6)
try {
final ODataEntity getRelatedProductRes = getRelatedProductReq.execute().getBody();
assertNotNull(getRelatedProductRes);
assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Product",
getRelatedProductRes.getTypeName().toString());
assertEquals(6, getRelatedProductRes.getProperty("ProductID").getPrimitiveValue().toCastValue(Integer.class), 0);
} catch (Exception e) {
// ignore
}
final ODataEntity getRelatedProductRes = getRelatedProductReq.execute().getBody();
assertNotNull(getRelatedProductRes);
assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Product",
getRelatedProductRes.getTypeName().toString());
assertEquals(6, getRelatedProductRes.getProperty("ProductID").getPrimitiveValue().toCastValue(Integer.class), 0);
// GetDefaultPI
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("Accounts").appendKeySegment(101);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Accounts").appendKeySegment(101);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -209,8 +176,7 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
// GetActualAmount
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(
entity.getNavigationLink("MyGiftCard").getLink());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
assertEquals(301, entity.getProperty("GiftCardID").getPrimitiveValue().toCastValue(Integer.class), 0);
@ -247,11 +213,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertNotNull(container);
// IncreaseRevenue
URIBuilder builder = getClient().getURIBuilder(serviceRoot).appendSingletonSegment("Company");
URIBuilder builder = getClient().getURIBuilder(testStaticServiceRootURL).appendSingletonSegment("Company");
ODataEntityRequest<ODataEntity> entityReq =
getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
ODataEntity entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -272,10 +237,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertTrue(increaseRevenueRes.hasPrimitiveValue());
// AddAccessRight
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("Products").appendKeySegment(5);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Products").appendKeySegment(5);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -296,10 +261,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertTrue(getProductDetailsRes.hasEnumValue());
// ResetAddress
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("Customers").appendKeySegment(2);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Customers").appendKeySegment(2);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -334,10 +299,10 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
assertEquals(2, resetAddressRes.getProperty("PersonID").getPrimitiveValue().toCastValue(Integer.class), 0);
// RefreshDefaultPI
builder = getClient().getURIBuilder(serviceRoot).appendEntitySetSegment("Accounts").appendKeySegment(101);
builder = getClient().getURIBuilder(testStaticServiceRootURL).
appendEntitySetSegment("Accounts").appendKeySegment(101);
entityReq = getClient().getRetrieveRequestFactory().getEntityRequest(builder.build());
// TODO: remove when fit is used since external test server does not advertise actions in Atom
entityReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
entityReq.setFormat(format);
entity = entityReq.execute().getBody();
assertNotNull(entity);
@ -363,12 +328,7 @@ public class BoundOperationInvokeTestITCase extends AbstractTestITCase {
@Test
public void atomActions() throws EdmPrimitiveTypeException {
//TODO test service doesn't support yet Atom POST params
try {
actions(ODataPubFormat.ATOM);
} catch (Exception e) {
// ignore
}
actions(ODataPubFormat.ATOM);
}
@Test

View File

@ -40,7 +40,6 @@ import org.apache.olingo.commons.api.edm.EdmActionImport;
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmFunctionImport;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.format.ODataPubFormat;
import org.junit.Test;

View File

@ -34,6 +34,7 @@ import org.apache.olingo.commons.api.data.Feed;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.Value;
import org.apache.olingo.commons.api.domain.ODataOperation;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.api.format.ContentType;
@ -214,7 +215,6 @@ public class AtomSerializer extends AbstractAtomDealer {
writer.writeAttribute(XMLConstants.XML_NS_URI, Constants.ATTR_XML_BASE, entry.getBaseURI().toASCIIString());
}
// server mode only
if (serverMode && StringUtils.isNotBlank(entry.getETag())) {
writer.writeAttribute(
version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA),
@ -239,7 +239,6 @@ public class AtomSerializer extends AbstractAtomDealer {
common(writer, (AbstractODataObject) entry);
}
// server mode only
if (serverMode) {
if (entry.getEditLink() != null) {
links(writer, Collections.singletonList(entry.getEditLink()));
@ -254,6 +253,17 @@ public class AtomSerializer extends AbstractAtomDealer {
links(writer, entry.getNavigationLinks());
links(writer, entry.getMediaEditLinks());
if (serverMode) {
for (ODataOperation operation : entry.getOperations()) {
writer.writeStartElement(
version.getNamespaceMap().get(ODataServiceVersion.NS_METADATA), Constants.ATOM_ELEM_ACTION);
writer.writeAttribute(Constants.ATTR_METADATA, operation.getMetadataAnchor());
writer.writeAttribute(Constants.ATTR_TITLE, operation.getTitle());
writer.writeAttribute(Constants.ATTR_TARGET, operation.getTarget().toASCIIString());
writer.writeEndElement();
}
}
writer.writeStartElement(Constants.ATOM_ELEM_CONTENT);
if (entry.isMediaEntry()) {
if (StringUtils.isNotBlank(entry.getMediaContentType())) {

View File

@ -29,6 +29,7 @@ import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.api.data.Entry;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.domain.ODataOperation;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
@ -107,6 +108,15 @@ public class JSONEntrySerializer extends AbstractJsonSerializer<JSONEntryImpl> {
}
}
if (serverMode) {
for (ODataOperation operation : entry.getOperations()) {
jgen.writeObjectFieldStart("#" + StringUtils.substringAfterLast(operation.getMetadataAnchor(), "#"));
jgen.writeStringField(Constants.ATTR_TITLE, operation.getTitle());
jgen.writeStringField(Constants.ATTR_TARGET, operation.getTarget().toASCIIString());
jgen.writeEndObject();
}
}
jgen.writeEndObject();
}
}