/**
* Copyright (C) 2010 Orbeon, Inc.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version
* 2.1 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 Lesser General Public License for more details.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.orbeon.dom.Document;
import org.orbeon.dom.Element;
import org.orbeon.exception.OrbeonFormatter;
import org.orbeon.oxf.resources.ResourceManager;
import org.orbeon.oxf.resources.ResourceManagerWrapper;
import org.orbeon.oxf.util.NumberUtils;
import org.orbeon.oxf.xml.ForwardingXMLReceiver;
import org.orbeon.oxf.xml.TransformerUtils;
import org.orbeon.oxf.xml.XPathUtils;
import org.orbeon.oxf.xml.dom4j.LocationData;
import org.orbeon.oxf.xml.dom4j.LocationDocumentResult;
import org.orbeon.oxf.xml.dom4j.LocationDocumentSource;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import javax.xml.transform.*;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class UtilsTest extends TestCase {
public UtilsTest(String s) {
super(s);
}
public static TestSuite suite() {
TestSuite suite = new TestSuite();
suite.addTest(new UtilsTest("testNumberUtils"));
suite.addTest(new UtilsTest("testLocationDocumentSourceResult"));
suite.addTest(new UtilsTest("testTransformerWrapper"));
return suite;
}
public void testNumberUtils() {
byte[] bytes1 = {(byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x9a, (byte) 0xbc, (byte) 0xde, (byte) 0xf0};
String results1 = "123456789abcdef0";
assertEquals(NumberUtils.toHexString(bytes1), results1);
byte[] bytes2 = {(byte) 0x01, (byte) 0x23, (byte) 0x45, (byte) 0x67, (byte) 0x89, (byte) 0xab, (byte) 0xcd, (byte) 0xef};
String results2 = "0123456789abcdef";
assertEquals(NumberUtils.toHexString(bytes2), results2);
byte[] bytes3 = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
String results3 = "0000000000000000";
assertEquals(NumberUtils.toHexString(bytes3), results3);
}
private ResourceManager setupResourceManager() {
// Setup resource manager
final Map<String, Object> props = new HashMap<String, Object>();
final Properties properties = System.getProperties();
for (Enumeration e = properties.propertyNames(); e.hasMoreElements();) {
String name = (String) e.nextElement();
if (name.startsWith("oxf.resources."))
props.put(name, properties.getProperty(name));
}
ResourceManagerWrapper.init(props);
return ResourceManagerWrapper.instance();
}
public void testLocationDocumentSourceResult() {
try {
Transformer transformer = TransformerUtils.getIdentityTransformer();
ResourceManager resourceManager = setupResourceManager();
InputStream is = resourceManager.getContentAsStream("/ops/unit-tests/company.xml");
String path = resourceManager.getRealPath("/ops/unit-tests/company.xml");
Source source = new StreamSource(is, path);
LocationDocumentResult result = new LocationDocumentResult();
transformer.transform(source, result);
Document doc = result.getDocument();
Element firstName = (Element) XPathUtils.selectSingleNode(doc, "//firstname");
assertEquals("Ada", firstName.getTextTrim());
assertEquals(4, ((LocationData) firstName.getData()).line());
source = new LocationDocumentSource(doc);
SAXResult saxResult = new SAXResult(new ForwardingXMLReceiver() {
Locator locator;
StringBuffer buff = new StringBuffer();
boolean foundFirstName = false;
public void setDocumentLocator(Locator locator) {
this.locator = locator;
}
public void startElement(String uri, String localname, String qName, Attributes attributes) throws SAXException {
if ("firstname".equals(localname)) {
assertEquals(4, locator.getLineNumber());
foundFirstName = true;
}
}
public void characters(char[] chars, int start, int length) throws SAXException {
if (foundFirstName)
buff.append(chars, start, length);
}
public void endElement(String uri, String localname, String qName) throws SAXException {
if ("firstname".equals(localname)) {
assertEquals("Ada", buff.toString());
}
}
});
transformer.transform(source, saxResult);
} catch (Exception e) {
System.err.println(OrbeonFormatter.format(e));
fail(e.toString());
}
}
public void testTransformerWrapper() {
final String publicProperty = "[public]";
final String privateProperty = "[private]";
final Properties[] privateOutputProperties = new Properties[] { new Properties() };
Transformer transformer = TransformerUtils.testCreateTransformerWrapper(new Transformer() {
public void clearParameters() {
}
public ErrorListener getErrorListener() {
return null;
}
public Properties getOutputProperties() {
return privateOutputProperties[0];
}
public String getOutputProperty(String name) throws IllegalArgumentException {
return (String) privateOutputProperties[0].get(name);
}
public Object getParameter(String name) {
return null;
}
public URIResolver getURIResolver() {
return null;
}
public void setErrorListener(ErrorListener listener) throws IllegalArgumentException {
}
public void setOutputProperties(Properties oformat) throws IllegalArgumentException {
privateOutputProperties[0] = oformat;
}
public void setOutputProperty(String name, String value) throws IllegalArgumentException {
privateOutputProperties[0].put(name, value);
}
public void setParameter(String name, Object value) {
}
public void setURIResolver(URIResolver resolver) {
}
public void transform(Source xmlSource, Result outputTarget) {
}
}, publicProperty, privateProperty);
// Set individual property
transformer.setOutputProperty(publicProperty, "3");
assertEquals(transformer.getOutputProperty(publicProperty), "3");
assertEquals(transformer.getOutputProperties().get(publicProperty), "3");
assertEquals(transformer.getOutputProperty(publicProperty), privateOutputProperties[0].get(privateProperty));
// Set all properties
Properties p2 = new Properties();
p2.put(publicProperty, "2");
transformer.setOutputProperties(p2);
assertEquals(transformer.getOutputProperty(publicProperty), "2");
assertEquals(transformer.getOutputProperties().get(publicProperty), "2");
assertEquals(transformer.getOutputProperty(publicProperty), privateOutputProperties[0].get(privateProperty));
}
}