I've started to create the Shopping Cart and I made this so far:
ShoppingCartConfig.xml <?xml version="1.0" encoding="ASCII"?> <Config xsi:noNamespaceSchemaLocation=" http:///org.apache.tuscany.das.rdb/config.xsd" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"> <Command name="all carts" SQL="SELECT * FROM CART" kind="Select"/> <Command name="all carts x items" SQL="SELECT * FROM CART_ITEM" kind="Select"/> <Command name="get cart item" SQL="SELECT * from CART_ITEM WHERE CART_ID = ? AND ITEM_ID = ?" kind="Select"/> <Command name="get cart items" SQL="SELECT * from CART_ITEM WHERE CART_ID = ?" kind="Select"/> <Command name="get items" SQL="select * FROM ITEM" kind="Select"/> <Command name="get item" SQL="select * FROM ITEM WHERE ID = ?" kind="Select"/> <Command name="get cart" SQL="select * FROM CART WHERE ID = ?" kind="Select"/> <Table tableName="CART"> <Column columnName="ID" primaryKey="true" generated="true"/> </Table> </Config> ShoppingCart.java import commonj.sdo.DataObject; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import org.apache.tuscany.das.rdb.*; public class ShoppingCart { public void newCart() { DAS das = DAS.FACTORY.createDAS (getClass().getClassLoader().getResourceAsStream("ShoppingCartConfig.xml"), getConnection()); Command command = das.getCommand("all carts"); DataObject allCarts = command.executeQuery(); DataObject newCart = allCarts.createDataObject("CART"); allCarts.getList("CART").add(newCart); das.applyChanges(allCarts); } public void newItem() { DAS das = DAS.FACTORY.createDAS (getClass().getClassLoader().getResourceAsStream("ShoppingCartConfig.xml"), getConnection()); Command command = das.getCommand("all items"); DataObject allItems = command.executeQuery(); DataObject newItem = allItems.createDataObject("ITEM"); allItems.getList("ITEM").add(newItem); das.applyChanges(allItems); } public boolean confirmOrder(int cartId) { DAS das = DAS.FACTORY.createDAS (getClass().getClassLoader().getResourceAsStream("ShoppingCartConfig.xml"), getConnection()); Command command = das.getCommand("get cart items"); DataObject cartItems = command.executeQuery(); ArrayList array = new ArrayList(cartItems.getList("CART_ITEM")); // check if there are enough items in stock in case another cart, that contains // the same item, was ordered before for (Iterator it = array.iterator(); it.hasNext();) { DataObject cartXItem = (DataObject) it.next(); int quantity = cartXItem.getInt("QUANTITY"); int itemId = cartXItem.getInt("ITEM_ID"); command = das.getCommand("get item"); command.setParameter(1, new Integer(itemId)); DataObject item = command.executeQuery(); int units = item.getInt("UNITS"); if (quantity > units) { return false; } item.setInt("UNITS", units - quantity); } command = das.getCommand("get cart"); command.setParameter(1, new Integer(cartId)); DataObject cart = command.executeQuery(); cart.getDataObject("CART[1]").setInt("CONFIRMED", 1); das.applyChanges(cartItems); return true; } public void addCartItem(int cartId, int itemId, int quantity) { DAS das = DAS.FACTORY.createDAS (getClass().getClassLoader().getResourceAsStream("ShoppingCartConfig.xml"), getConnection()); Command command = das.getCommand("all carts x items"); DataObject allCartsXItems = command.executeQuery(); DataObject newCartXItem = allCartsXItems.createDataObject ("CART_ITEM"); newCartXItem.setInt("QUANTITY", quantity); newCartXItem.setInt("CART_ID", cartId); newCartXItem.setInt("ITEM_ID", itemId); allCartsXItems.getList("CART_ITEM").add(newCartXItem); das.applyChanges(allCartsXItems); } public void removeCartItem(int cartId, int itemId) { DAS das = DAS.FACTORY.createDAS (getClass().getClassLoader().getResourceAsStream("ShoppingCartConfig.xml"), getConnection()); Command command = das.getCommand("all cart items"); command.setParameter(1, new Integer(cartId)); command.setParameter(2, new Integer(itemId)); DataObject cartItem = command.executeQuery(); cartItem.getDataObject("CART_ITEM[1]").delete(); das.applyChanges(cartItem); } private java.sql.Connection getConnection() { try { Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException e) { e.printStackTrace(); return null; } try { java.sql.Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/shoppingcart","tuscany","tuscany"); con.setAutoCommit(false); return con; } catch(SQLException e) { e.printStackTrace(); return null; } } } TABLES: CREATE TABLE CART ( ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, SUB_TOTAL DOUBLE, TAX DOUBLE, TOTAL DOUBLE, CONFIRMED INTEGER ); CREATE TABLE ITEM ( ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, DESCR CHAR(30), UNITS INTEGER ); CREATE TABLE CART_ITEM ( ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, CART_ID INTEGER, ITEM_ID INTEGER, QUANTITY INTEGER, FOREIGN KEY (CART_ID) REFERENCES CART(ID), FOREIGN KEY (ITEM_ID) REFERENCES ITEM(ID) ); It is not complete, there is still missing some functionalities in the ShoppingCart.java, the getters. I haven't tested all methods yet, but I'm already posting it here in case anyone wanting to give some suggestion. I have no idea how to make the ShoppingCart.jsp, I needing some ideas for the layout. Adriano Crestani On 11/16/06, Willian Maja <[EMAIL PROTECTED]> wrote:
I think I didn't understand what you want. But i tested using TimeStamp and DateTime: CREATE TABLE test (ID integer not null AUTO_INCREMENT, timestamp timestamp, datetime datetime, primary key (ID)); INSERT INTO test VALUES (); This will create the following row: | 1 | 2006-11-16 14:10:24.0 | NULL Now I will read the timestamp: Command read = das.createCommand("select * from test"); DataObject root = read.executeQuery(); DataObject node = root.getDataObject("test[1]"); java.util.Date date = node.getDate("timestamp"); // You must use java.util.Date, not java.sql.Date System.out.println(date.getHours()); // Print the hours System.out.println(date.getMonth()); // Print the month System.out.println(node.getDate("date")); // Print the TimeStamp ex:2006-11-16 14:12:23.0 To save DateTime I used the following code: //Continuing the last code, I'm going to save the TimeStamp in the DateTime column node.setDate("datetime", date); das.applyChanges(root); Now the row 1 from the test table will be: | 1 | 2006-11-16 14:10:24.0 | 2006-11-16 14:10:24.0 I read/updated the row with datetime and timestamp column. If this wasn't what you want, please send me the code you want to make work with SDO/Mysql. >From: "Katja" <[EMAIL PROTECTED]> >Reply-To: tuscany-dev@ws.apache.org >To: tuscany-dev@ws.apache.org >Subject: Re: New proposal to make DAS/SDO HOW TO >Date: Thu, 16 Nov 2006 17:29:58 +0100 > >Hi Willian! > >Thank you for the example! You tested with a Date-Column, that worked in my >application, too, because no conversion between the column and the data >object value is necessary. > >With DateTime a converter is needed: >SDO format: 2006-11-16T17:22 >MySQL format: 2006-11-16 17:22 > >The bigbank sample has a DateConverter for this issue, but this does only >work with Derby and not with MySQL. I don't know why. I posted the error >last time: >http://www.mail-archive.com/tuscany-dev@ws.apache.org/msg10725.html > >It would be great, if you could test again with a DateTime or Timestamp >column and tell me your solution. > >Thanks, >Katja > > > >-------- Original-Nachricht -------- >Datum: Thu, 16 Nov 2006 16:08:48 +0000 >Von: "Willian Maja" <[EMAIL PROTECTED]> >An: tuscany-dev@ws.apache.org >Betreff: Re: New proposal to make DAS/SDO HOW TO > > > Hi Katja, > > > > I've just tested to read Date column, and it works. I'm going to >paste > > my code here for you: > > > > This will be the test table, it's just a simple table with a DateTime > > Column. > > > > CREATE TABLE test (ID integer not null AUTO_INCREMENT, date_column >date); > > INSERT INTO test (date_column) VALUES ("06-11-16"); > > > > Now you should create your Das connection. In my code example I'll not >use > > XML configuration. I'm going to create the Command: > > > > Command read = das.createCommand("select * from test"); //Create > > the > > Command > > DataObject root = read.executeQuery(); > > DataObject row = root.getDataObject("teste[1]"); // Get the >first > > row from test table; > > System.out.println(row.getDate("date_column")); // Print the > > DateTime > > > > > > I think this will help you :). > > > > Bye. > > > > > > > > > > >From: "Katja" <[EMAIL PROTECTED]> > > >Reply-To: tuscany-dev@ws.apache.org > > >To: tuscany-dev@ws.apache.org > > >Subject: Re: New proposal to make DAS/SDO HOW TO > > >Date: Thu, 16 Nov 2006 09:14:28 +0100 > > > > > >Hi! > > > > > >Is it possible to add a Timestamp or DateTime column to the database? I > > am > > >very interested in how to access these columns with DAS and MySQL >because > > I > > >have not succeeded in doing this. > > > > > >Thanks, > > >Katja > > > > > >-------- Original-Nachricht -------- > > >Datum: Thu, 16 Nov 2006 03:44:18 -0400 > > >Von: "Adriano Crestani" <[EMAIL PROTECTED]> > > >An: tuscany-dev@ws.apache.org > > >Betreff: Re: New proposal to make DAS/SDO HOW TO > > > > > > > Willian, I created these tables, that will possible be used in the > > > > shopping > > > > cart app. It's simple, but I think a howto sample must be simple. >And > > if > > > > you > > > > want to add anything, feel free ; ) > > > > > > > > CREATE TABLE CART ( > > > > ID INTEGER, > > > > PRIMARY KEY (ID) > > > > ); > > > > > > > > CREATE TABLE ITEM ( > > > > ID INTEGER, > > > > ITEM VARCHAR(30), > > > > UNITS INTEGER, > > > > CART_ID INTEGER, > > > > PRIMARY KEY (ID), > > > > FOREIGN KEY (CART_ID) REFERENCES CART(ID) > > > > ); > > > > > > > > > > > > > > > > On 11/16/06, Luciano Resende <[EMAIL PROTECTED]> wrote: > > > > > > > > > > Hey Guys > > > > > > > > > > Very good to see some progress and some contents being >generated. > > I > > > > > agree > > > > > with you guys when you say this is becoming more like a user >guide, > > > > > instead > > > > > of a How To, and building it describing a new scenario would > > probably > > > > make > > > > > things more clear, altough let's try to keep it simple on the > > >beginning, > > > > > otherwise we are going to get a White paper :) > > > > > > > > > > I think we should describe actions that you would take when > > trying > > >to > > > > > create an application and describe how you would do it (e.g Now we > > >need > > > > to > > > > > execute a query to read the list of products, and this is how you > > >would > > > > do > > > > > using DAS), and point the user to further documentation in case it > > > > > needs/want to know more about the specific feature (e.g if they >want > > >to > > > > > learn the whole syntax/xsd of the das config file). > > > > > > > > > > I think couple things should not be covered on the How to : > > > > > - How to build a war file > > > > > - How to create a database (altough you might provide the >SQL > > > > > statements to create the tables you would use or at least describe > > the > > > > DB > > > > > schema) > > > > > > > > > > Now, talking about what should be in this how-to > > > > > - We could start very simple... 1 product table, and one > > simple > > > > jsp > > > > > that gives you a list of the products available > > > > > - Using MySQL is good, altough this how to should not really > > be > > > > > database dependent, right ? we could point it to any database, and > > you > > > > > guys > > > > > could maybe elaborate on what change would be necessary to do this > > :) > > > > > > > > > > Also, I think this how to does not necessarily need to produce >a > > > > > working > > > > > application, as it's intended to show how people would use DAS. If > > we > > > > want > > > > > to spend time creating an application, I'd suggest doing this as > > >another > > > > > task, and finish the one I have started as part of > > > > > http://issues.apache.org/jira/browse/TUSCANY-800 > > > > > > > > > > Let me know if you have any further questions... let's continue to > > > > > updating > > > > > the wiki, and please let me know when you guys want me to take a > > look > > > > and > > > > > provide a feedback on the contents... > > > > > > > > > > BTW, others are welcome to voice their opinion on what direction >we > > > > should > > > > > take here... > > > > > > > > > > > > > > > - Luciano Resende > > > > > Apache Tuscany > > > > > > > > > > > > > > > On 11/15/06, Adriano Crestani <[EMAIL PROTECTED]> wrote: > > > > > > > > > > > > I've decribed the XML configuration file, but it's still looking > > >like > > > > a > > > > > > user > > > > > > guide than a howto. I think the CompanyWeb sample is to simple >and > > > > > doesn't > > > > > > cover well all the DAS features. So lets make this Shopping Cart > > > > > > application > > > > > > trying to use all the DAS features. Then we will be able to do a > > >very > > > > > > useful > > > > > > howto. > > > > > > > > > > > > My propose is that this app must have at least: > > > > > > > > > > > > - 1 functionality that requires a SQL command with >arguments. > > > > Then > > > > > we > > > > > > cover how to deal with arguments in SQL commands. > > > > > > > > > > > > - 1 table that has one autoincrement key column to cover the > > > > > > "genarated" > > > > > > attribute on the howto. > > > > > > > > > > > > - 1 table that requires a concurrency control to cover the > > > > > > "concurrency" > > > > > > attribute on the howto. > > > > > > > > > > > > - 1 table containing a foreign key to cover how to explicit >in > > >the > > > > > XML > > > > > > configuration file the link between two tables. There will > > probabily > > > > be > > > > > a > > > > > > foreign key in its database anyway. ; ) > > > > > > > > > > > > I think also a good idea to use the MySql as the database >server, > > >once > > > > > > it's > > > > > > the most used server on webapps ; ) > > > > > > > > > > > > We must discuss how will be the Shopping Cart GUI, it must be > > simple > > > > > once > > > > > > it's not the focus of our howto. I think a simple html genarated > > by > > >a > > > > > jsp > > > > > > is > > > > > > enough. ; ) > > > > > > > > > > > > Adriano Crestani > > > > > > > > > > > > On 11/15/06, Willian Yabusame Maja <[EMAIL PROTECTED]> > > wrote: > > > > > > > > > > > > > > Hello Tuscany Community! > > > > > > > > > > > > > > Adriano Crestani and I are working together on a >HelloWorld > > >DAS > > > > > "How > > > > > > > To". I have uploaded what we have done so far to > > > > > > > > > > > > > > > > > > > > > > > > > > http://wiki.apache.org/ws/Tuscany/TuscanyJava/DAS_Java_Overview/RDBDAS_HOWTO_HelloDASApp > > > > > > > > > > > > > > We were using the CompanyWeb sample application to make >this > > > > > > > step-by-step how-to and teach how to use the DAS/SDO Features. > > We > > > > are > > > > > > not > > > > > > > liking what this is becoming, as it's looking more like a > > > > > > user-gide/readme > > > > > > > then really a how-to, so we would like to do a new proposal : > > > > > > > > > > > > > > Use the scenario of a Shopping cart, and use it to explain > > >more > > > > > > about > > > > > > > how to build it using DAS to handle the persistence part of >the > > > > app... > > > > > > > > > > > > > > The topics would be: > > > > > > > Introducing the scenario and the motivation to use > > DAS/SDO > > > > > > > Initial Setup and environment assumptions > > > > > > > Building the application > > > > > > > - database > > > > > > > - DAS commands > > > > > > > - Configuring the XML and how to make the > > commands > > > > > > > Explain the DAS/SDO and how to read/get results > > > > > > > conclusion > > > > > > > > > > > > > > > > > > > > > Before we change our path to this new approach, we would > > like > > >to > > > > > > hear > > > > > > > some feedback on what you guys think about this new >approach.... > > > > > > > > > > > > > > Willian Yabusame Maja > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >-- > > >Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! > > >Ideal f�r Modem und ISDN: http://www.gmx.net/de/go/smartsurfer > > > > > >--------------------------------------------------------------------- > > >To unsubscribe, e-mail: [EMAIL PROTECTED] > > >For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > _________________________________________________________________ > > MSN Busca: f�cil, r�pido, direto ao ponto. http://search.msn.com.br > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > >-- >Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! >Ideal f�r Modem und ISDN: http://www.gmx.net/de/go/smartsurfer > >--------------------------------------------------------------------- >To unsubscribe, e-mail: [EMAIL PROTECTED] >For additional commands, e-mail: [EMAIL PROTECTED] > _________________________________________________________________ MSN Hotmail, o maior webmail do Brasil. http://www.hotmail.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]