View Javadoc

1   /*
2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3    *
4    * This software is open source.
5    * See the bottom of this file for the licence.
6    */
7   
8   package org.dom4j.datatype;
9   
10  import com.sun.msv.datatype.DatabindableDatatype;
11  import com.sun.msv.datatype.SerializationContext;
12  import com.sun.msv.datatype.xsd.XSDatatype;
13  
14  import org.dom4j.Element;
15  import org.dom4j.Namespace;
16  import org.dom4j.Node;
17  import org.dom4j.QName;
18  import org.dom4j.tree.DefaultElement;
19  
20  import org.relaxng.datatype.DatatypeException;
21  import org.relaxng.datatype.ValidationContext;
22  
23  /***
24   * <p>
25   * <code>DatatypeElement</code> represents an Element which supports the <a
26   * href="http://www.w3.org/TR/xmlschema-2/">XML Schema Data Types </a>
27   * specification.
28   * </p>
29   * 
30   * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
31   * @version $Revision: 1.9 $
32   */
33  public class DatatypeElement extends DefaultElement implements
34          SerializationContext, ValidationContext {
35      /*** The <code>XSDatatype</code> of the <code>Attribute</code> */
36      private XSDatatype datatype;
37  
38      /*** The data (Object) value of the <code>Attribute</code> */
39      private Object data;
40  
41      public DatatypeElement(QName qname, XSDatatype datatype) {
42          super(qname);
43          this.datatype = datatype;
44      }
45  
46      public DatatypeElement(QName qname, int attributeCount, XSDatatype type) {
47          super(qname, attributeCount);
48          this.datatype = type;
49      }
50  
51      public String toString() {
52          return getClass().getName() + hashCode() + " [Element: <"
53                  + getQualifiedName() + " attributes: " + attributeList()
54                  + " data: " + getData() + " />]";
55      }
56  
57      /***
58       * Returns the MSV XSDatatype for this node
59       * 
60       * @return DOCUMENT ME!
61       */
62      public XSDatatype getXSDatatype() {
63          return datatype;
64      }
65  
66      // SerializationContext interface
67      // -------------------------------------------------------------------------
68      public String getNamespacePrefix(String uri) {
69          Namespace namespace = getNamespaceForURI(uri);
70  
71          return (namespace != null) ? namespace.getPrefix() : null;
72      }
73  
74      // ValidationContext interface
75      // -------------------------------------------------------------------------
76      public String getBaseUri() {
77          // XXXX: could we use a Document for this?
78          return null;
79      }
80  
81      public boolean isNotation(String notationName) {
82          // XXXX: no way to do this yet in dom4j so assume false
83          return false;
84      }
85  
86      public boolean isUnparsedEntity(String entityName) {
87          // XXXX: no way to do this yet in dom4j so assume valid
88          return true;
89      }
90  
91      public String resolveNamespacePrefix(String prefix) {
92          Namespace namespace = getNamespaceForPrefix(prefix);
93  
94          if (namespace != null) {
95              return namespace.getURI();
96          }
97  
98          return null;
99      }
100 
101     // Element interface
102     // -------------------------------------------------------------------------
103     public Object getData() {
104         if (data == null) {
105             String text = getTextTrim();
106 
107             if ((text != null) && (text.length() > 0)) {
108                 if (datatype instanceof DatabindableDatatype) {
109                     DatabindableDatatype bind = (DatabindableDatatype) datatype;
110                     data = bind.createJavaObject(text, this);
111                 } else {
112                     data = datatype.createValue(text, this);
113                 }
114             }
115         }
116 
117         return data;
118     }
119 
120     public void setData(Object data) {
121         String s = datatype.convertToLexicalValue(data, this);
122         validate(s);
123         this.data = data;
124         setText(s);
125     }
126 
127     public Element addText(String text) {
128         validate(text);
129 
130         return super.addText(text);
131     }
132 
133     public void setText(String text) {
134         validate(text);
135         super.setText(text);
136     }
137 
138     // Implementation methods
139     // -------------------------------------------------------------------------
140 
141     /***
142      * Override to force lazy recreation of data object
143      * 
144      * @param node
145      *            DOCUMENT ME!
146      */
147     protected void childAdded(Node node) {
148         data = null;
149         super.childAdded(node);
150     }
151 
152     /***
153      * Override to force lazy recreation of data object
154      * 
155      * @param node
156      *            DOCUMENT ME!
157      */
158     protected void childRemoved(Node node) {
159         data = null;
160         super.childRemoved(node);
161     }
162 
163     protected void validate(String text) throws IllegalArgumentException {
164         try {
165             datatype.checkValid(text, this);
166         } catch (DatatypeException e) {
167             throw new IllegalArgumentException(e.getMessage());
168         }
169     }
170 }
171 
172 /*
173  * Redistribution and use of this software and associated documentation
174  * ("Software"), with or without modification, are permitted provided that the
175  * following conditions are met:
176  * 
177  * 1. Redistributions of source code must retain copyright statements and
178  * notices. Redistributions must also contain a copy of this document.
179  * 
180  * 2. Redistributions in binary form must reproduce the above copyright notice,
181  * this list of conditions and the following disclaimer in the documentation
182  * and/or other materials provided with the distribution.
183  * 
184  * 3. The name "DOM4J" must not be used to endorse or promote products derived
185  * from this Software without prior written permission of MetaStuff, Ltd. For
186  * written permission, please contact dom4j-info@metastuff.com.
187  * 
188  * 4. Products derived from this Software may not be called "DOM4J" nor may
189  * "DOM4J" appear in their names without prior written permission of MetaStuff,
190  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
191  * 
192  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
193  * 
194  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
195  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
196  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
198  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
199  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
200  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
201  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
202  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
203  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
204  * POSSIBILITY OF SUCH DAMAGE.
205  * 
206  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
207  */