Index: pom.xml | |
=================================================================== | |
--- pom.xml (revision 952663) | |
+++ pom.xml (working copy) | |
@@ -189,6 +189,18 @@ | |
</exclusion> | |
</exclusions> | |
</dependency> | |
+ | |
+ <dependency> | |
+ <groupId>org.apache.geronimo.specs</groupId> | |
+ <artifactId>geronimo-jpa_2.0_spec</artifactId> | |
+ <version>1.0</version> | |
+ </dependency> | |
+ | |
+ <dependency> | |
+ <groupId>org.apache.openjpa</groupId> | |
+ <artifactId>openjpa</artifactId> | |
+ <version>2.0.0</version> | |
+ </dependency> | |
<dependency> | |
<groupId>org.apache.activemq</groupId> | |
Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/ejb3/TradeSLSBBean.java | |
=================================================================== | |
--- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/ejb3/TradeSLSBBean.java (revision 952663) | |
+++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/ejb3/TradeSLSBBean.java (working copy) | |
@@ -18,10 +18,15 @@ | |
package org.apache.geronimo.samples.daytrader.ejb3; | |
import org.apache.geronimo.samples.daytrader.AccountDataBean; | |
+import org.apache.geronimo.samples.daytrader.AccountDataBean_; | |
import org.apache.geronimo.samples.daytrader.AccountProfileDataBean; | |
+import org.apache.geronimo.samples.daytrader.AccountProfileDataBean_; | |
import org.apache.geronimo.samples.daytrader.HoldingDataBean; | |
+import org.apache.geronimo.samples.daytrader.HoldingDataBean_; | |
import org.apache.geronimo.samples.daytrader.OrderDataBean; | |
+import org.apache.geronimo.samples.daytrader.OrderDataBean_; | |
import org.apache.geronimo.samples.daytrader.QuoteDataBean; | |
+import org.apache.geronimo.samples.daytrader.QuoteDataBean_; | |
import org.apache.geronimo.samples.daytrader.TradeConfig; | |
import org.apache.geronimo.samples.daytrader.TradeAction; | |
import org.apache.geronimo.samples.daytrader.RunStatsDataBean; | |
@@ -43,6 +48,13 @@ | |
import javax.persistence.EntityManager; | |
import javax.persistence.PersistenceContext; | |
import javax.persistence.Query; | |
+import javax.persistence.TypedQuery; | |
+import javax.persistence.criteria.CriteriaBuilder; | |
+import javax.persistence.criteria.CriteriaQuery; | |
+import javax.persistence.criteria.ParameterExpression; | |
+import javax.persistence.criteria.Path; | |
+import javax.persistence.criteria.Predicate; | |
+import javax.persistence.criteria.Root; | |
import javax.transaction.HeuristicMixedException; | |
import javax.transaction.HeuristicRollbackException; | |
import javax.transaction.NotSupportedException; | |
@@ -51,6 +63,8 @@ | |
import org.apache.geronimo.samples.daytrader.util.FinancialUtils; | |
import org.apache.geronimo.samples.daytrader.util.Log; | |
import org.apache.geronimo.samples.daytrader.util.MDBStats; | |
+import org.apache.openjpa.persistence.criteria.OpenJPACriteriaQuery; | |
+import org.apache.openjpa.persistence.query.QueryBuilder; | |
@Stateless | |
@TransactionAttribute(TransactionAttributeType.REQUIRED) | |
@@ -89,8 +103,14 @@ | |
// ordered by their change in value | |
Collection<QuoteDataBean> quotes; | |
- Query query = entityManager.createNamedQuery("quoteejb.quotesByChange"); | |
- quotes = query.getResultList(); | |
+ // Demonstration of the JPA criteria query API for the following JPQL: | |
+ // SELECT q FROM quoteejb q WHERE q.symbol LIKE 's:1__' ORDER BY q.change1 DESC | |
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |
+ CriteriaQuery<QuoteDataBean> c = cb.createQuery(QuoteDataBean.class); | |
+ Root<QuoteDataBean> qdb = c.from(QuoteDataBean.class); | |
+ c.where(cb.like(qdb.get(QuoteDataBean_.symbol), "s:1__")); | |
+ c.orderBy(cb.desc(qdb.get(QuoteDataBean_.change1))); | |
+ quotes = entityManager.createQuery(c).getResultList(); | |
QuoteDataBean[] quoteArray = (QuoteDataBean[]) quotes.toArray(new QuoteDataBean[quotes.size()]); | |
ArrayList<QuoteDataBean> topGainers = new ArrayList<QuoteDataBean>(5); | |
@@ -356,12 +376,25 @@ | |
// Get the primary keys for all the closed Orders for this | |
// account. | |
- Query query = entityManager.createNamedQuery("orderejb.closedOrders"); | |
- query.setParameter("userID", userID); | |
- Collection results = query.getResultList(); | |
- Iterator itr = results.iterator(); | |
- | |
- // Spin through the orders to populate the lazy quote fields | |
+ | |
+ // Demonstration of the JPA criteria query API for the following JPQL: | |
+ // SELECT o FROM orderejb o WHERE o.orderStatus = 'closed' AND o.account.profile.userID = :userID | |
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |
+ CriteriaQuery<OrderDataBean> c = cb.createQuery(OrderDataBean.class); | |
+ Root<OrderDataBean> odb = c.from(OrderDataBean.class); | |
+ ParameterExpression<String> uidParm = cb.parameter(String.class); | |
+ Path<AccountDataBean> acct = odb.get(OrderDataBean_.account); | |
+ Path<AccountProfileDataBean> profile = acct.get(AccountDataBean_.profile); | |
+ Path<String> uid = profile.get(AccountProfileDataBean_.userID); | |
+ Predicate closedCondition = cb.equal(odb.get(OrderDataBean_.orderStatus), "closed"); | |
+ Predicate uidCondition = cb.equal(uid, uidParm); | |
+ Predicate condition = cb.and(closedCondition, uidCondition); | |
+ c.where(condition); | |
+ TypedQuery<OrderDataBean> q = entityManager.createQuery(c); | |
+ Collection<OrderDataBean> results = q.setParameter(uidParm, userID).getResultList(); | |
+ | |
+ Iterator itr = results.iterator(); | |
+ // Spin through the orders to populate the lazy quote fields | |
while (itr.hasNext()){ | |
OrderDataBean thisOrder = (OrderDataBean)itr.next(); | |
thisOrder.getQuote(); | |
@@ -427,8 +460,13 @@ | |
if (Log.doTrace()) | |
Log.trace("TradeSLSBBean:getAllQuotes"); | |
- Query query = entityManager.createNamedQuery("quoteejb.allQuotes"); | |
- return query.getResultList(); | |
+ // Demonstration of the JPA criteria query API for the following JPQL: | |
+ // SELECT q FROM quoteejb q | |
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |
+ CriteriaQuery<QuoteDataBean> c = cb.createQuery(QuoteDataBean.class); | |
+ Root<QuoteDataBean> qbd = c.from(QuoteDataBean.class); | |
+ TypedQuery<QuoteDataBean> q = entityManager.createQuery(c); | |
+ return q.getResultList(); | |
} | |
public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal changeFactor, double sharesTraded) { | |
@@ -463,6 +501,7 @@ | |
quote.setPrice(newPrice); | |
quote.setVolume(quote.getVolume() + sharesTraded); | |
+ quote.setChange(newPrice.subtract(quote.getOpen()).doubleValue()); | |
entityManager.merge(quote); | |
// TODO find out if requires new here is really intended -- it is backwards, | |
@@ -477,9 +516,22 @@ | |
if (Log.doTrace()) | |
Log.trace("TradeSLSBBean:getHoldings", userID); | |
- Query query = entityManager.createNamedQuery("holdingejb.holdingsByUserID"); | |
- query.setParameter("userID", userID); | |
- Collection<HoldingDataBean> holdings = query.getResultList(); | |
+ // Demonstration of the JPA criteria query API for the following JPQL: | |
+ // SELECT h FROM holdingejb h where h.account.profile.userID = :userID | |
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |
+ CriteriaQuery<HoldingDataBean> c = cb.createQuery(HoldingDataBean.class); | |
+ Root<HoldingDataBean> hdb = c.from(HoldingDataBean.class); | |
+ ParameterExpression<String> uidParm = cb.parameter(String.class); | |
+ Path<AccountDataBean> account = hdb.get(HoldingDataBean_.account); | |
+ Path<AccountProfileDataBean> profile = account.get(AccountDataBean_.profile); | |
+ Path<String> uid = profile.get(AccountProfileDataBean_.userID); | |
+ // The following 'select' method is not needed, since it is the default. It is just shown for | |
+ // illustrative purposes. | |
+ c.select(hdb); | |
+ c.where(cb.equal(uid, uidParm)); | |
+ TypedQuery<HoldingDataBean> q = entityManager.createQuery(c); | |
+ Collection<HoldingDataBean> holdings = q.setParameter(uidParm, userID).getResultList(); | |
+ | |
/* | |
* Inflate the lazy data memebers | |
*/ | |
Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeServices.java | |
=================================================================== | |
--- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeServices.java (revision 952663) | |
+++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeServices.java (working copy) | |
@@ -18,8 +18,6 @@ | |
import java.math.BigDecimal; | |
-import java.rmi.Remote; | |
-import java.rmi.RemoteException; | |
import java.util.Collection; | |
/** | |
@@ -33,7 +31,7 @@ | |
* @see TradeDirect | |
* | |
*/ | |
-public interface TradeServices extends Remote { | |
+public interface TradeServices { | |
/** | |
* Compute and return a snapshot of the current market conditions | |
@@ -44,7 +42,7 @@ | |
* | |
* @return A snapshot of the current market summary | |
*/ | |
- public MarketSummaryDataBean getMarketSummary() throws Exception, RemoteException; | |
+ public MarketSummaryDataBean getMarketSummary() throws Exception; | |
/** | |
@@ -61,7 +59,7 @@ | |
*/ | |
- public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception, RemoteException; | |
+ public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception; | |
/** | |
* Sell a stock holding and removed the holding for the given user. | |
@@ -72,7 +70,7 @@ | |
* @param holdingID the users holding to be sold | |
* @return OrderDataBean providing the status of the newly created sell order | |
*/ | |
- public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception, RemoteException; | |
+ public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception; | |
/** | |
@@ -87,7 +85,7 @@ | |
* @param orderID the Order being queued for processing | |
* @return OrderDataBean providing the status of the completed order | |
*/ | |
- public void queueOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException; | |
+ public void queueOrder(Integer orderID, boolean twoPhase) throws Exception; | |
/** | |
* Complete the Order identefied by orderID | |
@@ -102,7 +100,7 @@ | |
* @param orderID the Order to complete | |
* @return OrderDataBean providing the status of the completed order | |
*/ | |
- public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException; | |
+ public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception; | |
/** | |
* Cancel the Order identefied by orderID | |
@@ -113,7 +111,7 @@ | |
* @param orderID the Order to complete | |
* @return OrderDataBean providing the status of the completed order | |
*/ | |
- public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException; | |
+ public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception; | |
/** | |
@@ -123,7 +121,7 @@ | |
* @param orderID the order which has completed | |
* | |
*/ | |
- public void orderCompleted(String userID, Integer orderID) throws Exception, RemoteException; | |
+ public void orderCompleted(String userID, Integer orderID) throws Exception; | |
/** | |
@@ -132,7 +130,7 @@ | |
* @param userID the customer account to retrieve orders for | |
* @return Collection OrderDataBeans providing detailed order information | |
*/ | |
- public Collection getOrders(String userID) throws Exception, RemoteException; | |
+ public Collection getOrders(String userID) throws Exception; | |
/** | |
* Get the collection of completed orders for a given account that need to be alerted to the user | |
@@ -140,7 +138,7 @@ | |
* @param userID the customer account to retrieve orders for | |
* @return Collection OrderDataBeans providing detailed order information | |
*/ | |
- public Collection getClosedOrders(String userID) throws Exception, RemoteException; | |
+ public Collection getClosedOrders(String userID) throws Exception; | |
/** | |
@@ -151,7 +149,7 @@ | |
* @param details a short description of the stock or company | |
* @return a new QuoteDataBean or null if Quote could not be created | |
*/ | |
- public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception, RemoteException; | |
+ public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception; | |
/** | |
* Return a {@link QuoteDataBean} describing a current quote for the given stock symbol | |
@@ -159,14 +157,14 @@ | |
* @param symbol the stock symbol to retrieve the current Quote | |
* @return the QuoteDataBean | |
*/ | |
- public QuoteDataBean getQuote(String symbol) throws Exception, RemoteException; | |
+ public QuoteDataBean getQuote(String symbol) throws Exception; | |
/** | |
* Return a {@link java.util.Collection} of {@link QuoteDataBean} | |
* describing all current quotes | |
* @return A collection of QuoteDataBean | |
*/ | |
- public Collection getAllQuotes() throws Exception, RemoteException; | |
+ public Collection getAllQuotes() throws Exception; | |
/** | |
* Update the stock quote price and volume for the specified stock symbol | |
@@ -175,7 +173,7 @@ | |
* @param price the updated quote price | |
* @return the QuoteDataBean describing the stock | |
*/ | |
- public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception, RemoteException; | |
+ public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception; | |
/** | |
@@ -185,7 +183,7 @@ | |
* @param userID the customer requesting the portfolio | |
* @return Collection of the users portfolio of stock holdings | |
*/ | |
- public Collection getHoldings(String userID) throws Exception, RemoteException; | |
+ public Collection getHoldings(String userID) throws Exception; | |
/** | |
* Return a specific user stock holding identifed by the holdingID | |
@@ -193,7 +191,7 @@ | |
* @param holdingID the holdingID to return | |
* @return a HoldingDataBean describing the holding | |
*/ | |
- public HoldingDataBean getHolding(Integer holdingID) throws Exception, RemoteException; | |
+ public HoldingDataBean getHolding(Integer holdingID) throws Exception; | |
/** | |
* Return an AccountDataBean object for userID describing the account | |
@@ -202,7 +200,7 @@ | |
* @return User account data in AccountDataBean | |
*/ | |
public AccountDataBean getAccountData(String userID) | |
- throws Exception, RemoteException; | |
+ throws Exception; | |
/** | |
* Return an AccountProfileDataBean for userID providing the users profile | |
@@ -210,7 +208,7 @@ | |
* @param userID the account userID to lookup | |
* @param User account profile data in AccountProfileDataBean | |
*/ | |
- public AccountProfileDataBean getAccountProfileData(String userID) throws Exception, RemoteException; | |
+ public AccountProfileDataBean getAccountProfileData(String userID) throws Exception; | |
/** | |
* Update userID's account profile information using the provided AccountProfileDataBean object | |
@@ -218,7 +216,7 @@ | |
* @param userID the account userID to lookup | |
* @param User account profile data in AccountProfileDataBean | |
*/ | |
- public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception, RemoteException; | |
+ public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception; | |
/** | |
@@ -228,7 +226,7 @@ | |
* @param password the password entered by the customer for authentication | |
* @return User account data in AccountDataBean | |
*/ | |
- public AccountDataBean login(String userID, String password) throws Exception, RemoteException; | |
+ public AccountDataBean login(String userID, String password) throws Exception; | |
/** | |
* Logout the given user | |
@@ -237,7 +235,7 @@ | |
* @return the login status | |
*/ | |
- public void logout(String userID) throws Exception, RemoteException; | |
+ public void logout(String userID) throws Exception; | |
/** | |
* Register a new Trade customer. | |
@@ -259,7 +257,7 @@ | |
String address, | |
String email, | |
String creditcard, | |
- BigDecimal openBalance) throws Exception, RemoteException; | |
+ BigDecimal openBalance) throws Exception; | |
/** | |
@@ -271,6 +269,6 @@ | |
* | |
* return statistics for this benchmark run | |
*/ | |
- public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception, RemoteException; | |
+ public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception; | |
} | |
Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java | |
=================================================================== | |
--- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java (revision 952663) | |
+++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/TradeConfig.java (working copy) | |
@@ -38,7 +38,7 @@ | |
public static final int EJB3 = 0; | |
public static final int DIRECT = 1; | |
public static final int SESSION3 = 2; | |
- public static int runTimeMode = DIRECT; | |
+ public static int runTimeMode = EJB3; | |
/* Trade JPA Layer parameters */ | |
public static String[] jpaLayerNames = {"OpenJPA", "Hibernate"}; | |
Index: modules/ejb/src/main/resources/META-INF/ejb-jar.xml | |
=================================================================== | |
--- modules/ejb/src/main/resources/META-INF/ejb-jar.xml (revision 952663) | |
+++ modules/ejb/src/main/resources/META-INF/ejb-jar.xml (working copy) | |
@@ -25,4 +25,13 @@ | |
entity, session and message driven beans using annotations. The inline annotations | |
can be overriden by modifing this file. | |
--> | |
+ <assembly-descriptor> | |
+ <message-destination> | |
+ <message-destination-name>TradeBrokerQueue</message-destination-name> | |
+ </message-destination> | |
+ <message-destination> | |
+ <message-destination-name>TradeStreamerTopic</message-destination-name> | |
+ </message-destination> | |
+ </assembly-descriptor> | |
+ | |
</ejb-jar> | |
Index: modules/ejb/pom.xml | |
=================================================================== | |
--- modules/ejb/pom.xml (revision 952663) | |
+++ modules/ejb/pom.xml (working copy) | |
@@ -54,7 +54,8 @@ | |
</dependency> | |
<dependency> | |
<groupId>org.apache.geronimo.specs</groupId> | |
- <artifactId>geronimo-jpa_3.0_spec</artifactId> | |
+ <artifactId>geronimo-jpa_2.0_spec</artifactId> | |
+ <version>1.1</version> | |
<scope>provided</scope> | |
</dependency> | |
<dependency> | |
@@ -80,6 +81,7 @@ | |
<dependency> | |
<groupId>org.apache.openjpa</groupId> | |
<artifactId>openjpa</artifactId> | |
+ <version>2.0.0</version> | |
<scope>provided</scope> | |
</dependency> | |
<!-- OpenJPA PCEnhancer ant task failed without these packages --> | |
Index: modules/web/src/main/webapp/WEB-INF/web.xml | |
=================================================================== | |
--- modules/web/src/main/webapp/WEB-INF/web.xml (revision 952663) | |
+++ modules/web/src/main/webapp/WEB-INF/web.xml (working copy) | |
@@ -82,7 +82,7 @@ | |
<init-param> | |
<description>Sets the default RuntimeMode. Legal values include EJB and Direct</description> | |
<param-name>runTimeMode</param-name> | |
- <param-value>DIRECT</param-value> | |
+ <param-value>Full EJB3</param-value> | |
</init-param> | |
<init-param> | |
<description>Sets the default Order Processing Mode. Legal values include Synchronous, Asynchronous_1-Phase and Asynchronous_2-Phase</description> |