import java.util.Iterator;
import java.util.List;
+import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
+import org.wamblee.conditions.AndCondition;
import org.wamblee.conditions.Condition;
-import org.wamblee.conditions.OrCondition;
+import org.wamblee.conditions.PropertyRegexCondition;
/**
* Parse the configuration of desired programs.
*/
-public class ProgramConfigurationParser {
+class ProgramConfigurationParser {
+
+ private static final String ELEM_PASSWORD = "password";
+
+ private static final String ELEM_USERNAME = "username";
+
+ private static final String ELEM_PORT = "port";
+
+ private static final String ELEM_HOST = "host";
+
+ // Formatting configuration.
+ private static final String ELEM_FORMAT = "format";
+
+ private static final String ELEM_TEXT = "text";
+
+ private static final String ELEM_HTML = "html";
+
+
+ // Mail server configuration.
+
+ private static final String ELEM_NOTIFICATION = "notification";
+
+ private static final String ELEM_SMTP = "smtp";
+
+ private static final String ELEM_SUBJECT = "subject";
+
+ private static final String ELEM_TO = "to";
+
+ private static final String ELEM_FROM = "from";
+
+ // Configuration of interesting programs.
private static final String ELEM_PROGRAM = "program";
- private static final String ELEM_PATTERN = "name";
+ private static final String ELEM_PATTERN = "match";
+
+ private static final String ELEM_ACTION = "action";
+
+ private static final String ELEM_CATEGORY = "category";
+
+ private static final String ACTION_NOTIFY = "notify";
+
+ private List<ProgramFilter> _filters;
+
+ private Notifier _notifier;
+
+ ProgramConfigurationParser() {
+ _filters = null;
+ _notifier = null;
+ }
/**
* Parses the condition used to match the desired programs.
* Input stream to parse from.
* @return Condition.
*/
- Condition<Program> parse(InputStream aStream) {
+ void parse(InputStream aStream) {
+ List<ProgramFilter> filters = new ArrayList<ProgramFilter>();
try {
SAXReader reader = new SAXReader();
Document document = reader.read(aStream);
Element root = document.getRootElement();
- List<Condition<Program>> conditions = new ArrayList<Condition<Program>>();
for (Iterator i = root.elementIterator(ELEM_PROGRAM); i.hasNext();) {
Element program = (Element) i.next();
- String pattern = ".*" + program.element(ELEM_PATTERN).getText()
- + ".*";
- conditions.add(new ProgramNameMatcher(pattern));
+
+ Element categoryElem = program.element(ELEM_CATEGORY);
+ String category = "";
+ if ( categoryElem != null ) {
+ category = categoryElem.getText().trim();
+ }
+
+ Element actionElem = program.element(ELEM_ACTION);
+ ProgramAction action = new RecordProgramAction();
+ if (actionElem != null) {
+ if (actionElem.getText().equals(ACTION_NOTIFY)) {
+ action = new InterestingProgramAction(category);
+ }
+ }
+
+ List<Condition<Program>> regexConditions =
+ new ArrayList<Condition<Program>>();
+ for (Iterator j = program.elementIterator(ELEM_PATTERN); j.hasNext(); ) {
+ Element patternElem = (Element)j.next();
+ String fieldName = "name";
+ Attribute fieldAttribute = patternElem.attribute("field");
+ if ( fieldAttribute != null ) {
+ fieldName = fieldAttribute.getText();
+ }
+ String pattern = ".*(" + patternElem.getText()
+ + ").*";
+ regexConditions.add(new PropertyRegexCondition<Program>(fieldName, pattern, true));
+ }
+ Condition<Program> condition = new AndCondition<Program>(regexConditions);
+ filters.add(new ProgramFilter(condition, action));
}
- return new OrCondition<Program>(conditions);
+ _filters = filters;
+
+ Element notifier = root.element(ELEM_NOTIFICATION);
+ _notifier = parseNotifier(notifier);
+
} catch (DocumentException e) {
throw new RuntimeException("Error parsing program configuraiton", e);
}
}
+
+ /**
+ * Parses the notifier
+ * @return Notifier
+ */
+ private Notifier parseNotifier(Element aNotifier) {
+ String from = aNotifier.elementTextTrim(ELEM_FROM);
+ String to = aNotifier.elementTextTrim(ELEM_TO);
+ String subject = aNotifier.elementTextTrim(ELEM_SUBJECT);
+
+ Element smtp = aNotifier.element(ELEM_SMTP);
+ MailServer server = parseMailServer( smtp );
+
+ Element format = aNotifier.element(ELEM_FORMAT);
+ String htmlXslt = format.elementTextTrim(ELEM_HTML);
+ String textXslt = format.elementTextTrim(ELEM_TEXT);
+
+ return new MailNotifier(from, to, subject, htmlXslt, textXslt, server);
+ }
+
+ /**
+ * Parses the mail server from the XML.
+ * @param aSmtp Mail server configuration.
+ * @return Mail server.
+ */
+ private MailServer parseMailServer( Element aSmtp ) {
+ String host = aSmtp.elementTextTrim(ELEM_HOST);
+ Element portElem = aSmtp.element(ELEM_PORT);
+ int port = 25;
+ if ( portElem != null ) {
+ port = Integer.valueOf(portElem.getTextTrim());
+ }
+ String username = aSmtp.elementTextTrim(ELEM_USERNAME);
+ String password = aSmtp.elementTextTrim(ELEM_PASSWORD);
+
+ MailServer server = new MailServer(host, port, username, password);
+ return server;
+ }
+
+ /**
+ * Returns the list of program filters.
+ * @return Filter list.
+ */
+ public List<ProgramFilter> getFilters() {
+ return _filters;
+ }
+
+ /**
+ * Returns the notifier to use.
+ * @return Notifier.
+ */
+ public Notifier getNotifier() {
+ return _notifier;
+ }
}