package test.xml; /* * Copyright (C) 2013 Intel Corporation * All rights reserved. */ import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import javax.xml.transform.stream.StreamSource; import org.junit.Test; import com.intel.mtwilson.feature.xml.*; import org.apache.commons.io.IOUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; /** * * * @author jbuhacoff */ public class ReadFeatureXmlTest { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ReadFeatureXmlTest.class); // probably should be moved to a new utility module cpg-xml or cpg-jaxb // this pair is used when root element has @XmlRootEelment annotation when building private <T> T fromRootXML(InputStream in, Class<T> valueType) throws IOException, JAXBException { String document = IOUtils.toString(in, "UTF-8"); return fromRootXML(document, valueType); } private <T> T fromRootXML(String document, Class<T> valueType) throws IOException, JAXBException { JAXBContext jc = JAXBContext.newInstance( valueType ); Unmarshaller u = jc.createUnmarshaller(); Object o = u.unmarshal( new StreamSource( new StringReader( document ) ) ); // commented otu due to "Expected elements are (none)" error since xjc does not annotate root element <selections> with a tag and maybe timestamp. return (T)o; } // probably should be moved to a new utility module cpg-xml or cpg-jaxb // this pair is used when root element does NOT have @XmlRootEelment annotation when building private <T> T fromXML(InputStream in, Class<T> valueType) throws IOException, JAXBException { String document = IOUtils.toString(in, "UTF-8"); return fromXML(document, valueType); } private <T> T fromXML(String document, Class<T> valueType) throws IOException, JAXBException { JAXBContext jc = JAXBContext.newInstance( valueType ); Unmarshaller u = jc.createUnmarshaller(); JAXBElement<T> e = u.unmarshal( new StreamSource( new StringReader( document ) ), valueType); return e.getValue(); } /** * Sample output for feature 1: * {"id":"feature1","version":"0.1","name":"Feature #1","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"An example feature","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":null,"requires":null,"conflicts":null,"links":null} * * Sample output for feature 2: * {"id":"feature2","version":"0.1","name":"Feature #2","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"A second example feature which depends on the first feature","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":null,"requires":{"feature_ref":{"id":"feature1","version":null}},"conflicts":null,"links":null} * * Sample output for feature 3: * {"id":"feature3","version":"0.1","name":"Feature #3","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"A third example feature which depends on the first feature and conflicts with the second feature","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":null,"requires":{"feature_ref":{"id":"feature1","version":null}},"conflicts":{"feature_ref":{"id":"feature2","version":null}},"links":null} * * Sample output for feature 4: * {"id":"feature4","version":"0.1","name":"Feature #4","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"An example feature","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":{"components":{"component":{"id":"componentA","version":"0.76","name":"Component A","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"An important sub-component","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":null,"requires":null,"conflicts":null,"links":null}}},"requires":null,"conflicts":null,"links":{"link":{"value":"mailto:feature4-users@provider.com","rel":"mailing list","type":null}}} {"id":"feature4","version":"0.1","name":"Feature #4","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"An example feature","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":{"components":{"component":{"id":"componentA","version":"0.76","name":"Component A","provider":{"name":"Intel","url":"http://www.intel.com"},"description":"An important sub-component","license":{"copyright":"2014 Intel Corporation. All rights reserved.","url":"file:///LICENSE.TXT"},"includes":null,"requires":null,"conflicts":null,"links":null}}},"requires":null,"conflicts":null,"links":{"link":{"href":"mailto:feature4-users@provider.com","rel":"mailing list","type":null}}} * * @throws Exception */ @Test public void testReadFeatureType() throws Exception { InputStream in = getClass().getResourceAsStream("/feature-xml-examples/feature4.xml"); FeatureType feature = fromXML(in, FeatureType.class); in.close(); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy()); log.debug("feature1: {}", mapper.writeValueAsString(feature)); } /* public class TagSelection { public List<tag> tagList; public String name; public String id; } public class tag { private String name; private String value; private String oid; tag(String name, String value, String oid){ this.name =name; this.value=value; this.oid=oid; } String getName() { return this.name;} String getValue() {return this.value;} String getOid() { return this.oid;} }; public TagSelection getTagSelectionFromXml(String xml) throws ParserConfigurationException, SAXException, IOException { TagSelection ret = new TagSelection(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource is = new InputSource(new StringReader(xml)); Document doc = builder.parse(is); ArrayList<tag> tagList = new ArrayList<tag>(); int cnt=0; NodeList nodeList = doc.getElementsByTagName("attribute"); for (int s = 0; s < nodeList.getLength(); s++) { Node fstNode = nodeList.item(s); if (fstNode.getNodeType() == Node.ELEMENT_NODE) { Element fstElmnt = (Element) fstNode; String idValue = fstElmnt.getAttribute("oid"); Element lstNmElmnt = (Element) nodeList.item(cnt++); NodeList lstNm = lstNmElmnt.getChildNodes(); String currentAction = ((Node) lstNm.item(0)).getNodeValue(); if (currentAction != null) { tagList.add(new tag("",idValue,currentAction)); } } } nodeList = doc.getElementsByTagName("selection"); Node fstNode = nodeList.item(0); Element e = (Element) fstNode; ret.id = e.getAttribute("id"); ret.name= e.getAttribute("name"); ret.tagList = tagList; return ret; } @Test public void testParseFeature() throws ParserConfigurationException, SAXException, IOException { String xml = "<selections xmlns=\"urn:mtwilson-tag-selection\">\n" + "<selection id=\"1\" name=\"default\">\n" + "<attribute oid=\"1.3.6.1.4.1.99999.1\">US</attribute>\n" + "<attribute oid=\"1.3.6.1.4.1.99999.2\">CA</attribute>\n" + "<attribute oid=\"1.3.6.1.4.1.99999.3\">Folsom</attribute>\n" + "<attribute oid=\"1.3.6.1.4.1.99999.3\">Santa Clara</attribute>\n" + "</selection>\n" + "</selections>"; TagSelection selection = getTagSelectionFromXml(xml); System.out.println("got selection with name "+ selection.name + " and id of " + selection.id); } */ }