1 7 8 package org.dom4j.datatype; 9 10 import junit.textui.TestRunner; 11 12 import java.io.StringReader ; 13 import java.text.DateFormat ; 14 import java.text.SimpleDateFormat ; 15 import java.util.Calendar ; 16 import java.util.GregorianCalendar ; 17 import java.util.SimpleTimeZone ; 18 import java.util.TimeZone ; 19 20 import org.dom4j.Attribute; 21 import org.dom4j.Document; 22 import org.dom4j.Element; 23 import org.dom4j.io.SAXReader; 24 25 31 public class Datatype2Test extends AbstractDataTypeTestCase { 32 public static final int YEAR = 2001; 33 34 public static final int MONTH = 10; 35 36 public static final int DATE = 31; 37 38 public static void main(String [] args) { 39 TestRunner.run(Datatype2Test.class); 40 } 41 42 public void testSchema() throws Exception { 43 Document schema = getSchema(); 44 validateDocumentWithSchema(schema); 45 } 46 47 public void testSchemaWithNamedComplexType() throws Exception { 48 Document schema = getSchemaWithNamedComplexType(); 49 validateDocumentWithSchema(schema); 50 } 51 52 public void testSchemaWithReference() throws Exception { 53 Document schema = getSchemaWithReference(); 54 validateDocumentWithSchema(schema); 55 } 56 57 public void testSchemaWithNamedSimpleType() throws Exception { 58 Document schema = getSchemaWithNamedSimpleType(); 59 validateDocumentWithSchema(schema); 60 } 61 62 private void validateDocumentWithSchema(Document schema) throws Exception { 63 Document doc = getSource(schema); 64 Element root = doc.getRootElement(); 65 validateLongAttribute(root); 66 validateFloatElement(root); 67 validateDateElement(root); 68 } 69 70 private void validateLongAttribute(Element root) throws Exception { 71 Attribute attr = root.attribute("longAttribute"); 72 Object attrData = attr.getData(); 73 validateData("testLongAttribute", attrData, new Long (123)); 74 System.out.println("retrieved attribute " + attrData); 75 } 76 77 private void validateFloatElement(Element root) throws Exception { 78 Element elem = root.element("floatElement"); 79 Object elemData = elem.getData(); 80 validateData("testFloatElement", elemData, new Float (1.23)); 81 System.out.println("retrieved element:" + elemData); 82 } 83 84 private void validateDateElement(Element root) throws Exception { 85 Element elem = root.element("dateElement"); 86 Object elemData = elem.getData(); 87 Calendar expected = getDate(); 88 89 System.out.println("retrieved element:" + elemData); 90 91 assertTrue(elemData instanceof Calendar ); 93 94 Calendar elemCal = (Calendar ) elemData; 95 96 DateFormat format = new SimpleDateFormat ("MM/dd/yyyyZ"); 97 format.setTimeZone(elemCal.getTimeZone()); 98 99 String elemStr = format.format(elemCal.getTime()); 100 101 format.setTimeZone(expected.getTimeZone()); 102 103 String expectedStr = format.format(expected.getTime()); 104 105 assertEquals("testDateElement", expectedStr, elemStr); 106 } 107 108 private void validateData(String test, Object retrieved, Object expected) 109 throws Exception { 110 Class retrievedClass = retrieved.getClass(); 111 Class expectedClass = expected.getClass(); 112 113 if (!expectedClass.equals(retrievedClass)) { 115 String msg = "class mismatch in " + test + ":expected " 116 + expectedClass + ", retrieved " + retrievedClass; 117 throw new Exception (msg); 118 } 119 120 if (!expected.equals(retrieved)) { 122 String msg = "value mismatch in " + test + ":expected " + expected 123 + ", retrieved " + retrieved; 124 throw new Exception (msg); 125 } 126 } 127 128 private Document getSource(Document schema) throws Exception { 129 StringBuffer b = new StringBuffer (); 130 b.append("<?xml version='1.0' ?>"); 131 b.append("<test xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"); 132 b.append(" xsi:noNamespaceSchemaLocation='long.xsd'"); 133 b.append(" longAttribute='123' >"); 134 b.append(" <floatElement>1.23</floatElement>"); 135 b.append(" <dateElement>" + getDateString() + "</dateElement>"); 136 b.append("</test>"); 137 138 StringReader in = new StringReader (b.toString()); 139 DatatypeDocumentFactory docFactory = new DatatypeDocumentFactory(); 140 docFactory.loadSchema(schema); 141 142 SAXReader parser = new SAXReader(docFactory); 143 144 return parser.read(in); 145 } 146 147 private Document getSchema() throws Exception { 148 StringBuffer b = new StringBuffer (); 149 b.append("<?xml version='1.0' encoding='UTF-8'?>"); 150 b.append("<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"); 151 b.append(" <xsd:element name='test'>"); 152 b.append(" <xsd:complexType>"); 153 b.append(" <xsd:sequence>"); 154 b.append(" <xsd:element name='floatElement' type='xsd:float' />"); 155 b.append(" <xsd:element name='dateElement' type='xsd:date' />"); 156 b.append(" </xsd:sequence>"); 157 b.append(" <xsd:attribute name='longAttribute' type='xsd:long' />"); 158 b.append(" </xsd:complexType>"); 159 b.append(" </xsd:element>"); 160 b.append("</xsd:schema>"); 161 162 StringReader in = new StringReader (b.toString()); 163 SAXReader parser = new SAXReader(); 164 165 return parser.read(in); 166 } 167 168 private Document getSchemaWithNamedComplexType() throws Exception { 169 StringBuffer b = new StringBuffer (); 170 b.append("<?xml version='1.0' encoding='UTF-8'?>"); 171 b.append("<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"); 172 b.append(" <xsd:element name='test' type='TimePeriodType' />"); 173 b.append(" <xsd:complexType name='TimePeriodType'>"); 174 b.append(" <xsd:sequence>"); 175 b.append(" <xsd:element name='floatElement' type='xsd:float' />"); 176 b.append(" <xsd:element name='dateElement' type='xsd:date' />"); 177 b.append(" </xsd:sequence>"); 178 b.append(" <xsd:attribute name='longAttribute' type='xsd:long' />"); 179 b.append(" </xsd:complexType>"); 180 b.append("</xsd:schema>"); 181 182 StringReader in = new StringReader (b.toString()); 183 SAXReader parser = new SAXReader(); 184 185 return parser.read(in); 186 } 187 188 private Document getSchemaWithReference() throws Exception { 189 StringBuffer b = new StringBuffer (); 190 b.append("<?xml version='1.0' encoding='UTF-8'?>"); 191 b.append("<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"); 192 b.append(" <xsd:element name='test' type='TimePeriodType' />"); 193 b.append(" <xsd:complexType name='TimePeriodType'>"); 194 b.append(" <xsd:sequence>"); 195 b.append(" <xsd:element name='floatElement' type='xsd:float' />"); 196 b.append(" <xsd:element ref='dateElement' />"); 197 b.append(" </xsd:sequence>"); 198 b.append(" <xsd:attribute name='longAttribute' type='xsd:long' />"); 199 b.append(" </xsd:complexType>"); 200 b.append(" <xsd:element name='dateElement' type='xsd:date' />"); 201 b.append("</xsd:schema>"); 202 203 StringReader in = new StringReader (b.toString()); 204 SAXReader parser = new SAXReader(); 205 206 return parser.read(in); 207 } 208 209 private Document getSchemaWithNamedSimpleType() throws Exception { 210 StringBuffer b = new StringBuffer (); 211 b.append("<?xml version='1.0' encoding='UTF-8'?>"); 212 b.append("<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"); 213 b.append(" <xsd:element name='test'>"); 214 b.append(" <xsd:complexType>"); 215 b.append(" <xsd:sequence>"); 216 b.append(" <xsd:element name='floatElement' type='xsd:float' />"); 217 b.append(" <xsd:element name='dateElement' type='dateType' />"); 218 b.append(" </xsd:sequence>"); 219 b.append(" <xsd:attribute name='longAttribute' type='xsd:long' />"); 220 b.append(" </xsd:complexType>"); 221 b.append(" </xsd:element>"); 222 b.append(" <xsd:simpleType name='dateType'>"); 223 b.append(" <xsd:restriction base='xsd:date'>"); 224 b.append(" </xsd:restriction>"); 225 b.append(" </xsd:simpleType>"); 226 b.append("</xsd:schema>"); 227 228 StringReader in = new StringReader (b.toString()); 229 SAXReader parser = new SAXReader(); 230 231 return parser.read(in); 232 } 233 234 private static String getDateString() { 235 String yyyy = Integer.toString(YEAR); 237 String mm = Integer.toString(MONTH); 238 String dd = Integer.toString(DATE); 239 240 return yyyy + "-" + mm + "-" + dd + "Z"; 241 } 242 243 private static Calendar getDate() { 244 Calendar calendar = new GregorianCalendar (); 245 calendar.clear(); 246 calendar.set(Calendar.YEAR, YEAR); 247 calendar.set(Calendar.MONTH, MONTH - 1); 248 calendar.set(Calendar.DAY_OF_MONTH, DATE); 249 calendar.setTimeZone(TimeZone.getTimeZone("UTC")); 250 calendar.setTimeZone(new SimpleTimeZone (0, "XSD 'Z' timezone")); 251 252 return calendar; 253 } 254 } 255 256 292 | Popular Tags |