1   
2   
3   
4   
5   
6   
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  /***
26   * Test harness for XML Schema Datatypes support
27   * 
28   * @author Yuxin Ruan
29   * @version $Revision: 1.3 $
30   */
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          
92          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         
114         if (!expectedClass.equals(retrievedClass)) {
115             String msg = "class mismatch in " + test + ":expected "
116                     + expectedClass + ", retrieved " + retrievedClass;
117             throw new Exception(msg);
118         }
119 
120         
121         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         
236         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 
257 
258 
259 
260 
261 
262 
263 
264 
265 
266 
267 
268 
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 
279 
280 
281 
282 
283 
284 
285 
286 
287 
288 
289 
290 
291