/*
* org.xmlsmartdoc.goldenport
* Copyright (C) 2000-2004 ASAMI, Tomoharu (asami@relaxer.org)
*/
package org.xmlsmartdoc.goldenport.evaluater;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import org.xmlsmartdoc.goldenport.evaluater.pattern.ExprPattern;
import org.xmlsmartdoc.goldenport.evaluater.pattern.IPattern;
import com.AsamiOffice.xml.UDOM;
/**
* EvaluaterContext
*
* @since Apr. 9, 2004
* @version Apr. 12, 2004
* @author ASAMI, Tomoharu (asami@xmlSmartDoc.org)
*/
public class EvaluaterContext {
// Map<String, Atom>
private Map atoms_ = new HashMap();
private EvaluaterContext parent_;
public EvaluaterContext() {
}
public EvaluaterContext(EvaluaterContext ec) {
parent_ = ec;
}
public void setup(Node[] nodes) {
for (int i = 0;i < nodes.length;i++) {
setup(nodes[i]);
}
}
public void setup(Node node) {
if (node instanceof Document) {
node = ((Document)node).getDocumentElement();
}
setupDefineSet_(node);
setupDefine_(node);
}
private void setupDefineSet_(Node node) {
Element[] macros = UDOM.getElements(
node,
"http://www.xmlsmartdoc.org/xmlns/goldenport",
"goldenport"
);
for (int i = 0; i < macros.length; i++) {
addDefineSet_(macros[i]);
}
macros = UDOM.getElements( // compatibility
node,
"http://www.xmlsmartdoc.org/xmlns/goldenport",
"macro"
);
for (int i = 0; i < macros.length; i++) {
addDefineSet_(macros[i]);
}
macros = UDOM.getElements( // compatibility
node,
"http://www.relaxer.org/xmlns/goldenport",
"macro"
);
for (int i = 0; i < macros.length; i++) {
addDefineSet_(macros[i]);
}
macros = UDOM.getElements( // compatibility
node,
"http://www.relaxer.org/xmlns/goldenport",
"goldenport"
);
for (int i = 0; i < macros.length; i++) {
addDefineSet_(macros[i]);
}
}
private void addDefineSet_(Element macro) {
String uri = macro.getAttribute("src");
if (!"".equals(uri)) {
try {
Document doc = UDOM.loadDocumentNs(uri);
Element root = doc.getDocumentElement();
//System.out.println(root.getLocalName());
if ("macro".equals(root.getLocalName())) {
addDefineSet_(root);
} else if ("goldenport".equals(root.getLocalName())) {
addDefineSet_(root);
}
} catch (IOException e) {
} catch (ParserConfigurationException e) {
} catch (SAXException e) {
}
}
setupDefine_(macro);
}
private void setupDefine_(Node node) {
Element[] defines = UDOM.getElements(
node,
"http://www.xmlsmartdoc.org/xmlns/goldenport",
"define"
);
for (int i = 0; i < defines.length; i++) {
Element define = defines[i];
addDefine_(define);
}
defines = UDOM.getElements( // compatibility
node,
"http://www.relaxer.org/xmlns/goldenport",
"define"
);
for (int i = 0; i < defines.length; i++) {
Element define = defines[i];
addDefine_(define);
}
defines = UDOM.getElements( // compatibility
node,
"define"
);
for (int i = 0; i < defines.length; i++) {
Element define = defines[i];
addDefine_(define);
}
}
private void addDefine_(Element define) {
String name = define.getAttribute("name");
Atom atom = makeAtom(name);
atom.setPattern(new ExprPattern(define));
}
public Atom makeAtom(String name) {
Atom atom = getAtom_(name);
if (atom == null) {
atom = new Atom(name);
}
addAtom(atom);
return (atom);
}
public Atom getAtom(String name) {
Atom atom = getAtom_(name);
if (atom != null) {
return (atom);
} else if (parent_ != null) {
return (parent_.getAtom(name));
} else {
return (null);
}
}
private Atom getAtom_(String name) {
return ((Atom)atoms_.get(name));
}
public void addAtom(Atom atom) {
atoms_.put(atom.getName(), atom);
}
public void addDefine(String name, IPattern pattern) {
Atom atom = makeAtom(name);
atom.setPattern(pattern);
}
public EvaluaterContext getParent() {
return (parent_);
}
}