| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- //
- // XPathAtomicValue.cs
- //
- // Author:
- // Atsushi Enomoto <[email protected]>
- //
- // (C)2004 Novell Inc.
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- #if NET_2_0
- using System.Collections;
- using System.Xml;
- using System.Xml.Schema;
- namespace System.Xml.XPath
- {
- public sealed class XPathAtomicValue : XPathItem, ICloneable
- {
- bool booleanValue;
- DateTime dateTimeValue;
- decimal decimalValue;
- double doubleValue;
- int intValue;
- long longValue;
- object objectValue;
- float floatValue;
- string stringValue;
- XmlSchemaType schemaType;
- XmlTypeCode xmlTypeCode;
- ArrayList valueAsList;
- #region Constructors
- [MonoTODO]
- public XPathAtomicValue (bool value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Boolean;
- this.booleanValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (DateTime value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.DateTime;
- this.dateTimeValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (decimal value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Decimal;
- this.decimalValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (double value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Double;
- this.doubleValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (int value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Int;
- this.intValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (long value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Long;
- this.longValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (object value, XmlSchemaType xmlType)
- {
- // (known) acceptable types:
- // * ArrayList
- // * XPathAtomicValue (including Clone() support)
- if (value == null)
- throw new ArgumentNullException ("value");
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.None;
- objectValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (float value, XmlSchemaType xmlType)
- {
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.Float;
- this.floatValue = value;
- schemaType = xmlType;
- }
- [MonoTODO]
- public XPathAtomicValue (string value, XmlSchemaType xmlType)
- {
- if (value == null)
- throw new ArgumentNullException ("value");
- if (xmlType == null)
- throw new ArgumentNullException ("xmlType");
- xmlTypeCode = XmlTypeCode.String;
- this.stringValue = value;
- schemaType = xmlType;
- }
- #endregion
- #region Methods
- object ICloneable.Clone ()
- {
- return this.Clone ();
- }
- [MonoTODO]
- public XPathAtomicValue Clone ()
- {
- return new XPathAtomicValue (this, schemaType);
- }
- [MonoTODO]
- public override object ValueAs (Type type, IXmlNamespaceResolver nsResolver)
- {
- throw new NotImplementedException ();
- }
- #endregion
- #region Properties
- // As long as I tried, neither of such XPathAtomicValue created
- // with XmlText that contains atomic value, XmlElement that
- // contains such XmlText, XmlDocument nor XPathNavigator
- // created from such nodes returned false. So it won't be
- // true on this class. Apparently this class needs more
- // documentation.
- public override bool IsNode {
- get { return false; }
- }
- [MonoTODO]
- public override object TypedValue {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return ValueAsBoolean;
- case XmlTypeCode.DateTime:
- return ValueAsDateTime;
- case XmlTypeCode.Decimal:
- return ValueAsDecimal;
- case XmlTypeCode.Double:
- return ValueAsDouble;
- case XmlTypeCode.Long:
- return ValueAsInt64;
- case XmlTypeCode.Int:
- return ValueAsInt32;
- case XmlTypeCode.Float:
- return ValueAsSingle;
- case XmlTypeCode.String:
- return Value;
- }
- return objectValue;
- }
- }
- [MonoTODO]
- // This method works like ValueAsString, thus datetime values
- // fails to be converted.
- public override string Value {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToString (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToString (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToString (decimalValue);
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToString (doubleValue);
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToString (longValue);
- case XmlTypeCode.Int:
- return XQueryConvert.IntToString (intValue);
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToString (floatValue);
- case XmlTypeCode.String:
- return stringValue;
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.String));
- }
- }
- [MonoTODO]
- public override bool ValueAsBoolean {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return booleanValue;
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToBoolean (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToBoolean (decimalValue);
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToBoolean (doubleValue);
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToBoolean (longValue);
- case XmlTypeCode.Int:
- return XQueryConvert.IntToBoolean (intValue);
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToBoolean (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToBoolean (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Boolean));
- }
- }
- [MonoTODO]
- public override DateTime ValueAsDateTime {
- get {
- switch (xmlTypeCode) {
- // case XmlTypeCode.Boolean:
- // return XQueryConvert.BooleanToDateTime (booleanValue);
- case XmlTypeCode.DateTime:
- return dateTimeValue;
- // case XmlTypeCode.Decimal:
- // return XQueryConvert.DecimalToDateTime (decimalValue);
- // case XmlTypeCode.Double:
- // return XQueryConvert.DoubleToDateTime (doubleValue);
- // case XmlTypeCode.Long:
- // return XQueryConvert.IntegerToDateTime (longValue);
- // case XmlTypeCode.Int:
- // return XQueryConvert.IntToDateTime (intValue);
- // case XmlTypeCode.Float:
- // return XQueryConvert.FloatToDateTime (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToDateTime (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.DateTime));
- }
- }
- [MonoTODO]
- public override decimal ValueAsDecimal {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToDecimal (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToDecimal (decimalValue);
- case XmlTypeCode.Decimal:
- return decimalValue;
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToDecimal (doubleValue);
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToDecimal (longValue);
- case XmlTypeCode.Int:
- return XQueryConvert.IntToDecimal (intValue);
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToDecimal (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToDecimal (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Decimal));
- }
- }
- [MonoTODO]
- public override double ValueAsDouble {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToDouble (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToDouble (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToDouble (decimalValue);
- case XmlTypeCode.Double:
- return doubleValue;
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToDouble (longValue);
- case XmlTypeCode.Int:
- return XQueryConvert.IntToDouble (intValue);
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToDouble (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToDouble (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Double));
- }
- }
- [MonoTODO]
- public override int ValueAsInt32 {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToInt (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToInt (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToInt (decimalValue);
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToInt (doubleValue);
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToInt (longValue);
- case XmlTypeCode.Int:
- return intValue;
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToInt (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToInt (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Int));
- }
- }
- [MonoTODO]
- public override long ValueAsInt64 {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToInteger (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToInteger (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToInteger (decimalValue);
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToInteger (doubleValue);
- case XmlTypeCode.Long:
- return longValue;
- case XmlTypeCode.Int:
- return XQueryConvert.IntegerToInt (intValue);
- case XmlTypeCode.Float:
- return XQueryConvert.FloatToInteger (floatValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToInteger (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Long));
- }
- }
- [MonoTODO]
- public override float ValueAsSingle {
- get {
- switch (xmlTypeCode) {
- case XmlTypeCode.Boolean:
- return XQueryConvert.BooleanToFloat (booleanValue);
- // case XmlTypeCode.DateTime:
- // return XQueryConvert.DateTimeToFloat (dateTimeValue);
- case XmlTypeCode.Decimal:
- return XQueryConvert.DecimalToFloat (decimalValue);
- case XmlTypeCode.Double:
- return XQueryConvert.DoubleToFloat (doubleValue);
- case XmlTypeCode.Float:
- return floatValue;
- case XmlTypeCode.Int:
- return XQueryConvert.FloatToInt (intValue);
- case XmlTypeCode.Long:
- return XQueryConvert.IntegerToFloat (longValue);
- case XmlTypeCode.String:
- return XQueryConvert.StringToFloat (stringValue);
- }
- throw new InvalidOperationException (String.Format ("Conversion from {0} to {1} is not supported", schemaType, XmlTypeCode.Float));
- }
- }
- [MonoTODO]
- public override ICollection ValueAsList {
- get {
- if (valueAsList != null)
- return valueAsList;
- if (objectValue is ArrayList)
- valueAsList = objectValue as ArrayList;
- else if (objectValue is Array)
- valueAsList = new ArrayList ((Array) objectValue);
- else if (xmlTypeCode != XmlTypeCode.None) {
- valueAsList = new ArrayList ();
- valueAsList.Add (TypedValue);
- }
- else
- throw new NotImplementedException ();
- return valueAsList;
- }
- }
- [MonoTODO]
- public override Type ValueType {
- get { return schemaType.Datatype.ValueType; }
- }
- [MonoTODO]
- public override XmlSchemaType XmlType {
- get { return schemaType; }
- }
- #endregion
- }
- }
- #endif
|