olingo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jhues...@apache.org
Subject svn commit: r1523655 - /incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext
Date Mon, 16 Sep 2013 14:06:51 GMT
Author: jhuesken
Date: Mon Sep 16 14:06:51 2013
New Revision: 1523655

URL: http://svn.apache.org/r1523655
Log:
CMS commit to olingo by jhuesken

Added:
    incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext   (with props)

Added: incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext
URL: http://svn.apache.org/viewvc/incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext?rev=1523655&view=auto
==============================================================================
--- incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext (added)
+++ incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext Mon Sep 16
14:06:51 2013
@@ -0,0 +1,151 @@
+Title:
+Notice:    Licensed to the Apache Software Foundation (ASF) under one
+           or more contributor license agreements.  See the NOTICE file
+           distributed with this work for additional information
+           regarding copyright ownership.  The ASF licenses this file
+           to you under the Apache License, Version 2.0 (the
+           "License"); you may not use this file except in compliance
+           with the License.  You may obtain a copy of the License at
+           .
+             http://www.apache.org/licenses/LICENSE-2.0
+           .
+           Unless required by applicable law or agreed to in writing,
+           software distributed under the License is distributed on an
+           "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+           KIND, either express or implied.  See the License for the
+           specific language governing permissions and limitations
+           under the License.
+
+# Adding Function Imports to OData Services
+This section explains how to enable custom operations as function imports. Function imports
are used to perform custom operations on a JPA entity in addition to CRUD operations. For
example, consider a scenario where you would like to check the availability of an item to
promise on the sales order line items. ATP check is a custom operation that can be exposed
as a function import in the schema of OData service.
+
+1. Create a dependency to EDM Annotation Project. This is required to use the annotations
that are defined in the project.
+
+		<dependency>
+		   <groupId>org.apache.olingo.odata2</groupId>
+		   <artifactId>org.apache.olingo.odata2.api.annotation</artifactId>
+		   <version>x.x.x</version>
+		   <scope>provided</scope>
+		</dependency>
+
+2. Create a Java class and annotate the Java methods implementing custom operations with
Function Import and Parameter Java annotations as shown below. Java methods can be created
in JPA entity types and these methods can be annotated with EDM annotations for function import.
+		
+        package org.apache.olingo.odata2.jpa.processor.ref.extension;
+		
+		import java.util.List;
+		
+		import javax.persistence.EntityManager;
+		import javax.persistence.Persistence;
+		import javax.persistence.Query;
+		 
+		import org.apache.olingo.odata2.api.annotation.edm.Facets;
+		import org.apache.olingo.odata2.api.annotation.edm.FunctionImport;
+		import org.apache.olingo.odata2.api.annotation.edm.Parameter;
+		import org.apache.olingo.odata2.api.annotation.edm.Parameter.Mode;
+		import org.apache.olingo.odata2.api.annotation.edmx.HttpMethod.Name;
+		import org.apache.olingo.odata2.api.annotation.edmx.HttpMethod;
+		import org.apache.olingo.odata2.api.annotation.edm.FunctionImport.ReturnType;
+		import org.apache.olingo.odata2.api.annotation.edm.FunctionImport.Multiplicity;
+		import org.apache.olingo.odata2.api.exception.ODataException;
+		import org.apache.olingo.odata2.jpa.processor.ref.model.Address;
+		import org.apache.olingo.odata2.jpa.processor.ref.model.SalesOrderHeader;
+		import org.apache.olingo.odata2.jpa.processor.ref.model.SalesOrderItem;
+		
+		public class SalesOrderHeaderProcessor {
+		
+		  private EntityManager em;
+		  
+		   public SalesOrderHeaderProcessor() 
+		    em = Persistence.createEntityManagerFactory("salesorderprocessing")
+		      .createEntityManager();
+		  }
+		
+		  @SuppressWarnings("unchecked")
+		  @FunctionImport(name = "FindAllSalesOrders", entitySet = "SalesOrders", returnType =
ReturnType.ENTITY_TYPE, multiplicity = Multiplicity.MANY)
+		  public List<SalesOrderHeader> findAllSalesOrders(
+		    @Parameter(name = "DeliveryStatusCode", facets = @Facets(maxLength = 2)) final String
status) {
+		
+		        Query q = em.createQuery("SELECT E1 from SalesOrderHeader E1 WHERE E1.deliveryStatus
= '"+ status + "'");
+		        List<SalesOrderHeader> soList = (List<SalesOrderHeader>) q.getResultList();
+		        return soList;
+		  }
+		
+		  @FunctionImport(name = "CheckATP", returnType = ReturnType.SCALAR, multiplicity = Multiplicity.ONE,
httpMethod = @HttpMethod(name = Name.GET))
+		  public boolean checkATP(
+		    @Parameter(name = "SoID", facets = @Facets(nullable = false), mode = Mode.IN) final
Long soID,
+		    @Parameter(name = "LiId", facets = @Facets(nullable = false), mode = Mode.IN) final
Long lineItemID) {
+		    if (soID == 2L) {
+		      return false;
+		    } else {
+		      return true;
+		    }
+		  }
+		
+		  @FunctionImport(returnType = ReturnType.ENTITY_TYPE, entitySet = "SalesOrders")
+		  public SalesOrderHeader calculateNetAmount(
+		    @Parameter(name = "SoID", facets = @Facets(nullable = false)) final Long soID)
+		    throws ODataException {
+		
+		          if (soID <= 0L) {
+		            throw new ODataException("Invalid SoID");
+		          }
+		
+		          Query q = em.createQuery("SELECT E1 from SalesOrderHeader E1 WHERE E1.soId =
"+ soID + "l");
+		          if (q.getResultList().isEmpty()) {
+		            return null;
+		          }
+		          SalesOrderHeader so = (SalesOrderHeader) q.getResultList().get(0);
+		          double amount = 0;
+		          for (SalesOrderItem soi : so.getSalesOrderItem()) {
+		            amount = amount + (soi.getAmount() * soi.getDiscount() * soi.getQuantity());
+		          }
+		          so.setNetAmount(amount);
+		          return so;
+		      }
+
+		  @SuppressWarnings("unchecked")
+		  @FunctionImport(returnType = ReturnType.COMPLEX_TYPE)
+		  public Address getAddress(		
+		    @Parameter(name = "SoID", facets = @Facets(nullable = false)) final Long soID) {
+		    Query q = em.createQuery("SELECT E1 from SalesOrderHeader E1 WHERE E1.soId = " + soID
+ "l");
+		    List<SalesOrderHeader> soList = (List<SalesOrderHeader>) q.getResultList();
+		    if (!soList.isEmpty()) {
+		      return soList.get(0).getBuyerAddress();
+		    } else {
+		      return null;
+		    }
+		  }
+		
+		  /*
+		   * This method will not be transformed into Function
+		   * Import. Function Import with return type as void is not
+		   * supported yet.
+		   */
+		  @FunctionImport(returnType = ReturnType.NONE)
+		  public void process(
+		    @Parameter(name = "SoID", facets = @Facets(nullable = false)) final Long soID) {
+		    return;
+		  }
+		}
+
+3. Create a Java class by implementing the interface *org.apache.olingo.odata2.processor.api.jpa.model*
to register the annotated Java methods.
+
+        public class SalesOrderProcessingExtension implements JPAEdmExtension {
+          @Override
+          public void extendJPAEdmSchema(final JPAEdmSchemaView arg0 {
+            // TODO Auto-generated method stub
+          }
+
+          @Override
+          public void extendWithOperation(final JPAEdmSchemaView view) {
+            view.registerOperations(SalesOrderHeaderProcessor.class, null);
+          }
+       }
+
+ 	*Note*: Use the method *extendWithOperation* to register the list of classes and the methods
within the class that needs to be exposed as Function Imports. If the second parameter is
passed null, then the OData JPA Processor Library would consider all the annotated methods
within the class for Function Import. However, you could also restrict the list of methods
that needs to be transformed into function imports within a Java class by passing an array
of Java method names as the second parameter.
+
+4. Register the class created in step 3 with *ODataJPAContext* as shown below. The registration
can be done during the initialization of *ODataJPAContext* in OData JPA Service Factory along
with initializing persistence unit name, entity manager factory instance and optional mapping
model.
+
+ 	   oDataJPAContext.setJPAEdmExtension((JPAEdmExtension) new SalesOrderProcessingExtension());
+
+	*Note*: You must register the class because the OData JPA Processor Library should be informed
about the list of Java methods that it needs to process in a project. If we do not register,
then OData JPA Processor Library should scan all the classes and the methods in the Java project
looking for EDM annotations. In order to avoid such overload, it is mandatory to specify the
list of Java methods that shall be transformed into function imports in a class.
\ No newline at end of file

Propchange: incubator/olingo/site/trunk/content/doc/tutorials/jpafunctionimport.mdtext
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message