/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.netmgt.model.events; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.opennms.core.utils.InetAddressUtils.addr; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import org.custommonkey.xmlunit.DetailedDiff; import org.custommonkey.xmlunit.Difference; import org.custommonkey.xmlunit.XMLUnit; import org.exolab.castor.xml.Marshaller; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.opennms.core.test.MockLogAppender; import org.opennms.core.xml.SimpleNamespaceFilter; import org.opennms.netmgt.xml.event.AlarmData; import org.opennms.netmgt.xml.event.Autoacknowledge; import org.opennms.netmgt.xml.event.Autoaction; import org.opennms.netmgt.xml.event.Correlation; import org.opennms.netmgt.xml.event.Event; import org.opennms.netmgt.xml.event.Forward; import org.opennms.netmgt.xml.event.Logmsg; import org.opennms.netmgt.xml.event.Mask; import org.opennms.netmgt.xml.event.Maskelement; import org.opennms.netmgt.xml.event.Operaction; import org.opennms.netmgt.xml.event.Parm; import org.opennms.netmgt.xml.event.Script; import org.opennms.netmgt.xml.event.Snmp; import org.opennms.netmgt.xml.event.Tticket; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class JaxbCastorEquivalenceTest { private static final String xmlWithNamespace = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><event uuid=\"1234\" xmlns=\"http://xmlns.opennms.org/xsd/event\"><dbid>37</dbid><dist-poller>localhost</dist-poller><creation-time>Friday, March 18, 2011 1:34:13 PM GMT</creation-time><master-station>chief</master-station><mask><maskelement><mename>generic</mename><mevalue>6</mevalue></maskelement></mask><uei>uei.opennms.org/test</uei><source>JaxbCastorEquivalenceTest</source><nodeid>1</nodeid><time>Friday, March 18, 2011 1:34:13 PM GMT</time><host>funkytown</host><interface>192.168.0.1</interface><snmphost>192.168.0.1</snmphost><service>ICMP</service><snmp><id>.1.3.6.15</id><idtext>I am a banana!</idtext><version>v2c</version><specific>0</specific><generic>6</generic><community>public</community><time-stamp>1300455253196</time-stamp></snmp><parms><parm><parmName>foo</parmName><value encoding=\"text\" type=\"string\">bar</value></parm></parms><descr>This is a test thingy.</descr><logmsg dest=\"logndisplay\" notify=\"true\">this is a log message</logmsg><severity>Indeterminate</severity><pathoutage>monkeys</pathoutage><correlation path=\"pathOutage\" state=\"on\"><cuei>uei.opennms.org/funky-stuff</cuei><cmin>1</cmin><cmax>17</cmax><ctime>yesterday</ctime></correlation><operinstruct>run away</operinstruct><autoaction state=\"off\">content</autoaction><operaction menutext=\"this is in the menu!\" state=\"on\">totally actiony</operaction><autoacknowledge state=\"off\">content</autoacknowledge><loggroup>foo</loggroup><loggroup>bar</loggroup><tticket state=\"on\">tticket stuff</tticket><forward mechanism=\"snmptcp\" state=\"on\">I like shoes.</forward><script language=\"zombo\">the unattainable is within reach, at zombo.com</script><ifIndex>53</ifIndex><ifAlias>giggetE</ifAlias><mouseovertext>click here to buy now!!!!1!1!</mouseovertext><alarm-data x733-probable-cause=\"27\" x733-alarm-type=\"TimeDomainViolation\" auto-clean=\"true\" clear-key=\"car\" alarm-type=\"19\" reduction-key=\"bus\"/></event>"; @Before public void setUp() { MockLogAppender.setupLogging(true); } @Test @Ignore("castor-specific things have been removed from the classes now") public void marshalEvent() throws Exception { final Event event = getFullEvent(); final StringWriter jaxbWriter = new StringWriter(); final JAXBContext c = JAXBContext.newInstance("org.opennms.netmgt.xml.event"); final javax.xml.bind.Marshaller jaxbMarshaller = c.createMarshaller(); final SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); final Schema schema = factory.newSchema(new StreamSource("src/main/castor/event.xsd")); jaxbMarshaller.setSchema(schema); jaxbMarshaller.marshal(event, jaxbWriter); final String jaxbXml = jaxbWriter.toString(); System.err.println("JAXB: " + jaxbXml); final StringWriter castorWriter = new StringWriter(); final Marshaller m = new Marshaller(castorWriter); m.setSuppressNamespaces(true); m.marshal(event); final String castorXml = castorWriter.toString(); final String formattedCastorXml = castorXml.replaceFirst("<event ", "<event xmlns=\"http://xmlns.opennms.org/xsd/event\" ").replaceFirst("\\?>\n", " standalone=\"yes\"?>"); System.err.println("Castor: " + formattedCastorXml); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreAttributeOrder(true); XMLUnit.setNormalize(true); assertXmlEquals(formattedCastorXml, jaxbXml); org.exolab.castor.xml.Unmarshaller castorUnmarshaller = new org.exolab.castor.xml.Unmarshaller(Event.class); castorUnmarshaller.setIgnoreExtraAttributes(false); castorUnmarshaller.setIgnoreExtraElements(false); castorUnmarshaller.setWhitespacePreserve(true); final Reader jaxbStringReader = new StringReader(jaxbXml); final InputSource jaxbInputSource = new InputSource(jaxbStringReader); final Event jaxbEvent = (Event)castorUnmarshaller.unmarshal(jaxbInputSource); System.err.println("event = " + jaxbEvent); final Unmarshaller jaxbUnmarshaller = c.createUnmarshaller(); jaxbUnmarshaller.setSchema(schema); final XMLReader jaxbReader = XMLReaderFactory.createXMLReader(); final StringReader castorXmlReader = new StringReader(castorXml); final InputSource xmlSource = new InputSource(castorXmlReader); final SimpleNamespaceFilter filter = new SimpleNamespaceFilter("http://xmlns.opennms.org/xsd/event", true); filter.setParent(jaxbReader); final SAXSource source = new SAXSource(filter, xmlSource); Event newCastorEvent = (Event)jaxbUnmarshaller.unmarshal(source); assertNotNull(newCastorEvent); } @Test public void testUnmarshalEventSimple() throws Exception { final JAXBContext c = JAXBContext.newInstance("org.opennms.netmgt.xml.event"); c.createUnmarshaller().unmarshal(new StringReader(xmlWithNamespace)); } @Test public void testUnmarshalEventSimpleWithValidation() throws Exception { final JAXBContext c = JAXBContext.newInstance("org.opennms.netmgt.xml.event"); final Unmarshaller unmarshaller = c.createUnmarshaller(); final SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); final Schema schema = factory.newSchema(new StreamSource("src/main/castor/event.xsd")); unmarshaller.setSchema(schema); unmarshaller.unmarshal(new StringReader(xmlWithNamespace)); } @Test public void testUnmarshalEventSimpleWithValidationAndGeneratedJaxb() throws Exception { final JAXBContext c = JAXBContext.newInstance("org.opennms.xmlns.xsd.event"); final Unmarshaller unmarshaller = c.createUnmarshaller(); final SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); final Schema schema = factory.newSchema(new StreamSource("src/main/castor/event.xsd")); unmarshaller.setSchema(schema); unmarshaller.unmarshal(new StringReader(xmlWithNamespace)); } private Event getFullEvent() { final EventBuilder builder = new EventBuilder("uei.opennms.org/test", "JaxbCastorEquivalenceTest"); final Event event = builder .setUuid("1234") .setDistPoller("localhost") .setMasterStation("chief") .setNodeid(1) .setHost("funkytown") .setInterface(addr("192.168.0.1")) .setSnmpHost("192.168.0.1") .setService("ICMP") .setDescription("This is a test thingy.") .setSeverity("normal") .getEvent(); event.setDbid(37); event.setMask(getFullMask()); event.setSnmp(getFullSnmp()); event.setParmCollection(getParmCollection()); event.setLogmsg(getFullLogmsg()); event.setPathoutage("monkeys"); event.setCorrelation(getFullCorrelation()); event.setOperinstruct("run away"); event.setOperaction(new Operaction[] { getFullOperaction() }); event.setAutoaction(new Autoaction[] { getFullAutoaction() }); event.setAutoacknowledge(getFullAutoacknowledge()); event.setLoggroup(new String[] { "foo", "bar" }); event.setTticket(getFullTticket()); event.setForward(new Forward[] { getFullForward() }); event.setScript(new Script[] { getFullScript() }); event.setIfIndex(53); event.setIfAlias("giggetE"); event.setMouseovertext("click here to buy now!!!!1!1!"); event.setAlarmData(getFullAlarmData()); return event; } private AlarmData getFullAlarmData() { final AlarmData alarmData = new AlarmData(); alarmData.setAlarmType(19); alarmData.setAutoClean(true); alarmData.setClearKey("car"); alarmData.setReductionKey("bus"); alarmData.setX733AlarmType("TimeDomainViolation"); alarmData.setX733ProbableCause(27); return alarmData; } private Script getFullScript() { final Script script = new Script(); script.setLanguage("zombo"); script.setContent("the unattainable is within reach, at zombo.com"); return script; } private Forward getFullForward() { final Forward forward = new Forward(); forward.setContent("I like shoes."); forward.setMechanism("snmptcp"); forward.setState("on"); return forward; } private Tticket getFullTticket() { final Tticket tticket = new Tticket(); tticket.setContent("tticket stuff"); tticket.setState("on"); return tticket; } private Autoacknowledge getFullAutoacknowledge() { final Autoacknowledge autoacknowledge = new Autoacknowledge(); autoacknowledge.setContent("content"); autoacknowledge.setState("off"); return autoacknowledge; } private Autoaction getFullAutoaction() { final Autoaction autoaction = new Autoaction(); autoaction.setContent("content"); autoaction.setState("off"); return autoaction; } private Operaction getFullOperaction() { final Operaction operaction = new Operaction(); operaction.setContent("totally actiony"); operaction.setMenutext("this is in the menu!"); operaction.setState("on"); return operaction; } private Correlation getFullCorrelation() { final Correlation correlation = new Correlation(); correlation.setCmax("17"); correlation.setCmin("1"); correlation.setCtime("yesterday"); correlation.setCuei(new String[] { "uei.opennms.org/funky-stuff" }); correlation.setPath("pathOutage"); correlation.setState("on"); return correlation; } private Logmsg getFullLogmsg() { final Logmsg logmsg = new Logmsg(); logmsg.setContent("this is a log message"); return logmsg; } private List<Parm> getParmCollection() { final List<Parm> parms = new ArrayList<Parm>(); parms.add(new Parm("foo", "bar")); return parms; } private Snmp getFullSnmp() { final Snmp snmp = new Snmp(); snmp.setCommunity("public"); snmp.setGeneric(6); snmp.setId(".1.3.6.15"); snmp.setIdtext("I am a banana!"); snmp.setSpecific(0); snmp.setTimeStamp(new Date().getTime()); snmp.setVersion("v2c"); return snmp; } private Mask getFullMask() { final Mask mask = new Mask(); mask.setMaskelement(new Maskelement[] { getFullMaskelement() }); return mask; } private Maskelement getFullMaskelement() { final Maskelement maskelement = new Maskelement(); maskelement.setMename("generic"); maskelement.setMevalue(new String[] { "6" }); return maskelement; } private void assertXmlEquals(final String string, final String string2) throws Exception { final DetailedDiff diff = getDiff(string, string2); System.err.println("diff = " + diff); assertEquals("number of XMLUnit differences between the example xml and the mock object xml is 0", 0, diff.getAllDifferences().size()); } private DetailedDiff getDiff(final String xmlA, final String xmlB) throws SAXException, IOException { DetailedDiff myDiff = new DetailedDiff(XMLUnit.compareXML(xmlA, xmlB)); @SuppressWarnings("unchecked") List<Difference> allDifferences = myDiff.getAllDifferences(); if (allDifferences.size() > 0) { for (Difference d : allDifferences) { System.err.println(d); } } return myDiff; } }