You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by co...@apache.org on 2004/02/23 02:19:45 UTC

cvs commit: cocoon-2.1/src/blocks/petstore/samples/flow PetStoreImpl.js petstore.js

coliver     2004/02/22 17:19:45

  Modified:    src/blocks/petstore/java/org/apache/cocoon/components/flow/javascript
                        ScriptableConnection.java ScriptableResult.java
               src/blocks/petstore/samples/flow PetStoreImpl.js petstore.js
  Log:
  Used page local vars to fix pagination bugs in sample and added optional function arg to Database.query() function
  
  Revision  Changes    Path
  1.3       +70 -10    cocoon-2.1/src/blocks/petstore/java/org/apache/cocoon/components/flow/javascript/ScriptableConnection.java
  
  Index: ScriptableConnection.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/petstore/java/org/apache/cocoon/components/flow/javascript/ScriptableConnection.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ScriptableConnection.java	5 Sep 2003 07:21:48 -0000	1.2
  +++ ScriptableConnection.java	23 Feb 2004 01:19:45 -0000	1.3
  @@ -52,11 +52,29 @@
    * A ScriptableConnection provides two methods:
    *
    * <UL>
  - * <LI>query([String] stmt, [Array] parameters, [Number] startRow, [Number] maxRows)</LI>
  + * <LI>query([String] stmt, [Array] parameters, [Number] startRow, [Number] maxRows, [Function] fun)</LI>
    * <LI>update([String] stmt, [Array] parameters)</LI>
    * </UL>
  - * The object returned by <code>query</code> contains the following
  - * properties:
  + * If the <code>fun</code> argument is provided to <code>query</code> it
  + * will be called for each row returned (the row object will be passed as its 
  + * argument). For example:
  + * <pre>
  + * var db = Database.getConnection(...);
  + * var queryVal = ...;
  + * var startRow = 0;
  + * var maxRows = 100; 
  + *
  + * db.query("select * from table where column = ?", 
  + *          [queryVal], 
  + *          startRow,
  + *          maxRows,
  + *          function(row) {
  + *              print("column = " + row.column);
  + *          });
  + *
  + * </pre>
  + * If <code>fun</code> is undefined, an object containing the following 
  + * properties will be returned instead:
    * <UL>
    * <LI>[Array] rows - an array of row objects</LI>
    * <LI>[Array] rowsByIndex - An array with an array per row of column values</LI>
  @@ -206,7 +224,8 @@
       }
   
       public Object jsFunction_query(String sql, Object params,
  -                                   int startRow, int maxRows) 
  +                                   int startRow, int maxRows,
  +                                   Object funObj) 
           throws JavaScriptException {
           try {
               PreparedStatement stmt = connection.prepareStatement(sql);
  @@ -229,11 +248,52 @@
               if (maxRows == 0) {
                   maxRows = -1;
               }
  -            ScriptableResult s = new ScriptableResult(this, rs, 
  -                                                      startRow, maxRows);
  -            s.setParentScope(getTopLevelScope(this));
  -            s.setPrototype(getClassPrototype(this, s.getClassName()));
  -            return s;
  +            if (funObj instanceof Function) {
  +                Context cx = Context.getCurrentContext();
  +                Function fun = (Function)funObj;
  +                ResultSetMetaData rsmd = rs.getMetaData();
  +                int noOfColumns = rsmd.getColumnCount();
  +                // Throw away all rows upto startRow
  +                for (int i = 0; i < startRow; i++) {
  +                    rs.next();
  +                }
  +                // Process the remaining rows upto maxRows
  +                int processedRows = 0;
  +                int index = 0;
  +                boolean isLimited = false;
  +                Scriptable scope = getTopLevelScope(this);
  +                Scriptable thisObj;
  +                Scriptable proto = getObjectPrototype(scope);
  +                Object[] args;
  +                while (rs.next()) {
  +                    if ((maxRows != -1) && (processedRows == maxRows)) {
  +                        isLimited = true; 
  +                        break;
  +                    }
  +                    Scriptable row = new ScriptableResult.Row();
  +                    row.setParentScope(scope);
  +                    row.setPrototype(proto);
  +                    for (int i = 1; i <= noOfColumns; i++) {
  +                        Object value =  rs.getObject(i);
  +                        if (rs.wasNull()) {
  +                            value = null;
  +                        }
  +                        row.put(rsmd.getColumnName(i), row, value);
  +                    }
  +                    args = new Object[1];
  +                    args[0] = row;
  +                    fun.call(cx, scope, scope, args);
  +                }
  +                return Undefined.instance;
  +            } else {
  +                ScriptableResult s = new ScriptableResult(this, rs, 
  +                                                          startRow, maxRows);
  +                s.setParentScope(getTopLevelScope(this));
  +                s.setPrototype(getClassPrototype(this, s.getClassName()));
  +                return s;
  +            }
  +        } catch (JavaScriptException e) {
  +            throw e;
           } catch (Exception e) {
               throw new JavaScriptException(e);
           }
  
  
  
  1.2       +5 -1      cocoon-2.1/src/blocks/petstore/java/org/apache/cocoon/components/flow/javascript/ScriptableResult.java
  
  Index: ScriptableResult.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/petstore/java/org/apache/cocoon/components/flow/javascript/ScriptableResult.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ScriptableResult.java	12 Jul 2003 19:09:39 -0000	1.1
  +++ ScriptableResult.java	23 Feb 2004 01:19:45 -0000	1.2
  @@ -67,6 +67,10 @@
               return "Row";
           }
   
  +        public boolean has(String name, Scriptable start) {
  +            return super.has(name.toUpperCase(), start);
  +        }
  +
           public Object get(String name, Scriptable start) {
               return super.get(name.toUpperCase(), start);
           }
  
  
  
  1.4       +5 -5      cocoon-2.1/src/blocks/petstore/samples/flow/PetStoreImpl.js
  
  Index: PetStoreImpl.js
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/petstore/samples/flow/PetStoreImpl.js,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PetStoreImpl.js	11 Nov 2003 12:09:51 -0000	1.3
  +++ PetStoreImpl.js	23 Feb 2004 01:19:45 -0000	1.4
  @@ -140,8 +140,8 @@
   function CartItem(cart, item) {
       this.cart = cart;
       this.item = item;
  -    this.quantity = 1
  -    this.listPrice = Number(item.listPrice);
  +    this.quantity = 1;
  +    this.listPrice = new Number(item.listPrice);
       this.total = this.listPrice * this.quantity;
       cart.subTotal += this.listPrice;
   }
  @@ -555,7 +555,7 @@
       
       var result = rs.rows[0].ROWCOUNT;
       conn.close();
  -    return Number(result);
  +    return new Number(result);
   }
   
   PetStore.prototype.insertNewUser = function(model) {
  @@ -623,7 +623,7 @@
                           [key]);
       var result = rs.rows[0].ROWCOUNT;
       conn.close();
  -    return Number(result);
  +    return new Number(result);
   }
   
   PetStore.prototype.getItemRowCountByProduct = function(key) {
  @@ -632,7 +632,7 @@
                           [key]);
       var result = rs.rows[0].ROWCOUNT;
       conn.close();
  -    return Number(result);
  +    return new Number(result);
   }
   
   PetStore.prototype.searchProductList = function(key, skipResults, maxResults) {
  
  
  
  1.5       +124 -112  cocoon-2.1/src/blocks/petstore/samples/flow/petstore.js
  
  Index: petstore.js
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/petstore/samples/flow/petstore.js,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- petstore.js	11 Nov 2003 12:09:51 -0000	1.4
  +++ petstore.js	23 Feb 2004 01:19:45 -0000	1.5
  @@ -54,27 +54,25 @@
   var VIEW = "jexl";
   var EXT = ".jexl";
   
  +// Utility to format numbers and dates (for use by Velocity templates)
   
  -function Format() {
  +function Formatter() {
   }
   
  -Format.prototype.formatNumber = function(num, format) {
  +Formatter.prototype.formatNumber = function(num, format) {
       return new java.text.DecimalFormat(format).format(num);
   }
   
  -Format.prototype.formatDate = function(date, format) {
  +Formatter.prototype.formatDate = function(date, format) {
       return new java.text.SimpleDateFormat(format).format(date);
   }
   
  -var fmt = new Format();
  +var formatter = new Formatter();
   var petStore = null;
   var accountForm = null;
   var cartForm = null;
   var categoryList = null;
   
  -function print(line) {
  -    cocoon.log.info(line);
  -}
   
   function main(funName) {
       var fun = this[funName];
  @@ -134,7 +132,7 @@
       cocoon.sendPage("view/Cart" + EXT, {
               accountForm: accountForm,
               cartForm: cartForm,
  -            fmt: fmt,
  +            fmt: formatter,
               cartItems: cartItems,
               label: "Shopping Cart"
       });
  @@ -150,7 +148,7 @@
           cartItems.push(cartItem);
       }
       cocoon.sendPage("view/Cart" + EXT, {
  -            fmt: fmt,
  +            fmt: formatter,
               accountForm: accountForm,
               cartForm: cartForm,
               cartItems: cartItems,
  @@ -163,12 +161,12 @@
       for (var i in cartForm.cart.cartItems) {
           var cartItem = cartForm.cart.cartItems[i];
           var itemId = cartItem.item.itemId;
  -        var quantity = new java.lang.Double(cocoon.request.get(itemId)).intValue();
  +        var quantity = parseInt(cocoon.request.get(itemId));
           cartItem.updateQuantity(quantity);
           cartItems.push(cartItem);
       }
       cocoon.sendPage("view/Cart" + EXT, {
  -            fmt: fmt,
  +            fmt: formatter,
               accountForm: accountForm,
               cartForm:cartForm,
               cartItems: cartItems,
  @@ -186,7 +184,7 @@
           cartItems.push(cartItem);
       }
       cocoon.sendPage("view/Cart" + EXT, {
  -            fmt: fmt,
  +            fmt: formatter,
               accountForm: accountForm,
               cartForm: cartForm,
               cartItems: cartItems,
  @@ -199,41 +197,39 @@
   function viewCategory() {
       var categoryId = cocoon.request.get("categoryId");
       var category = getPetStore().getCategory(categoryId);
  -    var skipResults = 0;
       var maxResults = MAX_RESULTS;
  +    /* page local variable to keep track of pagination */
  +    var local = cocoon.createPageLocal();
  +    local.skipResults = 0;
       while (true) {
           var productList =
               getPetStore().getProductListByCategory(categoryId,
  -                                                    skipResults,
  -                                                    maxResults);
  -        var lastPage = !productList.isLimitedByMaxRows;
  -        var rowCount = productList.rowCount;
  -        cocoon.sendPageAndWait("view/Category" + EXT, {
  -                accountForm: accountForm,
  -                productList: productList.rows,
  -                category: category,
  -                firstPage: skipResults == 0,
  -                lastPage: lastPage
  -        });
  -
  -        catch (break) {
  -            print("zapping productList");
  -            productList = null;
  -        }
  -
  -        catch (continue) {
  -            print("returning from continuation");
  -            print("productList="+productList);
  -        }
  -
  +                                                   local.skipResults,
  +                                                   maxResults);
  +        local.lastPage = !productList.isLimitedByMaxRows;
  +        local.rowCount = productList.rowCount;
  +        var contextData = {
  +            accountForm: accountForm,
  +            productList: productList.rows,
  +            category: category,
  +            firstPage: local.skipResults == 0,
  +            lastPage: local.lastPage
  +        };
  +        cocoon.sendPageAndWait("view/Category" + EXT, 
  +                               contextData, 
  +                               function () {
  +                                   /* release contextData and productList */
  +                                   contextData = null;
  +                                   productList = null;
  +                               });
           var page = cocoon.request.get("page");
           if (page == "previous") {
  -            if (skipResults != 0) {
  -                skipResults -= maxResults;
  +            if (local.skipResults != 0) {
  +                local.skipResults -= maxResults;
               }
           } else if (page == "next") {
  -            if (!lastPage) {
  -                skipResults += rowCount;
  +            if (!local.lastPage) {
  +                local.skipResults += local.rowCount;
               }
           }
       }
  @@ -244,30 +240,39 @@
   function viewProduct() {
       var productId = cocoon.request.get("productId");
       var product = getPetStore().getProduct(productId);
  -    var skipResults = 0;
       var maxResults = MAX_RESULTS;
  -
  +    /* page local variable to handle pagination */
  +    var local = cocoon.createPageLocal();
  +    local.skipResults = 0;
       while (true) {
           var itemList =
               getPetStore().getItemListByProduct(productId,
  -                                               skipResults,
  +                                               local.skipResults,
                                                  maxResults);
  -        cocoon.sendPageAndWait("view/Product" + EXT, {
  -                        accountForm: accountForm,
  -                        fmt: fmt,
  -                        product: product,
  -                        firstPage: skipResults == 0,
  -                        lastPage: !itemList.isLimitedByMaxRows,
  -                        itemList: itemList.rows
  -        });
  +        local.lastPage = !itemList.isLimitedByMaxRows;
  +        var contextData = {
  +            accountForm: accountForm,
  +            fmt: formatter,
  +            product: product,
  +            firstPage: local.skipResults == 0,
  +            lastPage: local.lastPage,
  +            itemList: itemList.rows
  +        };
  +        cocoon.sendPageAndWait("view/Product" + EXT, 
  +                               contextData,
  +                               function() {
  +                                   /* release contextData and itemList */
  +                                   contextData = null;
  +                                   itemList = null;
  +                               });
           var page = cocoon.request.get("page");
           if (page == "previous") {
  -            if (skipResults != 0) {
  -                skipResults -= maxResults;
  +            if (local.skipResults != 0) {
  +                local.skipResults -= maxResults;
               }
           } else if (page == "next") {
  -            if (!itemList.isLimitedByMaxRows) {
  -                skipResults += itemList.rowCount;
  +            if (!local.lastPage) {
  +                local.skipResults += itemList.rowCount;
               }
           }
       }
  @@ -284,7 +289,7 @@
                item: item,
                quantity: getPetStore().getItemRowCountByProduct(item.productId),
                product: item.product,
  -             fmt: fmt
  +             fmt: formatter
       });
   }
   
  @@ -371,23 +376,22 @@
       model.banneropt = accountForm.account.banneropt;
   
       editAccountDataForm.showForm("view/editAccountForm.cforms");
  -    while ((model.changePwdOption == true) && ((model.password != model.retypepassword) || (model.password==null)))     {
  -    model.message = "Passwords don't match!";
  -    editAccountDataForm.showForm("view/editAccountForm.cforms");
  +    while (model.changePwdOption && (model.password != model.retypepassword || model.password == null)) {
  +        model.message = "Passwords don't match!";
  +        editAccountDataForm.showForm("view/editAccountForm.cforms");
       }
   
  -    if (accountForm.signOn == false) {
  -    var update = getPetStore().updateAccount(model);
  +    if (!accountForm.signOn) {
  +        var update = getPetStore().updateAccount(model);
       } else {
  -    var insert = getPetStore().insertAccount(model);
  -    accountForm.signOn = false;
  +        var insert = getPetStore().insertAccount(model);
  +        accountForm.signOn = false;
       }
   
  -    if (model.changePwdOption == true) {
  +    if (model.changePwdOption) {
           var chPwd = getPetStore().updateSignon(accountForm.username, model.password);
           accountForm.password = model.password;
       }
  -
       accountForm.account = getPetStore().getAccount(accountForm.username, accountForm.password);
   }
   
  @@ -402,8 +406,8 @@
   
       newAccountDataForm.showForm("view/newAccountForm.cforms");
       while (getPetStore().testDuplicateLogin(model.username) > 0) {
  -    model.message = "Username already in use. Please choose another username.";
  -    newAccountDataForm.showForm("view/newAccountForm.cforms");
  +        model.message = "Username already in use. Please choose another username.";
  +        newAccountDataForm.showForm("view/newAccountForm.cforms");
       }
       var insertNewUser = getPetStore().insertNewUser(model);
       print("insertNewUser: "+insertNewUser);
  @@ -431,35 +435,44 @@
           });
           return;
       }
  -    var skipSearchResults = 0;
  +    /* page local variable to manage pagination */
  +    var local = cocoon.createPageLocal();
  +    local.skipSearchResults = 0;
       var maxSearchResults = 3;
       while (true) {
           var result =
  -            getPetStore().searchProductList(keyword, skipSearchResults,
  +            getPetStore().searchProductList(keyword, 
  +                                            local.skipSearchResults,
                                               maxSearchResults);
  -        var lastPage = !result.isLimitedByMaxRows;
  -        var rowCount = result.rowCount;
  -        cocoon.sendPageAndWait("view/SearchProducts" + EXT, {
  -                        accountForm: accountForm,
  -                        searchResultsProductList: result.rows,
  -                        firstPage: skipSearchResults == 0,
  -                        lastPage: lastPage
  -        });
  +        local.lastPage = !result.isLimitedByMaxRows;
  +        local.rowCount = result.rowCount;
  +        var contextData = {
  +            accountForm: accountForm,
  +            searchResultsProductList: result.rows,
  +            firstPage: local.skipSearchResults == 0,
  +            lastPage: local.lastPage
  +        };
  +        cocoon.sendPageAndWait("view/SearchProducts" + EXT, 
  +                               contextData, 
  +                               function() {
  +                                   /* release contextData and result */
  +                                   contextData = null;
  +                                   result = null;
  +                               });
           var page = cocoon.request.get("page");
           if (page == "previous") {
  -            if (skipSearchResults != 0) {
  -                skipSearchResults -= maxSearchResults;
  +            if (local.skipSearchResults != 0) {
  +                local.skipSearchResults -= maxSearchResults;
               }
           } else if (page == "next") {
  -            if (!lastPage) {
  -                skipSearchResults += rowCount;
  +            if (!local.lastPage) {
  +                local.skipSearchResults += local.rowCount;
               }
           }
       }
   }
   
   function billingForm(order) {
  -
       var billingForm = new Form("view/forms/newOrderForm_d.xml");
       var model = billingForm.getModel();
       model.cardType = order.cardType;
  @@ -479,20 +492,18 @@
   }
   
   function shippingForm(order) {
  -        var shippingForm = new Form("view/forms/newShippingForm_d.xml");
  -        var model = shippingForm.getModel();
  -        model.shipToFirstName = order.shipToFirstName;
  -        model.shipToLastName = order.shipToLastName;
  -        model.shipAddress1 = order.shipAddress1;
  -        model.shipAddress2 = order.shipAddress2;
  -        model.shipCity= order.shipCity;
  -        model.shipState= order.shipState;
  -        model.shipZip= order.shipZip;
  -        model.shipCountry= order.shipCountry;
  -        shippingForm.showForm("view/newShippingForm.cforms");
  -        return model;
  -
  -
  +    var shippingForm = new Form("view/forms/newShippingForm_d.xml");
  +    var model = shippingForm.getModel();
  +    model.shipToFirstName = order.shipToFirstName;
  +    model.shipToLastName = order.shipToLastName;
  +    model.shipAddress1 = order.shipAddress1;
  +    model.shipAddress2 = order.shipAddress2;
  +    model.shipCity= order.shipCity;
  +    model.shipState= order.shipState;
  +    model.shipZip= order.shipZip;
  +    model.shipCountry= order.shipCountry;
  +    shippingForm.showForm("view/newShippingForm.cforms");
  +    return model;
   }
   
   // Checkout
  @@ -506,7 +517,7 @@
       cocoon.sendPageAndWait("view/Cart" + EXT, {
                       accountForm: accountForm,
                       cartForm: cartForm,
  -                    fmt: fmt,
  +                    fmt: formatter,
                       cartItems: cartItems,
                       label: "Checkout Summary"
       });
  @@ -516,7 +527,7 @@
       var orderForm = new OrderForm();
       orderForm.initOrder(accountForm, cartForm);
   
  -var model = billingForm(orderForm.order);
  +    var model = billingForm(orderForm.order);
       orderForm.order.billToFirstName = model.billToFirstName;
       orderForm.order.billToLastName = model.billToLastName;
       orderForm.order.billAddress1 = model.billAddress1;
  @@ -530,7 +541,7 @@
       orderForm.order.expiryDate = model.expiryDate;
       orderForm.shippingAddressRequired = model.shippingAddressRequired;
       if (orderForm.shippingAddressRequired == true) {
  -        var model = shippingForm(orderForm.order);
  +        model = shippingForm(orderForm.order);
           orderForm.order.shipToFirstName = model.shipToFirstName;
           orderForm.order.shipToLastName = model.shipToLastName;
           orderForm.order.shipAddress1 = model.shipAddress1;
  @@ -540,15 +551,16 @@
           orderForm.order.shipZip = model.shipZip;
           orderForm.order.shipCountry = model.shipCountry;
       }
  -
  +    
       cocoon.sendPageAndWait("view/ConfirmOrder" + EXT,
                       {accountForm: accountForm,
                       order: orderForm.order,
  -                    fmt: fmt});
  +                    fmt: formatter});
   
  -    orderForm.confirmed = eval(cocoon.request.getParameter("confirmed"));
  +    orderForm.confirmed = 
  +        cocoon.request.getParameter("confirmed") == "true";
   
  -    if ((cartForm.cart.numberOfItems > 0) && (orderForm.confirmed == true)) {
  +    if (cartForm.cart.numberOfItems > 0 && orderForm.confirmed) {
           var lastOID = getPetStore().insertOrder(orderForm.order, accountForm.username);
           cartForm = new CartForm();
   //        cocoon.sendPage("viewOrder.do?orderId=" + lastOID);
  @@ -563,25 +575,25 @@
       var orderList = getPetStore().getOrderList(accountForm.username);
       cocoon.sendPage("view/ListOrders" + EXT, {
               accountForm: accountForm,
  -            fmt: fmt,
  +            fmt: formatter,
               orderList: orderList
       });
   }
   
   function viewOrder(lastOID) {
  -	var orderId;
  -	var message;
  -	if (lastOID != null) {
  -		orderId = lastOID;
  -		message = "Thank you, your order has been submitted.";
  -	} else {
  -		orderId = cocoon.request.getParameter("orderId");
  -	}
  +    var orderId;
  +    var message;
  +    if (lastOID != null) {
  +        orderId = lastOID;
  +        message = "Thank you, your order has been submitted.";
  +    } else {
  +        orderId = cocoon.request.getParameter("orderId");
  +    }
       var archivedOrder = getPetStore().getOrder(orderId, accountForm.username);
       var lineItemList = getPetStore().getLineItems(orderId);
       cocoon.sendPage("view/ViewOrder" + EXT, {
               accountForm: accountForm,
  -            fmt: fmt,
  +            fmt: formatter,
               message: message,
               archivedOrder: archivedOrder,
               lineItemList: lineItemList.rows,