package org.jactr.tools.experiment.impl;
/*
* default logging
*/
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jactr.tools.experiment.IDataLogger;
import org.jactr.tools.experiment.IExperiment;
public class XMLDataLogger implements IDataLogger
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(XMLDataLogger.class);
private IExperiment _experiment;
private int _level = 0;
private PrintWriter _writer;
private String _path;
static private int _iterations;
public XMLDataLogger()
{
_iterations++;
}
public void setExperiment(IExperiment experiment)
{
_experiment = experiment;
}
public void setPath(String relativePath, String fileName)
{
/*
* model will already be defined
*/
String subj = _experiment.getVariableResolver()
.resolve("${SubjectId}", _experiment.getVariableContext()).toString();
File fp = new File(relativePath, subj);
fp.mkdirs();
fp = new File(fp, fileName);
_path = fp.getPath();
try
{
_writer = new PrintWriter(new FileWriter(fp));
}
catch (IOException e)
{
LOGGER.error("XMLDataCollector.setPath threw IOException : ", e);
}
}
public String getPath()
{
return _path;
}
synchronized public PrintWriter getWriter()
{
if (_writer == null) _writer = new PrintWriter(System.out);
return _writer;
}
public void open(String tagName, Map<String, String> attributes,
IVariableContext context)
{
write(tagName, false, false, attributes, context);
}
public void close(String tagName)
{
write(tagName, true, false, Collections.EMPTY_MAP,
_experiment.getVariableContext());
}
public void simple(String tagName, Map<String, String> attributes,
IVariableContext context)
{
write(tagName, false, true, attributes, context);
}
synchronized private void write(String tagName, boolean close,
boolean simple, Map<String, String> attributes, IVariableContext context)
{
if (close) _level--;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < _level; i++)
sb.append(" ");
if (close)
sb.append("</");
else
sb.append("<");
sb.append(tagName);
if (!close)
{
VariableResolver resolver = _experiment.getVariableResolver();
for (Map.Entry<String, String> entry : attributes.entrySet())
{
String attr = entry.getKey();
String value = entry.getValue();
value = resolver.resolve(value, context).toString();
sb.append(" ").append(attr).append("=").append("\"").append(value)
.append("\"");
}
}
if (simple)
sb.append("/>");
else
sb.append(">");
PrintWriter writer = getWriter();
writer.println(sb.toString());
writer.flush();
if (!simple && !close) _level++;
}
}