package hep.aida.ref.plotter.style.registry;
import hep.aida.IAnalysisFactory;
import hep.aida.IBaseStyle;
import hep.aida.IPlotterFactory;
import hep.aida.IPlotterStyle;
import hep.aida.ref.plotter.BaseStyle;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import org.freehep.xml.util.XMLWriter;
public class StyleStoreXMLWriter extends XMLWriter {
public static void writeToFile(String fileName, IStyleStore store) throws IOException {
writeToFile(fileName, store, false);
}
public static void writeToFile(String fileName, IStyleStore store, boolean writeAllParameters) throws IOException {
File file = new File(fileName);
if (file.exists()) file.delete();
Writer writer = new BufferedWriter(new FileWriter(file));
StyleStoreXMLWriter xmlWriter = new StyleStoreXMLWriter(writer);
xmlWriter.writeXMLStyleStore(store, writeAllParameters);
xmlWriter.close();
}
public StyleStoreXMLWriter(Writer writer) throws IOException {
super(writer);
openDoc("1.0", "ISO-8859-1", false);
//referToDTD("aidaStyleStore", "http://java.freehep.org/schemas/jaida/1.0/StyleStoreSchema.xsd");
referToDTD("aidaStyleStore", "http://java.freehep.org/schemas/jaida/1.0/StyleStoreDTD.dtd");
}
public void close() throws IOException {
super.close();
}
// Writing IStyleStore to XML
public void writeXMLStyleStore(IStyleStore store) {
writeXMLStyleStore(store, false);
}
public void writeXMLStyleStore(IStyleStore store, boolean writeAllParameters) {
setAttribute("storeName", store.getStoreName());
setAttribute("storeType", store.getStoreType());
setAttribute("isReadOnly", store.isReadOnly());
openTag("aidaStyleStore");
String[] names = store.getAllStyleNames();
if (store instanceof BaseStyleStore) {
for (int i=0; i<names.length; i++) {
StyleStoreEntry entry = ((BaseStyleStore) store).getStoreEntry(names[i]);
storeEntryToXML(names[i], entry.getPreviewType().getName(), store.getStyle(names[i]), entry.getRule());
}
} else {
for (int i=0; i<names.length; i++) {
storeEntryToXML(names[i], store.getStyle(names[i]), store.getRuleForStyle(names[i]));
}
}
closeTag();
}
// Writing StyleStore Entry to XML
public void storeEntryToXML(String name, IPlotterStyle style, IStyleRule rule) {
String previewType = StyleStoreEntry.DEFAULT_ENTRY_TYPE;
storeEntryToXML(name, previewType, style, rule);
}
public void storeEntryToXML(String name, String type, IPlotterStyle style, IStyleRule rule) {
setAttribute("entryName", name);
if (type != null) setAttribute("entryType", type);
openTag("aidaStyleStoreEntry");
styleRuleToXML(rule);
plotterStyleToXML(style);
closeTag();
}
// Writing IStyleRule to XML
public void styleRuleToXML(IStyleRule rule) {
setAttribute("ruleValue", rule.getDescription());
if (rule instanceof JELRule && ((JELRule) rule).getType() != null) {
setAttribute("ruleType", ((JELRule) rule).getType());
}
printTag("aidaStyleRule");
}
// Writing IPlotterStyle to XML
public void plotterStyleToXML(IPlotterStyle style) {
plotterStyleToXML(style, false);
}
public void plotterStyleToXML(IPlotterStyle style, boolean writeAllParameters) {
if (isStyleEmpty(style, writeAllParameters)) return;
openTag("aidaPlotterStyle");
IBaseStyle[] children = style.children();
if (children != null) {
for (int i=0; i<children.length; i++) {
styleToXML(children[i], writeAllParameters);
}
}
styleParametersToXML(style, writeAllParameters);
closeTag();
}
void styleToXML(IBaseStyle style) {
styleToXML(style, false);
}
void styleToXML(IBaseStyle style, boolean writeAllParameters) {
if (isStyleEmpty(style, writeAllParameters)) return;
setAttribute("type", style.name());
openTag("aidaStyle");
IBaseStyle[] children = style.children();
if (children != null) {
for (int i=0; i<children.length; i++) {
styleToXML(children[i], writeAllParameters);
}
}
styleParametersToXML(style, writeAllParameters);
closeTag();
}
void styleParametersToXML(IBaseStyle style, boolean writeAllParameters) {
String[] parNames = style.availableParameters();
if (parNames != null) {
for (int i=0; i<parNames.length; i++) {
String name = parNames[i];
String value = style.parameterValue(name);
if (value == null) value = "null";
boolean isSet = true;
String type = String.class.getName();
String[] possibleValues = null;
if (style instanceof BaseStyle) {
isSet = ((BaseStyle) style).isParameterSet(name);
type = ((BaseStyle) style).parameter(name).type().getName();
possibleValues = ((BaseStyle) style).availableParameterOptions(name);
}
String options = null;
if (possibleValues != null && possibleValues.length > 0) {
options = "\""+possibleValues[0]+"\"";
for (int o=1; o<possibleValues.length; o++) options += ", \""+possibleValues[o]+"\"";
}
if (isSet || writeAllParameters) {
setAttribute("attributeName", name);
setAttribute("attributeValue", value);
if (options != null) setAttribute("attributeOptions", options);
printTag("aidaStyleAttribute");
}
}
}
}
boolean isStyleEmpty(IBaseStyle style) {
return isStyleEmpty(style, false);
}
boolean isStyleEmpty(IBaseStyle style, boolean writeAllParameters) {
boolean isEmpty = true;
// Check if style has any valid parameters
String[] parNames = style.availableParameters();
if (parNames != null) {
for (int i=0; i<parNames.length; i++) {
String name = parNames[i];
boolean isSet = true;
if (style instanceof BaseStyle) isSet = ((BaseStyle) style).isParameterSet(name);
if (isSet || writeAllParameters) {
return false;
}
}
}
// Check if children styles are empty
IBaseStyle[] children = style.children();
if (children != null) {
for (int i=0; i<children.length; i++) {
if (!isStyleEmpty(children[i])) return false;
}
}
return isEmpty;
}
public static void main(String[] args) throws Exception {
XMLStyleStore store = new XMLStyleStore("XML Store 2", XMLStyleStore.TYPE, false);
IPlotterFactory pf = IAnalysisFactory.create().createPlotterFactory();
IPlotterStyle style1 = pf.createPlotterStyle();
style1.dataBoxStyle().setVisible(true);
style1.dataBoxStyle().backgroundStyle().setPattern("hatched");
JELRule rule1 = new JELRule("OverlayNumber==1");
store.addStyle("Style-1", style1, rule1);
IPlotterStyle style2 = pf.createPlotterStyle();
style2.dataBoxStyle().setVisible(false);
style2.dataBoxStyle().backgroundStyle().setColor("White");
JELRule rule2 = new JELRule("RegionNumber>=2");
store.addStyle("Style-2", style2, rule2);
String fileName = "C:/TEMP/xmlStore.xml";
StyleStoreXMLWriter.writeToFile(fileName, store);
}
}