package com.bagri.core.server.api.df.xml;
import static com.bagri.support.util.FileUtils.readTextFile;
import static org.junit.Assert.*;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.bagri.core.model.Data;
import com.bagri.core.model.Path;
import com.bagri.core.server.api.ContentModeler;
import com.bagri.core.server.api.ModelManagement;
import com.bagri.core.server.api.impl.ModelManagementImpl;
public class XmlModelerTest {
private static String xml =
"<person>\n" +
" <firstName>John</firstName>\n" +
" <lastName>Smith</lastName>\n" +
" <age>25</age>\n" +
" <address>\n" +
" <streetAddress>21 2nd Street</streetAddress>\n" +
" <city>New York</city>\n" +
" <state>NY</state>\n" +
" <postalCode>10021</postalCode>\n" +
" </address>\n" +
" <phoneNumbers>\n" +
" <phoneNumber>\n" +
" <type>home</type>\n" +
" <number>212 555-1234</number>\n" +
" <comment/>\n" +
" </phoneNumber>\n" +
" </phoneNumbers>\n" +
" <gender>\n" +
" <type>male</type>\n" +
" </gender>\n" +
"</person>\n";
private static String schemaRussianDoll =
"<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n" +
" <xs:element name=\"person\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element name=\"firstName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"lastName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"age\" type=\"xs:int\"/>\n" +
" <xs:element name=\"address\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element name=\"streetAddress\" type=\"xs:string\"/>\n" +
" <xs:element name=\"city\" type=\"xs:string\"/>\n" +
" <xs:element name=\"state\" type=\"xs:string\"/>\n" +
" <xs:element name=\"postalCode\" type=\"xs:int\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"phoneNumbers\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element name=\"phoneNumber\" maxOccurs=\"unbounded\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element name=\"type\" type=\"xs:string\"/>\n" +
" <xs:element name=\"number\" type=\"xs:string\"/>\n" +
" <xs:element name=\"comment\" type=\"xs:string\" minOccurs=\"0\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"gender\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element name=\"type\" type=\"xs:string\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
"</xs:schema>";
private static String schemaSalamiSlice =
"<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n" +
" <xs:element name=\"streetAddress\" type=\"xs:string\"/>\n" +
" <xs:element name=\"city\" type=\"xs:string\"/>\n" +
" <xs:element name=\"state\" type=\"xs:string\"/>\n" +
" <xs:element name=\"postalCode\" type=\"xs:short\"/>\n" +
" <xs:element name=\"type\" type=\"xs:string\"/>\n" +
" <xs:element name=\"number\" type=\"xs:string\"/>\n" +
" <xs:element name=\"comment\" type=\"xs:string\"/>\n" +
" <xs:element name=\"phoneNumber\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element ref=\"type\"/>\n" +
" <xs:element ref=\"number\"/>\n" +
" <xs:element ref=\"comment\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"firstName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"lastName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"age\" type=\"xs:byte\"/>\n" +
" <xs:element name=\"address\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element ref=\"streetAddress\"/>\n" +
" <xs:element ref=\"city\"/>\n" +
" <xs:element ref=\"state\"/>\n" +
" <xs:element ref=\"postalCode\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"phoneNumbers\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element ref=\"phoneNumber\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"gender\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element ref=\"type\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
" <xs:element name=\"person\">\n" +
" <xs:complexType>\n" +
" <xs:sequence>\n" +
" <xs:element ref=\"firstName\"/>\n" +
" <xs:element ref=\"lastName\"/>\n" +
" <xs:element ref=\"age\"/>\n" +
" <xs:element ref=\"address\"/>\n" +
" <xs:element ref=\"phoneNumbers\"/>\n" +
" <xs:element ref=\"gender\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" </xs:element>\n" +
"</xs:schema>";
private static String schemaVenetianBlind =
"<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" attributeFormDefault=\"unqualified\">\n" +
" <xs:element name=\"person\" type=\"personType\"/>\n" +
" <xs:complexType name=\"addressType\">\n" +
" <xs:sequence>\n" +
" <xs:element name=\"streetAddress\" type=\"xs:string\"/>\n" +
" <xs:element name=\"city\" type=\"xs:string\"/>\n" +
" <xs:element name=\"state\" type=\"xs:string\"/>\n" +
" <xs:element name=\"postalCode\" type=\"xs:int\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" <xs:complexType name=\"phoneNumberType\">\n" +
" <xs:sequence>\n" +
" <xs:element name=\"type\" type=\"xs:string\"/>\n" +
" <xs:element name=\"number\" type=\"xs:string\"/>\n" +
" <xs:element name=\"comment\" type=\"xs:string\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" <xs:complexType name=\"phoneNumbersType\">\n" +
" <xs:sequence>\n" +
" <xs:element name=\"phoneNumber\" type=\"phoneNumberType\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" <xs:complexType name=\"genderType\">\n" +
" <xs:sequence>\n" +
" <xs:element name=\"type\" type=\"xs:string\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
" <xs:complexType name=\"personType\">\n" +
" <xs:sequence>\n" +
" <xs:element name=\"firstName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"lastName\" type=\"xs:string\"/>\n" +
" <xs:element name=\"age\" type=\"xs:byte\"/>\n" +
" <xs:element name=\"address\" type=\"addressType\"/>\n" +
" <xs:element name=\"phoneNumbers\" type=\"phoneNumbersType\"/>\n" +
" <xs:element name=\"gender\" type=\"genderType\"/>\n" +
" </xs:sequence>\n" +
" </xs:complexType>\n" +
"</xs:schema>";
private ModelManagement model;
private ContentModeler modelPro;
@Before
public void setUp() throws Exception {
model = new ModelManagementImpl();
modelPro = new XmlModeler(model);
}
//@After
//public void tearDown() throws Exception {
//}
@Test
public void registerRRPersonSchemaTest() throws Exception {
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
modelPro.registerModel(schemaRussianDoll);
Collection<Path> paths = model.getTypePaths("/person");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
@Test
public void registerRRSchemaPersonTest() throws Exception {
modelPro.registerModel(schemaRussianDoll);
Collection<Path> paths = model.getTypePaths("/person");
//System.out.println(paths);
assertNotNull(paths);
assertTrue(paths.size() > 0);
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
@Test
public void registerSSPersonSchemaTest() throws Exception {
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
modelPro.registerModel(schemaSalamiSlice);
Collection<Path> paths = model.getTypePaths("/person");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
@Test
public void registerSSSchemaPersonTest() throws Exception {
modelPro.registerModel(schemaSalamiSlice);
Collection<Path> paths = model.getTypePaths("/person");
//System.out.println(paths);
assertNotNull(paths);
assertTrue(paths.size() > 0);
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
@Test
public void registerVBPersonSchemaTest() throws Exception {
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
modelPro.registerModel(schemaVenetianBlind);
Collection<Path> paths = model.getTypePaths("/person");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
@Test
public void registerVBSchemaPersonTest() throws Exception {
modelPro.registerModel(schemaVenetianBlind);
Collection<Path> paths = model.getTypePaths("/person");
//System.out.println(paths);
assertNotNull(paths);
assertTrue(paths.size() > 0);
XmlStaxParser parser = new XmlStaxParser(model);
List<Data> data = parser.parse(xml);
assertEquals(data.size(), paths.size());
compareModels(paths, data);
}
private void compareModels(Collection<Path> paths, List<Data> data) {
for (Data dt: data) {
Path path = findPath(paths, dt.getPathId());
if (path == null) {
fail("no path found for pathId " + dt.getPathId());
}
if (path.getParentId() != dt.getParentPathId()) {
fail("parents are different for pathId " + dt.getPathId());
}
if (path.getPostId() != dt.getPostId()) {
fail("posts are different for pathId " + dt.getPathId());
}
}
}
private Path findPath(Collection<Path> paths, int pathId) {
for (Iterator<Path> itr = paths.iterator(); itr.hasNext();) {
Path path = itr.next();
if (path.getPathId() == pathId) {
return path;
}
}
return null;
}
@Test
public void registerSecurityPathTest() throws Exception {
String schema = readTextFile("..\\etc\\samples\\tpox\\security.xsd");
modelPro.registerModel(schema);
Collection<Path> paths = model.getTypePaths("/{http://tpox-benchmark.com/security}Security");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(165, paths.size());
}
@Test
public void registerSecurityModelTest() throws Exception {
modelPro.registerModelUri("..\\etc\\samples\\tpox\\security.xsd");
Collection<Path> paths = model.getTypePaths("/{http://tpox-benchmark.com/security}Security");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(165, paths.size());
}
@Test
public void registerCustomerPathTest() throws Exception {
String schema = readTextFile("..\\etc\\samples\\tpox\\custacc.xsd");
modelPro.registerModel(schema);
Collection<Path> paths = model.getTypePaths("/{http://tpox-benchmark.com/custacc}Customer");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(162, paths.size());
}
@Test
public void registerCustomerModelTest() throws Exception {
modelPro.registerModelUri("..\\etc\\samples\\tpox\\custacc.xsd");
Collection<Path> paths = model.getTypePaths("/{http://tpox-benchmark.com/custacc}Customer");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(162, paths.size());
}
@Test
public void registerSchemas() throws Exception {
((XmlModeler) modelPro).registerModels("..\\etc\\samples\\tpox\\");
Collection<Path> paths = model.getTypePaths("/{http://tpox-benchmark.com/custacc}Customer");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(162, paths.size());
paths = model.getTypePaths("/{http://tpox-benchmark.com/security}Security");
assertNotNull(paths);
assertTrue(paths.size() > 0);
assertEquals(165, paths.size());
}
}