📄 regexpevaluator.java
字号:
package de.spieleck.app.jacson.eval;
import java.util.*;
import org.apache.oro.text.regex.*;
import de.spieleck.config.ConfigNode;
import de.spieleck.config.ConfigVerify.Acceptor;
import de.spieleck.util.FastClassForName;
import de.spieleck.app.jacson.JacsonNames;
import de.spieleck.app.jacson.JacsonRegistry;
import de.spieleck.app.jacson.JacsonConfigException;
import de.spieleck.app.jacson.JacsonException;
import de.spieleck.app.jacson.JacsonReport;
import de.spieleck.app.jacson.JacsonBlock;
import de.spieleck.app.jacson.util.RegExpUtil;
import de.spieleck.app.jacson.util.ConfigUtil;
/**
* Regexp based Evaluator for {@link de.spieleck.app.jacson.Jacson} uses pluggable
* handlers to actually react on the Matches.
* <br/><b>Note:</b> This might not be necessary any more sometimes
* soon, since with the latest pack of filters similar effects
* should be creatable without the Subhandler thing. Use with caution.
* @author fsn
*/
public class RegExpEvaluator
extends EvaluatorBase
implements Acceptor, JacsonNames
{
public final static String HANDLER_NODE = "handler";
/** oro-Regexp-Pattern */
protected Pattern pattern;
/** Handlers for matches */
protected List handlers;
/** Counter for total matches */
protected long matches;
/** Output Marker */
protected String label;
protected RegExpUtil rutil;
public RegExpEvaluator()
{
}
public void init(ConfigNode node, JacsonRegistry registry)
throws JacsonConfigException
{
matches = 0;
obtainHandlers(node, registry.find(node,HANDLER_NODE), registry);
if ( handlers.size() == 0 )
ConfigUtil.exception(
"RexExpEvalutator needs at least one handler", node);
label = registry.scanForString(JS_OBJ_LABEL, node);
rutil = registry.getRegExpUtil();
pattern = rutil.obtainPattern("RegExpEvalutator", node, registry);
}
public boolean accept(ConfigNode cn)
{
String name = cn.getName();
return name.equals(HANDLER_NODE)
|| name.equals(JS_OBJ_LABEL)
|| JacsonRegistry.acceptId(cn)
|| rutil.accept(cn);
}
public void obtainHandlers(ConfigNode node,
Iterator iter, JacsonRegistry registry)
throws JacsonConfigException
{
handlers = new LinkedList();
while ( iter.hasNext() )
{
ConfigNode handlerConfig = (ConfigNode) iter.next();
String clazz = handlerConfig.getString();
RegExpHandler handler = (RegExpHandler) FastClassForName.newInstance(
clazz, "de.spieleck.app.jacson.eval.rhandler.",
RegExpHandler.class);
if ( handler == null )
ConfigUtil.exception("No Handler: "+clazz, node);
handler.init(handlerConfig, registry);
handlers.add(handler);
}
}
public void registerReport(JacsonReport jr)
{
super.registerReport(jr);
JacsonBlock.registerReport(handlers.iterator(), jr);
}
public void putChunk(String chunk)
throws JacsonException
{
if ( chunk == null )
return;
PatternMatcher matcher = rutil.getMatcher();
if ( matcher.matches(chunk, pattern) )
{
matches++;
MatchResult mRes = matcher.getMatch();
Iterator it = handlers.iterator();
while ( it.hasNext() )
{
RegExpHandler rh = (RegExpHandler) it.next();
rh.handle(getRegState(), chunk, mRes);
}
}
}
public void summary()
{
JacsonReport jr = getRegReport();
jr.begin("regexp");
if ( label != null )
jr.report("label", label);
jr.report("matches", ""+matches);
jr.begin("list");
JacsonBlock.summary(handlers.iterator());
jr.end();
jr.end();
}
}
//
// Jacson - Text Filtering with Java.
// Copyright (C) 2002 Frank S. Nestel (nestefan -at- users.sourceforge.net)
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library 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. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -