blob: 98d84f2aefc0b2522262079870451a194a0c049d [file] [log] [blame]
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>