/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.util.jaxb;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.transform.TransformerException;
import org.apache.commons.lang.StringUtils;
import org.drugis.addis.entities.DomainImpl;
import org.drugis.addis.entities.Drug;
import org.drugis.addis.entities.data.AddisData;
import org.drugis.addis.gui.GUIFactory;
import org.drugis.addis.gui.Main;
import org.drugis.addis.util.jaxb.JAXBConvertor.ConversionException;
import org.drugis.addis.util.jaxb.JAXBHandler.XmlFormatType;
import org.junit.Test;
import org.xml.sax.SAXException;
public class JAXBHandlerTest {
private static final String V3_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<addis-data xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xsi:noNamespaceSchemaLocation=\"http://drugis.org/files/addis-3.xsd\">\n" +
"</addis-data>\n";
private static final String V2_XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<addis-data xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://drugis.org/files/addis-2.xsd\">\n" +
"</addis-data>\n";
private static final String LEGACY_XML = "<?xml version=\"1.0\" ?>\n" +
"<addis-data>\n" +
"</addis-data>\n";
private static final String OTHER_XML = "<?xml version=\"1.0\" ?>\n" +
"<oranges>\n" +
"</oranges>\n";
@Test
public void testUnmarshallMarshallXmlCompare() throws JAXBException, SAXException, TransformerException, IOException {
// read xml file
AddisData data = JAXBHandler.unmarshallAddisData(JAXBConvertor.transformToLatest(JAXBHandlerTest.class.getResourceAsStream("schema_test.xml"), 1));
// write out
String testFile = "jaxb_marshall_test.xml";
JAXBHandler.marshallAddisData(data, new FileOutputStream(testFile));
// read back generated xml
AddisData data_clone = JAXBHandler.unmarshallAddisData(new FileInputStream(testFile));
// compare
assertEquals(data, data_clone);
File temp = new File(testFile);
temp.delete();
}
@Test
public void doNotSerializeInvalidCharsTest() throws JAXBException, ConversionException, IOException {
DomainImpl domainImpl = new DomainImpl();
GUIFactory.suppressErrors(true);
List<Character> invalidXMLChars = Main.XMLStreamFilter.getCharacters();
Drug drug = new Drug(StringUtils.join(invalidXMLChars, " "), "#");
domainImpl.getDrugs().add(drug);
ByteArrayOutputStream out = new ByteArrayOutputStream();
FilterOutputStream os = new Main.XMLStreamFilter(out);
JAXBHandler.marshallAddisData(JAXBConvertor.convertDomainToAddisData(domainImpl), os);
os.close();
JAXBHandler.unmarshallAddisData(new ByteArrayInputStream(out.toByteArray()));
GUIFactory.suppressErrors(false);
}
@Test
public void determineXmlVersionTest() throws IOException {
ByteArrayInputStream emptyInput = new ByteArrayInputStream("".getBytes());
XmlFormatType emptyVersion = JAXBHandler.determineXmlType(emptyInput);
assertFalse(emptyVersion.isValid());
assertFalse(emptyVersion.isLegacy());
ByteArrayInputStream v3input = new ByteArrayInputStream(V3_XML.getBytes());
XmlFormatType v3version = JAXBHandler.determineXmlType(v3input);
assertTrue(v3version.isValid());
assertFalse(v3version.isLegacy());
assertEquals(3, v3version.getVersion());
ByteArrayInputStream v2input = new ByteArrayInputStream(V2_XML.getBytes());
XmlFormatType v2version = JAXBHandler.determineXmlType(v2input);
assertTrue(v2version.isValid());
assertFalse(v2version.isLegacy());
assertEquals(2, v2version.getVersion());
ByteArrayInputStream v0input = new ByteArrayInputStream(LEGACY_XML.getBytes());
XmlFormatType v0version = JAXBHandler.determineXmlType(v0input);
assertTrue(v0version.isValid());
assertTrue(v0version.isLegacy());
ByteArrayInputStream otherInput = new ByteArrayInputStream(OTHER_XML.getBytes());
XmlFormatType otherVersion = JAXBHandler.determineXmlType(otherInput);
assertFalse(otherVersion.isValid());
}
}