/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.internal.model.alerts; import java.util.logging.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.subgraph.vega.api.model.alerts.IScanAlert.Severity; import com.subgraph.vega.api.xml.IXmlRepository; public class ScanAlertFactory { private final Logger logger = Logger.getLogger("alerts"); private final IXmlRepository xmlRepository; ScanAlertFactory(IXmlRepository xmlRepository) { this.xmlRepository = xmlRepository; } ScanAlert createAlert(String key, String name, long scanId, long requestId) { Document doc = xmlRepository.getDocument("alerts/"+ name +".xml"); if(doc == null) doc = xmlRepository.getDocument("alerts/default.xml"); if(doc == null) { logger.warning("Could not find XML alert description named "+ name); return null; } final Element alert = getAlertElement(doc, name); if(alert == null) return null; final Severity severity = parseSeverity(alert); final String title = parseTitle(alert); return new ScanAlert(key, name, title, severity, scanId, requestId); } private Severity parseSeverity(Element alertElement) { NodeList nodeList = alertElement.getElementsByTagName("severity"); if(nodeList.getLength() == 0 || nodeList.item(0).getNodeType() != Node.ELEMENT_NODE) return Severity.UNKNOWN; return processSeverityElement((Element) nodeList.item(0)); } private Severity processSeverityElement(Element e) { final String sev = getTextForElement(e); if(sev == null) return Severity.UNKNOWN; if(sev.equalsIgnoreCase("high")) return Severity.HIGH; else if(sev.equalsIgnoreCase("medium")) return Severity.MEDIUM; else if(sev.equalsIgnoreCase("low")) return Severity.LOW; else if(sev.equalsIgnoreCase("info")) return Severity.INFO; else return Severity.UNKNOWN; } private String parseTitle(Element alertElement) { final NodeList nodeList = alertElement.getElementsByTagName("title"); if(nodeList.getLength() == 0 || nodeList.item(0).getNodeType() != Node.ELEMENT_NODE) return null; final Element titleElement = (Element) nodeList.item(0); return getTextForElement(titleElement); } private String getTextForElement(Element e) { final NodeList nodes = e.getChildNodes(); for(int i = 0; i < nodes.getLength(); i++) { Node n = nodes.item(i); if(n.getNodeType() == Node.TEXT_NODE) return n.getNodeValue(); } return null; } private Element getAlertElement(Document xmlRoot, String name) { final NodeList alertNodes = xmlRoot.getElementsByTagName("alert"); final int n = alertNodes.getLength(); if(n == 0) { logger.warning("No alert node found in XML for description "+ name); return null; } if(n > 1) { logger.warning("Multiple alert entries found in XML for description "+ name +", ignoring extras"); } if(alertNodes.item(0).getNodeType() != Node.ELEMENT_NODE) return null; return (Element) alertNodes.item(0); } }