package org.jactr.tools.grapher.core.parser;
/*
* default logging
*/
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.tools.grapher.core.probe.ChunkProbe;
import org.jactr.tools.grapher.core.probe.LinkParameterProbe;
import org.jactr.tools.grapher.core.probe.ModelProbe;
import org.jactr.tools.grapher.core.probe.ParameterizedProbe;
import org.jactr.tools.grapher.core.probe.ProductionProbe;
import org.jactr.tools.grapher.core.selector.BufferSelector;
import org.jactr.tools.grapher.core.selector.ChunkSelector;
import org.jactr.tools.grapher.core.selector.ChunkTypeSelector;
import org.jactr.tools.grapher.core.selector.ClassNamedParameterSelector;
import org.jactr.tools.grapher.core.selector.ExtensionSelector;
import org.jactr.tools.grapher.core.selector.InstrumentSelector;
import org.jactr.tools.grapher.core.selector.LinkSelector;
import org.jactr.tools.grapher.core.selector.ModelSelector;
import org.jactr.tools.grapher.core.selector.ModuleSelector;
import org.jactr.tools.grapher.core.selector.ProductionSelector;
import org.jactr.tools.marker.markerof.IMarkerOf;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Parser
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(Parser.class);
static public final String PROBE_TAG = "probe";
static public final String MARKER_TAG = "marker";
static public final String LINK_TAG = "link";
static public final String MODEL_TAG = "model";
static public final String CHUNK_TAG = "chunk";
static public final String CHUNK_TYPE_TAG = "chunk-type";
static public final String PRODUCTION_TAG = "production";
static public final String MODULE_TAG = "module";
static public final String BUFFER_TAG = "buffer";
static public final String EXTENSION_TAG = "extension";
static public final String PATTERN_ATTR = "pattern";
static public final String POLL_ATTR = "poll";
static public final String SELECT_ALL = ".*";
static public final String TIME_WINDOW_ATTR = "window";
static public final String GROUP_TAG = "group";
static public final String ID_ATTR = "id";
private Document _document;
public Parser(URL resource) throws ParserConfigurationException,
SAXException, IOException
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
_document = parser.parse(resource.openStream());
}
public double getTimeWindow()
{
try
{
return Double.parseDouble(_document.getDocumentElement().getAttribute(
TIME_WINDOW_ATTR));
}
catch (NumberFormatException nfe)
{
return 1;
}
}
public Collection<ModelSelector> buildModelSelectors()
{
NodeList nl = _document.getDocumentElement()
.getElementsByTagName(GROUP_TAG);
Collection<ModelSelector> rtn = new ArrayList<ModelSelector>();
/*
* groups could be provided..
*/
if (nl.getLength() == 0)
nl = _document.getDocumentElement().getElementsByTagName(MODEL_TAG);
for (int i = 0; i < nl.getLength(); i++)
{
String groupName = "";
Element node = (Element) nl.item(i);
if (node.getNodeName().equals(GROUP_TAG))
{
groupName = node.getAttribute(ID_ATTR);
/*
* group the children
*/
NodeList kids = node.getChildNodes();
for (int j = 0; j < kids.getLength(); j++)
if (kids.item(j).getNodeName().equalsIgnoreCase(MODEL_TAG))
{
ModelSelector selector = buildModelSelector((Element) kids.item(j));
selector.setGroupId(groupName);
rtn.add(selector);
}
}
else
rtn.add(buildModelSelector(node));
}
return rtn;
}
protected ModelSelector buildModelSelector(Element element)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
ModelSelector selector = new ModelSelector(pattern);
ModelProbe lastProbe = null;
NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); i++)
{
String nodeName = nl.item(i).getNodeName();
if (nodeName.equals(MODULE_TAG) || nodeName.equals(BUFFER_TAG)
|| nodeName.equals(EXTENSION_TAG))
selector.add(buildGeneralSelector((Element) nl.item(i)));
if (nodeName.equals(PRODUCTION_TAG))
selector.add(buildProductionSelector((Element) nl.item(i)));
if (nodeName.equals(CHUNK_TYPE_TAG))
selector.add(buildChunkTypeSelector((Element) nl.item(i)));
if (nodeName.equalsIgnoreCase(CHUNK_TAG))
selector.add(buildChunkSelector((Element) nl.item(i)));
if (nodeName.equalsIgnoreCase(CHUNK_TAG))
selector.add(buildChunkSelector((Element) nl.item(i)));
if (nodeName.equalsIgnoreCase(PROBE_TAG))
{
lastProbe = buildModelProbe((Element) nl.item(i), lastProbe);
selector.add(lastProbe);
}
}
return selector;
}
protected ProductionSelector buildProductionSelector(Element element)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
ProductionSelector selector = new ProductionSelector(pattern);
NodeList nl = element.getChildNodes();
ProductionProbe lastProbe = null;
for (int i = 0; i < nl.getLength(); i++)
if (nl.item(i).getNodeName().equals(PROBE_TAG))
{
lastProbe = buildProductionProbe((Element) nl.item(i), lastProbe);
selector.add(lastProbe);
}
else if (nl.item(i).getNodeName().equalsIgnoreCase(MARKER_TAG))
{
IMarkerOf markerOf = buildMarkerOf((Element) nl.item(i));
selector.add(markerOf);
}
return selector;
}
protected ChunkSelector buildChunkSelector(Element element)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
ChunkSelector selector = new ChunkSelector(pattern);
NodeList nl = element.getChildNodes();
ChunkProbe lastProbe = null;
for (int i = 0; i < nl.getLength(); i++)
{
String nodeName = nl.item(i).getNodeName();
if (nodeName.equalsIgnoreCase(LINK_TAG))
selector.add(buildLinkSelector((Element) nl.item(i)));
else if (nodeName.equalsIgnoreCase(PROBE_TAG))
{
lastProbe = buildChunkProbe((Element) nl.item(i), lastProbe);
selector.add(lastProbe);
}
else if (nodeName.equalsIgnoreCase(MARKER_TAG))
{
IMarkerOf markerOf = buildMarkerOf((Element) nl.item(i));
selector.add(markerOf);
}
}
return selector;
}
protected LinkSelector buildLinkSelector(Element element)
{
String chunkPattern = element.getAttribute(CHUNK_TAG);
if (chunkPattern.length() == 0) chunkPattern = SELECT_ALL;
String chunkTypePattern = element.getAttribute(CHUNK_TYPE_TAG);
if (chunkTypePattern.length() == 0) chunkTypePattern = SELECT_ALL;
LinkSelector selector = new LinkSelector(chunkTypePattern, chunkPattern);
NodeList nl = element.getChildNodes();
LinkParameterProbe lastProbe = null;
for (int i = 0; i < nl.getLength(); i++)
if (nl.item(i).getNodeName().equals(PROBE_TAG))
{
lastProbe = buildLinkProbe((Element) nl.item(i), lastProbe);
selector.add(lastProbe);
}
return selector;
}
protected ClassNamedParameterSelector buildGeneralSelector(Element element)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
String tagName = element.getTagName();
ClassNamedParameterSelector selector = null;
if (tagName.equals("buffer")) selector = new BufferSelector(pattern);
else
if (tagName.equals("module")) selector = new ModuleSelector(pattern);
else
if (tagName.equals("extension")) selector = new ExtensionSelector(pattern);
else
if (tagName.equals("instrument"))
selector = new InstrumentSelector(pattern);
else
selector = new ClassNamedParameterSelector(pattern);
NodeList nl = element.getChildNodes();
ParameterizedProbe lastProbe = null;
for (int i = 0; i < nl.getLength(); i++)
if (nl.item(i).getNodeName().equals(PROBE_TAG))
{
lastProbe = buildParameterizedProbe((Element) nl.item(i), lastProbe);
selector.add(lastProbe);
}
else if (nl.item(i).getNodeName().equalsIgnoreCase(MARKER_TAG))
{
IMarkerOf markerOf = buildMarkerOf((Element) nl.item(i));
selector.add(markerOf);
}
return selector;
}
protected ChunkTypeSelector buildChunkTypeSelector(Element element)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
ChunkTypeSelector selector = new ChunkTypeSelector(pattern);
// NodeList nl = element.getElementsByTagName(PROBE_TAG);
// ChunkProbe lastProbe = null;
// for (int i = 0; i < nl.getLength(); i++)
// {
// lastProbe = buildChunkProbe((Element) nl.item(i), lastProbe);
// selector.add(lastProbe);
// }
NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); i++)
if (nl.item(i).getNodeName().equals(CHUNK_TAG))
selector.add(buildChunkSelector((Element) nl.item(i)));
return selector;
}
protected ModelProbe buildModelProbe(Element element, ModelProbe probe)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
// boolean poll = Boolean.parseBoolean(element.getAttribute(POLL_ATTR));
if (probe == null) probe = new ModelProbe(pattern, null);
probe.addPattern(pattern);
probe.setPollable(Boolean.parseBoolean(element.getAttribute(POLL_ATTR)));
return probe;
}
protected ProductionProbe buildProductionProbe(Element element,
ProductionProbe probe)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
// boolean poll = Boolean.parseBoolean(element.getAttribute(POLL_ATTR));
if (probe == null) probe = new ProductionProbe(pattern, null);
probe.addPattern(pattern);
probe.setPollable(Boolean.parseBoolean(element.getAttribute(POLL_ATTR)));
return probe;
}
protected ParameterizedProbe buildParameterizedProbe(Element element,
ParameterizedProbe probe)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
// boolean poll = Boolean.parseBoolean(element.getAttribute(POLL_ATTR));
if (probe == null) probe = new ParameterizedProbe(pattern, null);
probe.addPattern(pattern);
// probe.setPollable(Boolean.parseBoolean(element.getAttribute(POLL_ATTR)));
// for now they must be pollable as we dont have general listener for
// parameterized
probe.setPollable(true);
return probe;
}
protected LinkParameterProbe buildLinkProbe(Element element,
LinkParameterProbe probe)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
// boolean poll = Boolean.parseBoolean(element.getAttribute(POLL_ATTR));
if (probe == null) probe = new LinkParameterProbe(pattern, null);
probe.addPattern(pattern);
// probe.setPollable(Boolean.parseBoolean(element.getAttribute(POLL_ATTR)));
// for now they must be pollable as we dont have general listener for
// parameterized
probe.setPollable(true);
return probe;
}
protected ChunkProbe buildChunkProbe(Element element, ChunkProbe probe)
{
String pattern = element.getAttribute(PATTERN_ATTR);
if (pattern.length() == 0) pattern = SELECT_ALL;
// boolean poll = Boolean.parseBoolean(element.getAttribute(POLL_ATTR));
if (probe == null) probe = new ChunkProbe(pattern, null);
probe.addPattern(pattern);
probe.setPollable(Boolean.parseBoolean(element.getAttribute(POLL_ATTR)));
return probe;
}
protected IMarkerOf buildMarkerOf(Element element)
{
String className = element.getAttribute("class");
try
{
Class clazz = getClass().getClassLoader().loadClass(className);
IMarkerOf markerOf = (IMarkerOf) clazz.newInstance();
return markerOf;
}
catch (Exception e)
{
if (LOGGER.isWarnEnabled())
LOGGER
.warn(String.format("Could not instantiate markerOf class %s",
className), e);
return null;
}
}
}