private Map<XPathExpression, Number> parse(String message, XmlProvider xmlstarter) { if(message == null || "".equals(message)) { return Collections.emptyMap(); } else { log(Level.TRACE, "new message to parse: "); log(Level.TRACE, message); // The XML returned from an iLO is buggy, up to ilO2 1.50 message = message.replaceAll("<RIBCL VERSION=\"[0-9\\.]+\"/>", "<RIBCL >"); Document d = xmlstarter.getDocument(new StringReader(message)); return xmlstarter.fileFromXpaths(d, getPd().getCollectMapping().keySet()); } }
public Document getDocument(InputSource stream) { DocumentBuilder dbuilder = localDocumentBuilder.get(); Document d = null; log(Level.TRACE, "%s %s %s started %s@%s", stream, dbuilder, isStarted(), getClass().getName(), Integer.toHexString(hashCode())); try { dbuilder.reset(); d = dbuilder.parse(stream); log(Level.TRACE, "just parsed a %s", d.getDocumentElement().getTagName()); } catch (SAXException e) { log(Level.ERROR, e, "Invalid XML: %s", e.getMessage()); } catch (IOException e) { log(Level.ERROR, e, "IO Exception getting values: %s", e.getMessage()); } return d; }
p.setHost(host); p.setPd(pd); host.registerStarter(new XmlProvider()); long l; String uptimeXml; p.find(XmlProvider.class).start(); uptimeXml = "<?xml version=\"1.0\" ?><element />"; l = p.findUptime(p.find(XmlProvider.class), Tools.parseString(uptimeXml)); Assert.assertEquals(0, l, 0.0001); p.find(XmlProvider.class).stop(); p.find(XmlProvider.class).start(); uptimeXml = "<?xml version=\"1.0\" ?><element uptime=\"1125\" />"; l = p.findUptime(p.find(XmlProvider.class), Tools.parseString(uptimeXml)); Assert.assertEquals((long) 1125, l); p.find(XmlProvider.class).stop(); p.find(XmlProvider.class).start(); uptimeXml = "<?xml version=\"1.0\" ?><element />"; l = p.findUptime(p.find(XmlProvider.class), Tools.parseString(uptimeXml)); Assert.assertEquals((long) 0, l); p.find(XmlProvider.class).stop(); p.find(XmlProvider.class).start(); uptimeXml = "<?xml version=\"1.0\" ?><element />"; l = p.findUptime(p.find(XmlProvider.class), Tools.parseString(uptimeXml)); Assert.assertEquals((long) 0, l); p.find(XmlProvider.class).stop();
/** * Extract the the uptime from the XML document, reusing the XML provider * utilites * * @param xmlstarter * @param d * @return */ protected long findUptime(XmlProvider xmlstarter, Document d) { String upTimePath = getPd().getSpecific("upTimePath"); if(upTimePath != null) { return xmlstarter.findUptime(d, upTimePath); } else if(getPd().getSpecific("nouptime") != null) { return Long.MAX_VALUE; } else { String startTimePath = getPd().getSpecific("startTimePath"); String currentTimePath = getPd().getSpecific("currentTimePath"); String timePattern = getPd().getSpecific("timePattern"); if(startTimePath != null && currentTimePath != null && timePattern != null) { DateFormat df = new SimpleDateFormat(timePattern); return xmlstarter.findUptimeByDate(d, startTimePath, currentTimePath, df); } else { log(Level.ERROR, "No xpath for the uptime"); return 0; } } }
@Override protected DocumentBuilder initialValue() { DocumentBuilderFactory instance = DocumentBuilderFactory.newInstance(); instance.setIgnoringComments(true); instance.setValidating(false); try { return instance.newDocumentBuilder(); } catch (ParserConfigurationException e) { log(Level.FATAL, e, "No Document builder available"); return null; } } };
public Document getDocument(InputStream stream) { return getDocument(new InputSource(stream)); }
@Override public boolean isStarted(Object key) { return super.isStarted(key) && find(XmlProvider.class).isStarted() && find(SocketFactory.class).isStarted(); }
public long findUptime(Document d, String upTimePath) { long uptime = 0; if(upTimePath == null) { log(Level.ERROR, "No xpath for the uptime for " + this); return 0; } try { XPath xpather = localXpath.get(); Node upTimeNode = (Node) xpather.evaluate(upTimePath, d, XPathConstants.NODE); if(upTimeNode != null) { log(Level.TRACE, "Will parse uptime: %s", upTimeNode.getTextContent()); String dateString = upTimeNode.getTextContent(); uptime = jrds.Util.parseStringNumber(dateString, 0L); } log(Level.ALL, "uptime is %d", uptime); } catch (XPathExpressionException e) { log(Level.ERROR, e, "Uptime not found"); } return uptime; }
public Document getDocument(Reader stream) { return getDocument(new InputSource(stream)); }
@Override protected Map<String, Number> parseStream(InputStream stream) { XmlProvider xmlstarter = find(XmlProvider.class); if(xmlstarter == null) { log(Level.ERROR, "XML Provider not found"); return null; } Document d = xmlstarter.getDocument(stream); if (! validateXml(xmlstarter, d)) { return null; } setUptime(findUptime(xmlstarter, d)); Map<String, Number> vars = new HashMap<>(collectKeys.size()); for (Map.Entry<XPathExpression, Number> e: xmlstarter.fileFromXpaths(d, collectKeys.keySet()).entrySet()) { vars.put(collectKeys.get(e.getKey()), e.getValue()); } log(Level.TRACE, "Values found: %s", vars); log(Level.TRACE, "%s", vars); vars = dom2Map(d, vars); log(Level.TRACE, "%s", vars); return vars; }
public long findUptimeByDate(Document d, String startTimePath, String currentTimePath, DateFormat pattern) { XPath xpather = localXpath.get(); try { Node startTimeNode = (Node) xpather.evaluate(startTimePath, d, XPathConstants.NODE); String startTimeString = startTimeNode.getTextContent(); Date startTime = pattern.parse(startTimeString); Node currentTimeNode = (Node) xpather.evaluate(currentTimePath, d, XPathConstants.NODE); String currentTimeString = currentTimeNode.getTextContent(); Date currentTime = pattern.parse(currentTimeString); return (currentTime.getTime() - startTime.getTime()) / 1000; } catch (XPathExpressionException e) { log(Level.ERROR, e, "Time not found"); } catch (ParseException e) { log(Level.ERROR, e, "Date not parsed with pattern " + ((SimpleDateFormat) pattern).toPattern()); } return 0; }
@Override protected Document makeDocument(XmlProvider xmlstarter) { Document locfgQ = super.makeDocument(xmlstarter); Document ribclQ = xmlstarter.getDocument(); Node ribclElem = locfgQ.getDocumentElement().getFirstChild(); ribclQ.adoptNode(ribclElem); ribclQ.appendChild(ribclElem); return ribclQ; }
public Map<XPathExpression, Number> fileFromXpaths(Document d, Set<XPathExpression> xpaths) { Map<XPathExpression, Number> values = new HashMap<>(xpaths.size()); for(XPathExpression xpath: xpaths) { try { log(Level.TRACE, "Will search the xpath \"%s\"", xpath); Node n = (Node) xpath.evaluate(d, XPathConstants.NODE); Double value; if(n != null) { value = jrds.Util.parseStringNumber(n.getTextContent(), Double.NaN); values.put(xpath, value); } } catch (XPathExpressionException e) { log(Level.ERROR, "Invalid XPATH : " + xpath + " for " + this); } catch (NumberFormatException e) { log(Level.WARN, e, "value read from %s not parsable", xpath); } } log(Level.TRACE, "Values found: %s", values); return values; }
protected Document makeDocument(XmlProvider xmlstarter) { Document ribclQ = xmlstarter.getDocument(); Element LOCFG = ribclQ.createElement("LOCFG"); LOCFG.setAttribute("version", "2.21"); ribclQ.appendChild(LOCFG); Element RIBCL = ribclQ.createElement("RIBCL"); LOCFG.appendChild(RIBCL); RIBCL.setAttribute("VERSION", "2.0"); Element LOGIN = ribclQ.createElement("LOGIN"); LOGIN.setAttribute("USER_LOGIN", user); LOGIN.setAttribute("PASSWORD", passwd); RIBCL.appendChild(LOGIN); Element command = ribclQ.createElement(getPd().getSpecific("command")); command.setAttribute("MODE", "read"); LOGIN.appendChild(command); Element subcommand = ribclQ.createElement(getPd().getSpecific("subcommand")); command.appendChild(subcommand); return ribclQ; }