/* * GoldenPort * Copyright (C) 2000-2003 ASAMI, Tomoharu (asami@relaxer.org) * * This program 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. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.xmlsmartdoc.goldenport.evaluater; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmlsmartdoc.goldenport.engine.AbstractPort; import org.xmlsmartdoc.goldenport.engine.GoldenportException; import org.xmlsmartdoc.goldenport.engine.PortContext; import org.xmlsmartdoc.goldenport.engine.PortNodeList; import org.xmlsmartdoc.goldenport.evaluater.patterns.*; import org.xmlsmartdoc.goldenport.selecters.AllSelecter; /** * Evaluater * * @since Jul. 6, 2002 * @version Apr. 11, 2004 * @author ASAMI, Tomoharu (asami@xmlSmartDoc.org) */ public class Evaluater extends AbstractPort { private EvaluaterContext rootContext_; public Evaluater() { setSelecter(AllSelecter.getSingleton()); rootContext_ = new EvaluaterContext(); // rootContext_.addDefine("goldenport", new GoldenportSubrPattern()); // rootContext_.addDefine("define", new DefineSubrPattern()); rootContext_.addDefine("copy-of", new CopyOfSubrPattern()); rootContext_.addDefine("text", new TextSubrPattern()); rootContext_.addDefine("and", new AndFexprPattern()); rootContext_.addDefine("or", new OrFexprPattern()); } public Evaluater(Node doc) { this(); rootContext_.setup(doc); } public Evaluater(Node[] docs) { this(); rootContext_.setup(docs); } public int startElement( Element element, PortContext context, PortNodeList result ) throws GoldenportException { String name = element.getLocalName(); if (UEvaluater.isGoldenportDefineSet(element)) { return (EVAL_DONE); } EvaluaterContext ec = (EvaluaterContext)context.getProperty("evaluater"); ec = new EvaluaterContext(ec); ec.setup(element); context.setProperty("evaluater", ec); Atom atom = getAtom_(name, ec); if (atom != null) { return (atom.startElement(element, context, result)); } else { result.setup(element); return (EVAL_CHILDREN); } } public void endElement( Element element, PortNodeList children, PortContext context, PortNodeList result ) throws GoldenportException { String name = element.getLocalName(); EvaluaterContext ec = (EvaluaterContext)context.getProperty("evaluater"); Atom atom = getAtom_(name, ec); if (atom != null) { atom.endElement(element, children, context, result); } else { result.setup(children); } context.setProperty("evaluater", ec.getParent()); } private Atom getAtom_(String name, EvaluaterContext ec) { Atom atom = ec.getAtom(name); if (atom != null) { return (atom); } return (rootContext_.getAtom(name)); } }