private void readEntityCollection()

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));
    }
  }