jstrachan 2002/10/23 23:59:54
Modified: jelly/src/java/org/apache/commons/jelly/tags/core
CoreTagLibrary.java ForEachTag.java WhileTag.java
jelly/src/test/org/apache/commons/jelly suite.jelly
Added: jelly/src/java/org/apache/commons/jelly/tags/core
BreakTag.java
jelly/src/java/org/apache/commons/jelly/impl
BreakException.java
Log:
Adding the ability to break out of loops based on Vinay's patch.
Throwing a BreakException will terminate a <forEach> or <while> loop, which the
<break> tag now does (along with an optional test)
Revision Changes Path
1.21 +6 -5
jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/CoreTagLibrary.java
Index: CoreTagLibrary.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/CoreTagLibrary.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- CoreTagLibrary.java 22 Oct 2002 15:13:43 -0000 1.20
+++ CoreTagLibrary.java 24 Oct 2002 06:59:53 -0000 1.21
@@ -104,6 +104,7 @@
registerTag("import", ImportTag.class);
// extensions to JSTL
+ registerTag("break", BreakTag.class);
registerTag("expr", ExprTag.class);
registerTag("new", NewTag.class);
registerTag("setProperties", SetPropertiesTag.class);
1.17 +52 -44
jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/ForEachTag.java
Index: ForEachTag.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/ForEachTag.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- ForEachTag.java 12 Oct 2002 12:25:23 -0000 1.16
+++ ForEachTag.java 24 Oct 2002 06:59:53 -0000 1.17
@@ -73,6 +73,7 @@
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jelly.expression.Expression;
+import org.apache.commons.jelly.impl.BreakException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -126,55 +127,62 @@
log.debug("running with items: " + items);
}
- if (items != null) {
- Iterator iter = items.evaluateAsIterator(context);
- if (log.isDebugEnabled()) {
- log.debug("Iterating through: " + iter);
- }
-
- // ignore the first items of the iterator
- for (index = 0; index < begin && iter.hasNext(); index++ ) {
- iter.next();
- }
-
- while (iter.hasNext() && index < end) {
- Object value = iter.next();
- if (var != null) {
- context.setVariable(var, value);
+ try {
+ if (items != null) {
+ Iterator iter = items.evaluateAsIterator(context);
+ if (log.isDebugEnabled()) {
+ log.debug("Iterating through: " + iter);
}
- if (indexVar != null) {
- context.setVariable(indexVar, new Integer(index));
+
+ // ignore the first items of the iterator
+ for (index = 0; index < begin && iter.hasNext(); index++ ) {
+ iter.next();
}
- invokeBody(output);
- // now we need to move to next index
- index++;
- for ( int i = 1; i < step; i++, index++ ) {
- if ( ! iter.hasNext() ) {
- return;
+ while (iter.hasNext() && index < end) {
+ Object value = iter.next();
+ if (var != null) {
+ context.setVariable(var, value);
+ }
+ if (indexVar != null) {
+ context.setVariable(indexVar, new Integer(index));
+ }
+ invokeBody(output);
+
+ // now we need to move to next index
+ index++;
+ for ( int i = 1; i < step; i++, index++ ) {
+ if ( ! iter.hasNext() ) {
+ return;
+ }
+ iter.next();
}
- iter.next();
}
}
- }
- else {
- if ( end == Integer.MAX_VALUE && begin == 0 ) {
- throw new MissingAttributeException( "items" );
- }
else {
- String varName = var;
- if ( varName == null ) {
- varName = indexVar;
+ if ( end == Integer.MAX_VALUE && begin == 0 ) {
+ throw new MissingAttributeException( "items" );
}
-
- for (index = begin; index <= end; index += step ) {
-
- if (varName != null) {
- Object value = new Integer(index);
- context.setVariable(varName, value);
+ else {
+ String varName = var;
+ if ( varName == null ) {
+ varName = indexVar;
+ }
+
+ for (index = begin; index <= end; index += step ) {
+
+ if (varName != null) {
+ Object value = new Integer(index);
+ context.setVariable(varName, value);
+ }
+ invokeBody(output);
}
- invokeBody(output);
}
+ }
+ }
+ catch (BreakException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("loop terminated by break: " + e, e);
}
}
}
1.3 +13 -4
jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/WhileTag.java
Index: WhileTag.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/WhileTag.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WhileTag.java 5 Oct 2002 04:30:18 -0000 1.2
+++ WhileTag.java 24 Oct 2002 06:59:53 -0000 1.3
@@ -73,6 +73,7 @@
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jelly.expression.Expression;
+import org.apache.commons.jelly.impl.BreakException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -107,13 +108,21 @@
public void doTag(XMLOutput output) throws MissingAttributeException,
Exception {
if (test != null) {
- while (test.evaluateAsBoolean(getContext())) {
+ try {
+ while (test.evaluateAsBoolean(getContext())) {
+ if (log.isDebugEnabled()) {
+ log.debug("evaluated to true! gonna keep on chuggin!");
+ }
+ invokeBody(output);
+ }
+ }
+ catch (BreakException e) {
if (log.isDebugEnabled()) {
- log.debug("evaluated to true! gonna keep on chuggin!");
+ log.debug("loop terminated by break: " + e, e);
}
- invokeBody(output);
}
- } else {
+ }
+ else {
throw new MissingAttributeException("test");
}
}
1.1
jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/BreakTag.java
Index: BreakTag.java
===================================================================
/*
* $Header:
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/core/BreakTag.java,v
1.9 2002/06/11 21:41:11 jstrachan Exp $
* $Revision: 1.9 $
* $Date: 2002/06/11 21:41:11 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* $Id: BreakTag.java,v 1.9 2002/06/11 21:41:11 jstrachan Exp $
*/
package org.apache.commons.jelly.tags.core;
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jelly.impl.BreakException;
import org.apache.commons.jelly.expression.Expression;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* A tag which terminates the execution of the current <forEach> or
≶while>
* loop. This tag can take an optional boolean test attribute which if its true
* then the break occurs otherwise the loop continues processing.
*
* @author <a href="mailto:jstrachan@;apache.org">James Strachan</a>
* @version $Revision: 1.9 $
*/
public class BreakTag extends TagSupport {
/** The expression to evaluate. */
private Expression test;
/** The Log to which logging calls will be made. */
private static final Log log = LogFactory.getLog(BreakTag.class);
public BreakTag() {
}
// Tag interface
//-------------------------------------------------------------------------
public void doTag(XMLOutput output) throws Exception {
if (test == null || test.evaluateAsBoolean(context)) {
throw new BreakException();
}
}
/**
* Sets the Jelly expression to evaluate.
* If this returns true then the loop is terminated
*
* @param test the Jelly expression to evaluate
*/
public void setTest(Expression test) {
this.test = test;
}
}
1.10 +39 -0
jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/suite.jelly
Index: suite.jelly
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/suite.jelly,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- suite.jelly 21 Oct 2002 11:12:42 -0000 1.9
+++ suite.jelly 24 Oct 2002 06:59:54 -0000 1.10
@@ -213,4 +213,43 @@
expected="foo 1 barfoo 2 barfoo 3 bar"
actual="${foo}"/>
</test:case>
+
+ <test:case name="testBreak">
+
+ <j:forEach var="i" begin="1" end="10">
+ <j:if test="${i==4}">
+ <j:break/>
+ </j:if>
+ </j:forEach>
+
+ <test:assertTrue test="${i==4}"/>
+
+ <j:while test="${i != 10}">
+ <j:if test="${i==6}">
+ <j:break/>
+ </j:if>
+ <j:set var="i" value="${i+1}"/>
+ </j:while>
+
+ <test:assertTrue test="${i==6}"/>
+
+ </test:case>
+
+ <test:case name="testBreakWithIf">
+
+ <j:forEach var="i" begin="1" end="10">
+ <j:break test="${i==4}"/>
+ </j:forEach>
+
+ <test:assertTrue test="${i==4}"/>
+
+ <j:while test="${i != 10}">
+ <j:break test="${i==6}"/>
+ <j:set var="i" value="${i+1}"/>
+ </j:while>
+
+ <test:assertTrue test="${i==6}"/>
+
+ </test:case>
+
</test:suite>
1.1
jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/impl/BreakException.java
Index: BreakException.java
===================================================================
/*
* $Header:
/home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/JellyException.java,v
1.9 2002/07/15 16:18:15 werken Exp $
* $Revision: 1.9 $
* $Date: 2002/07/15 16:18:15 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* $Id: .java,v 1.9 2002/07/15 16:18:15 werken Exp $
*/
package org.apache.commons.jelly.impl;
import org.apache.commons.jelly.JellyException;
/**
* <p><code>BreakException</code> is used to terminate loops such as
* <forEach> and <while> tags.</p>
*
* @author <a href="mailto:jstrachan@;apache.org">James Strachan</a>
* @version $Revision: 1.9 $
*/
public class BreakException extends JellyException {
public BreakException() {
super("Break exception, terminating the parent loop");
}
}
--
To unsubscribe, e-mail: <mailto:commons-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>