in fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java [177:299]
public InputStream addOrReplaceEntity(
final String key,
final String entitySetName,
final InputStream is,
final Entity entry) throws Exception {
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
IOUtils.copy(is, bos);
IOUtils.closeQuietly(is);
final Map<String, NavigationProperty> navigationProperties = metadata.getNavigationProperties(entitySetName);
// -----------------------------------------
// 0. Retrieve navigation links to be kept
// -----------------------------------------
Set<String> linksToBeKept;
try {
linksToBeKept = new HashSet<String>(navigationProperties.keySet());
} catch (NullPointerException e) {
linksToBeKept = Collections.<String> emptySet();
}
for (String availableLink : new HashSet<String>(linksToBeKept)) {
try {
fsManager.resolve(Commons.getLinksPath(entitySetName, key, availableLink, Accept.JSON_FULLMETA));
} catch (Exception e) {
linksToBeKept.remove(availableLink);
}
}
for (String linkName : retrieveAllLinkNames(new ByteArrayInputStream(bos.toByteArray()))) {
linksToBeKept.remove(linkName);
}
// -----------------------------------------
// -----------------------------------------
// 1. Get default entry key and path (N.B. operation will consume/close the stream; use a copy instead)
// -----------------------------------------
final String entityKey = key == null ? getDefaultEntryKey(entitySetName, entry) : key;
final String path = Commons.getEntityBasePath(entitySetName, entityKey);
// -----------------------------------------
// -----------------------------------------
// 2. Retrieve navigation info
// -----------------------------------------
final NavigationLinks links = retrieveNavigationInfo(entitySetName, new ByteArrayInputStream(bos.toByteArray()));
// -----------------------------------------
// -----------------------------------------
// 3. Normalize navigation info; add edit link; ... and save entity ....
// -----------------------------------------
final InputStream createdEntity = saveSingleEntity(
entityKey, entitySetName, new ByteArrayInputStream(bos.toByteArray()), links);
// -----------------------------------------
bos.reset();
IOUtils.copy(createdEntity, bos);
// -----------------------------------------
// 4. Add navigation links to be kept
// -----------------------------------------
final InputStream normalizedEntity =
addLinks(entitySetName, entityKey, new ByteArrayInputStream(bos.toByteArray()), linksToBeKept);
// -----------------------------------------
IOUtils.closeQuietly(bos);
// -----------------------------------------
// 5. save the entity
// -----------------------------------------
final FileObject fo = fsManager.putInMemory(
normalizedEntity,
fsManager.getAbsolutePath(path + Constants.get(ConstantKey.ENTITY), getDefaultFormat()));
// -----------------------------------------
// -----------------------------------------
// 4. Create links file and provided inlines
// -----------------------------------------
for (Map.Entry<String, List<String>> link : links.getLinks()) {
putLinksInMemory(path, entitySetName, entityKey, link.getKey(), link.getValue());
}
final List<String> hrefs = new ArrayList<String>();
for (final Link link : entry.getNavigationLinks()) {
final NavigationProperty navProp =
navigationProperties == null ? null : navigationProperties.get(link.getTitle());
if (navProp != null) {
final String inlineEntitySetName = navProp.getTarget();
if (link.getInlineEntity() != null) {
final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, link.getInlineEntity());
addOrReplaceEntity(
inlineEntryKey,
inlineEntitySetName,
toInputStream(link.getInlineEntity()),
link.getInlineEntity());
hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
} else if (link.getInlineEntitySet() != null) {
for (Entity subentry : link.getInlineEntitySet().getEntities()) {
final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, subentry);
addOrReplaceEntity(
inlineEntryKey,
inlineEntitySetName,
toInputStream(subentry),
subentry);
hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
}
}
if (!hrefs.isEmpty()) {
putLinksInMemory(path, entitySetName, entityKey, link.getTitle(), hrefs);
}
}
}
// -----------------------------------------
return fo.getContent().getInputStream();
}