[OLINGO-234] OperationImportInvokeTestITCase moved to fit]

This commit is contained in:
Francesco Chicchiriccò 2014-04-23 13:26:32 +02:00
parent 32fcb8cb5e
commit f87321f98e
14 changed files with 730 additions and 94 deletions

View File

@ -419,7 +419,7 @@ public abstract class AbstractServices {
} else {
final Container<JSONEntryImpl> jcont =
mapper.readValue(IOUtils.toInputStream(changes), new TypeReference<JSONEntryImpl>() {
});
});
entryChanges = dataBinder.getAtomEntry(jcont.getObject());
}
@ -609,7 +609,7 @@ public abstract class AbstractServices {
} else {
final Container<JSONEntryImpl> jcontainer =
mapper.readValue(IOUtils.toInputStream(entity), new TypeReference<JSONEntryImpl>() {
});
});
entry = dataBinder.getAtomEntry(jcontainer.getObject());
@ -636,7 +636,7 @@ public abstract class AbstractServices {
Container<AtomEntryImpl> result = atomDeserializer.read(serialization, AtomEntryImpl.class);
result = new Container<AtomEntryImpl>(
URI.create(Constants.get(version, ConstantKey.DEFAULT_SERVICE_URL)
+ "$metadata#" + entitySetName + "/$entity"), null, result.getObject());
+ "$metadata#" + entitySetName + "/$entity"), null, result.getObject());
final String path = Commons.getEntityBasePath(entitySetName, entityKey);
FSManager.instance(version).putInMemory(
@ -698,13 +698,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, "UTF-8"),
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) {
@ -756,9 +756,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, "UTF-8"),
@ -888,7 +888,7 @@ public abstract class AbstractServices {
} else {
mapper.writeValue(
writer, new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(), container.getMetadataETag(),
dataBinder.getJsonFeed(container.getObject())));
dataBinder.getJsonFeed(container.getObject())));
}
return xml.createResponse(
@ -1503,8 +1503,8 @@ public abstract class AbstractServices {
mapper.writeValue(
writer,
new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(),
container.getMetadataETag(),
dataBinder.getJsonFeed((AtomFeedImpl) container.getObject())));
container.getMetadataETag(),
dataBinder.getJsonFeed((AtomFeedImpl) container.getObject())));
}
} else {
final Container<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
@ -1516,8 +1516,8 @@ public abstract class AbstractServices {
mapper.writeValue(
writer,
new JsonEntryContainer<JSONEntryImpl>(container.getContextURL(),
container.getMetadataETag(),
dataBinder.getJsonEntry((AtomEntryImpl) container.getObject())));
container.getMetadataETag(),
dataBinder.getJsonEntry((AtomEntryImpl) container.getObject())));
}
}

View File

@ -25,6 +25,8 @@ 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;
import java.util.Map;
@ -48,17 +50,25 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.InInterceptors;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.olingo.commons.api.data.CollectionValue;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.api.data.Entry;
import org.apache.olingo.commons.api.data.Feed;
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.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;
@ -196,7 +206,7 @@ public class V4Services extends AbstractServices {
return utils.getValue().createResponse(
FSManager.instance(version).readFile(Constants.get(version, ConstantKey.REF)
+ File.separatorChar + filename, utils.getKey()),
+ File.separatorChar + filename, utils.getKey()),
null,
utils.getKey());
} catch (Exception e) {
@ -218,7 +228,7 @@ public class V4Services extends AbstractServices {
final Response response =
getEntityInternal(uriInfo.getRequestUri().toASCIIString(),
accept, entitySetName, entityId, accept, StringUtils.EMPTY, StringUtils.EMPTY, false);
accept, entitySetName, entityId, accept, StringUtils.EMPTY, StringUtils.EMPTY, false);
return response.getStatus() >= 400
? postNewEntity(uriInfo, accept, contentType, prefer, entitySetName, changes)
: super.patchEntity(uriInfo, accept, contentType, prefer, ifMatch, entitySetName, entityId, changes);
@ -272,7 +282,7 @@ public class V4Services extends AbstractServices {
final InputStream entry = FSManager.instance(version).
readFile(containedPath(entityId, containedEntitySetName).
append('(').append(containedEntityId).append(')').toString(), Accept.ATOM);
append('(').append(containedEntityId).append(')').toString(), Accept.ATOM);
final Container<AtomEntryImpl> container = atomDeserializer.read(entry, AtomEntryImpl.class);
@ -315,7 +325,7 @@ public class V4Services extends AbstractServices {
} else {
final Container<JSONEntryImpl> jcontainer =
mapper.readValue(IOUtils.toInputStream(entity), new TypeReference<JSONEntryImpl>() {
});
});
entry = dataBinder.getAtomEntry(jcontainer.getObject());
@ -413,7 +423,7 @@ public class V4Services extends AbstractServices {
final Container<JSONEntryImpl> jsonContainer = mapper.readValue(IOUtils.toInputStream(changes),
new TypeReference<JSONEntryImpl>() {
});
});
jsonContainer.getObject().setType(typeInfo.getFullQualifiedName().toString());
entryChanges = dataBinder.getAtomEntry(jsonContainer.getObject());
}
@ -446,7 +456,7 @@ public class V4Services extends AbstractServices {
// 1. Fetch the contained entity to be removed
final InputStream entry = FSManager.instance(version).
readFile(containedPath(entityId, containedEntitySetName).
append('(').append(containedEntityId).append(')').toString(), Accept.ATOM);
append('(').append(containedEntityId).append(')').toString(), Accept.ATOM);
final Container<AtomEntryImpl> container = atomDeserializer.read(entry, AtomEntryImpl.class);
// 2. Remove the contained entity
@ -510,7 +520,7 @@ public class V4Services extends AbstractServices {
} else {
mapper.writeValue(
writer, new JsonFeedContainer<JSONFeedImpl>(container.getContextURL(), container.getMetadataETag(),
dataBinder.getJsonFeed(container.getObject())));
dataBinder.getJsonFeed(container.getObject())));
}
return xml.createResponse(
@ -522,4 +532,315 @@ public class V4Services extends AbstractServices {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/GetDefaultColor()")
public Response functionGetDefaultColor(
@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("Microsoft.Test.OData.Services.ODataWCFService.Color");
property.setValue(new EnumValueImpl("Red"));
final Container<AtomPropertyImpl> container = new Container<AtomPropertyImpl>(
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()),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/GetPerson2({param:.*})")
public Response functionGetPerson2(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getEntityInternal(
uriInfo.getRequestUri().toASCIIString(), accept, "Customers", "1", format, null, null, false);
}
@GET
@Path("/GetPerson({param:.*})")
public Response functionGetPerson(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getEntityInternal(
uriInfo.getRequestUri().toASCIIString(), accept, "Customers", "1", format, null, null, false);
}
@GET
@Path("/GetAllProducts()")
public Response functionGetAllProducts(
@Context UriInfo uriInfo,
@HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
@QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format) {
return getEntitySet(uriInfo, accept, "Products", format, null, null, null, null);
}
@GET
@Path("/GetProductsByAccessLevel({param:.*})")
public Response functionGetProductsByAccessLevel(
@Context UriInfo uriInfo,
@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("Collection(String)");
final CollectionValue value = new CollectionValueImpl();
value.get().add(new PrimitiveValueImpl("Cheetos"));
value.get().add(new PrimitiveValueImpl("Mushrooms"));
value.get().add(new PrimitiveValueImpl("Apple"));
value.get().add(new PrimitiveValueImpl("Car"));
value.get().add(new PrimitiveValueImpl("Computer"));
property.setValue(value);
final Container<AtomPropertyImpl> container = new Container<AtomPropertyImpl>(
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()),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@GET
@Path("/GetBossEmails({param:.*})")
public Response functionGetBossEmails(
@Context UriInfo uriInfo,
@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("Collection(Edm.String)");
final CollectionValue value = new CollectionValueImpl();
value.get().add(new PrimitiveValueImpl("first@olingo.apache.org"));
value.get().add(new PrimitiveValueImpl("second@olingo.apache.org"));
property.setValue(value);
final Container<AtomPropertyImpl> container = new Container<AtomPropertyImpl>(
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()),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/Discount()")
public Response actionDiscount(
@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);
Property property;
if (contentTypeValue == Accept.ATOM) {
final Container<AtomPropertyImpl> paramContainer = atomDeserializer.read(
IOUtils.toInputStream(param, Constants.ENCODING), AtomPropertyImpl.class);
property = paramContainer.getObject();
} else {
final Container<JSONPropertyImpl> paramContainer =
mapper.readValue(IOUtils.toInputStream(param, Constants.ENCODING),
new TypeReference<JSONPropertyImpl>() {
});
property = paramContainer.getObject();
}
assert property.getValue().isComplex();
assert 1 == property.getValue().asComplex().get().size();
assert "Edm.Int32".equals(property.getValue().asComplex().get().get(0).getType());
assert property.getValue().asComplex().get().get(0).getValue().isPrimitive();
assert "percentage".equals(property.getValue().asComplex().get().get(0).getName());
return xml.createResponse(null, null, null, acceptType, Response.Status.NO_CONTENT);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/ResetBossAddress()")
public Response actionResetBossAddress(
@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);
Property property;
if (contentTypeValue == Accept.XML) {
final Container<AtomPropertyImpl> paramContainer = atomDeserializer.read(
IOUtils.toInputStream(param, Constants.ENCODING), AtomPropertyImpl.class);
property = paramContainer.getObject();
} else {
final Container<JSONPropertyImpl> paramContainer =
mapper.readValue(IOUtils.toInputStream(param, Constants.ENCODING),
new TypeReference<JSONPropertyImpl>() {
});
property = paramContainer.getObject();
}
assert "Microsoft.Test.OData.Services.ODataWCFService.Address".equals(property.getType());
assert property.getValue().isComplex();
return xml.createResponse(
null,
new ByteArrayInputStream(param.getBytes(Constants.ENCODING)),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
@POST
@Path("/ResetBossEmail()")
public Response actionResetBossEmail(
@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);
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();
}
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)),
null,
acceptType);
} catch (Exception e) {
return xml.createFaultResponse(accept, e);
}
}
}

View File

@ -0,0 +1,35 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.fit.serializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
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.JSONPropertySerializer;
@JsonDeserialize(using = JSONPropertyDeserializer.class)
@JsonSerialize(using = JSONPropertySerializer.class)
public class JsonPropertyContainer<T> extends Container<T> {
public JsonPropertyContainer(final URI contextURL, final String metadataETag, final T object) {
super(contextURL, metadataETag, object);
}
}

View File

@ -0,0 +1,139 @@
{
"@odata.context": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/$metadata#Products",
"value": [{
"@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"
}
}, {
"@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"
}
}, {
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Product",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(7)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(7)",
"ProductID": 7,
"Name": "Apple",
"QuantityPerUnit": "Pound",
"UnitPrice@odata.type": "#Single",
"UnitPrice": 0.35,
"QuantityInStock": 20,
"Discontinued": false,
"UserAccess@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel",
"UserAccess": "Read",
"SkinColor@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Color",
"SkinColor": "Red",
"CoverColors@odata.type": "#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
"CoverColors": ["Blue"],
"Details@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(7)/Details/$ref",
"Details@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(7)/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(7)/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(7)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
}
}, {
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Product",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(8)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(8)",
"ProductID": 8,
"Name": "Car",
"QuantityPerUnit": "Pound",
"UnitPrice@odata.type": "#Single",
"UnitPrice": 28000,
"QuantityInStock": 300,
"Discontinued": false,
"UserAccess@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel",
"UserAccess": "Execute",
"SkinColor@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Color",
"SkinColor": "Red",
"CoverColors@odata.type": "#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
"CoverColors": ["Red", "Red", "Blue"],
"Details@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(8)/Details/$ref",
"Details@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(8)/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(8)/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(8)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
}
}, {
"@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Product",
"@odata.id": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(9)",
"@odata.editLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(9)",
"ProductID": 9,
"Name": "Computer",
"QuantityPerUnit": "Pound",
"UnitPrice@odata.type": "#Single",
"UnitPrice": 1250,
"QuantityInStock": 1000,
"Discontinued": false,
"UserAccess@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel",
"UserAccess": "Read",
"SkinColor@odata.type": "#Microsoft.Test.OData.Services.ODataWCFService.Color",
"SkinColor": "Green",
"CoverColors@odata.type": "#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)",
"CoverColors": ["Green"],
"Details@odata.associationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(9)/Details/$ref",
"Details@odata.navigationLink": "http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(9)/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(9)/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(9)/Microsoft.Test.OData.Services.ODataWCFService.GetProductDetails"
}
}]
}

View File

@ -0,0 +1,167 @@
<?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.
-->
<feed 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">
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products</id>
<title />
<updated>2014-04-23T08:04:46Z</updated>
<entry>
<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-23T08:04:46Z</updated>
<author>
<name />
</author>
<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>
<entry>
<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-23T08:04:46Z</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>
<entry>
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(7)</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(7)" />
<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(7)/Details" />
<title />
<updated>2014-04-23T08:04:46Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">7</d:ProductID>
<d:Name>Apple</d:Name>
<d:QuantityPerUnit>Pound</d:QuantityPerUnit>
<d:UnitPrice m:type="Single">0.35</d:UnitPrice>
<d:QuantityInStock m:type="Int32">20</d:QuantityInStock>
<d:Discontinued m:type="Boolean">false</d:Discontinued>
<d:UserAccess m:type="#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel">Read</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>Blue</m:element>
</d:CoverColors>
</m:properties>
</content>
</entry>
<entry>
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(8)</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(8)" />
<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(8)/Details" />
<title />
<updated>2014-04-23T08:04:46Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">8</d:ProductID>
<d:Name>Car</d:Name>
<d:QuantityPerUnit>Pound</d:QuantityPerUnit>
<d:UnitPrice m:type="Single">28000</d:UnitPrice>
<d:QuantityInStock m:type="Int32">300</d:QuantityInStock>
<d:Discontinued m:type="Boolean">false</d:Discontinued>
<d:UserAccess m:type="#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel">Execute</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>Red</m:element>
<m:element>Red</m:element>
<m:element>Blue</m:element>
</d:CoverColors>
</m:properties>
</content>
</entry>
<entry>
<id>http://localhost:${cargo.servlet.port}/StaticService/V40/Static.svc/Products(9)</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(9)" />
<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(9)/Details" />
<title />
<updated>2014-04-23T08:04:46Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:ProductID m:type="Int32">9</d:ProductID>
<d:Name>Computer</d:Name>
<d:QuantityPerUnit>Pound</d:QuantityPerUnit>
<d:UnitPrice m:type="Single">1250</d:UnitPrice>
<d:QuantityInStock m:type="Int32">1000</d:QuantityInStock>
<d:Discontinued m:type="Boolean">false</d:Discontinued>
<d:UserAccess m:type="#Microsoft.Test.OData.Services.ODataWCFService.AccessLevel">Read</d:UserAccess>
<d:SkinColor m:type="#Microsoft.Test.OData.Services.ODataWCFService.Color">Green</d:SkinColor>
<d:CoverColors m:type="#Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)">
<m:element>Green</m:element>
</d:CoverColors>
</m:properties>
</content>
</entry>
</feed>

View File

@ -70,7 +70,7 @@ public abstract class AbstractODataInvokeRequest<T extends ODataInvokeResult>
* @param uri URI that identifies the operation.
*/
public AbstractODataInvokeRequest(
final CommonODataClient odataClient,
final CommonODataClient<?> odataClient,
final Class<T> reference,
final HttpMethod method,
final URI uri) {

View File

@ -32,8 +32,8 @@ import org.apache.olingo.commons.api.format.ODataPubFormat;
public class ODataInvokeRequestImpl<T extends ODataInvokeResult> extends AbstractODataInvokeRequest<T> {
public ODataInvokeRequestImpl(final CommonODataClient odataClient, final Class<T> reference, final HttpMethod method,
final URI uri) {
public ODataInvokeRequestImpl(final CommonODataClient<?> odataClient, final Class<T> reference,
final HttpMethod method, final URI uri) {
super(odataClient, reference, method, uri);
}

View File

@ -35,8 +35,8 @@ public class ODataInvokeRequestImpl<T extends ODataInvokeResult> extends Abstrac
private ODataPubFormat format;
public ODataInvokeRequestImpl(final CommonODataClient odataClient, final Class<T> reference, final HttpMethod method,
final URI uri) {
public ODataInvokeRequestImpl(final CommonODataClient<?> odataClient, final Class<T> reference,
final HttpMethod method, final URI uri) {
super(odataClient, reference, method, uri);
}

View File

@ -77,7 +77,7 @@ public class BatchTestITCase extends AbstractTestITCase {
private static final int MAX = 10000;
// ------------------------
// Uncomment to performe check externally ...
// Uncomment to check externally ...
// ------------------------
// private final static String testStaticServiceRootURL=
// "http://odatae2etest.azurewebsites.net/javatest/DefaultService/";

View File

@ -22,13 +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.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.invoke.ODataNoContent;
import org.apache.olingo.commons.api.domain.ODataCollectionValue;
@ -46,35 +42,14 @@ 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.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
public class OperationImportInvokeTestITCase 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,7 +64,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
EdmFunctionImport funcImp = container.getFunctionImport("GetDefaultColor");
final ODataInvokeRequest<ODataProperty> defaultColorReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0));
defaultColorReq.setFormat(format);
@ -106,7 +81,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("London");
final ODataInvokeRequest<ODataEntity> person2Req = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0),
Collections.<String, ODataValue>singletonMap("city", city));
@ -129,24 +104,20 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
client.getObjectFactory().newPrimitiveValueBuilder().buildString("98052")));
final ODataInvokeRequest<ODataEntity> personReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0),
Collections.<String, ODataValue>singletonMap("address", address));
personReq.setFormat(format);
//TODO test service doesn't support yet complex and collection values as inline parameters
try {
final ODataEntity person = personReq.execute().getBody();
assertNotNull(person);
} catch (Exception e) {
// ignore
}
final ODataEntity person = personReq.execute().getBody();
assertNotNull(person);
assertEquals(person2, person);
// GetAllProducts
funcImp = container.getFunctionImport("GetAllProducts");
final ODataInvokeRequest<ODataEntitySet> productsReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0));
productsReq.setFormat(format);
@ -161,7 +132,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
newEnumValue("Microsoft.Test.OData.Services.ODataWCFService.AccessLevel", "None");
final ODataInvokeRequest<ODataProperty> prodByALReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0),
Collections.<String, ODataValue>singletonMap("accessLevel", accessLevel));
@ -193,7 +164,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
final ODataPrimitiveValue percentage = getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(22);
final ODataInvokeRequest<ODataNoContent> discountReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(actImp.getName()).build(),
actImp.getUnboundAction(),
Collections.<String, ODataValue>singletonMap("percentage", percentage));
@ -214,7 +185,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
client.getObjectFactory().newPrimitiveValueBuilder().buildString("66010")));
final ODataInvokeRequest<ODataProperty> resetBossAddressReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(actImp.getName()).build(),
actImp.getUnboundAction(),
Collections.<String, ODataValue>singletonMap("address", address));
@ -225,12 +196,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
@Test
public void atomActionImports() {
//TODO test service doesn't support yet Atom POST params
try {
actionImports(ODataPubFormat.ATOM);
} catch (Exception e) {
// ignore
}
actionImports(ODataPubFormat.ATOM);
}
@Test
@ -247,12 +213,11 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
final EdmActionImport actImp = container.getActionImport("ResetBossEmail");
final ODataCollectionValue<org.apache.olingo.commons.api.domain.v4.ODataValue> emails =
getClient().getObjectFactory().newCollectionValue(
EdmPrimitiveTypeKind.String.getFullQualifiedName().toString());
getClient().getObjectFactory().newCollectionValue("Collection(Edm.String)");
emails.add(getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("first@olingo.apache.org"));
emails.add(getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("second@olingo.apache.org"));
ODataInvokeRequest<ODataProperty> bossEmailsReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(actImp.getName()).build(),
actImp.getUnboundAction(),
Collections.<String, ODataValue>singletonMap("emails", emails));
@ -268,7 +233,7 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
params.put("start", getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(0));
params.put("count", getClient().getObjectFactory().newPrimitiveValueBuilder().buildInt32(100));
bossEmailsReq = getClient().getInvokeRequestFactory().
getInvokeRequest(getClient().getURIBuilder(serviceRoot).
getInvokeRequest(getClient().getURIBuilder(testStaticServiceRootURL).
appendOperationCallSegment(funcImp.getName()).build(),
funcImp.getUnboundFunctions().get(0),
params);
@ -277,17 +242,13 @@ public class OperationImportInvokeTestITCase extends AbstractTestITCase {
assertNotNull(bossEmailsViaGET);
assertTrue(bossEmailsViaGET.hasCollectionValue());
assertEquals(2, bossEmailsViaGET.getCollectionValue().size());
assertEquals(bossEmails, bossEmailsViaGET);
assertEquals(bossEmails.getCollectionValue().asJavaCollection(),
bossEmailsViaGET.getCollectionValue().asJavaCollection());
}
@Test
public void atomBossEmails() throws EdmPrimitiveTypeException {
//TODO test service doesn't support yet Atom POST params
try {
bossEmails(ODataPubFormat.ATOM);
} catch (Exception e) {
// ignore
}
bossEmails(ODataPubFormat.ATOM);
}
@Test

View File

@ -195,7 +195,7 @@ abstract class AbstractJsonSerializer<T> extends ODataJacksonSerializer<T> {
}
protected void property(final JsonGenerator jgen, final Property property, final String name) throws IOException {
if (serverMode) {
if (serverMode && !Constants.VALUE.equals(name)) {
String type = property.getType();
if (StringUtils.isBlank(type)
&& property.getValue().isPrimitive() || property.getValue().isNull()) {

View File

@ -229,8 +229,10 @@ public class AtomSerializer extends AbstractAtomDealer {
writer.writeStartElement(Constants.ATOM_ELEM_CATEGORY);
writer.writeAttribute(Constants.ATOM_ATTR_SCHEME, version.getNamespaceMap().get(ODataServiceVersion.NS_SCHEME));
writer.writeAttribute(Constants.ATOM_ATTR_TERM,
new EdmTypeInfo.Builder().setTypeExpression(entry.getType()).build().external(version));
if (StringUtils.isNotBlank(entry.getType())) {
writer.writeAttribute(Constants.ATOM_ATTR_TERM,
new EdmTypeInfo.Builder().setTypeExpression(entry.getType()).build().external(version));
}
writer.writeEndElement();
if (entry instanceof AbstractODataObject) {

View File

@ -52,21 +52,14 @@ public class JSONEntrySerializer extends AbstractJsonSerializer<JSONEntryImpl> {
jgen.writeStartObject();
if (StringUtils.isNotBlank(entry.getType())) {
jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE),
new EdmTypeInfo.Builder().setTypeExpression(entry.getType()).build().external(version));
}
if (serverMode) {
if (container.getContextURL() != null) {
jgen.writeStringField(version.compareTo(ODataServiceVersion.V40) >= 0
? Constants.JSON_CONTEXT : Constants.JSON_METADATA,
container.getContextURL().toASCIIString());
}
if (version.compareTo(ODataServiceVersion.V40) >= 0) {
if (StringUtils.isNotBlank(container.getMetadataETag())) {
jgen.writeStringField(Constants.JSON_METADATA_ETAG, container.getMetadataETag());
}
if (version.compareTo(ODataServiceVersion.V40) >= 0 && StringUtils.isNotBlank(container.getMetadataETag())) {
jgen.writeStringField(Constants.JSON_METADATA_ETAG, container.getMetadataETag());
}
if (StringUtils.isNotBlank(entry.getETag())) {
@ -74,6 +67,11 @@ public class JSONEntrySerializer extends AbstractJsonSerializer<JSONEntryImpl> {
}
}
if (StringUtils.isNotBlank(entry.getType())) {
jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE),
new EdmTypeInfo.Builder().setTypeExpression(entry.getType()).build().external(version));
}
if (entry.getId() != null) {
jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_ID), entry.getId());
}

View File

@ -22,9 +22,11 @@ import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import org.apache.commons.lang3.StringUtils;
import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.Container;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.commons.core.edm.EdmTypeInfo;
/**
@ -49,6 +51,17 @@ public class JSONPropertySerializer extends AbstractJsonSerializer<JSONPropertyI
jgen.writeStartObject();
if (serverMode && container.getContextURL() != null) {
jgen.writeStringField(version.compareTo(ODataServiceVersion.V40) >= 0
? Constants.JSON_CONTEXT : Constants.JSON_METADATA,
container.getContextURL().toASCIIString());
}
if (StringUtils.isNotBlank(property.getType())) {
jgen.writeStringField(version.getJSONMap().get(ODataServiceVersion.JSON_TYPE),
new EdmTypeInfo.Builder().setTypeExpression(property.getType()).build().external(version));
}
if (property.getValue().isNull()) {
jgen.writeBooleanField(Constants.JSON_NULL, true);
} else if (property.getValue().isPrimitive()) {