[OLINGO-1207] Sample project supporting containment navigation

This commit is contained in:
ramya vasanth 2017-12-01 09:56:36 +05:30
parent 73d1e2e07f
commit b86aa5d977
13 changed files with 983 additions and 44 deletions

View File

@ -95,6 +95,10 @@ public class DataCreator {
data.put("ESTwoPrimDerived", createESTwoPrimDerived(edm, odata));
data.put("ESAllPrimDerived", createESAllPrimDerived(edm, odata));
data.put("ESDelta", createESDelta(edm, odata));
data.put("ESKeyNavCont", createESKeyNavCont(edm, odata));
data.put("ETCont", createETCont(edm, odata));
data.put("ETBaseCont", createETBaseCont(edm, odata));
data.put("ETTwoCont", createETTwoCont(edm, odata));
linkSINav(data);
linkESTwoPrim(data);
@ -104,6 +108,8 @@ public class DataCreator {
linkESTwoKeyNav(data);
linkESPeople(data);
linkESDelta(data);
linkESKeyNavCont(data);
linkETBaseCont(data);
}
@ -1697,6 +1703,35 @@ public class DataCreator {
esTwoKeyNavTargets.get(1));
}
private void linkESKeyNavCont(final Map<String, EntityCollection> data) {
final EntityCollection entityCollection = data.get("ESKeyNavCont");
final List<Entity> targetEntities = data.get("ETCont").getEntities();
final List<Entity> etBaseContEntities = data.get("ETBaseCont").getEntities();
setLinks(entityCollection.getEntities().get(1), "NavPropertyETContMany", targetEntities.get(1),
targetEntities.get(2));
setLinkForContNav(entityCollection.getEntities().get(3), "NavPropertyETContOne", targetEntities.get(0));
setLinks(entityCollection.getEntities().get(2), "NavPropertyETBaseContMany", etBaseContEntities.get(1),
etBaseContEntities.get(2));
}
protected static void setLinkForContNav(final Entity entity,
final String navigationPropertyName, final Entity target) {
Link link = entity.getNavigationLink(navigationPropertyName);
if (link == null) {
link = new Link();
link.setRel(Constants.NS_NAVIGATION_LINK_REL + navigationPropertyName);
link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE);
link.setTitle(navigationPropertyName);
link.setHref(entity.getId().toASCIIString() +
(navigationPropertyName != null && navigationPropertyName.length() > 0 ? "/" + navigationPropertyName: ""));
entity.getNavigationLinks().add(link);
}
link.setInlineEntity(target);
}
protected static Property createPrimitive(final String name, final Object value) {
return new Property(null, name, ValueType.PRIMITIVE, value);
}
@ -1848,4 +1883,263 @@ public class DataCreator {
}
}
}
private EntityCollection createESKeyNavCont(final Edm edm, final OData odata) {
EntityCollection entityCollection = new EntityCollection();
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) 32766))
.addProperty(createPrimitive("PropertyString", "Test String1"))
.addProperty(createComplex("PropertyCompNavCont",
ComplexTypeProvider.nameCTNavCont.getFullQualifiedNameAsString())));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) -365))
.addProperty(createPrimitive("PropertyString", "Test String2"))
.addProperty(createComplex("PropertyCompNavCont",
ComplexTypeProvider.nameCTNavCont.getFullQualifiedNameAsString())));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) -32766))
.addProperty(createPrimitive("PropertyString", "Test String3"))
.addProperty(createComplex("PropertyCompNavCont",
ComplexTypeProvider.nameCTNavCont.getFullQualifiedNameAsString())));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE))
.addProperty(createPrimitive("PropertyString", "Test String4"))
.addProperty(createComplex("PropertyCompNavCont",
ComplexTypeProvider.nameCTNavCont.getFullQualifiedNameAsString())));
setEntityType(entityCollection, edm.getEntityType(EntityTypeProvider.nameETKeyNavCont));
createEntityId(edm, odata, "ESKeyNavCont", entityCollection);
createOperations("ESKeyNavCont", entityCollection, EntityTypeProvider.nameETKeyNavCont);
return entityCollection;
}
private EntityCollection createETCont(final Edm edm, final OData odata) {
EntityCollection entityCollection = new EntityCollection();
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE))
.addProperty(createPrimitive("PropertyString", "First Resource - positive values"))
.addProperty(createPrimitive("PropertyBoolean", true))
.addProperty(createPrimitive("PropertyByte", (short) 255))
.addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt32", Integer.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MAX_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) 1.79000000E+20))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+19))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2012, 12, 3)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2012, 12, 3, 7, 16, 23)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(6)))
.addProperty(createPrimitive("PropertyGuid", GUID))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE))
.addProperty(createPrimitive("PropertyString", "Second Resource - negative values"))
.addProperty(createPrimitive("PropertyBoolean", false))
.addProperty(createPrimitive("PropertyByte", (short) 0))
.addProperty(createPrimitive("PropertySByte", Byte.MIN_VALUE))
.addProperty(createPrimitive("PropertyInt32", Integer.MIN_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MIN_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) -1.79000000E+08))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+05))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(-34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2015, 11, 5)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 7, 17, 8)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(9)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) 0))
.addProperty(createPrimitive("PropertyString", ""))
.addProperty(createPrimitive("PropertyBoolean", false))
.addProperty(createPrimitive("PropertyByte", (short) 0))
.addProperty(createPrimitive("PropertySByte", 0))
.addProperty(createPrimitive("PropertyInt32", 0))
.addProperty(createPrimitive("PropertyInt64", 0L))
.addProperty(createPrimitive("PropertySingle", (float) 0))
.addProperty(createPrimitive("PropertyDouble", 0D))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyBinary", new byte[] {}))
.addProperty(createPrimitive("PropertyDate", getDate(1970, 1, 1)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 0, 0, 0)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
setEntityType(entityCollection, edm.getEntityType(EntityTypeProvider.nameETCont));
createEntityId(edm, odata, "ESKeyNavCont", entityCollection);
String id = "ESKeyNavCont(-365)";
id = id + "/NavPropertyETContMany(" +
entityCollection.getEntities().get(1).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(1).setId(URI.create(id));
id = "ESKeyNavCont(-365)";
id = id + "/NavPropertyETContMany(" +
entityCollection.getEntities().get(2).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(2).setId(URI.create(id));
id = "ESKeyNavCont(32766)";
id = id + "/NavPropertyETContOne(" +
entityCollection.getEntities().get(0).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(0).setId(URI.create(id));
return entityCollection;
}
private EntityCollection createETBaseCont(final Edm edm, final OData odata) {
EntityCollection entityCollection = new EntityCollection();
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE))
.addProperty(createPrimitive("PropertyString", "First Resource - positive values"))
.addProperty(createPrimitive("PropertyInt32", Integer.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MAX_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) 1.79000000E+20))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+19))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2012, 12, 3)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2012, 12, 3, 7, 16, 23)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(6)))
.addProperty(createPrimitive("PropertyGuid", GUID))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE))
.addProperty(createPrimitive("PropertyString", "Second Resource - negative values"))
.addProperty(createPrimitive("PropertyInt32", Integer.MIN_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MIN_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) -1.79000000E+08))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+05))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(-34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2015, 11, 5)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 7, 17, 8)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(9)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) 0))
.addProperty(createPrimitive("PropertyString", ""))
.addProperty(createPrimitive("PropertyInt32", 0))
.addProperty(createPrimitive("PropertyInt64", 0L))
.addProperty(createPrimitive("PropertySingle", (float) 0))
.addProperty(createPrimitive("PropertyDouble", 0D))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyBinary", new byte[] {}))
.addProperty(createPrimitive("PropertyDate", getDate(1970, 1, 1)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 0, 0, 0)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
setEntityType(entityCollection, edm.getEntityType(EntityTypeProvider.nameETBaseCont));
createEntityId(edm, odata, "ESKeyNavCont", entityCollection);
String id = "ESKeyNavCont(-32766)";
id = id + "/NavPropertyETBaseContMany(" +
entityCollection.getEntities().get(1).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(1).setId(URI.create(id));
id = "ESKeyNavCont(-32766)";
id = id + "/NavPropertyETBaseContMany(" +
entityCollection.getEntities().get(2).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(2).setId(URI.create(id));
return entityCollection;
}
private void linkETBaseCont(final Map<String, EntityCollection> data) {
final EntityCollection entityCollection = data.get("ETBaseCont");
final List<Entity> etTwoContEntities = data.get("ETTwoCont").getEntities();
setLinkForContNav(entityCollection.getEntities().get(1),
"NavPropertyETBaseContTwoContOne", etTwoContEntities.get(0));
setLinks(entityCollection.getEntities().get(2), "NavPropertyETBaseContTwoContMany", etTwoContEntities.get(1),
etTwoContEntities.get(2));
}
private EntityCollection createETTwoCont(final Edm edm, final OData odata) {
EntityCollection entityCollection = new EntityCollection();
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE))
.addProperty(createPrimitive("PropertyString", "First Resource - positive values"))
.addProperty(createPrimitive("PropertyBoolean", true))
.addProperty(createPrimitive("PropertyByte", (short) 255))
.addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt32", Integer.MAX_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MAX_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) 1.79000000E+20))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+19))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2012, 12, 3)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2012, 12, 3, 7, 16, 23)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(6)))
.addProperty(createPrimitive("PropertyGuid", GUID))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE))
.addProperty(createPrimitive("PropertyString", "Second Resource - negative values"))
.addProperty(createPrimitive("PropertyBoolean", false))
.addProperty(createPrimitive("PropertyByte", (short) 0))
.addProperty(createPrimitive("PropertySByte", Byte.MIN_VALUE))
.addProperty(createPrimitive("PropertyInt32", Integer.MIN_VALUE))
.addProperty(createPrimitive("PropertyInt64", Long.MIN_VALUE))
.addProperty(createPrimitive("PropertySingle", (float) -1.79000000E+08))
.addProperty(createPrimitive("PropertyDouble", -1.7900000000000000E+05))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(-34)))
.addProperty(createPrimitive("PropertyBinary",
new byte[] { 0x01, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF }))
.addProperty(createPrimitive("PropertyDate", getDate(2015, 11, 5)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 7, 17, 8)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(9)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14))));
entityCollection.getEntities().add(new Entity()
.addProperty(createPrimitive("PropertyInt16", (short) 0))
.addProperty(createPrimitive("PropertyString", ""))
.addProperty(createPrimitive("PropertyBoolean", false))
.addProperty(createPrimitive("PropertyByte", (short) 0))
.addProperty(createPrimitive("PropertySByte", 0))
.addProperty(createPrimitive("PropertyInt32", 0))
.addProperty(createPrimitive("PropertyInt64", 0L))
.addProperty(createPrimitive("PropertySingle", (float) 0))
.addProperty(createPrimitive("PropertyDouble", 0D))
.addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyBinary", new byte[] {}))
.addProperty(createPrimitive("PropertyDate", getDate(1970, 1, 1)))
.addProperty(createPrimitive("PropertyDateTimeOffset", getDateTime(2005, 12, 3, 0, 0, 0)))
.addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(0)))
.addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
.addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
setEntityType(entityCollection, edm.getEntityType(EntityTypeProvider.nameETTwoCont));
createEntityId(edm, odata, "ESKeyNavCont", entityCollection);
String id = "ESKeyNavCont(-32766)/NavPropertyETBaseContMany(-32768)";
id = id + "/NavPropertyETBaseContTwoContOne(" +
entityCollection.getEntities().get(0).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(0).setId(URI.create(id));
id = "ESKeyNavCont(-32766)/NavPropertyETBaseContMany(0)";
id = id + "/NavPropertyETBaseContTwoContMany(" +
entityCollection.getEntities().get(1).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(1).setId(URI.create(id));
id = "ESKeyNavCont(-32766)/NavPropertyETBaseContMany(0)";
id = id + "/NavPropertyETBaseContTwoContMany(" +
entityCollection.getEntities().get(2).getProperty("PropertyInt16").getValue() + ")";
entityCollection.getEntities().get(2).setId(URI.create(id));
return entityCollection;
}
}

View File

@ -31,6 +31,7 @@ import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.ComplexValue;
import org.apache.olingo.commons.api.data.DeletedEntity;
import org.apache.olingo.commons.api.data.DeletedEntity.Reason;
@ -870,4 +871,109 @@ public class DataProvider {
}
return null;
}
public Entity createContNav(final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType,
final Entity newEntity, List<UriParameter> keys, String navPropertyName) throws DataProviderException {
List<Entity> rootEntity = data.get(edmEntitySet.getName()).getEntities();
EntityCollection entitySet = data.get(edmEntityType.getName());
entitySet.getEntities().add(newEntity);
for (Entity entity : rootEntity) {
if (isRootEntity(entity, keys)){
String id = entity.getId().toASCIIString() + "/" + navPropertyName +
appendKeys(newEntity.getProperties(), edmEntityType.getKeyPredicateNames());
newEntity.setId(URI.create(id));
Link link = entity.getNavigationLink(navPropertyName);
if (link == null) {
link = new Link();
link.setRel(Constants.NS_NAVIGATION_LINK_REL + navPropertyName);
link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE);
link.setTitle(navPropertyName);
link.setHref(entity.getId().toASCIIString() +
(navPropertyName != null && navPropertyName.length() > 0 ? "/" + navPropertyName: ""));
entity.getNavigationLinks().add(link);
}
if (link.getInlineEntitySet() != null) {
link.getInlineEntitySet().getEntities().add(newEntity);
} else {
EntityCollection collection = new EntityCollection();
collection.getEntities().add(newEntity);
link.setInlineEntitySet(collection);
}
}
}
return newEntity;
}
private String appendKeys(List<Property> properties, List<String> keyNames) {
StringBuilder keyValue = new StringBuilder();
keyValue.append("(");
for (int i = 0; i < keyNames.size(); i++) {
for (Property property : properties) {
if (property.getName().equals(keyNames.get(i))) {
keyValue.append(property.getName()).append("=");
keyValue.append(property.getValue());
}
if (i < keyNames.size() - 1) {
keyValue.append(",");
}
}
}
keyValue.append(")");
return keyValue.toString();
}
private boolean isRootEntity(Entity entity, List<UriParameter> keys) {
boolean found = false;
for (UriParameter key : keys) {
if (entity.getProperty(key.getName()).getValue().toString().equals(key.getText())) {
found = true;
} else {
found = false;
}
}
return found;
}
public Entity readDataFromEntity(final EdmEntityType edmEntityType,
final List<UriParameter> keys) throws DataProviderException {
EntityCollection coll = data.get(edmEntityType.getName());
List<Entity> entities = coll.getEntities();
try {
for (final Entity entity : entities) {
boolean found = true;
for (final UriParameter key : keys) {
EdmKeyPropertyRef refType = edmEntityType.getKeyPropertyRef(key.getName());
Object value = findPropertyRefValue(entity, refType);
final EdmProperty property = refType.getProperty();
final EdmPrimitiveType type = (EdmPrimitiveType) property.getType();
if (key.getExpression() != null && !(key.getExpression() instanceof Literal)) {
throw new DataProviderException("Expression in key value is not supported yet!",
HttpStatusCode.NOT_IMPLEMENTED);
}
final String text = key.getAlias() == null ? key.getText() : ((Literal) key.getExpression()).getText();
final Object keyValue = type.valueOfString(type.fromUriLiteral(text),
property.isNullable(), property.getMaxLength(), property.getPrecision(), property.getScale(),
property.isUnicode(),
Calendar.class.isAssignableFrom(value.getClass()) ? Calendar.class : value.getClass());
if (!value.equals(keyValue)) {
found = false;
break;
}
}
if (found) {
return entity;
}
}
return null;
} catch (final EdmPrimitiveTypeException e) {
throw new DataProviderException("Wrong key!", HttpStatusCode.BAD_REQUEST, e);
}
}
}

View File

@ -175,7 +175,9 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
public void createEntity(final ODataRequest request, final ODataResponse response, final UriInfo uriInfo,
final ContentType requestFormat, final ContentType responseFormat)
throws ODataApplicationException, ODataLibraryException {
if (uriInfo.asUriInfoResource().getUriResourceParts().size() > 1) {
final boolean isContNav = checkIfContNavigation(uriInfo);
if (uriInfo.asUriInfoResource().getUriResourceParts().size() > 1 && !isContNav ||
isContNav && uriInfo.asUriInfoResource().getUriResourceParts().size() > 2) {
throw new ODataApplicationException("Invalid resource type.",
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
}
@ -194,7 +196,11 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final UriResourceEntitySet resourceEntitySet = (UriResourceEntitySet) uriInfo.getUriResourceParts().get(0);
final EdmEntitySet edmEntitySet = resourceEntitySet.getEntitySet();
final EdmEntityType edmEntityType = edmEntitySet.getEntityType();
EdmEntityType edmEntityType = null;
edmEntityType = getEdmTypeForContNavProperty(uriInfo);
if (edmEntityType == null) {
edmEntityType = edmEntitySet.getEntityType();
}
final Entity entity;
ExpandOption expand = null;
@ -208,8 +214,14 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
new RequestValidator(dataProvider, request.getRawBaseUri())
.validate(edmEntitySet, deserializerResult.getEntity());
if (isContNav) {
entity = dataProvider.createContNav(edmEntitySet, edmEntityType, deserializerResult.getEntity(),
((UriResourceEntitySet)uriInfo.getUriResourceParts().get(0)).getKeyPredicates(),
((UriResourceNavigation)uriInfo.getUriResourceParts().get(1)).getSegmentValue());
} else {
entity = dataProvider.create(edmEntitySet);
dataProvider.update(request.getRawBaseUri(), edmEntitySet, entity, deserializerResult.getEntity(), false, true);
}
expand = deserializerResult.getExpandTree();
}
@ -217,8 +229,8 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
+ odata.createUriHelper().buildCanonicalURL(edmEntitySet, entity);
final Return returnPreference = odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).getReturn();
if (returnPreference == null || returnPreference == Return.REPRESENTATION) {
response.setContent(serializeEntity(request, entity, edmEntitySet, edmEntityType, responseFormat, expand, null)
.getContent());
response.setContent(serializeEntity(request, entity, edmEntitySet, edmEntityType, responseFormat,
expand, null, isContNav).getContent());
response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
response.setStatusCode(HttpStatusCode.CREATED.getStatusCode());
} else {
@ -450,7 +462,12 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
//for Singleton/$ref edmEntityset will be null throw error
validateSingletonRef(isReference,edmEntitySet);
final EdmEntityType edmEntityType = getEdmType(uriInfo, edmEntitySet);
EdmEntityType edmEntityType = null;
edmEntityType = getEdmTypeForContNavProperty(uriInfo);
final boolean iscontNav = checkIfContNavigation(uriInfo);
if (edmEntityType == null) {
edmEntityType = getEdmType(uriInfo, edmEntitySet);
}
final Entity entity = readEntity(uriInfo);
@ -472,7 +489,8 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final SerializerResult serializerResult = isReference ?
serializeReference(entity, edmEntitySet, requestedFormat) :
serializeEntity(request, entitySerialization, edmEntitySet, edmEntityType, requestedFormat, expand, select);
serializeEntity(request, entitySerialization, edmEntitySet, edmEntityType,
requestedFormat, expand, select, iscontNav);
if (entity.getETag() != null) {
response.setHeader(HttpHeader.ETAG, entity.getETag());
@ -482,6 +500,39 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
response.setHeader(HttpHeader.CONTENT_TYPE, requestedFormat.toContentTypeString());
}
private boolean checkIfContNavigation(UriInfo uriInfo) {
List<UriResource> pathSegments = uriInfo.getUriResourceParts();
for(UriResource resource : pathSegments) {
if (resource instanceof UriResourceNavigation) {
UriResourceNavigation navResource = (UriResourceNavigation) resource;
if (navResource.getProperty().containsTarget()) {
return true;
}
}
}
return false;
}
private EdmEntityType getEdmTypeForContNavProperty(UriInfo uriInfo) {
List<UriResource> pathSegments = uriInfo.getUriResourceParts();
EdmEntityType type = null;
for(UriResource resource : pathSegments) {
if (resource instanceof UriResourceNavigation) {
UriResourceNavigation navResource = (UriResourceNavigation) resource;
if (navResource.getProperty().containsTarget()) {
if (navResource.getTypeFilterOnCollection() != null) {
type = ((EdmEntityType) navResource.getTypeFilterOnCollection());
} else if (navResource.getTypeFilterOnEntry() != null) {
type = ((EdmEntityType) navResource.getTypeFilterOnEntry());
} else {
type = ((EdmEntityType) navResource.getType());
}
}
}
}
return type;
}
/*This method validates if the $ref is called directly on Singleton
* Error is thrown when $ref is called on a Singleton as it is not implemented*/
private void validateSingletonRef(boolean isReference, EdmEntitySet edmEntitySet) throws
@ -530,10 +581,15 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
//
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
final EdmEntityType edmEntityType = edmEntitySet == null ?
final boolean isContNav = checkIfContNavigation(uriInfo);
EdmEntityType edmEntityType = null;
edmEntityType = getEdmTypeForContNavProperty(uriInfo);
if (edmEntityType == null) {
edmEntityType = edmEntitySet == null ?
(EdmEntityType) ((UriResourcePartTyped) uriInfo.getUriResourceParts()
.get(uriInfo.getUriResourceParts().size() - 1)).getType() :
edmEntitySet.getEntityType();
}
EntityCollection entitySetInitial = readEntityCollection(uriInfo);
Delta delta = null;
@ -640,7 +696,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
final SerializerResult serializerResult =
serializeEntityCollection(request,
entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType,
expand, select, countOption, id);
expand, select, countOption, id, isContNav);
response.setContent(serializerResult.getContent());
}
@ -681,7 +737,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
edmEntityType, delta,
EntityCollectionSerializerOptions.with()
.contextURL(isODataMetadataNone(requestedFormat) ? null :
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select))
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select, false))
.count(countOption)
.expand(expand).select(select)
.id(id)
@ -707,7 +763,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
private SerializerResult serializeEntityCollection(final ODataRequest request, final EntityCollection
entityCollection, final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType,
final ContentType requestedFormat, final ExpandOption expand, final SelectOption select,
final CountOption countOption, String id) throws ODataLibraryException {
final CountOption countOption, String id, final boolean isContNav) throws ODataLibraryException {
return odata.createSerializer(requestedFormat, request.getHeaders(HttpHeader.ODATA_VERSION))
.entityCollection(
@ -716,7 +772,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
entityCollection,
EntityCollectionSerializerOptions.with()
.contextURL(isODataMetadataNone(requestedFormat) ? null :
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select))
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select, isContNav))
.count(countOption)
.expand(expand).select(select)
.id(id)
@ -797,7 +853,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
streamCollection,
EntityCollectionSerializerOptions.with()
.contextURL(isODataMetadataNone(requestedFormat) ? null :
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select))
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, false, expand, select, false))
.count(countOption)
.expand(expand).select(select)
.id(id)
@ -826,17 +882,17 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
private SerializerResult serializeEntity(final ODataRequest request, final Entity entity,
final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType,
final ContentType requestedFormat) throws ODataLibraryException {
return serializeEntity(request, entity, edmEntitySet, edmEntityType, requestedFormat, null, null);
return serializeEntity(request, entity, edmEntitySet, edmEntityType, requestedFormat, null, null, false);
}
private SerializerResult serializeEntity(final ODataRequest request, final Entity entity,
final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType,
final ContentType requestedFormat,
final ExpandOption expand, final SelectOption select)
final ExpandOption expand, final SelectOption select, final boolean isContNav)
throws ODataLibraryException {
ContextURL contextUrl = isODataMetadataNone(requestedFormat) ? null :
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, true, expand, null);
getContextUrl(request.getRawODataPath(), edmEntitySet, edmEntityType, true, expand, null,isContNav);
return odata.createSerializer(requestedFormat, request.getHeaders(HttpHeader.ODATA_VERSION)).entity(
serviceMetadata,
edmEntityType,
@ -848,12 +904,12 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
}
private ContextURL getContextUrl(String rawODataPath, final EdmEntitySet entitySet, final EdmEntityType entityType,
final boolean isSingleEntity, final ExpandOption expand, final SelectOption select)
final boolean isSingleEntity, final ExpandOption expand, final SelectOption select, final boolean isContNav)
throws ODataLibraryException {
Builder builder = ContextURL.with().oDataPath(rawODataPath);
builder = entitySet == null ?
isSingleEntity ? builder.type(entityType) : builder.asCollection().type(entityType) :
builder.entitySet(entitySet);
!isContNav ? builder.entitySet(entitySet) : builder.entitySetOrSingletonOrType(rawODataPath.substring(1));
builder = builder
.selectList(odata.createUriHelper().buildContextURLSelectList(entityType, expand, select))
.suffix(isSingleEntity && entitySet != null ? Suffix.ENTITY : null);

View File

@ -111,8 +111,7 @@ public abstract class TechnicalProcessor implements Processor {
(UriResourceNavigation) resourcePaths.get(navigationCount);
blockTypeFilters(uriResourceNavigation);
if (uriResourceNavigation.getProperty().containsTarget()) {
throw new ODataApplicationException("Containment navigation is not supported.",
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
return entitySet;
}
EdmBindingTarget target = null ;
if(entitySet!=null){
@ -203,6 +202,8 @@ public abstract class TechnicalProcessor implements Processor {
key.isEmpty() ?
link.getInlineEntity() :
dataProvider.read(navigationProperty.getType(), link.getInlineEntitySet(), key);
EdmEntityType edmEntityType = getEntityTypeBasedOnNavPropertyTypeCast(uriNavigationResource);
entity = edmEntityType != null ? dataProvider.readDataFromEntity(edmEntityType, key) : entity;
if (entity == null) {
throw new ODataApplicationException("Nothing found.", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ROOT);
}
@ -211,6 +212,16 @@ public abstract class TechnicalProcessor implements Processor {
return entity;
}
private EdmEntityType getEntityTypeBasedOnNavPropertyTypeCast(UriResourceNavigation uriNavigationResource) {
if (uriNavigationResource.getTypeFilterOnCollection() != null) {
return (EdmEntityType) uriNavigationResource.getTypeFilterOnCollection();
} else if (uriNavigationResource.getTypeFilterOnEntry() != null) {
return (EdmEntityType) uriNavigationResource.getTypeFilterOnEntry();
}
return null;
}
protected EdmEntitySet getEntitySetBasedOnTypeCast(UriResourceEntitySet uriResource) {
EdmEntitySet entitySet = null;
EdmEntityContainer container = this.serviceMetadata.getEdm().getEntityContainer();
@ -301,10 +312,7 @@ public abstract class TechnicalProcessor implements Processor {
private void blockTypeFilters(final UriResource uriResource) throws ODataApplicationException {
if (uriResource instanceof UriResourceFunction
&& (((UriResourceFunction) uriResource).getTypeFilterOnCollection() != null
|| ((UriResourceFunction) uriResource).getTypeFilterOnEntry() != null)
|| uriResource instanceof UriResourceNavigation
&& (((UriResourceNavigation) uriResource).getTypeFilterOnCollection() != null
|| ((UriResourceNavigation) uriResource).getTypeFilterOnEntry() != null)) {
|| ((UriResourceFunction) uriResource).getTypeFilterOnEntry() != null)) {
throw new ODataApplicationException("Type filters are not supported.",
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
}

View File

@ -182,7 +182,9 @@ public class ComplexTypeProvider {
PropertyProvider.navPropertyETKeyNavOne_CT_ETeyNav,
PropertyProvider.collectionNavPropertyETKeyNavMany_CT_ETKeyNav,
PropertyProvider.navPropertyETTwoKeyNavOne_CT_ETTwoKeyNav,
PropertyProvider.collectionNavPropertyETTwoKeyNavMany_CT_ETTwoKeyNav
PropertyProvider.collectionNavPropertyETTwoKeyNavMany_CT_ETTwoKeyNav,
PropertyProvider.navPropertyETTwoKeyNavMany_CT_ETCont,
PropertyProvider.collectionNavPropertyETTwoKeyNavMany_CT_ETBaseCont
));
} else if (complexTypeName.equals(nameCTBasePrimCompNav)) {

View File

@ -92,6 +92,12 @@ public class EntityTypeProvider {
public static final FullQualifiedName nameETPeople = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETPeople");
public static final FullQualifiedName nameETCont = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETCont");
public static final FullQualifiedName nameETBaseCont = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETBaseCont");
public static final FullQualifiedName nameETTwoCont = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETTwoCont");
public CsdlEntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
if(entityTypeName.equals(nameETAllPrimDefaultValues)){
return new CsdlEntityType()
@ -382,7 +388,10 @@ public class EntityTypeProvider {
PropertyProvider.navPropertyETTwoKeyNavOneCT_ETTwoKeyNav,
PropertyProvider.collectionNavPropertyETTwoKeyNavMany_CT_ETTwoKeyNav,
PropertyProvider.navPropertyETTwoKeyNavContOne_ETTwoKeyNav,
PropertyProvider.collectionNavPropertyETTwoKeyNavContMany_ETTwoKeyNav
PropertyProvider.collectionNavPropertyETTwoKeyNavContMany_ETTwoKeyNav,
PropertyProvider.navPropertyETTwoKeyNavContOne_ETCont,
PropertyProvider.collectionNavPropertyETTwoKeyNavContMany_ETCont,
PropertyProvider.collectionNavPropertyETTwoKeyNavContMany_ETBaseCont
));
} else if (entityTypeName.equals(nameETTwoKeyNavCont)) {
@ -514,6 +523,43 @@ public class EntityTypeProvider {
.setNavigationProperties(
Arrays.asList(PropertyProvider.navPropertyETAllPrimOne_ETAllPrim,
PropertyProvider.collectionNavPropertyETAllPrimMany_ETAllPrim));
} else if (entityTypeName.equals(nameETCont)) {
return new CsdlEntityType()
.setName("ETCont").setBaseType(nameETBaseCont)
.setProperties(Arrays.asList(
PropertyProvider.propertyBoolean, PropertyProvider.propertyByte, PropertyProvider.propertySByte
))
.setNavigationProperties(Arrays.asList(PropertyProvider.navPropertyETCont_ETTwoPrim,
PropertyProvider.collectionNavPropertyETContMany_ETTwoPrim));
} else if (entityTypeName.equals(nameETBaseCont)) {
return new CsdlEntityType()
.setName("ETBaseCont")
.setKey(Arrays.asList(
new CsdlPropertyRef().setName("PropertyInt16")))
.setProperties(Arrays.asList(
PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString,
PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
PropertyProvider.propertySingle, PropertyProvider.propertyDouble, PropertyProvider.propertyDecimal_Scale,
PropertyProvider.propertyBinary, PropertyProvider.propertyDate, PropertyProvider.propertyDateTimeOffset,
PropertyProvider.propertyDuration, PropertyProvider.propertyGuid, PropertyProvider.propertyTimeOfDay
))
.setNavigationProperties(Arrays.asList(PropertyProvider.navPropertyETBaseCont_ETTwoPrim,
PropertyProvider.collectionNavPropertyETBaseContMany_ETTwoPrim,
PropertyProvider.collectionNavPropertyETBaseContMany_ETTwoCont,
PropertyProvider.navPropertyETBaseCont_ETTwoCont));
} else if (entityTypeName.equals(nameETTwoCont)) {
return new CsdlEntityType()
.setName("ETTwoCont")
.setKey(Arrays.asList(
new CsdlPropertyRef().setName("PropertyInt16"),
new CsdlPropertyRef().setName("PropertyString")))
.setProperties(Arrays.asList(
PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString_NotNullable,
PropertyProvider.propertyInt32, PropertyProvider.propertyInt64,
PropertyProvider.propertySingle, PropertyProvider.propertyDouble, PropertyProvider.propertyDecimal_Scale,
PropertyProvider.propertyBinary, PropertyProvider.propertyDate, PropertyProvider.propertyDateTimeOffset,
PropertyProvider.propertyDuration, PropertyProvider.propertyGuid, PropertyProvider.propertyTimeOfDay
));
}
return null;
}

View File

@ -952,4 +952,70 @@ public class PropertyProvider {
.setType(EntityTypeProvider.nameETPeople)
.setNullable(true)
.setCollection(true);
public static final CsdlNavigationProperty navPropertyETCont_ETTwoPrim = new CsdlNavigationProperty()
.setName("NavPropertyETContOne")
.setType(EntityTypeProvider.nameETTwoPrim)
.setNullable(false);
public static final CsdlNavigationProperty collectionNavPropertyETContMany_ETTwoPrim =
new CsdlNavigationProperty()
.setName("NavPropertyETContMany")
.setType(EntityTypeProvider.nameETTwoPrim)
.setCollection(true);
public static final CsdlNavigationProperty navPropertyETBaseCont_ETTwoPrim = new CsdlNavigationProperty()
.setName("NavPropertyETBaseContOne")
.setType(EntityTypeProvider.nameETTwoBase)
.setNullable(false);
public static final CsdlNavigationProperty collectionNavPropertyETBaseContMany_ETTwoPrim =
new CsdlNavigationProperty()
.setName("NavPropertyETBaseContMany")
.setType(EntityTypeProvider.nameETTwoBase)
.setCollection(true);
public static final CsdlNavigationProperty navPropertyETBaseCont_ETTwoCont = new CsdlNavigationProperty()
.setName("NavPropertyETBaseContTwoContOne")
.setType(EntityTypeProvider.nameETTwoCont).setContainsTarget(true)
.setNullable(false);
public static final CsdlNavigationProperty collectionNavPropertyETBaseContMany_ETTwoCont =
new CsdlNavigationProperty()
.setName("NavPropertyETBaseContTwoContMany")
.setType(EntityTypeProvider.nameETTwoCont).setContainsTarget(true)
.setCollection(true);
public static final CsdlNavigationProperty navPropertyETTwoKeyNavContOne_ETCont = new CsdlNavigationProperty()
.setName("NavPropertyETContOne")
.setContainsTarget(true)
.setType(EntityTypeProvider.nameETCont);
public static final CsdlNavigationProperty collectionNavPropertyETTwoKeyNavContMany_ETCont =
new CsdlNavigationProperty()
.setName("NavPropertyETContMany")
.setContainsTarget(true)
.setType(EntityTypeProvider.nameETCont)
.setCollection(true);
public static final CsdlNavigationProperty collectionNavPropertyETTwoKeyNavContMany_ETBaseCont =
new CsdlNavigationProperty()
.setName("NavPropertyETBaseContMany")
.setContainsTarget(true)
.setType(EntityTypeProvider.nameETBaseCont)
.setCollection(true);
public static final CsdlNavigationProperty navPropertyETTwoKeyNavMany_CT_ETCont =
new CsdlNavigationProperty()
.setName("NavPropertyETTwoKeyNavETContOne")
.setContainsTarget(true)
.setType(EntityTypeProvider.nameETCont);
public static final CsdlNavigationProperty collectionNavPropertyETTwoKeyNavMany_CT_ETBaseCont =
new CsdlNavigationProperty()
.setName("NavPropertyETTwoKeyNavETContMany")
.setContainsTarget(true)
.setCollection(true)
.setType(EntityTypeProvider.nameETBaseCont);
}

View File

@ -87,6 +87,9 @@ public class SchemaProvider {
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETKeyPrimNav));
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETStream));
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETDelta));
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCont));
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETBaseCont));
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoCont));
// ComplexTypes
List<CsdlComplexType> complexTypes = new ArrayList<CsdlComplexType>();

View File

@ -39,6 +39,7 @@ import org.apache.olingo.commons.api.data.ContextURL.Suffix;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.data.EntityIterator;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Operation;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ValueType;
@ -2514,4 +2515,81 @@ public class ODataJsonSerializerTest {
Mockito.when(complexType.getNamespace()).thenReturn("olingo.odata.test1");
return complexType;
}
@Test
public void entityESKeyNavContFullMetadata() throws Exception {
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESKeyNavCont");
final Entity entity = data.readAll(edmEntitySet).getEntities().get(0);
InputStream result = serializerFullMetadata.entity(metadata, edmEntitySet.getEntityType(), entity,
EntitySerializerOptions.with()
.contextURL(ContextURL.with().entitySet(edmEntitySet).suffix(Suffix.ENTITY).build())
.build()).getContent();
final String resultString = IOUtils.toString(result);
final String expected = "{\"@odata.context\":\"$metadata#ESKeyNavCont/$entity\","
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\",\"@odata.type\":"
+ "\"#olingo.odata.test1.ETKeyNavCont\",\"@odata.id\":\"ESKeyNavCont(32766)\","
+ "\"PropertyInt16@odata.type\":\"#Int16\",\"PropertyInt16\":32766,"
+ "\"PropertyString\":\"Test String1\",\"PropertyCompNavCont\":"
+ "{\"@odata.type\":\"#olingo.odata.test1.CTNavCont\"}}";
Assert.assertEquals(expected, resultString);
}
@Test
public void entityESKeyNavContFullMetadataWithContNav() throws Exception {
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESKeyNavCont");
final Entity entity = data.readAll(edmEntitySet).getEntities().get(1);
Link link = entity.getNavigationLink("NavPropertyETContMany");
InputStream result = serializerFullMetadata.entityCollection(metadata,
edmEntitySet.getEntityType().getNavigationProperty("NavPropertyETContMany").getType(),
link.getInlineEntitySet(),
EntityCollectionSerializerOptions.with()
.contextURL(ContextURL.with().
type(edmEntitySet.getEntityType().getNavigationProperty("NavPropertyETContMany").getType())
.entitySetOrSingletonOrType("ESKeyNavCont(-365)/NavPropertyETContMany").build())
.build()).getContent();
final String resultString = IOUtils.toString(result);
final String expected = "{\"@odata.context\":\"$metadata#ESKeyNavCont%28-365%29%2FNavPropertyETContMany\","
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\",\"value\":[{"
+ "\"@odata.type\":\"#olingo.odata.test1.ETCont\",\"@odata.id\":"
+ "\"ESKeyNavCont(-365)/NavPropertyETContMany(-32768)\","
+ "\"PropertyInt16@odata.type\":\"#Int16\",\"PropertyInt16\":-32768,"
+ "\"PropertyString\":\"Second Resource - negative values\",\"PropertyInt32@odata.type\":"
+ "\"#Int32\",\"PropertyInt32\":-2147483648,\"PropertyInt64@odata.type\":\"#Int64\","
+ "\"PropertyInt64\":-9223372036854775808,\"PropertySingle@odata.type\":\"#Single\","
+ "\"PropertySingle\":-1.79E8,\"PropertyDouble\":-179000.0,"
+ "\"PropertyDecimal@odata.type\":\"#Decimal\",\"PropertyDecimal\":-34,"
+ "\"PropertyBinary@odata.type\":\"#Binary\",\"PropertyBinary\":\"ASNFZ4mrze8=\","
+ "\"PropertyDate@odata.type\":\"#Date\",\"PropertyDate\":\"2015-11-05\","
+ "\"PropertyDateTimeOffset@odata.type\":\"#DateTimeOffset\","
+ "\"PropertyDateTimeOffset\":\"2005-12-03T07:17:08Z\","
+ "\"PropertyDuration@odata.type\":\"#Duration\","
+ "\"PropertyDuration\":\"PT9S\",\"PropertyGuid@odata.type\":"
+ "\"#Guid\",\"PropertyGuid\":\"76543201-23ab-cdef-0123-456789dddfff\","
+ "\"PropertyTimeOfDay@odata.type\":\"#TimeOfDay\","
+ "\"PropertyTimeOfDay\":\"23:49:14\",\"PropertyBoolean\":false,"
+ "\"PropertyByte@odata.type\":\"#Byte\",\"PropertyByte\":0,"
+ "\"PropertySByte@odata.type\":\"#SByte\",\"PropertySByte\":-128},"
+ "{\"@odata.type\":\"#olingo.odata.test1.ETCont\","
+ "\"@odata.id\":\"ESKeyNavCont(-365)/NavPropertyETContMany(0)\","
+ "\"PropertyInt16@odata.type\":\"#Int16\",\"PropertyInt16\":0,"
+ "\"PropertyString\":\"\",\"PropertyInt32@odata.type\":\"#Int32\","
+ "\"PropertyInt32\":0,\"PropertyInt64@odata.type\":\"#Int64\","
+ "\"PropertyInt64\":0,\"PropertySingle@odata.type\":\"#Single\","
+ "\"PropertySingle\":0.0,\"PropertyDouble\":0.0,"
+ "\"PropertyDecimal@odata.type\":\"#Decimal\",\"PropertyDecimal\":0,"
+ "\"PropertyBinary@odata.type\":\"#Binary\",\"PropertyBinary\":\"\","
+ "\"PropertyDate@odata.type\":\"#Date\",\"PropertyDate\":\"1970-01-01\","
+ "\"PropertyDateTimeOffset@odata.type\":\"#DateTimeOffset\","
+ "\"PropertyDateTimeOffset\":\"2005-12-03T00:00:00Z\","
+ "\"PropertyDuration@odata.type\":\"#Duration\",\"PropertyDuration\":\"PT0S\","
+ "\"PropertyGuid@odata.type\":\"#Guid\","
+ "\"PropertyGuid\":\"76543201-23ab-cdef-0123-456789cccddd\","
+ "\"PropertyTimeOfDay@odata.type\":\"#TimeOfDay\","
+ "\"PropertyTimeOfDay\":\"00:01:01\",\"PropertyBoolean\":false,"
+ "\"PropertyByte@odata.type\":\"#Byte\",\"PropertyByte\":0,"
+ "\"PropertySByte@odata.type\":\"#SByte\",\"PropertySByte\":0}]}";
Assert.assertEquals(expected, resultString);
}
}

View File

@ -23,9 +23,7 @@ import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import myservice.mynamespace.service.DemoEdmProvider;
import myservice.mynamespace.util.Util;
import org.apache.olingo.commons.api.data.ComplexValue;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.data.Property;
@ -36,20 +34,26 @@ import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.ex.ODataRuntimeException;
import org.apache.olingo.server.api.uri.UriParameter;
import myservice.mynamespace.service.DemoEdmProvider;
import myservice.mynamespace.util.Util;
public class Storage {
// represent our database
private List<Entity> productList;
private List<Entity> categoryList;
private List<Entity> supplierList;
public Storage() {
productList = new ArrayList<Entity>();
categoryList = new ArrayList<Entity>();
supplierList = new ArrayList<Entity>();
// creating some sample data
initProductSampleData();
initCategorySampleData();
initSupplierSampleData();
}
/* PUBLIC FACADE */
@ -75,6 +79,8 @@ public class Storage {
entity = getProduct(edmEntityType, keyParams);
} else if (edmEntityType.getName().equals(DemoEdmProvider.ET_CATEGORY_NAME)) {
entity = getCategory(edmEntityType, keyParams);
} else if (edmEntityType.getName().equals(DemoEdmProvider.ET_SUPPLIER_NAME)) {
entity = getSupplier(edmEntityType, keyParams);
}
return entity;
@ -127,6 +133,23 @@ public class Storage {
// the first 2 products are monitors
navigationTargetEntityCollection.getEntities().addAll(productList.subList(4, 6));
}
} else if (sourceEntityFqn.equals(DemoEdmProvider.ET_PRODUCT_FQN.getFullQualifiedNameAsString())
&& relatedEntityFqn.equals(DemoEdmProvider.ET_SUPPLIER_FQN)) {
int productID = (Integer) sourceEntity.getProperty("ID").getValue();
if (productID == 1) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(0));
navigationTargetEntityCollection.getEntities().add(supplierList.get(1));
} else if (productID == 2) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(2));
} else if (productID == 3) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(3));
} else if (productID == 4) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(4));
} else if (productID == 5) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(5));
} else if (productID == 6) {
navigationTargetEntityCollection.getEntities().add(supplierList.get(6));
}
}
if (navigationTargetEntityCollection.getEntities().isEmpty()) {
@ -148,6 +171,16 @@ public class Storage {
return retEntitySet;
}
private EntityCollection getSuppliers() {
EntityCollection retEntitySet = new EntityCollection();
for (Entity supplierEntity : this.supplierList) {
retEntitySet.getEntities().add(supplierEntity);
}
return retEntitySet;
}
private Entity getProduct(EdmEntityType edmEntityType, List<UriParameter> keyParams) {
// the list of entities at runtime
@ -157,6 +190,15 @@ public class Storage {
return Util.findEntity(edmEntityType, entityCollection, keyParams);
}
private Entity getSupplier(EdmEntityType edmEntityType, List<UriParameter> keyParams) {
// the list of entities at runtime
EntityCollection entityCollection = getSuppliers();
/* generic approach to find the requested entity */
return Util.findEntity(edmEntityType, entityCollection, keyParams);
}
private EntityCollection getCategories() {
EntityCollection entitySet = new EntityCollection();
@ -261,6 +303,123 @@ public class Storage {
categoryList.add(entity);
}
private void initSupplierSampleData() {
Entity entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 1));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "DESIGN INDEX INDIA"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"null"));
Property p1 = new Property(null, "City", ValueType.PRIMITIVE, "Delhi");
Property p2 = new Property(null, "Country", ValueType.PRIMITIVE, "India");
ComplexValue complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "1"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 2));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "Advance Label Ltd"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"(617) 555-3389"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Tsuen Wan");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "Hong Kong");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "1"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 3));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "TECH GROUP INTERNATIONAL LIMITED "));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"null"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Bangalore");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "India");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "2"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 4));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "BenQ India Pvt Ltd"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"43844115"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Gurgaon");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "India");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "3"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 5));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "Sharp"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"(12345) 1210"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Osaka");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "Japan");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "4"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 6));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "Wonder World"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"43844115"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Zürich");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "Switzerland");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "5"));
supplierList.add(entity);
entity = new Entity();
entity.addProperty(new Property(null, "SupplierID", ValueType.PRIMITIVE, 7));
entity.addProperty(new Property(null, "CompanyName", ValueType.PRIMITIVE, "Touch International"));
entity.addProperty(new Property(null, "Fax", ValueType.PRIMITIVE,
"43847115"));
p1 = new Property(null, "City", ValueType.PRIMITIVE, "Austin");
p2 = new Property(null, "Country", ValueType.PRIMITIVE, "USA");
complexValue = new ComplexValue();
complexValue.getValue().add(p1);
complexValue.getValue().add(p2);
entity.addProperty(new Property(null, "Address", ValueType.COMPLEX, complexValue));
entity.setType(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString());
entity.setId(createId(entity, "SupplierID", "Suppliers", "6"));
supplierList.add(entity);
}
private URI createId(Entity entity, String idPropertyName) {
return createId(entity, idPropertyName, null);
}
@ -279,11 +438,28 @@ public class Storage {
}
}
private URI createId(Entity entity, String idPropertyName, String navigationName, String sourceId) {
try {
StringBuilder sb = new StringBuilder(getEntitySetName(entity)).append("(");
final Property property = entity.getProperty(idPropertyName);
sb.append(sourceId).append(")");
if(navigationName != null) {
sb.append("/").append(navigationName);
sb.append("(").append(property.asPrimitive()).append(")");
}
return new URI(sb.toString());
} catch (URISyntaxException e) {
throw new ODataRuntimeException("Unable to create (Atom) id for entity: " + entity, e);
}
}
private String getEntitySetName(Entity entity) {
if(DemoEdmProvider.ET_CATEGORY_FQN.getFullQualifiedNameAsString().equals(entity.getType())) {
return DemoEdmProvider.ES_CATEGORIES_NAME;
} else if(DemoEdmProvider.ET_PRODUCT_FQN.getFullQualifiedNameAsString().equals(entity.getType())) {
return DemoEdmProvider.ES_PRODUCTS_NAME;
} else if(DemoEdmProvider.ET_SUPPLIER_FQN.getFullQualifiedNameAsString().equals(entity.getType())) {
return DemoEdmProvider.ES_PRODUCTS_NAME;
}
return entity.getType();
}

View File

@ -25,6 +25,7 @@ import java.util.List;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmProvider;
import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
@ -51,9 +52,16 @@ public class DemoEdmProvider extends CsdlAbstractEdmProvider {
public static final String ET_CATEGORY_NAME = "Category";
public static final FullQualifiedName ET_CATEGORY_FQN = new FullQualifiedName(NAMESPACE, ET_CATEGORY_NAME);
public static final String ET_SUPPLIER_NAME = "Supplier";
public static final FullQualifiedName ET_SUPPLIER_FQN = new FullQualifiedName(NAMESPACE, ET_SUPPLIER_NAME);
public static final String CT_ADDRESS_NAME = "Address";
public static final FullQualifiedName CT_ADDRESS_FQN = new FullQualifiedName(NAMESPACE, CT_ADDRESS_NAME);
// Entity Set Names
public static final String ES_PRODUCTS_NAME = "Products";
public static final String ES_CATEGORIES_NAME = "Categories";
public static final String ES_SUPPLIERS_NAME = "Suppliers";
@Override
public CsdlEntityType getEntityType(FullQualifiedName entityTypeName) {
@ -77,8 +85,11 @@ public class DemoEdmProvider extends CsdlAbstractEdmProvider {
// navigation property: many-to-one, null not allowed (product must have a category)
CsdlNavigationProperty navProp = new CsdlNavigationProperty().setName("Category")
.setType(ET_CATEGORY_FQN).setNullable(false).setPartner("Products");
CsdlNavigationProperty contNavProp = new CsdlNavigationProperty().setName("Suppliers")
.setType(ET_SUPPLIER_FQN).setContainsTarget(true).setCollection(true);
List<CsdlNavigationProperty> navPropList = new ArrayList<CsdlNavigationProperty>();
navPropList.add(navProp);
navPropList.add(contNavProp);
// configure EntityType
entityType = new CsdlEntityType();
@ -110,12 +121,48 @@ public class DemoEdmProvider extends CsdlAbstractEdmProvider {
entityType.setProperties(Arrays.asList(id, name));
entityType.setKey(Arrays.asList(propertyRef));
entityType.setNavigationProperties(navPropList);
} else if (entityTypeName.equals(ET_SUPPLIER_FQN)) {
// create EntityType properties
CsdlProperty supplierId = new CsdlProperty().setName("SupplierID")
.setType(EdmPrimitiveTypeKind.Int32.getFullQualifiedName());
CsdlProperty companyName = new CsdlProperty().setName("CompanyName")
.setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
CsdlProperty fax = new CsdlProperty().setName("Fax")
.setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
CsdlProperty address = new CsdlProperty().setName(CT_ADDRESS_NAME)
.setType(CT_ADDRESS_FQN);
// create PropertyRef for Key element
CsdlPropertyRef propertyRef = new CsdlPropertyRef();
propertyRef.setName("SupplierID");
// configure EntityType
entityType = new CsdlEntityType();
entityType.setName(ET_SUPPLIER_NAME);
entityType.setProperties(Arrays.asList(supplierId, companyName, fax, address));
entityType.setKey(Arrays.asList(propertyRef));
}
return entityType;
}
@Override
public CsdlComplexType getComplexType(final FullQualifiedName complexTypeName) {
CsdlComplexType complexType = null;
if (complexTypeName.equals(CT_ADDRESS_FQN)) {
complexType = new CsdlComplexType().setName(CT_ADDRESS_NAME)
.setProperties(Arrays.asList(
new CsdlProperty()
.setName("City")
.setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()),
new CsdlProperty()
.setName("Country")
.setType(EdmPrimitiveTypeKind.String.getFullQualifiedName())));
}
return complexType;
}
@Override
public CsdlEntitySet getEntitySet(FullQualifiedName entityContainer, String entitySetName) {
@ -180,8 +227,14 @@ public class DemoEdmProvider extends CsdlAbstractEdmProvider {
List<CsdlEntityType> entityTypes = new ArrayList<CsdlEntityType>();
entityTypes.add(getEntityType(ET_PRODUCT_FQN));
entityTypes.add(getEntityType(ET_CATEGORY_FQN));
entityTypes.add(getEntityType(ET_SUPPLIER_FQN));
schema.setEntityTypes(entityTypes);
// add Complex Types
List<CsdlComplexType> complexTypes = new ArrayList<CsdlComplexType>();
complexTypes.add(getComplexType(CT_ADDRESS_FQN));
schema.setComplexTypes(complexTypes);
// add EntityContainer
schema.setEntityContainer(getEntityContainer());

View File

@ -81,6 +81,7 @@ public class DemoEntityCollectionProcessor implements EntityCollectionProcessor
EdmEntitySet responseEdmEntitySet = null; // we'll need this to build the ContextURL
EntityCollection responseEntityCollection = null; // we'll need this to set the response body
EdmEntityType responseEdmEntityType = null;
// 1st retrieve the requested EntitySet from the uriInfo (representation of the parsed URI)
List<UriResource> resourceParts = uriInfo.getUriResourceParts();
@ -107,8 +108,13 @@ public class DemoEntityCollectionProcessor implements EntityCollectionProcessor
UriResourceNavigation uriResourceNavigation = (UriResourceNavigation) lastSegment;
EdmNavigationProperty edmNavigationProperty = uriResourceNavigation.getProperty();
EdmEntityType targetEntityType = edmNavigationProperty.getType();
if (!edmNavigationProperty.containsTarget()) {
// from Categories(1) to Products
responseEdmEntitySet = Util.getNavigationTargetEntitySet(startEdmEntitySet, edmNavigationProperty);
} else {
responseEdmEntitySet = startEdmEntitySet;
responseEdmEntityType = targetEntityType;
}
// 2nd: fetch the data from backend
// first fetch the entity where the first segment of the URI points to
@ -130,12 +136,19 @@ public class DemoEntityCollectionProcessor implements EntityCollectionProcessor
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
}
ContextURL contextUrl = null;
EdmEntityType edmEntityType = null;
// 3rd: create and configure a serializer
ContextURL contextUrl = ContextURL.with().entitySet(responseEdmEntitySet).build();
if (isContNav(uriInfo)) {
contextUrl = ContextURL.with().entitySetOrSingletonOrType(request.getRawODataPath()).build();
edmEntityType = responseEdmEntityType;
} else {
contextUrl = ContextURL.with().entitySet(responseEdmEntitySet).build();
edmEntityType = responseEdmEntitySet.getEntityType();
}
final String id = request.getRawBaseUri() + "/" + responseEdmEntitySet.getName();
EntityCollectionSerializerOptions opts = EntityCollectionSerializerOptions.with()
.contextURL(contextUrl).id(id).build();
EdmEntityType edmEntityType = responseEdmEntitySet.getEntityType();
ODataSerializer serializer = odata.createSerializer(responseFormat);
SerializerResult serializerResult = serializer.entityCollection(this.srvMetadata, edmEntityType,
@ -147,4 +160,17 @@ public class DemoEntityCollectionProcessor implements EntityCollectionProcessor
response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
}
private boolean isContNav(UriInfo uriInfo) {
List<UriResource> resourceParts = uriInfo.getUriResourceParts();
for (UriResource resourcePart : resourceParts) {
if (resourcePart instanceof UriResourceNavigation) {
UriResourceNavigation navResource = (UriResourceNavigation) resourcePart;
if (navResource.getProperty().containsTarget()) {
return true;
}
}
}
return false;
}
}

View File

@ -109,8 +109,13 @@ public class DemoEntityProcessor implements EntityProcessor {
UriResourceNavigation uriResourceNavigation = (UriResourceNavigation) navSegment;
EdmNavigationProperty edmNavigationProperty = uriResourceNavigation.getProperty();
responseEdmEntityType = edmNavigationProperty.getType();
if (!edmNavigationProperty.containsTarget()) {
// contextURL displays the last segment
responseEdmEntitySet = Util.getNavigationTargetEntitySet(startEdmEntitySet, edmNavigationProperty);
} else {
responseEdmEntitySet = startEdmEntitySet;
}
// 2nd: fetch the data from backend.
// e.g. for the URI: Products(1)/Category we have to find the correct Category entity
@ -141,7 +146,14 @@ public class DemoEntityProcessor implements EntityProcessor {
}
// 3. serialize
ContextURL contextUrl = ContextURL.with().entitySet(responseEdmEntitySet).suffix(Suffix.ENTITY).build();
ContextURL contextUrl = null;
if (isContNav(uriInfo)) {
contextUrl = ContextURL.with().entitySetOrSingletonOrType(request.getRawODataPath()).
suffix(Suffix.ENTITY).build();
} else {
contextUrl = ContextURL.with().entitySet(responseEdmEntitySet).suffix(Suffix.ENTITY).build();
}
EntitySerializerOptions opts = EntitySerializerOptions.with().contextURL(contextUrl).build();
ODataSerializer serializer = this.odata.createSerializer(responseFormat);
@ -154,6 +166,19 @@ public class DemoEntityProcessor implements EntityProcessor {
response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
}
private boolean isContNav(UriInfo uriInfo) {
List<UriResource> resourceParts = uriInfo.getUriResourceParts();
for (UriResource resourcePart : resourceParts) {
if (resourcePart instanceof UriResourceNavigation) {
UriResourceNavigation navResource = (UriResourceNavigation) resourcePart;
if (navResource.getProperty().containsTarget()) {
return true;
}
}
}
return false;
}
/*
* These processor methods are not handled in this tutorial
*/