/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and others contributors as indicated
* by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2005-2006, JBoss Inc.
*/
package org.jboss.tools.smooks.templating.template.xml;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
import junit.framework.TestCase;
import org.eclipse.emf.common.util.URI;
import org.jboss.tools.smooks.templating.model.ModelBuilderException;
import org.jboss.tools.smooks.templating.model.xml.XSDModelBuilder;
import org.jboss.tools.smooks.templating.template.Mapping;
import org.jboss.tools.smooks.templating.template.TemplateBuilder;
import org.jboss.tools.smooks.templating.template.TestUtil;
import org.jboss.tools.smooks.templating.template.exception.TemplateBuilderException;
import org.jboss.tools.smooks.templating.template.exception.UnmappedCollectionNodeException;
import org.milyn.util.FreeMarkerTemplate;
import org.milyn.xml.XmlUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* @author <a href="mailto:tom.fennelly@jboss.com">tom.fennelly@jboss.com</a>
*/
public class XSDXMLFreeMarkerTemplateBuilderTest extends TestCase {
public void testSimplePerson01() throws IOException, ParserConfigurationException, TemplateBuilderException,
SAXException, ModelBuilderException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new File(
"src/org/jboss/tools/smooks/templating/template/xml/simple-person.xsd"), "person");
String theTemplate = builder.buildTemplate();
System.out.println(theTemplate);
TestUtil.assertXMLEquals(theTemplate, "expected/simple-person-01.xml", getClass());
// Now, test that we can parse the template ....
XMLFreeMarkerTemplateBuilder builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), theTemplate);
assertEquals(theTemplate, builder2.buildTemplate());
}
public void testSimplePerson02() throws IOException, ParserConfigurationException, TemplateBuilderException,
SAXException, ModelBuilderException, XPathExpressionException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new File(
"src/org/jboss/tools/smooks/templating/template/xml/simple-person.xsd"), "person");
builder.addValueMapping("male", builder.getModelNode("ns0:person/name/smk:compositor/male"));
builder.addValueMapping("firstName", builder.getModelNode("ns0:person/name/@first"));
builder.addValueMapping("lastName", builder.getModelNode("ns0:person/name/@last"));
builder.addValueMapping("address", builder.getModelNode("ns0:person/address"));
builder.addValueMapping("age", builder.getModelNode("ns0:person/age"));
Map javaCtx = createPersonObj("Tom", "Fennelly", "Ireland", 21);
String template = builder.buildTemplate();
// System.out.println(template);
FreeMarkerTemplate freemarker = new FreeMarkerTemplate(template);
String templateRes = freemarker.apply(javaCtx);
TestUtil.assertXMLEquals(templateRes, "expected/simple-person-02.xml", getClass());
TestUtil.validate(builder, templateRes);
// Now, test that we can parse the template and extract the mappings
// from it....
XMLFreeMarkerTemplateBuilder builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), template);
assertEquals(5, builder2.getMappings().size());
assertEquals(template, builder2.buildTemplate());
}
public void testPeople01() throws IOException, ParserConfigurationException, TemplateBuilderException,
SAXException, ModelBuilderException, XPathExpressionException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new File(
"src/org/jboss/tools/smooks/templating/template/xml/people.xsd"), "people");
// Try adding a value mapping before adding the collection mapping.
// Should get an exception...
try {
builder.addValueMapping("personObj.firtName", builder.getModelNode("ns0:people/person/name/@first"));
fail("Expected UnmappedCollectionNodeException");
} catch (UnmappedCollectionNodeException e) {
assertEquals("Unmapped collection node 'person'.", e.getMessage());
}
}
public void testPeople02() throws IOException, ParserConfigurationException, TemplateBuilderException,
SAXException, ModelBuilderException, XPathExpressionException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new File(
"src/org/jboss/tools/smooks/templating/template/xml/people.xsd"), "people");
builder.addCollectionMapping("people", (Element) builder.getModelNode("ns0:people/person"), "personObj");
builder.addValueMapping("personObj.male", builder.getModelNode("ns0:people/person/name/smk:compositor/male"));
builder.addValueMapping("personObj.firstName", builder.getModelNode("ns0:people/person/name/@first"));
builder.addValueMapping("personObj.lastName", builder.getModelNode("ns0:people/person/name/@last"));
builder.addValueMapping("personObj.address", builder.getModelNode("ns0:people/person/address"));
builder.addValueMapping("personObj.age", builder.getModelNode("ns0:people/person/age"));
assertEquals(6, builder.getMappings().size());
Map javaCtx = new HashMap();
List people = new ArrayList();
people.add(createPersonObj("Tom", "Fennelly", "Ireland", 6));
people.add(createPersonObj("Mike", "Fennelly", "Ireland", 5));
javaCtx.put("people", people);
String template = builder.buildTemplate();
FreeMarkerTemplate freemarker = new FreeMarkerTemplate(template);
String templateRes = freemarker.apply(javaCtx);
TestUtil.assertXMLEquals(templateRes, "expected/people-01.xml", getClass());
// Now, test that we can parse the template and extract the mappings
// from it....
XMLFreeMarkerTemplateBuilder builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), template);
assertEquals(6, builder2.getMappings().size());
assertEquals(template, builder2.buildTemplate());
}
public void testElementName() throws IOException, ModelBuilderException {
File xsdFile = new File("src/org/jboss/tools/smooks/templating/template/xml/smooks1_0.xsd");
URI uri = URI.createFileURI(xsdFile.getCanonicalFile().toString());
XSDModelBuilder builder = new XSDModelBuilder(uri);
builder.setRootElementName("smooks-resource-list");
XMLFreeMarkerTemplateBuilder templateBuilder = new XMLFreeMarkerTemplateBuilder(builder);
Document document = templateBuilder.getModel();
StringWriter writer = new StringWriter();
XmlUtil.serialize(document, true, writer);
System.out.println(writer);
//checkNodeName(document.getDocumentElement());
}
public void testCreature01() throws IOException, ParserConfigurationException, TemplateBuilderException,
SAXException, ModelBuilderException, XPathExpressionException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new File(
"src/org/jboss/tools/smooks/templating/template/xml/creature.xsd"), "creature");
Mapping mapping = builder.addValueMapping("dog", builder.getModelNode("ns0:creature/smk:compositor/dog/@name"));
// The mapping onto the <dog> node should result in the <person> and
// <cat> nodes being hidden...
assertEquals(2, mapping.getHideNodes().size());
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/person"), mapping.getHideNodes().get(0));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/cat"), mapping.getHideNodes().get(1));
String theTemplate = builder.buildTemplate();
TestUtil.assertXMLEquals(theTemplate, "expected/creature-01.xml", getClass());
TestUtil.validate(builder, theTemplate);
// Now, test that we can parse the template and extract the mappings
// from it....
XMLFreeMarkerTemplateBuilder builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), theTemplate);
assertEquals(theTemplate, builder2.buildTemplate());
// ========================================================
// Remove the <dog> mapping... should reshow the <person> and <cat>
// nodes...
List<Node> showNodes = builder.removeMapping(mapping).getShowNodes();
assertEquals(2, showNodes.size());
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/person"), showNodes.get(0));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/cat"), showNodes.get(1));
mapping = builder.addValueMapping("cat", builder.getModelNode("ns0:creature/smk:compositor/cat"));
// The mapping onto the <cat> node should result in the <person> and
// <dog> nodes being hidden...
assertEquals(2, mapping.getHideNodes().size());
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/dog"), mapping.getHideNodes().get(0));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/person"), mapping.getHideNodes().get(1));
theTemplate = builder.buildTemplate();
TestUtil.assertXMLEquals(theTemplate, "expected/creature-02.xml", getClass());
TestUtil.validate(builder, theTemplate);
// Now, test that we can parse the template and extract the mappings
// from it....
builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), theTemplate);
assertEquals(theTemplate, builder2.buildTemplate());
// ========================================================
// Remove the <cat> mapping... should reshow the <person> and <dog>
// nodes...
showNodes = builder.removeMapping(mapping).getShowNodes();
assertEquals(2, showNodes.size());
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/dog"), showNodes.get(0));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/person"), showNodes.get(1));
// Map the person... there are nested choice compositors on this one...
mapping = builder.addValueMapping("male", builder
.getModelNode("ns0:creature/smk:compositor/person/name/smk:compositor/male"));
builder.addValueMapping("firstName", builder.getModelNode("ns0:creature/smk:compositor/person/name/@first"));
builder.addValueMapping("lastName", builder.getModelNode("ns0:creature/smk:compositor/person/name/@last"));
builder.addValueMapping("address", builder.getModelNode("ns0:creature/smk:compositor/person/address"));
builder.addValueMapping("age", builder.getModelNode("ns0:creature/smk:compositor/person/age"));
// The mapping onto the <person> node should result in the <female>,
// <dog> and <cat> nodes being hidden...
assertEquals(3, mapping.getHideNodes().size());
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/person/name/smk:compositor/female"), mapping
.getHideNodes().get(0));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/dog"), mapping.getHideNodes().get(1));
assertEquals(builder.getModelNode("ns0:creature/smk:compositor/cat"), mapping.getHideNodes().get(2));
theTemplate = builder.buildTemplate();
TestUtil.assertXMLEquals(theTemplate, "expected/creature-03.xml", getClass());
// Now, test that we can parse the template and extract the mappings
// from it....
builder2 = new XMLFreeMarkerTemplateBuilder(builder.getModelBuilder(), theTemplate);
assertEquals(theTemplate, builder2.buildTemplate());
}
public void testOrderStatusRequest() throws IOException, ParserConfigurationException, ModelBuilderException, SAXException, TemplateBuilderException {
TemplateBuilder builder = TestUtil.createXSDFreeMarkerTemplateBuilder(new
File("resources/xcbl40/schema/org/xcbl/path_delim/schemas/xcbl/v4_0/ordermanagement/v1_0/ordermanagement.xsd"), "OrderStatusResult");
String theTemplate = builder.buildTemplate();
System.out.println(theTemplate);
TestUtil.assertXMLEquals(theTemplate, "expected/order-status-01.xml", getClass());
}
private Map createPersonObj(String first, String last, String address, int age) {
Map javaCtx = new HashMap();
javaCtx.put("male", true);
javaCtx.put("firstName", first);
javaCtx.put("lastName", last);
javaCtx.put("address", address);
javaCtx.put("age", age);
return javaCtx;
}
private void printModel(TemplateBuilder builder) {
System.out.println(XmlUtil.serialize(builder.getModel(), true));
}
}