in odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java [139:213]
private void writeExpandedNavigationProperty(final Writer writer, final EntityInfoAggregator entityInfo,
final Map<String, Object> data,
final EdmEntityType type, final String navigationPropertyName) throws EdmException, EntityProviderException,
IOException {
final EdmNavigationProperty navigationProperty = (EdmNavigationProperty) type.getProperty(navigationPropertyName);
final boolean isFeed = navigationProperty.getMultiplicity() == EdmMultiplicity.MANY;
final EdmEntitySet entitySet = entityInfo.getEntitySet();
final EdmEntitySet inlineEntitySet = entitySet.getRelatedEntitySet(navigationProperty);
WriteCallbackContext context = isFeed ? new WriteFeedCallbackContext() : new WriteEntryCallbackContext();
context.setSourceEntitySet(entitySet);
context.setNavigationProperty(navigationProperty);
context.setEntryData(data);
context.setCurrentWriteProperties(properties);
context.setCurrentExpandSelectTreeNode(properties.getExpandSelectTree().getLinks().get(
navigationPropertyName));
Map<String, ODataCallback> callbacks = properties.getCallbacks();
String navigationPropertyNameFqn = concat(entityInfo.getEntityType().getName(), navigationPropertyName);
ODataCallback callback = callbacks.get(navigationPropertyName);
callback = callback == null ? callbacks.get(navigationPropertyNameFqn) : callback;
if (callback == null) {
throw new EntityProviderProducerException(EntityProviderException.EXPANDNOTSUPPORTED);
}
try {
if (isFeed) {
final WriteFeedCallbackResult result =
((OnWriteFeedContent) callback).retrieveFeedResult((WriteFeedCallbackContext) context);
List<Map<String, Object>> inlineData = result.getFeedData();
if (inlineData == null) {
inlineData = new ArrayList<Map<String, Object>>();
}
//This statement is used for the client use case. Flag should never be set on server side
if(properties.isOmitInlineForNullData() && inlineData.isEmpty()){
writeDeferredUri(entityInfo, navigationPropertyName);
return;
}
final EntityProviderWriteProperties inlineProperties = result.getInlineProperties();
final EntityInfoAggregator inlineEntityInfo =
EntityInfoAggregator.create(inlineEntitySet, inlineProperties.getExpandSelectTree());
JsonFeedEntityProducer jsonFeedEntityProducer = new JsonFeedEntityProducer(inlineProperties);
if (properties.isResponsePayload()) {
jsonFeedEntityProducer.appendAsObject(writer, inlineEntityInfo, inlineData, false);
} else {
jsonFeedEntityProducer.appendAsArray(writer, inlineEntityInfo, inlineData);
}
} else {
final WriteEntryCallbackResult result =
((OnWriteEntryContent) callback).retrieveEntryResult((WriteEntryCallbackContext) context);
Map<String, Object> inlineData = result.getEntryData();
//This statement is used for the client use case. Flag should never be set on server side
if(properties.isOmitInlineForNullData() && (inlineData == null || inlineData.isEmpty())){
writeDeferredUri(entityInfo, navigationPropertyName);
return;
}
if (inlineData != null && !inlineData.isEmpty()) {
final EntityProviderWriteProperties inlineProperties = result.getInlineProperties();
final EntityInfoAggregator inlineEntityInfo =
EntityInfoAggregator.create(inlineEntitySet, inlineProperties.getExpandSelectTree());
new JsonEntryEntityProducer(inlineProperties).append(writer, inlineEntityInfo, inlineData, false);
} else {
jsonStreamWriter.unquotedValue("null");
}
}
} catch (final ODataApplicationException e) {
throw new EntityProviderProducerException(EntityProviderException.EXCEPTION_OCCURRED.addContent(e.getClass()
.getSimpleName()), e);
}
}