/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.jstl.el;
import com.caucho.el.Expr;
import com.caucho.jsp.PageContextImpl;
import com.caucho.util.CharBuffer;
import com.caucho.util.L10N;
import javax.el.ELContext;
import javax.servlet.jsp.JspException;
import java.util.Iterator;
public class ForTokensTag extends ForEachTag {
private static L10N L = new L10N(ForTokensTag.class);
private Expr _delimsExpr;
/**
* Sets the delimiter expression.
*/
public void setDelims(Expr delims)
{
_delimsExpr = delims;
}
/**
* Process the tag.
*/
public int doStartTag()
throws JspException
{
try {
_iterator = null;
_index = 0;
_count = 0;
PageContextImpl pageContext = (PageContextImpl) this.pageContext;
ELContext env = pageContext.getELContext();
if (_beginExpr != null)
_begin = (int) _beginExpr.evalLong(env);
else
_begin = -1;
if (_endExpr != null)
_end = (int) _endExpr.evalLong(env);
else
_end = Integer.MAX_VALUE;
if (_stepExpr != null)
_step = (int) _stepExpr.evalLong(env);
else
_step = 0;
String items = _itemsExpr.evalString(env);
String delims = _delimsExpr.evalString(env);
_iterator = new TokenIterator(items, delims);
while (_index < _begin && _iterator.hasNext()) {
_index++;
_iterator.next();
}
if (_varStatus != null)
pageContext.setAttribute(_varStatus, this);
return doAfterBody();
} catch (Exception e) {
throw new JspException(e);
}
}
public class TokenIterator implements Iterator {
private String value;
private char []delims;
private int length;
private int i;
private CharBuffer cb = new CharBuffer();
TokenIterator(String value, String delims)
{
this.value = value;
this.delims = delims.toCharArray();
this.length = value.length();
}
public boolean hasNext()
{
return i < length;
}
public Object next()
{
cb.clear();
char ch = 0;
int startDelims = delims.length - 1;
loop:
for (; i < length; i++) {
ch = value.charAt(i);
for (int j = startDelims; j >= 0; j--) {
if (delims[j] == ch)
break loop;
}
cb.append(ch);
}
i++;
return cb.toString();
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
}