package org.opennms.web.controller.ncs; import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.transform.TransformerConfigurationException; 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; public class NCSListFormattingTest { @Test public void testMarshallComponent() throws JAXBException, UnsupportedEncodingException, TransformerConfigurationException { 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(); String result = "<ul>\n" + getComponentHTML(svc) + "</ul>"; assertEquals(getExpectedList(), result); } private String getExpectedList() { return "<ul>\n" + "<li>CokeP2P<ul>\n" + "<li>PE1:SE1<ul>\n" + "<li>jnxVpnIf<ul>\n" + "<li>link</li>\n" + "</ul></li>\n" + "<li>jnxVpnPw-vcid(50)<ul>\n" + "<li>lspA-PE1-PE2</li>\n" + "<li>lspB-PE1-PE2</li>\n" + "</ul></li>\n" + "</ul></li>\n" + "<li>PE2:SE1<ul>\n" + "<li>jnxVpnIf<ul>\n" + "<li>link</li>\n" + "</ul></li>\n" + "<li>jnxVpnPw-vcid(50)<ul>\n" + "<li>lspA-PE2-PE1</li>\n" + "<li>lspB-PE2-PE1</li>\n" + "</ul></li>\n" + "</ul></li>\n" + "</ul></li>\n" + "</ul>"; } @Test public void testRecursiveMethod() { NCSComponent svc = new NCSBuilder("Service", "NA-Service", "123") .setName("CokeP2P") .pushComponent("ServiceElement", "NA-ServiceElement", "8765") .setName("PE1:SE1") .setNodeIdentity("space", "1111-PE1") .popComponent() .pushComponent("ServiceElement", "NA-ServiceElement", "8766") .setName("PE2:SE2") .popComponent() .get(); String expected = "<ul>\n" + "<li>CokeP2P<ul>\n" + "<li>PE1:SE1</li>\n" + "<li>PE2:SE2</li>\n" + "</ul>" + "</li>\n" + "</ul>"; String result = "<ul>\n" + getComponentHTML(svc) + "</ul>"; assertEquals(expected, result); System.err.println("recursive: " + result); } private String getComponentHTML(NCSComponent component) { StringBuffer buffer = new StringBuffer(); buffer.append("<li>"); buffer.append(component.getName()); Set<NCSComponent> subcomponents = component.getSubcomponents(); if(subcomponents.size() > 0) { buffer.append("<ul>\n"); for(NCSComponent c : subcomponents) { buffer.append(getComponentHTML(c)); } buffer.append("</ul>"); } buffer.append("</li>\n"); return buffer.toString(); } private void printJaxbXML(NCSComponent svc) throws JAXBException, UnsupportedEncodingException { 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"); System.err.println(result); } }