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,