package org.reldb.dbrowser.ui.feedback; import java.util.Vector; import org.eclipse.swt.widgets.TreeItem; public class FeedbackInfo { private static class NameValue { String name; String value; public NameValue(String name, String value) {this.name = name; this.value = value;} } private String reportType; private Vector<NameValue> strings = new Vector<NameValue>(); private Vector<TreeItem> trees = new Vector<TreeItem>(); public FeedbackInfo(String reportType) { this.reportType = reportType; } public void addString(String name, String content) { strings.add(new NameValue(name, content)); } public void addTree(TreeItem content) { trees.add(content); } // & & ampersand // < < less than // > > greater than // ' ' apostrophe // " " quotation mark private static String strXMLEncode(String s) { return s.replace("&", "&").replace("<", "<").replace(">", ">").replace("'", "'").replace("\"", """); } private void emitChar(StringBuffer out, int count, char c) { for (int i=0; i<count; i++) out.append(c); } private String repeatChar(int count, char c) { StringBuffer s = new StringBuffer(); emitChar(s, count, c); return s.toString(); } private void emitOpenTag(StringBuffer out, String s) { out.append("<"); out.append(s); out.append(">"); } private void emitCloseTag(StringBuffer out, String s) { out.append("</"); out.append(s); out.append(">"); } private boolean hasCheckOrCheckedChildren(TreeItem tree) { if (tree.getChecked()) return true; for (TreeItem child: tree.getItems()) if (hasCheckOrCheckedChildren(child)) return true; return false; } private void emitTreeItems(StringBuffer out, int tabCount, TreeItem tree) { if (tree == null || !hasCheckOrCheckedChildren(tree)) return; emitChar(out, tabCount, '\t'); if (tree.getItemCount() == 0) { emitOpenTag(out, "data"); out.append(strXMLEncode(tree.getText()).replace("\n", "\n" + repeatChar(tabCount, '\t'))); emitCloseTag(out, "data"); } else { String tagName = tree.getText().replace(' ', '_'); emitOpenTag(out, tagName); out.append('\n'); for (TreeItem child: tree.getItems()) emitTreeItems(out, tabCount + 1, child); emitChar(out, tabCount, '\t'); emitCloseTag(out, tagName); } out.append('\n'); } public String toString() { StringBuffer out = new StringBuffer(); out.append("<" + reportType + ">\n"); for (NameValue nameValue: strings) { out.append("\t<" + nameValue.name + ">"); if (nameValue.value.trim().length() > 0) out.append("\n\t" + strXMLEncode(nameValue.value).replace("\n", "\n\t") + "\n\t"); out.append("</" + nameValue.name + ">\n"); } for (TreeItem treeItem: trees) emitTreeItems(out, 1, treeItem); out.append("</" + reportType + ">"); return out.toString(); } }