package org.opennms.netmgt.model.ncs;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.junit.Test;
import org.opennms.netmgt.model.ncs.NCSBuilder;
import org.opennms.netmgt.model.ncs.NCSComponent;
import org.opennms.netmgt.model.ncs.NCSComponent.DependencyRequirements;
import org.xml.sax.SAXException;
public class JAXBTest {
@Test
public void testMarshall() throws JAXBException, UnsupportedEncodingException, SAXException {
final String expectedXML = "" +
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<component xmlns=\"http://xmlns.opennms.org/xsd/model/ncs\" type=\"Service\" foreignId=\"123\" foreignSource=\"NA-Service\">\n" +
" <name>CokeP2P</name>\n" +
" <component type=\"ServiceElement\" foreignId=\"8765\" foreignSource=\"NA-ServiceElement\">\n" +
" <name>PE1,SE1</name>\n" +
" <node foreignId=\"1111-PE1\" foreignSource=\"space\"/>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"8765,jnxVpnIf\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>jnxVpnIf</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnIfUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnIfDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>jnxVpnIfVpnType</key>\n" +
" <value>5</value>\n" +
" </attribute>\n" +
" <attribute>\n" +
" <key>jnxVpnIfVpnName</key>\n" +
" <value>ge-1/0/2.50</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"8765,link\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>link</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/linkUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/linkDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>linkName</key>\n" +
" <value>ge-1/0/2</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" </component>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"8765,jnxVpnPw-vcid(50)\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>jnxVpnPw-vcid(50)</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnPwUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnPwDown</downEventUei>\n" +
" <dependenciesRequired>ANY</dependenciesRequired>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>jnxVpnPwVpnType</key>\n" +
" <value>5</value>\n" +
" </attribute>\n" +
" <attribute>\n" +
" <key>jnxVpnPwVpnName</key>\n" +
" <value>ge-1/0/2.50</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"8765,lspA-PE1-PE2\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>lspA-PE1-PE2</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>mplsLspName</key>\n" +
" <value>lspA-PE1-PE2</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"8765,lspB-PE1-PE2\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>lspB-PE1-PE2</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>mplsLspName</key>\n" +
" <value>lspB-PE1-PE2</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" </component>\n" +
" </component>\n" +
" <component type=\"ServiceElement\" foreignId=\"9876\" foreignSource=\"NA-ServiceElement\">\n" +
" <name>PE2,SE1</name>\n" +
" <node foreignId=\"2222-PE2\" foreignSource=\"space\"/>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"9876,jnxVpnIf\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>jnxVpnIf</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnIfUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnIfDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>jnxVpnIfVpnType</key>\n" +
" <value>5</value>\n" +
" </attribute>\n" +
" <attribute>\n" +
" <key>jnxVpnIfVpnName</key>\n" +
" <value>ge-3/1/4.50</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"9876,link\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>link</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/linkUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/linkDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>linkName</key>\n" +
" <value>ge-3/1/4</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" </component>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"9876,jnxVpnPw-vcid(50)\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>jnxVpnPw-vcid(50)</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnPwUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/jnxVpnPwDown</downEventUei>\n" +
" <dependenciesRequired>ANY</dependenciesRequired>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>jnxVpnPwVpnType</key>\n" +
" <value>5</value>\n" +
" </attribute>\n" +
" <attribute>\n" +
" <key>jnxVpnPwVpnName</key>\n" +
" <value>ge-3/1/4.50</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"9876,lspA-PE2-PE1\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>lspA-PE2-PE1</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>mplsLspName</key>\n" +
" <value>lspA-PE2-PE1</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" <component type=\"ServiceElementComponent\" foreignId=\"9876,lspB-PE2-PE1\" foreignSource=\"NA-SvcElemComp\">\n" +
" <name>lspB-PE2-PE1</name>\n" +
" <upEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp</upEventUei>\n" +
" <downEventUei>uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown</downEventUei>\n" +
" <attributes>\n" +
" <attribute>\n" +
" <key>mplsLspName</key>\n" +
" <value>lspB-PE2-PE1</value>\n" +
" </attribute>\n" +
" </attributes>\n" +
" </component>\n" +
" </component>\n" +
" </component>\n" +
"</component>\n" +
"";
NCSComponent svc = new NCSBuilder("Service", "NA-Service", "123")
.setName("CokeP2P")
.pushComponent("ServiceElement", "NA-ServiceElement", "8765")
.setName("PE1,SE1")
.setNodeIdentity("space", "1111-PE1")
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "8765,jnxVpnIf")
.setName("jnxVpnIf")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnIfUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnIfDown")
.setAttribute("jnxVpnIfVpnType", "5")
.setAttribute("jnxVpnIfVpnName", "ge-1/0/2.50")
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "8765,link")
.setName("link")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/linkUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/linkDown")
.setAttribute("linkName", "ge-1/0/2")
.popComponent()
.popComponent()
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "8765,jnxVpnPw-vcid(50)")
.setName("jnxVpnPw-vcid(50)")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnPwUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnPwDown")
.setAttribute("jnxVpnPwVpnType", "5")
.setAttribute("jnxVpnPwVpnName", "ge-1/0/2.50")
.setDependenciesRequired(DependencyRequirements.ANY)
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "8765,lspA-PE1-PE2")
.setName("lspA-PE1-PE2")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown")
.setAttribute("mplsLspName", "lspA-PE1-PE2")
.popComponent()
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "8765,lspB-PE1-PE2")
.setName("lspB-PE1-PE2")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown")
.setAttribute("mplsLspName", "lspB-PE1-PE2")
.popComponent()
.popComponent()
.popComponent()
.pushComponent("ServiceElement", "NA-ServiceElement", "9876")
.setName("PE2,SE1")
.setNodeIdentity("space", "2222-PE2")
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "9876,jnxVpnIf")
.setName("jnxVpnIf")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnIfUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnIfDown")
.setAttribute("jnxVpnIfVpnType", "5")
.setAttribute("jnxVpnIfVpnName", "ge-3/1/4.50")
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "9876,link")
.setName("link")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/linkUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/linkDown")
.setAttribute("linkName", "ge-3/1/4")
.popComponent()
.popComponent()
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "9876,jnxVpnPw-vcid(50)")
.setName("jnxVpnPw-vcid(50)")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnPwUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/jnxVpnPwDown")
.setAttribute("jnxVpnPwVpnType", "5")
.setAttribute("jnxVpnPwVpnName", "ge-3/1/4.50")
.setDependenciesRequired(DependencyRequirements.ANY)
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "9876,lspA-PE2-PE1")
.setName("lspA-PE2-PE1")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown")
.setAttribute("mplsLspName", "lspA-PE2-PE1")
.popComponent()
.pushComponent("ServiceElementComponent", "NA-SvcElemComp", "9876,lspB-PE2-PE1")
.setName("lspB-PE2-PE1")
.setUpEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathUp")
.setDownEventUei("uei.opennms.org/vendor/Juniper/traps/mplsLspPathDown")
.setAttribute("mplsLspName", "lspB-PE2-PE1")
.popComponent()
.popComponent()
.popComponent()
.get();
// Create a Marshaller
JAXBContext context = JAXBContext.newInstance(NCSComponent.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// save the output in a byte array
ByteArrayOutputStream out = new ByteArrayOutputStream();
// marshall the output
marshaller.marshal(svc, out);
// verify its matches the expected results
byte[] utf8 = out.toByteArray();
String result = new String(utf8, "UTF-8");
assertEquals(expectedXML, result);
System.err.println(result);
// unmarshall the generated XML
URL xsd = getClass().getResource("/ncs-model.xsd");
assertNotNull(xsd);
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = schemaFactory.newSchema(xsd);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
Source source = new StreamSource(new ByteArrayInputStream(utf8));
NCSComponent read = unmarshaller.unmarshal(source, NCSComponent.class).getValue();
assertNotNull(read);
// round trip back to XML and make sure we get the same thing
ByteArrayOutputStream reout = new ByteArrayOutputStream();
marshaller.marshal(read, reout);
String roundTrip = new String(reout.toByteArray(), "UTF-8");
assertEquals(expectedXML, roundTrip);
}
}