blob: cde9b749032e1d0bd582ca1e79b123e36e332bc2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.olingo.server.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntityCollection;
import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmProperty;
import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.server.api.ODataApplicationException;
import org.apache.olingo.server.api.ServiceMetadata;
import org.apache.olingo.server.api.deserializer.DeserializerException;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.api.uri.UriResourceNavigation;
import org.apache.olingo.server.core.deserializer.json.ODataJsonDeserializer;
import org.apache.olingo.server.core.responses.EntityResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TripPinDataModel {
private final ServiceMetadata metadata;
private HashMap<String, EntityCollection> entitySetMap = new HashMap<String, EntityCollection>();
private Map<Integer, Map<String,Object>> tripLinks = new HashMap<Integer, Map<String,Object>>();
private Map<String, Map<String,Object>> peopleLinks = new HashMap<String, Map<String,Object>>();
private Map<Integer, Map<String, Object>> flightLinks = new HashMap<Integer, Map<String, Object>>();
public TripPinDataModel(ServiceMetadata metadata) throws Exception {
this.metadata = metadata;
loadData();
}
@SuppressWarnings("unchecked")
public void loadData() throws Exception {
EdmEntityContainer ec = metadata.getEdm().getEntityContainer(null);
for (EdmEntitySet edmEntitySet : ec.getEntitySets()) {
String entitySetName = edmEntitySet.getName();
EntityCollection set = loadEnities(entitySetName, edmEntitySet.getEntityType());
if (set != null) {
this.entitySetMap.put(entitySetName, set);
}
}
EdmEntityType type = metadata.getEdm().getEntityType(
new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin", "Trip"));
this.entitySetMap.put("Trip", loadEnities("Trip", type));
type = metadata.getEdm().getEntityType(
new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin", "Flight"));
this.entitySetMap.put("Flight", loadEnities("Flight", type));
type = metadata.getEdm().getEntityType(
new FullQualifiedName("Microsoft.OData.SampleService.Models.TripPin", "Event"));
this.entitySetMap.put("Event", loadEnities("Event", type));
ObjectMapper mapper = new ObjectMapper();
Map<String, List<Object>> tripLinks = mapper.readValue(new FileInputStream(new File(
"src/test/resources/trip-links.json")), Map.class);
for (Object link : tripLinks.get("value")) {
Map<String, Object> map = (Map<String, Object>) link;
this.tripLinks.put((Integer) map.get("TripId"), map);
}
Map<String, List<Object>> peopleLinks = mapper.readValue(new FileInputStream(new File(
"src/test/resources/people-links.json")), Map.class);
for (Object link : peopleLinks.get("value")) {
Map<String, Object> map = (Map<String, Object>) link;
this.peopleLinks.put((String) map.get("UserName"), map);
}
Map<String, List<Object>> flightLinks = mapper.readValue(new FileInputStream(new File(
"src/test/resources/flight-links.json")), Map.class);
for (Object link : flightLinks.get("value")) {
Map<String, Object> map = (Map<String, Object>) link;
this.flightLinks.put((Integer) map.get("PlanItemId"), map);
}
}
private EntityCollection loadEnities(String entitySetName, EdmEntityType type) {
try {
ODataJsonDeserializer deserializer = new ODataJsonDeserializer(ContentType.JSON, this.metadata);
EntityCollection set = deserializer.entityCollection(new FileInputStream(new File(
"src/test/resources/" + entitySetName.toLowerCase() + ".json")), type).getEntityCollection();
// TODO: the count needs to be part of deserializer
set.setCount(set.getEntities().size());
for (Entity entity : set.getEntities()) {
entity.setETag(UUID.randomUUID().toString());
entity.setId(new URI(EntityResponse.buildLocation("", entity, entitySetName,
type)));
entity.setType(type.getFullQualifiedName().getFullQualifiedNameAsString());
}
return set;
} catch (FileNotFoundException e) {
// keep going
e.printStackTrace();
} catch (DeserializerException e) {
// keep going
e.printStackTrace();
} catch (URISyntaxException e) {
// keep going
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public EntityCollection getEntitySet(String name) {
return getEntitySet(name, -1, -1);
}
public EntityCollection getEntitySet(String name, int skip, int pageSize) {
EntityCollection set = this.entitySetMap.get(name);
if (set == null) {
return null;
}
EntityCollection modifiedES = new EntityCollection();
int i = 0;
for (Entity e : set.getEntities()) {
if (skip >= 0 && i >= skip && modifiedES.getEntities().size() < pageSize) {
modifiedES.getEntities().add(e);
}
i++;
}
modifiedES.setCount(i);
set.setCount(i);
if (skip == -1 && pageSize == -1) {
return set;
}
return modifiedES;
}
private List<Entity> getMatch(UriParameter param, List<Entity> es)
throws ODataApplicationException {
ArrayList<Entity> list = new ArrayList<Entity>();
for (Entity entity : es) {
EdmEntityType entityType = this.metadata.getEdm().getEntityType(
new FullQualifiedName(entity.getType()));
EdmProperty property = (EdmProperty) entityType.getProperty(param.getName());
EdmType type = property.getType();
if (type.getKind() == EdmTypeKind.PRIMITIVE) {
Object match = readPrimitiveValue(property, param.getText());
Property entityValue = entity.getProperty(param.getName());
if (match.equals(entityValue.asPrimitive())) {
list.add(entity);
}
} else {
throw new RuntimeException("Can not compare complex objects");
}
}
return list;
}
static Object readPrimitiveValue(EdmProperty edmProperty, String value)
throws ODataApplicationException {
if (value == null) {
return null;
}
try {
if (value.startsWith("'") && value.endsWith("'")) {
value = value.substring(1,value.length()-1);
}
EdmPrimitiveType edmPrimitiveType = (EdmPrimitiveType) edmProperty.getType();
Class<?> javaClass = getJavaClassForPrimitiveType(edmProperty, edmPrimitiveType);
return edmPrimitiveType.valueOfString(value, edmProperty.isNullable(),
edmProperty.getMaxLength(), edmProperty.getPrecision(), edmProperty.getScale(),
edmProperty.isUnicode(), javaClass);
} catch (EdmPrimitiveTypeException e) {
throw new ODataApplicationException("Invalid value: " + value + " for property: "
+ edmProperty.getName(), 500, Locale.getDefault());
}
}
static Class<?> getJavaClassForPrimitiveType(EdmProperty edmProperty, EdmPrimitiveType edmPrimitiveType) {
Class<?> javaClass = null;
if (edmProperty.getMapping() != null && edmProperty.getMapping().getMappedJavaClass() != null) {
javaClass = edmProperty.getMapping().getMappedJavaClass();
} else {
javaClass = edmPrimitiveType.getDefaultType();
}
edmPrimitiveType.getDefaultType();
return javaClass;
}
public Entity getEntity(String name, List<UriParameter> keys) throws ODataApplicationException {
EntityCollection es = getEntitySet(name);
return getEntity(es, keys);
}
public Entity getEntity(EntityCollection es, List<UriParameter> keys) throws ODataApplicationException {
List<Entity> search = es.getEntities();
for (UriParameter param : keys) {
search = getMatch(param, search);
}
if (search.isEmpty()) {
return null;
}
return search.get(0);
}
@SuppressWarnings("unchecked")
private EntityCollection getFriends(String userName) {
Map<String, Object> map = this.peopleLinks.get(userName);
if (map == null) {
return null;
}
ArrayList<String> friends = (ArrayList<String>) map.get("Friends");
EntityCollection set = getEntitySet("People");
EntityCollection result = new EntityCollection();
int i = 0;
if (friends != null) {
for (String friend : friends) {
for (Entity e : set.getEntities()) {
if (e.getProperty("UserName").getValue().equals(friend)) {
result.getEntities().add(e);
i++;
break;
}
}
}
}
result.setCount(i);
return result;
}
@SuppressWarnings("unchecked")
private EntityCollection getTrips(String userName) {
Map<String, Object> map = this.peopleLinks.get(userName);
if (map == null) {
return null;
}
ArrayList<Integer> trips = (ArrayList<Integer>) map.get("Trips");
EntityCollection set = getEntitySet("Trip");
EntityCollection result = new EntityCollection();
int i = 0;
if (trips != null) {
for (int trip : trips) {
for (Entity e : set.getEntities()) {
if (e.getProperty("TripId").getValue().equals(trip)) {
result.getEntities().add(e);
i++;
break;
}
}
}
}
result.setCount(i);
return result;
}
private Entity getPhoto(String userName) {
Map<String, Object> map = this.peopleLinks.get(userName);
if (map == null) {
return null;
}
Integer photoID = (Integer) map.get("Photo");
EntityCollection set = getEntitySet("Photos");
if (photoID != null) {
for (Entity e : set.getEntities()) {
if (e.getProperty("Id").getValue().equals(photoID.longValue())) {
return e;
}
}
}
return null;
}
private EntityCollection getPlanItems(int tripId, EntityCollection result) {
getFlights(tripId, result);
getEvents(tripId, result);
return result;
}
@SuppressWarnings("unchecked")
private EntityCollection getEvents(int tripId, EntityCollection result) {
Map<String, Object> map = this.tripLinks.get(tripId);
if (map == null) {
return null;
}
ArrayList<Integer> events = (ArrayList<Integer>) map.get("Events");
EntityCollection set = getEntitySet("Event");
int i = result.getEntities().size();
if (events != null) {
for (int event : events) {
for (Entity e : set.getEntities()) {
if (e.getProperty("PlanItemId").getValue().equals(event)) {
result.getEntities().add(e);
i++;
break;
}
}
}
}
result.setCount(i);
return result;
}
@SuppressWarnings("unchecked")
private EntityCollection getFlights(int tripId, EntityCollection result) {
Map<String, Object> map = this.tripLinks.get(tripId);
if (map == null) {
return null;
}
ArrayList<Integer> flights = (ArrayList<Integer>) map.get("Flights");
EntityCollection set = getEntitySet("Flight");
int i = result.getEntities().size();
if (flights != null) {
for (int flight : flights) {
for (Entity e : set.getEntities()) {
if (e.getProperty("PlanItemId").getValue().equals(flight)) {
result.getEntities().add(e);
i++;
break;
}
}
}
}
result.setCount(i);
return result;
}
@SuppressWarnings("unchecked")
private EntityCollection getTripPhotos(int tripId) {
Map<String, Object> map = this.tripLinks.get(tripId);
if (map == null) {
return null;
}
ArrayList<Integer> photos = (ArrayList<Integer>) map.get("Photos");
EntityCollection set = getEntitySet("Photos");
EntityCollection result = new EntityCollection();
int i = 0;
if (photos != null) {
for (int photo : photos) {
for (Entity e : set.getEntities()) {
if (e.getProperty("Id").getValue().equals(photo)) {
result.getEntities().add(e);
i++;
break;
}
}
}
}
result.setCount(i);
return result;
}
private Entity getFlightFrom(int flighID) {
Map<String, Object> map = this.flightLinks.get(flighID);
if (map == null) {
return null;
}
String from = (String) map.get("From");
EntityCollection set = getEntitySet("Airports");
if (from != null) {
for (Entity e : set.getEntities()) {
if (e.getProperty("IataCode").getValue().equals(from)) {
return e;
}
}
}
return null;
}
private Entity getFlightTo(int flighID) {
Map<String, Object> map = this.flightLinks.get(flighID);
if (map == null) {
return null;
}
String to = (String) map.get("To");
EntityCollection set = getEntitySet("Airports");
if (to != null) {
for (Entity e : set.getEntities()) {
if (e.getProperty("IataCode").getValue().equals(to)) {
return e;
}
}
}
return null;
}
private Entity getFlightAirline(int flighID) {
Map<String, Object> map = this.flightLinks.get(flighID);
if (map == null) {
return null;
}
String airline = (String) map.get("Airline");
EntityCollection set = getEntitySet("Airlines");
if (airline != null) {
for (Entity e : set.getEntities()) {
if (e.getProperty("AirlineCode").getValue().equals(airline)) {
return e;
}
}
}
return null;
}
@SuppressWarnings("unchecked")
public void addNavigationLink(String navigation, Entity parentEntity, Entity childEntity) {
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(parentEntity.getType()));
String key = type.getKeyPredicateNames().get(0);
if (type.getName().equals("Person") && navigation.equals("Friends")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.peopleLinks.put((String) parentEntity.getProperty(key).getValue(), map);
}
ArrayList<String> friends = (ArrayList<String>) map.get("Friends");
if (friends == null) {
friends = new ArrayList<String>();
map.put("Friends", friends);
}
friends.add((String) childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Person") && navigation.equals("Trips")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.peopleLinks.put((String) parentEntity.getProperty(key).getValue(), map);
}
ArrayList<Integer> trips = (ArrayList<Integer>) map.get("Trips");
if (trips == null) {
trips = new ArrayList<Integer>();
map.put("Trips", trips);
}
trips.add((Integer) childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Person") && navigation.equals("Photo")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.peopleLinks.put((String) parentEntity.getProperty(key).getValue(), map);
}
map.put("Photo", ((Long)childEntity.getProperty("Id").getValue()).intValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Trip") && navigation.equals("PlanItems")) {
Map<String, Object> map = this.tripLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.tripLinks.put((Integer) parentEntity.getProperty(key).getValue(), map);
}
if (childEntity.getType().equals("Flight")) {
ArrayList<Integer> flights = (ArrayList<Integer>) map.get("Flights");
if (flights == null) {
flights = new ArrayList<Integer>();
map.put("Flights", flights);
}
flights.add((Integer) childEntity.getProperty(key).getValue());
} else {
ArrayList<Integer> events = (ArrayList<Integer>) map.get("Events");
if (events == null) {
events = new ArrayList<Integer>();
map.put("Events", events);
}
events.add((Integer) childEntity.getProperty(key).getValue());
}
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Trip") && navigation.equals("Photo")) {
Map<String, Object> map = this.tripLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.tripLinks.put((Integer) parentEntity.getProperty(key).getValue(), map);
}
ArrayList<Integer> photos = (ArrayList<Integer>) map.get("Photos");
if (photos == null) {
photos = new ArrayList<Integer>();
map.put("Photos", photos);
}
photos.add((Integer) childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Flight") && navigation.equals("From")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.flightLinks.put((Integer) parentEntity.getProperty(key).getValue(), map);
}
map.put("From", childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Flight") && navigation.equals("To")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.flightLinks.put((Integer) parentEntity.getProperty(key).getValue(), map);
}
map.put("To", childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else if (type.getName().equals("Flight") && navigation.equals("Airline")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map == null) {
map = new HashMap<String, Object>();
this.flightLinks.put((Integer) parentEntity.getProperty(key).getValue(), map);
}
map.put("Airline", childEntity.getProperty(key).getValue());
setLink(parentEntity, navigation, childEntity);
} else {
throw new RuntimeException("unknown relation");
}
}
protected static void setLink(Entity entity, final String navigationPropertyName,
final Entity target) {
Link link = new Link();
link.setTitle(navigationPropertyName);
link.setInlineEntity(target);
entity.getNavigationLinks().add(link);
}
public boolean updateNavigationLink(String navigationProperty, Entity parentEntity,
Entity updateEntity) {
boolean updated = false;
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(parentEntity.getType()));
String key = type.getKeyPredicateNames().get(0);
EdmEntityType updateType = this.metadata.getEdm().getEntityType(
new FullQualifiedName(updateEntity.getType()));
String updateKey = updateType.getKeyPredicateNames().get(0);
if (type.getName().equals("Person") && navigationProperty.equals("Photo")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.put("Photo", ((Long) updateEntity.getProperty(updateKey).getValue()).intValue());
updated = true;
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("From")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.put("From", updateEntity.getProperty(updateKey).getValue());
updated = true;
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("To")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.put("To", updateEntity.getProperty(updateKey).getValue());
updated = true;
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("Airline")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.put("Airline", updateEntity.getProperty(updateKey).getValue());
updated = true;
}
} else {
throw new RuntimeException("unknown relation");
}
return updated;
}
public Entity createEntity(EdmEntitySet edmEntitySet, Entity entity, String baseURL)
throws ODataApplicationException {
EntityCollection set = this.entitySetMap.get(edmEntitySet.getName());
Entity copy = new Entity();
copy.setType(entity.getType());
for (Property p : entity.getProperties()) {
copy.addProperty(p);
}
try {
copy.setId(new URI(EntityResponse.buildLocation(baseURL, entity, edmEntitySet.getName(), edmEntitySet
.getEntityType())));
copy.setETag(UUID.randomUUID().toString());
} catch (URISyntaxException e) {
throw new ODataApplicationException("Failed to create ID for entity", 500,
Locale.getDefault());
} catch (EdmPrimitiveTypeException e) {
throw new ODataApplicationException("Failed to create ID for entity", 500,
Locale.getDefault());
}
set.getEntities().add(copy);
return copy;
}
public boolean updateEntity(EdmEntitySet edmEntitySet, String eTag, String key, Object keyValue,
boolean merge, Entity changes, String baseURL) throws ODataApplicationException {
boolean updated = false;
if (merge) {
EntityCollection set = getEntitySet(edmEntitySet.getName());
Iterator<Entity> it = set.getEntities().iterator();
while (it.hasNext()) {
Entity entity = it.next();
if (entity.getProperty(key).getValue().equals(keyValue) && eTag.equals("*")
|| eTag.equals(entity.getETag())) {
for (Property p :changes.getProperties()) {
for (Property p1: entity.getProperties()) {
if (p.getName().equals(p1.getName())) {
p1.setValue(p1.getValueType(), p.getValue());
updated = true;
break;
}
}
}
break;
}
}
} else {
// this is delete, then insert
EntityCollection set = getEntitySet(edmEntitySet.getName());
Iterator<Entity> it = set.getEntities().iterator();
while (it.hasNext()) {
Entity entity = it.next();
if (entity.getProperty(key).getValue().equals(keyValue) && eTag.equals("*")
|| eTag.equals(entity.getETag())) {
Property p = entity.getProperty(key);
changes.addProperty(p);
createEntity(edmEntitySet, changes, baseURL);
updated = true;
}
}
}
return updated;
}
public boolean deleteEntity(String entitySetName, String eTag, String key, Object keyValue) {
EntityCollection set = getEntitySet(entitySetName);
Iterator<Entity> it = set.getEntities().iterator();
boolean removed = false;
while (it.hasNext()) {
Entity entity = it.next();
if (entity.getProperty(key).getValue().equals(keyValue) && eTag.equals("*")
|| eTag.equals(entity.getETag())) {
it.remove();
removed = true;
break;
}
}
return removed;
}
public boolean updateProperty(String entitySetName, String eTag, String key, Object keyValue,
Property property) {
EntityCollection set = getEntitySet(entitySetName);
Iterator<Entity> it = set.getEntities().iterator();
boolean replaced = false;
while (it.hasNext()) {
Entity entity = it.next();
if (entity.getProperty(key).getValue().equals(keyValue) && eTag.equals("*")
|| eTag.equals(entity.getETag())) {
entity.getProperty(property.getName()).setValue(property.getValueType(),
property.getValue());
replaced = true;
break;
}
}
return replaced;
}
public EntityCollection getNavigableEntitySet(Entity parentEntity, UriResourceNavigation navigation) {
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(parentEntity.getType()));
String key = type.getKeyPredicateNames().get(0);
String linkName = navigation.getProperty().getName();
EntityCollection results = null;
if (type.getName().equals("Person") && linkName.equals("Friends")) {
results = getFriends((String) parentEntity.getProperty(key).getValue());
} else if (type.getName().equals("Person") && linkName.equals("Trips")) {
results = getTrips((String) parentEntity.getProperty(key).getValue());
} else if (type.getName().equals("Trip") && linkName.equals("PlanItems")) {
EntityCollection planitems = new EntityCollection();
if (navigation.getTypeFilterOnCollection() == null) {
results = getPlanItems((Integer) parentEntity.getProperty(key).getValue(), planitems);
} else if (navigation.getTypeFilterOnCollection().getName().equals("Flight")) {
results = getFlights((Integer) parentEntity.getProperty(key).getValue(), planitems);
} else if (navigation.getTypeFilterOnCollection().getName().equals("Event")) {
results = getEvents((Integer) parentEntity.getProperty(key).getValue(), planitems);
} else {
throw new RuntimeException("unknown relation");
}
} else if (type.getName().equals("Trip") && linkName.equals("Photos")) {
results = getTripPhotos((Integer) parentEntity.getProperty(key).getValue());
}
return results;
}
public Entity getNavigableEntity(Entity parentEntity, UriResourceNavigation navigation)
throws ODataApplicationException {
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(parentEntity.getType()));
String key = type.getKeyPredicateNames().get(0);
String linkName = navigation.getProperty().getName();
EntityCollection results = null;
if (navigation.getProperty().isCollection()) {
results = getNavigableEntitySet(parentEntity, navigation);
return this.getEntity(results, navigation.getKeyPredicates());
}
if (type.getName().equals("Person") && linkName.equals("Photo")) {
return getPhoto((String) parentEntity.getProperty(key).getValue());
} else if (type.getName().equals("Flight") && linkName.equals("From")) {
return getFlightFrom((Integer) parentEntity.getProperty(key).getValue());
} else if (type.getName().equals("Flight") && linkName.equals("To")) {
return getFlightTo((Integer) parentEntity.getProperty(key).getValue());
} else if (type.getName().equals("Flight") && linkName.equals("Airline")) {
return getFlightAirline((Integer) parentEntity.getProperty(key).getValue());
} else {
throw new RuntimeException("unknown relation");
}
}
@SuppressWarnings("unchecked")
public boolean removeNavigationLink(String navigationProperty, Entity parentEntity,
Entity deleteEntity) {
boolean removed = false;
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(parentEntity.getType()));
String key = type.getKeyPredicateNames().get(0);
if (type.getName().equals("Person") && navigationProperty.equals("Friends")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
ArrayList<String> friends = (ArrayList<String>) map.get("Friends");
if (friends != null) {
friends.remove(deleteEntity.getProperty(key).getValue());
removed = true;
}
}
} else if (type.getName().equals("Person") && navigationProperty.equals("Trips")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
ArrayList<Integer> trips = (ArrayList<Integer>) map.get("Trips");
if (trips != null) {
trips.remove(deleteEntity.getProperty(key).getValue());
removed = true;
}
}
} else if (type.getName().equals("Person") && navigationProperty.equals("Photo")) {
Map<String, Object> map = this.peopleLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.remove("Photo");
removed = true;
}
} else if (type.getName().equals("Trip") && navigationProperty.equals("PlanItems")) {
Map<String, Object> map = this.tripLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
if (deleteEntity.getType().equals("Flight")) {
ArrayList<Integer> flights = (ArrayList<Integer>) map.get("Flights");
if (flights != null) {
flights.remove(deleteEntity.getProperty(key).getValue());
removed = true;
}
} else {
ArrayList<Integer> events = (ArrayList<Integer>) map.get("Events");
if (events != null) {
events.remove(deleteEntity.getProperty(key).getValue());
removed = true;
}
}
}
} else if (type.getName().equals("Trip") && navigationProperty.equals("Photo")) {
Map<String, Object> map = this.tripLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
ArrayList<Integer> photos = (ArrayList<Integer>) map.get("Photos");
if (photos != null) {
photos.remove(deleteEntity.getProperty(key).getValue());
removed = true;
}
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("From")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.remove("From");
removed = true;
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("To")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.remove("To");
removed = true;
}
} else if (type.getName().equals("Flight") && navigationProperty.equals("Airline")) {
Map<String, Object> map = this.flightLinks.get(parentEntity.getProperty(key).getValue());
if (map != null) {
map.remove("Airline");
removed = true;
}
} else {
throw new RuntimeException("unknown relation");
}
return removed;
}
// note these are not tied to entities for simplicity sake
public boolean updateMedia(Entity entity, InputStream mediaContent)
throws ODataApplicationException {
checkForMedia(entity);
return true;
}
// note these are not tied to entities for simplicity sake
public InputStream readMedia(Entity entity) throws ODataApplicationException {
checkForMedia(entity);
try {
return new FileInputStream(new File("src/test/resources/OlingoOrangeTM.png"));
} catch (FileNotFoundException e) {
throw new ODataApplicationException("image not found", 500, Locale.getDefault());
}
}
// note these are not tied to entities for simplicity sake
public boolean deleteMedia(Entity entity) throws ODataApplicationException {
checkForMedia(entity);
return true;
}
private void checkForMedia(Entity entity) throws ODataApplicationException {
EdmEntityType type = this.metadata.getEdm().getEntityType(
new FullQualifiedName(entity.getType()));
if (!type.hasStream()) {
throw new ODataApplicationException("No Media proeprty on the entity", 500,
Locale.getDefault());
}
}
public boolean deleteStream(Entity entity, EdmProperty property) {
// should remove stream links
return true;
}
public boolean updateStream(Entity entity, EdmProperty property, InputStream streamContent) {
// should add stream links
return true;
}
}