Index: pom.xml =================================================================== --- pom.xml (revision 948077) +++ pom.xml (working copy) @@ -189,6 +189,18 @@ + + + org.apache.geronimo.specs + geronimo-jpa_2.0_spec + 1.0 + + + + org.apache.openjpa + openjpa + 2.0.0 + org.apache.activemq Index: bin/dbscripts/derby/createDerbyDB.bat =================================================================== --- bin/dbscripts/derby/createDerbyDB.bat (revision 935418) +++ bin/dbscripts/derby/createDerbyDB.bat (working copy) @@ -26,7 +26,8 @@ :GERONIMO_OK set DERBY_PATH=%GERONIMO_HOME%\repository\org\apache\derby -set DERBY_VER=10.4.1.3 +@REM set DERBY_VER=10.4.1.3 +set DERBY_VER=10.5.3.0_1 set CLASSPATH=%DERBY_PATH%\derby\%DERBY_VER%\derby-%DERBY_VER%.jar set CLASSPATH=%CLASSPATH%;%DERBY_PATH%\derbynet\%DERBY_VER%\derbynet-%DERBY_VER%.jar set CLASSPATH=%CLASSPATH%;%DERBY_PATH%\derbytools\%DERBY_VER%\derbytools-%DERBY_VER%.jar 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 935418) +++ 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/ejb3/TradeSLSBBean.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/ejb3/TradeSLSBBean.java (revision 935418) +++ 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 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 c = cb.createQuery(QuoteDataBean.class); + Root 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 topGainers = new ArrayList(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 c = cb.createQuery(OrderDataBean.class); + Root odb = c.from(OrderDataBean.class); + ParameterExpression uidParm = cb.parameter(String.class); + Path acct = odb.get(OrderDataBean_.account); + Path profile = acct.get(AccountDataBean_.profile); + Path 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 q = entityManager.createQuery(c); + Collection 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 c = cb.createQuery(QuoteDataBean.class); + Root qbd = c.from(QuoteDataBean.class); + TypedQuery 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 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 c = cb.createQuery(HoldingDataBean.class); + Root hdb = c.from(HoldingDataBean.class); + ParameterExpression uidParm = cb.parameter(String.class); + Path account = hdb.get(HoldingDataBean_.account); + Path profile = account.get(AccountDataBean_.profile); + Path 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 q = entityManager.createQuery(c); + Collection holdings = q.setParameter(uidParm, userID).getResultList(); + /* * Inflate the lazy data memebers */ Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/HoldingDataBean_.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/HoldingDataBean_.java (revision 0) +++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/HoldingDataBean_.java (revision 0) @@ -0,0 +1,22 @@ +/** + * Generated by OpenJPA MetaModel Generator Tool. +**/ + +package org.apache.geronimo.samples.daytrader; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.metamodel.SingularAttribute; + +@javax.persistence.metamodel.StaticMetamodel +(value=org.apache.geronimo.samples.daytrader.HoldingDataBean.class) +@javax.annotation.Generated +(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Mon May 03 09:50:36 CDT 2010") +public class HoldingDataBean_ { + public static volatile SingularAttribute account; + public static volatile SingularAttribute holdingID; + public static volatile SingularAttribute purchaseDate; + public static volatile SingularAttribute purchasePrice; + public static volatile SingularAttribute quantity; + public static volatile SingularAttribute quote; +} Property changes on: modules\ejb\src\main\java\org\apache\geronimo\samples\daytrader\HoldingDataBean_.java ___________________________________________________________________ Added: svn:eol-style + native Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountDataBean_.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountDataBean_.java (revision 0) +++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountDataBean_.java (revision 0) @@ -0,0 +1,27 @@ +/** + * Generated by OpenJPA MetaModel Generator Tool. +**/ + +package org.apache.geronimo.samples.daytrader; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.metamodel.CollectionAttribute; +import javax.persistence.metamodel.SingularAttribute; + +@javax.persistence.metamodel.StaticMetamodel +(value=org.apache.geronimo.samples.daytrader.AccountDataBean.class) +@javax.annotation.Generated +(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Mon May 03 09:48:10 CDT 2010") +public class AccountDataBean_ { + public static volatile SingularAttribute accountID; + public static volatile SingularAttribute balance; + public static volatile SingularAttribute creationDate; + public static volatile CollectionAttribute holdings; + public static volatile SingularAttribute lastLogin; + public static volatile SingularAttribute loginCount; + public static volatile SingularAttribute logoutCount; + public static volatile SingularAttribute openBalance; + public static volatile CollectionAttribute orders; + public static volatile SingularAttribute profile; +} Property changes on: modules\ejb\src\main\java\org\apache\geronimo\samples\daytrader\AccountDataBean_.java ___________________________________________________________________ Added: svn:eol-style + native Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/QuoteDataBean_.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/QuoteDataBean_.java (revision 0) +++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/QuoteDataBean_.java (revision 0) @@ -0,0 +1,23 @@ +/** + * Generated by OpenJPA MetaModel Generator Tool. +**/ + +package org.apache.geronimo.samples.daytrader; + +import java.math.BigDecimal; +import javax.persistence.metamodel.SingularAttribute; + +@javax.persistence.metamodel.StaticMetamodel +(value=org.apache.geronimo.samples.daytrader.QuoteDataBean.class) +@javax.annotation.Generated +(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Mon May 03 09:51:22 CDT 2010") +public class QuoteDataBean_ { + public static volatile SingularAttribute change1; + public static volatile SingularAttribute companyName; + public static volatile SingularAttribute high; + public static volatile SingularAttribute low; + public static volatile SingularAttribute open1; + public static volatile SingularAttribute price; + public static volatile SingularAttribute symbol; + public static volatile SingularAttribute volume; +} Property changes on: modules\ejb\src\main\java\org\apache\geronimo\samples\daytrader\QuoteDataBean_.java ___________________________________________________________________ Added: svn:eol-style + native 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 935418) +++ 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/java/org/apache/geronimo/samples/daytrader/OrderDataBean_.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/OrderDataBean_.java (revision 0) +++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/OrderDataBean_.java (revision 0) @@ -0,0 +1,26 @@ +/** + * Generated by OpenJPA MetaModel Generator Tool. +**/ + +package org.apache.geronimo.samples.daytrader; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.metamodel.SingularAttribute; + +@javax.persistence.metamodel.StaticMetamodel +(value=org.apache.geronimo.samples.daytrader.OrderDataBean.class) +@javax.annotation.Generated +(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Mon May 03 09:26:18 CDT 2010") +public class OrderDataBean_ { + public static volatile SingularAttribute account; + public static volatile SingularAttribute completionDate; + public static volatile SingularAttribute openDate; + public static volatile SingularAttribute orderFee; + public static volatile SingularAttribute orderID; + public static volatile SingularAttribute orderStatus; + public static volatile SingularAttribute orderType; + public static volatile SingularAttribute price; + public static volatile SingularAttribute quantity; + public static volatile SingularAttribute quote; +} Property changes on: modules\ejb\src\main\java\org\apache\geronimo\samples\daytrader\OrderDataBean_.java ___________________________________________________________________ Added: svn:eol-style + native Index: modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountProfileDataBean_.java =================================================================== --- modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountProfileDataBean_.java (revision 0) +++ modules/ejb/src/main/java/org/apache/geronimo/samples/daytrader/AccountProfileDataBean_.java (revision 0) @@ -0,0 +1,21 @@ +/** + * Generated by OpenJPA MetaModel Generator Tool. +**/ + +package org.apache.geronimo.samples.daytrader; + +import javax.persistence.metamodel.SingularAttribute; + +@javax.persistence.metamodel.StaticMetamodel +(value=org.apache.geronimo.samples.daytrader.AccountProfileDataBean.class) +@javax.annotation.Generated +(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",date="Mon May 03 10:10:27 CDT 2010") +public class AccountProfileDataBean_ { + public static volatile SingularAttribute account; + public static volatile SingularAttribute address; + public static volatile SingularAttribute creditCard; + public static volatile SingularAttribute email; + public static volatile SingularAttribute fullName; + public static volatile SingularAttribute passwd; + public static volatile SingularAttribute userID; +} Property changes on: modules\ejb\src\main\java\org\apache\geronimo\samples\daytrader\AccountProfileDataBean_.java ___________________________________________________________________ Added: svn:eol-style + native Index: modules/ejb/src/main/resources/META-INF/ejb-jar.xml =================================================================== --- modules/ejb/src/main/resources/META-INF/ejb-jar.xml (revision 935418) +++ 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. --> + + + TradeBrokerQueue + + + TradeStreamerTopic + + + Index: modules/ejb/pom.xml =================================================================== --- modules/ejb/pom.xml (revision 935418) +++ modules/ejb/pom.xml (working copy) @@ -54,7 +54,8 @@ org.apache.geronimo.specs - geronimo-jpa_3.0_spec + geronimo-jpa_2.0_spec + 1.1 provided @@ -80,6 +81,7 @@ org.apache.openjpa openjpa + 2.0.0 provided Index: modules/web/src/main/webapp/WEB-INF/web.xml =================================================================== --- modules/web/src/main/webapp/WEB-INF/web.xml (revision 935418) +++ modules/web/src/main/webapp/WEB-INF/web.xml (working copy) @@ -82,7 +82,7 @@ Sets the default RuntimeMode. Legal values include EJB and Direct runTimeMode - DIRECT + Full EJB3 Sets the default Order Processing Mode. Legal values include Synchronous, Asynchronous_1-Phase and Asynchronous_2-Phase