[OLINGO-1207] Sample project supporting containment navigation
This commit is contained in:
parent
73d1e2e07f
commit
b86aa5d977
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue