in lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java [575:726]
private void readEntityCollection(final ODataRequest request, final ODataResponse response,
final UriInfo uriInfo, final ContentType requestedContentType, final boolean isReference)
throws ODataApplicationException, ODataLibraryException {
//
if (odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).hasRespondAsync()) {
TechnicalAsyncService asyncService = TechnicalAsyncService.getInstance();
TechnicalEntityProcessor processor = new TechnicalEntityProcessor(dataProvider, serviceMetadata);
processor.init(odata, serviceMetadata);
AsyncProcessor<EntityCollectionProcessor> asyncProcessor =
asyncService.register(processor, EntityCollectionProcessor.class);
asyncProcessor.prepareFor().readEntityCollection(request, response, uriInfo, requestedContentType);
String location = asyncProcessor.processAsync();
TechnicalAsyncService.acceptedResponse(response, location);
//
return;
}
//
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
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;
if (entitySetInitial == null) {
entitySetInitial = new EntityCollection();
}
// Modifying the original entitySet means modifying the "database", so we have to make a shallow
// copy of the entity set (new EntitySet, but exactly the same data).
EntityCollection entitySet = new EntityCollection();
entitySet.getEntities().addAll(entitySetInitial.getEntities());
entitySet.getOperations().addAll(entitySetInitial.getOperations());
// Apply system query options.
SearchHandler.applySearchSystemQueryOption(uriInfo.getSearchOption(), entitySet);
FilterHandler.applyFilterSystemQuery(uriInfo.getFilterOption(), entitySet, uriInfo, serviceMetadata.getEdm());
CountHandler.applyCountSystemQueryOption(uriInfo.getCountOption(), entitySet);
OrderByHandler.applyOrderByOption(uriInfo.getOrderByOption(), entitySet, uriInfo, serviceMetadata.getEdm());
SkipHandler.applySkipSystemQueryHandler(uriInfo.getSkipOption(), entitySet);
TopHandler.applyTopSystemQueryOption(uriInfo.getTopOption(), entitySet);
final Integer pageSize = odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).getMaxPageSize();
final Integer serverPageSize = ServerSidePagingHandler.applyServerSidePaging(uriInfo.getSkipTokenOption(),
entitySet,
edmEntitySet,
request.getRawRequestUri(),
pageSize);
// Apply expand system query option
final ExpandOption expand = uriInfo.getExpandOption();
final SelectOption select = uriInfo.getSelectOption();
// Transform the entity graph to a tree. The construction is controlled by the expand tree.
// Apply all expand system query options to the tree.
// So the expanded navigation properties can be modified for serialization,
// without affecting the data stored in the database.
final ExpandSystemQueryOptionHandler expandHandler = new ExpandSystemQueryOptionHandler();
final EntityCollection entitySetSerialization = expandHandler.transformEntitySetGraphToTree(entitySet,
edmEntitySet,
expand, null);
expandHandler.applyExpandQueryOptions(entitySetSerialization, edmEntitySet, expand, uriInfo,
serviceMetadata.getEdm());
final CountOption countOption = uriInfo.getCountOption();
final List<SystemQueryOption> systemQueryOptions = uriInfo.getSystemQueryOptions();
String deltaToken = null;
for (SystemQueryOption systemQueryOption : systemQueryOptions) {
if (systemQueryOption.getName().contains(DELTATOKEN)) {
deltaToken = systemQueryOption.getText();
delta = new Delta();
Integer count = 0;
if (deltaToken != null) {
String deltaTokenValue = generateDeltaToken();
List<DeletedEntity> listOfDeletedEntities = readDeletedEntities(uriInfo);
List<DeltaLink> listOfAddedLinks = readAddedLinks(uriInfo);
List<DeltaLink> listOfDeletedLinks = readDeletedLinks(uriInfo);
List<Entity> listofNavigationEntities = readNavigationEntities(uriInfo);
delta.getDeletedEntities().addAll(listOfDeletedEntities);
delta.getAddedLinks().addAll(listOfAddedLinks);
delta.getDeletedLinks().addAll(listOfDeletedLinks);
delta.getEntities().addAll(listofNavigationEntities);
count = listOfDeletedLinks.size()+listOfAddedLinks.size()+listOfDeletedEntities.size();
delta.setDeltaLink(DeltaTokenHandler.createDeltaLink(
request.getRawRequestUri(),
deltaTokenValue));
}
delta.getEntities().addAll(entitySetSerialization.getEntities());
count = count + delta.getEntities().size();
delta.setCount(count);
break;
}
}
String id;
if (edmEntitySet == null) {
// Used for functions, function imports etc.
id = request.getRawODataPath();
} else {
id = request.getRawBaseUri() + edmEntitySet.getName();
}
if(odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).hasTrackChanges()) {
String deltaTokenValue = generateDeltaToken();
entitySetSerialization.setDeltaLink(DeltaTokenHandler.createDeltaLink(
request.getRawRequestUri(),
deltaTokenValue));
}
if(isReference) {
final SerializerResult serializerResult =
serializeReferenceCollection(entitySetSerialization, edmEntitySet, requestedContentType, countOption);
response.setContent(serializerResult.getContent());
} else if(isStreaming(edmEntitySet, requestedContentType)) {
final SerializerStreamResult serializerResult =
serializeEntityCollectionStreamed(request,
entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType,
expand, select, countOption, id);
response.setODataContent(serializerResult.getODataContent());
} else if(delta != null){
final SerializerResult serializerResult =
serializeDeltaPayloads(request,
delta, edmEntitySet, edmEntityType, requestedContentType,
expand, select, countOption, id);
response.setContent(serializerResult.getContent());
} else {
final SerializerResult serializerResult =
serializeEntityCollection(request,
entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType,
expand, select, countOption, id, isContNav);
response.setContent(serializerResult.getContent());
}
//
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
if (pageSize != null) {
response.setHeader(HttpHeader.PREFERENCE_APPLIED,
PreferencesApplied.with().maxPageSize(serverPageSize).build().toValueString());
}else if (odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).hasTrackChanges()) {
response.setHeader(HttpHeader.PREFERENCE_APPLIED,
PreferencesApplied.with().trackChanges().build().toValueString());
}
if(delta!=null && request.getHeaders(HttpHeader.ODATA_MAX_VERSION) != null){
response.setHeader(HttpHeader.ODATA_VERSION,request.getHeaders(HttpHeader.ODATA_MAX_VERSION).get(0));
}
}