You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/08/12 07:47:42 UTC

olingo-odata4 git commit: [OLINGO-756][OLINGO-713] Support in sqo-es tutorial

Repository: olingo-odata4
Updated Branches:
  refs/heads/master dc44d7c99 -> 790ec7601


[OLINGO-756][OLINGO-713] Support  in sqo-es tutorial


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/790ec760
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/790ec760
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/790ec760

Branch: refs/heads/master
Commit: 790ec76011915627159af07f332824398a695146
Parents: dc44d7c
Author: Michael Bolz <mi...@sap.com>
Authored: Wed Aug 12 07:45:25 2015 +0200
Committer: Michael Bolz <mi...@sap.com>
Committed: Wed Aug 12 07:47:38 2015 +0200

----------------------------------------------------------------------
 .../service/DemoEntityCollectionProcessor.java  |  32 ++-
 .../service/DemoEntityProcessor.java            | 234 ++++++++-----------
 .../src/main/webapp/index.jsp                   |   6 +
 3 files changed, 134 insertions(+), 138 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/790ec760/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityCollectionProcessor.java
----------------------------------------------------------------------
diff --git a/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityCollectionProcessor.java b/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityCollectionProcessor.java
index 60f8cd2..83dd676 100755
--- a/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityCollectionProcessor.java
+++ b/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityCollectionProcessor.java
@@ -27,9 +27,11 @@ import org.apache.olingo.commons.api.data.ContextURL;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.data.Link;
+import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.commons.api.http.HttpHeader;
@@ -100,15 +102,35 @@ public class DemoEntityCollectionProcessor implements EntityCollectionProcessor
     // in our example: http://localhost:8080/DemoService/DemoService.svc/Categories/$expand=Products
     // or http://localhost:8080/DemoService/DemoService.svc/Products?$expand=Category
     if (expandOption != null) {
-
       // retrieve the EdmNavigationProperty from the expand expression
       // Note: in our example, we have only one NavigationProperty, so we can directly access it
+      EdmNavigationProperty edmNavigationProperty = null;
       ExpandItem expandItem = expandOption.getExpandItems().get(0);
-      // can be 'Category' or 'Products'
-      UriResource uriResource = expandItem.getResourcePath().getUriResourceParts().get(0);
+      if(expandItem.isStar()) {
+        List<EdmNavigationPropertyBinding> bindings = edmEntitySet.getNavigationPropertyBindings();
+        // we know that there are navigation bindings
+        // however normally in this case a check if navigation bindings exists is done
+        if(!bindings.isEmpty()) {
+          // can in our case only be 'Category' or 'Products', so we can take the first
+          EdmNavigationPropertyBinding binding = bindings.get(0);
+          EdmElement property = edmEntitySet.getEntityType().getProperty(binding.getPath());
+          // we don't need to handle error cases, as it is done in the Olingo library
+          if(property instanceof EdmNavigationProperty) {
+            edmNavigationProperty = (EdmNavigationProperty) property;
+          }
+        }
+      } else {
+        // can be 'Category' or 'Products', no path supported
+        UriResource uriResource = expandItem.getResourcePath().getUriResourceParts().get(0);
+        // we don't need to handle error cases, as it is done in the Olingo library
+        if(uriResource instanceof UriResourceNavigation) {
+          edmNavigationProperty = ((UriResourceNavigation) uriResource).getProperty();
+        }
+      }
+
+      // can be 'Category' or 'Products', no path supported
       // we don't need to handle error cases, as it is done in the Olingo library
-      if (uriResource instanceof UriResourceNavigation) {
-        EdmNavigationProperty edmNavigationProperty = ((UriResourceNavigation) uriResource).getProperty();
+      if(edmNavigationProperty != null) {
         String navPropName = edmNavigationProperty.getName();
         EdmEntityType expandEdmEntityType = edmNavigationProperty.getType();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/790ec760/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityProcessor.java
----------------------------------------------------------------------
diff --git a/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityProcessor.java b/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityProcessor.java
index f9bcb2b..281fdbe 100755
--- a/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityProcessor.java
+++ b/samples/tutorials/p6_queryoptions-es/src/main/java/myservice/mynamespace/service/DemoEntityProcessor.java
@@ -29,9 +29,11 @@ import org.apache.olingo.commons.api.data.ContextURL.Suffix;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.data.Link;
+import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.format.ODataFormat;
 import org.apache.olingo.commons.api.http.HttpHeader;
@@ -71,144 +73,110 @@ public class DemoEntityProcessor implements EntityProcessor {
     this.srvMetadata = serviceMetadata;
   }
 
-
-//  /**
-//   * DUMMY example implementation
-//   * */
-//  public void readEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat)
-//      throws ODataApplicationException, SerializerException {
-//
-//		// 1. Analyze the URI
-//	  	EdmEntitySet edmEntitySet  = ((UriResourceEntitySet)uriInfo.getUriResourceParts().get(0)).getEntitySet();
-//	  	// get the system query option $expand
-//		ExpandOption expandOption = uriInfo.getExpandOption();
-//
-//		// 2. get the data. 
-//		
-//		// Note: this is FAKE implementation
-//		// used for following request: 
-//		// http://localhost:8080/DemoService/DemoService.svc/Products(1)?$expand=Category
-//		
-//		// create hard-coded product entity and set a hard-coded category as inlineEntity for the expand
-//	    Entity fakeProductEntity = new Entity().addProperty(new Property(null, "ID", ValueType.PRIMITIVE, 11))
-//	    					.addProperty(new Property(null, "Name", ValueType.PRIMITIVE, "Gamer Mouse"));
-//	    fakeProductEntity.addProperty(new Property(null, "Description", ValueType.PRIMITIVE, "High end gaming mouse"));
-//	    
-//	    // create hard-coded category entity (the target of the $expand) 
-//	    Entity fakeCategoryEntity = new Entity().addProperty(new Property(null, "ID", ValueType.PRIMITIVE, 22))
-//	    					.addProperty(new Property(null, "Name", ValueType.PRIMITIVE, "Mice"));
-//
-//	    // create navigation link from product to category
-//        Link fakeLink = new Link();
-//        fakeLink.setTitle("Category");  // hard-code the name of the navigation property as declared in EdmProvider
-//        fakeLink.setInlineEntity(fakeCategoryEntity); // the entity which will be expanded
-//        
-//        //add the link to the product entity
-//        fakeProductEntity.getNavigationLinks().add(fakeLink);
-//        
-//        // END FAKE
-//
-//        
-//		// 3. serialize
-//		ContextURL contextUrl = ContextURL.with().entitySet(edmEntitySet).suffix(ContextURL.Suffix.ENTITY).build();
-//		// $expand info is added to the serializer options
-//		EntitySerializerOptions options = EntitySerializerOptions.with().contextURL(contextUrl).expand(expandOption).build();  
-//		ODataSerializer serializer = this.odata.createSerializer(ODataFormat.fromContentType(responseFormat));
-//		SerializerResult serializerResult = serializer.entity(srvMetadata, edmEntitySet.getEntityType(), fakeProductEntity, options);
-//
-//		//4. configure the response object
-//		response.setContent(serializerResult.getContent());
-//		response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-//		response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
-//  }
-
-  
-  
-  public void readEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat)
-	      throws ODataApplicationException, SerializerException {
-
-			// 1. retrieve the Entity Type
-			List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
-			// Note: only in our example we can assume that the first segment is the EntitySet
-			UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0);
-			EdmEntitySet edmEntitySet = uriResourceEntitySet.getEntitySet();
-
-			// 2. retrieve the data from backend
-			List<UriParameter> keyPredicates = uriResourceEntitySet.getKeyPredicates();
-			Entity entity = storage.readEntityData(edmEntitySet, keyPredicates);
-
-			// 3. apply system query options
-			
-			// handle $select
-			SelectOption selectOption = uriInfo.getSelectOption();
-			// in our example, we don't have performance issues, so we can rely upon the handling in the Olingo lib
-			// nothing else to be done
-			
-			// handle $expand
-			ExpandOption expandOption = uriInfo.getExpandOption();
-			// in our example: http://localhost:8080/DemoService/DemoService.svc/Categories(1)/$expand=Products
-			// or http://localhost:8080/DemoService/DemoService.svc/Products(1)?$expand=Category
-			if(expandOption != null){
-
-				// retrieve the EdmNavigationProperty from the expand expression
-				// Note: in our example, we have only one NavigationProperty, so we can directly access it
-				ExpandItem expandItem = expandOption.getExpandItems().get(0);
+	public void readEntity(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat)
+					throws ODataApplicationException, SerializerException {
+
+		// 1. retrieve the Entity Type
+		List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
+		// Note: only in our example we can assume that the first segment is the EntitySet
+		UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0);
+		EdmEntitySet edmEntitySet = uriResourceEntitySet.getEntitySet();
+
+		// 2. retrieve the data from backend
+		List<UriParameter> keyPredicates = uriResourceEntitySet.getKeyPredicates();
+		Entity entity = storage.readEntityData(edmEntitySet, keyPredicates);
+
+		// 3. apply system query options
+
+		// handle $select
+		SelectOption selectOption = uriInfo.getSelectOption();
+		// in our example, we don't have performance issues, so we can rely upon the handling in the Olingo lib
+		// nothing else to be done
+
+		// handle $expand
+		ExpandOption expandOption = uriInfo.getExpandOption();
+		// in our example: http://localhost:8080/DemoService/DemoService.svc/Categories(1)/$expand=Products
+		// or http://localhost:8080/DemoService/DemoService.svc/Products(1)?$expand=Category
+		if(expandOption != null) {
+			// retrieve the EdmNavigationProperty from the expand expression
+			// Note: in our example, we have only one NavigationProperty, so we can directly access it
+			EdmNavigationProperty edmNavigationProperty = null;
+			ExpandItem expandItem = expandOption.getExpandItems().get(0);
+			if(expandItem.isStar()) {
+				List<EdmNavigationPropertyBinding> bindings = edmEntitySet.getNavigationPropertyBindings();
+				// we know that there are navigation bindings
+				// however normally in this case a check if navigation bindings exists is done
+				if(!bindings.isEmpty()) {
+					// can in our case only be 'Category' or 'Products', so we can take the first
+					EdmNavigationPropertyBinding binding = bindings.get(0);
+					EdmElement property = edmEntitySet.getEntityType().getProperty(binding.getPath());
+					// we don't need to handle error cases, as it is done in the Olingo library
+					if(property instanceof EdmNavigationProperty) {
+						edmNavigationProperty = (EdmNavigationProperty) property;
+					}
+				}
+			} else {
 				// can be 'Category' or 'Products', no path supported
 				UriResource uriResource = expandItem.getResourcePath().getUriResourceParts().get(0);
 				// we don't need to handle error cases, as it is done in the Olingo library
-				if(uriResource instanceof UriResourceNavigation){
-					EdmNavigationProperty edmNavigationProperty = ((UriResourceNavigation)uriResource).getProperty();
-					EdmEntityType expandEdmEntityType = edmNavigationProperty.getType();
-					String navPropName = edmNavigationProperty.getName();
-					
-					// build the inline data
-					Link link = new Link();
-					link.setTitle(navPropName);
-					link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE);  
-					
-					if(edmNavigationProperty.isCollection()){ // in case of Categories(1)/$expand=Products
-						// fetch the data for the $expand (to-many navigation) from backend
-						// here we get the data for the expand
-						EntityCollection expandEntityCollection = storage.getRelatedEntityCollection(entity, expandEdmEntityType);
-						link.setInlineEntitySet(expandEntityCollection);
-					}else{  // in case of Products(1)?$expand=Category
-						// fetch the data for the $expand (to-one navigation) from backend
-						// here we get the data for the expand
-						Entity expandEntity = storage.getRelatedEntity(entity, expandEdmEntityType);
-						link.setInlineEntity(expandEntity);
-					}
-					
-					// set the link - containing the expanded data - to the current entity 
-					entity.getNavigationLinks().add(link);
+				if(uriResource instanceof UriResourceNavigation) {
+					edmNavigationProperty = ((UriResourceNavigation) uriResource).getProperty();
 				}
 			}
-			
-			
-			
-			// 4. serialize
-			EdmEntityType edmEntityType = edmEntitySet.getEntityType();
-			// we need the property names of the $select, in order to build the context URL
-			String selectList = odata.createUriHelper().buildContextURLSelectList(edmEntityType, expandOption, selectOption);
-			ContextURL contextUrl = ContextURL.with().entitySet(edmEntitySet)
-                                                .selectList(selectList)
-                                                .suffix(Suffix.ENTITY).build();
-		 	
-			// make sure that $expand and $select are considered by the serializer
-			// adding the selectOption to the serializerOpts will actually tell the lib to do the job
-			EntitySerializerOptions opts = EntitySerializerOptions.with()
-					.contextURL(contextUrl)
-					.select(selectOption)
-					.expand(expandOption)
-					.build();
-
-			ODataSerializer serializer = this.odata.createSerializer(ODataFormat.fromContentType(responseFormat));
-			SerializerResult serializerResult = serializer.entity(srvMetadata, edmEntityType, entity, opts);
-
-			//5. configure the response object
-			response.setContent(serializerResult.getContent());
-			response.setStatusCode(HttpStatusCode.OK.getStatusCode());
-			response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
-	  }
+
+			// can be 'Category' or 'Products', no path supported
+			// we don't need to handle error cases, as it is done in the Olingo library
+			if(edmNavigationProperty != null) {
+				EdmEntityType expandEdmEntityType = edmNavigationProperty.getType();
+				String navPropName = edmNavigationProperty.getName();
+
+				// build the inline data
+				Link link = new Link();
+				link.setTitle(navPropName);
+				link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE);
+
+				if(edmNavigationProperty.isCollection()){ // in case of Categories(1)/$expand=Products
+					// fetch the data for the $expand (to-many navigation) from backend
+					// here we get the data for the expand
+					EntityCollection expandEntityCollection = storage.getRelatedEntityCollection(entity, expandEdmEntityType);
+					link.setInlineEntitySet(expandEntityCollection);
+				} else {  // in case of Products(1)?$expand=Category
+					// fetch the data for the $expand (to-one navigation) from backend
+					// here we get the data for the expand
+					Entity expandEntity = storage.getRelatedEntity(entity, expandEdmEntityType);
+					link.setInlineEntity(expandEntity);
+				}
+
+				// set the link - containing the expanded data - to the current entity
+				entity.getNavigationLinks().add(link);
+			}
+		}
+
+
+		// 4. serialize
+		EdmEntityType edmEntityType = edmEntitySet.getEntityType();
+		// we need the property names of the $select, in order to build the context URL
+		String selectList = odata.createUriHelper().buildContextURLSelectList(edmEntityType, expandOption, selectOption);
+		ContextURL contextUrl = ContextURL.with().entitySet(edmEntitySet)
+						.selectList(selectList)
+						.suffix(Suffix.ENTITY).build();
+
+		// make sure that $expand and $select are considered by the serializer
+		// adding the selectOption to the serializerOpts will actually tell the lib to do the job
+		EntitySerializerOptions opts = EntitySerializerOptions.with()
+						.contextURL(contextUrl)
+						.select(selectOption)
+						.expand(expandOption)
+						.build();
+
+		ODataSerializer serializer = this.odata.createSerializer(ODataFormat.fromContentType(responseFormat));
+		SerializerResult serializerResult = serializer.entity(srvMetadata, edmEntityType, entity, opts);
+
+		// 5. configure the response object
+		response.setContent(serializerResult.getContent());
+		response.setStatusCode(HttpStatusCode.OK.getStatusCode());
+		response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString());
+	}
 
   
   

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/790ec760/samples/tutorials/p6_queryoptions-es/src/main/webapp/index.jsp
----------------------------------------------------------------------
diff --git a/samples/tutorials/p6_queryoptions-es/src/main/webapp/index.jsp b/samples/tutorials/p6_queryoptions-es/src/main/webapp/index.jsp
index b2cc03e..5ee033f 100755
--- a/samples/tutorials/p6_queryoptions-es/src/main/webapp/index.jsp
+++ b/samples/tutorials/p6_queryoptions-es/src/main/webapp/index.jsp
@@ -31,11 +31,17 @@ under the License.
         <a href="DemoService.svc/Products/?$expand=Category">Expand - /Products/?$expand=Category</a>
     </li>
     <li>
+        <a href="DemoService.svc/Products(1)/?$expand=*">Expand - /Products(1)/?$expand=*</a>
+    </li>
+    <li>
         <a href="DemoService.svc/Categories(1)/?$expand=Products">Expand - /Categories(1)/?$expand=Products</a>
     </li>
     <li>
         <a href="DemoService.svc/Categories/?$expand=Products">Expand - /Categories/?$expand=Products</a>
     </li>
+    <li>
+        <a href="DemoService.svc/Categories/?$expand=*">Expand - /Categories/?$expand=*</a>
+    </li>
 </ul>