2017-08-02 47 views
1

我正在使用olingo使用OData v4协议处理其余的系统。我被堆叠在导航时心中已经得到了让我们说:如何在OData 4中实现三重或更多分段导航4

Company.svc/Departaments(X)/雇员(X)/ BussinesTrips

在Olingo的教程存在这样的情况是2个段导航的示例。第一部分是UriResourceEntitySet,第二部分是UriResourceNavigation。 在这个例子中,这两个(尤其是entitySet)是从存储中获取相关实体集合的方法中的参数。

在我的例子中有Company.svc/UriResourceEntitySet/UriResourceNavigation/UriResourceNavigation,我可以从UriInfo参数说。

我不知道该怎么做。我应该改变方法或以某种方式强制penulimate段为EntitySet。

感谢您的支持,我即将等待回拨。

@Override 
public void readEntityCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat) 
     throws ODataApplicationException, ODataLibraryException { 
    String lastUri = "lastUriResource"; 
    String sourceNavigationUri = "sourceUriResource"; 

    EdmEntitySet responseEntitySet = null; 
    EntityCollection responseEntityCollection = null; 

    List<UriResource> resourcePaths = uriInfo.getUriResourceParts(); 
    UriResource uriResource = resourcePaths.get(0); 
    if (!(uriResource instanceof UriResourceEntitySet)) { 
     throw new ODataApplicationException("Only EntitySet is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
    } 

    UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) uriResource; 
    EdmEntitySet startEntitySet = uriResourceEntitySet.getEntitySet(); 
    if (resourcePaths.size() == 1) { 
     responseEntitySet = startEntitySet; 
     responseEntityCollection = storage.readEntitySetData(responseEntitySet); 
    } else { 
     startEntitySet = Util.getNavigationTargetEntitySet(uriInfo); 
     HashMap<String, UriResource> uriResourceHashMap = Util.getLastNavigationAndItsSource(uriInfo); 
     UriResource lastUriResource = uriResourceHashMap.get(lastUri); 
     UriResource sourceUriResource = uriResourceHashMap.get(sourceNavigationUri); 
     EdmNavigationProperty edmNavigationProperty = null; 
     if (!(lastUriResource instanceof UriResourceNavigation)) { 
      throw new ODataApplicationException("Only navigation is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
     } 
     edmNavigationProperty = ((UriResourceNavigation) lastUriResource).getProperty(); 

     if (!(sourceUriResource instanceof UriResourceEntitySet)) { 
      throw new ODataApplicationException("Only Entity Set is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
     } 
     uriResourceEntitySet = (UriResourceEntitySet) sourceUriResource; 
     startEntitySet = uriResourceEntitySet.getEntitySet(); 
     responseEntitySet = Util.getNavigationTargetEntitySet(uriInfo); 
     EdmEntityType targetEntityType = edmNavigationProperty.getType(); 
     List<UriParameter> keyParameters = uriResourceEntitySet.getKeyPredicates(); 

     Entity sourceEntity = storage.readEntityData(startEntitySet, keyParameters); 
     if (sourceEntity == null) { 
      throw new ODataApplicationException("Entity not found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ROOT); 
     } 
     responseEntityCollection = storage.getRelatedEntityCollection(sourceEntity, targetEntityType); 
    } 

    ContextURL contextUrl = ContextURL.with().entitySet(responseEntitySet).build(); 

    final String id = request.getRawBaseUri() + "/" + responseEntitySet.getName(); 
    EntityCollectionSerializerOptions options = EntityCollectionSerializerOptions.with().id(id).contextURL(contextUrl).build(); 
    EdmEntityType edmEntityType = responseEntitySet.getEntityType(); 

    ODataSerializer serializer = odata.createSerializer(responseFormat); 
    SerializerResult serializerResult = serializer.entityCollection(serviceMetaData, edmEntityType, responseEntityCollection, options); 
    InputStream inputStream = serializerResult.getContent(); 

    response.setContent(inputStream); 
    response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString()); 
    response.setStatusCode(HttpStatusCode.OK.getStatusCode()); 

} 

}

回答

1

Departaments(x)的UriResourceEntitySet。你可能有它的EdmEntitySet。假设它存储在prevEdmEntitySet变量中。

雇员(x)的UriResourceNavigation。你应该把它的名字,并与上面提到的变量使用它:

String propName = uriResourceNavigation.getProperty().getName(); 
EdmEntitySet currEdmEntitySet = (EdmEntitySet) startEdmEntitySet.getRelatedBindingTarget(propName); 

那么你应该prevEdmEntitySet=currEdmEntitySet开始下一次迭代和重复所有UriResourceNavigation S(在你的例子只是一个更多的时间)。