#region Disclaimer / License
// Copyright (C) 2010, Jackie Ng
// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie@gmail.com
//
// This library 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 library 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.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
#endregion Disclaimer / License
using GeoAPI.Geometries;
using OSGeo.MapGuide.MaestroAPI.Schema;
using System;
using System.Globalization;
namespace OSGeo.MapGuide.MaestroAPI.Feature
{
///
/// Base class of all MapGuide property values. Functions as a nullable box type
/// around an underlying data type
///
public abstract class PropertyValue
{
///
/// Initializes a new instance of the class.
///
protected PropertyValue()
{
this.IsNull = true;
}
///
/// Gets or sets a value indicating whether this instance is null.
///
///
/// true if this instance is null; otherwise, false.
///
public virtual bool IsNull { get; protected set; }
///
/// Sets the value to null.
///
public virtual void SetNull() => this.IsNull = true;
///
/// Gets the type.
///
public abstract PropertyValueType Type { get; }
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public abstract PropertyDefinitionType PropertyDefType { get; }
///
/// Gets the value as a string
///
///
public abstract string ValueAsString();
}
///
/// Base class of all nullable value type property values.
///
///
public abstract class ValueTypePropertyValue : PropertyValue where T : struct
{
///
/// Initializes a new instance of the class.
///
protected ValueTypePropertyValue()
: base()
{
}
///
/// Initializes a new instance of the class.
///
/// The value.
protected ValueTypePropertyValue(T value)
: base()
{
_value = value;
}
private Nullable _value;
///
/// Gets or sets a value indicating whether this instance is null.
///
///
/// true if this instance is null; otherwise, false.
///
public override bool IsNull => !_value.HasValue;
///
/// Gets or sets the value.
///
///
/// The value.
///
public T Value
{
get
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue); //LOCALIZEME
return _value.Value;
}
set
{
_value = value;
}
}
///
/// Sets the value to null.
///
public override void SetNull() => _value = null;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Data;
}
///
/// Base class of all reference type property values
///
///
public abstract class ReferenceTypePropertyValue : PropertyValue where T : class
{
///
/// Initializes a new instance of the class.
///
protected ReferenceTypePropertyValue()
: base()
{
}
///
/// Initializes a new instance of the class.
///
/// The value.
protected ReferenceTypePropertyValue(T value)
: base()
{
this.Value = value;
}
private T _value;
///
/// Gets or sets the value.
///
///
/// The value.
///
public T Value
{
get
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return _value;
}
set
{
_value = value;
this.IsNull = (value == null);
}
}
}
///
/// Stores byte data
///
public class ByteValue : ValueTypePropertyValue
{
///
/// Initializes this instance
///
public ByteValue()
: base()
{
}
///
/// Initializes this instance
///
public ByteValue(byte value)
: base()
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Byte;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores boolean data
///
public class BooleanValue : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public BooleanValue()
: base()
{
}
///
/// Initializes a new instance
///
public BooleanValue(bool value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Boolean;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString();
}
}
///
/// Stores blob data
///
public class BlobValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public BlobValue()
: base()
{
}
///
/// Initializes a new instance
///
public BlobValue(byte[] value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Blob;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Data;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
throw new NotSupportedException();
}
}
///
/// Stores clob data
///
public class ClobValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public ClobValue()
: base()
{
}
///
/// Initializes a new instance
///
public ClobValue(char[] value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Clob;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Data;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
throw new NotSupportedException();
}
}
///
/// Stores datetime data
///
public class DateTimeValue : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public DateTimeValue()
: base()
{
}
///
/// Initializes a new instance
///
public DateTimeValue(DateTime value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.DateTime;
private static string PadLeft(string str, char ch, int totalChars)
{
var value = str;
while (value.Length < totalChars)
value = ch + value;
return value;
}
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
var dt = this.Value;
return string.Format("TIMESTAMP '{0}-{1}-{2} {3}:{4}:{5}'", //NOXLATE
PadLeft(dt.Year.ToString(), '0', 4), //NOXLATE
PadLeft(dt.Month.ToString(), '0', 2), //NOXLATE
PadLeft(dt.Year.ToString(), '0', 2), //NOXLATE
PadLeft(dt.Hour.ToString(), '0', 2), //NOXLATE
PadLeft(dt.Minute.ToString(), '0', 2), //NOXLATE
PadLeft(dt.Second.ToString(), '0', 2)); //NOXLATE
}
}
///
/// Stores double data
///
public class DoubleValue : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public DoubleValue()
: base()
{
}
///
/// Initializes a new instance
///
public DoubleValue(double value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Double;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores feature data
///
public class FeatureValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public FeatureValue()
: base()
{
}
///
/// Initializes a new instance
///
public FeatureValue(IFeature[] values)
: base(values)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Feature;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Object;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
throw new NotSupportedException();
}
}
///
/// Stores geometry data
///
public class GeometryValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public GeometryValue()
: base()
{
}
///
/// Initializes a new instance
///
public GeometryValue(IGeometry value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Geometry;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Geometry;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.AsText();
}
}
///
/// Stores int16 data
///
public class Int16Value : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public Int16Value()
: base()
{
}
///
/// Initializes a new instance
///
public Int16Value(short value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Int16;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores int32 data
///
public class Int32Value : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public Int32Value()
: base()
{
}
///
/// Initializes a new instance
///
public Int32Value(int value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Int32;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores int64 data
///
public class Int64Value : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public Int64Value()
: base()
{
}
///
/// Initializes a new instance
///
public Int64Value(long value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Int64;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores raster data
///
public class RasterValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public RasterValue()
: base()
{
}
///
/// Initializes a new instance
///
public RasterValue(byte[] value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Raster;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Raster;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
throw new NotSupportedException();
}
}
///
/// Stores float data
///
public class SingleValue : ValueTypePropertyValue
{
///
/// Initializes a new instance
///
public SingleValue()
: base()
{
}
///
/// Initializes a new instance
///
public SingleValue(float value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.Single;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value.ToString(CultureInfo.InvariantCulture);
}
}
///
/// Stores string data
///
public class StringValue : ReferenceTypePropertyValue
{
///
/// Initializes a new instance
///
public StringValue()
: base()
{
}
///
/// Initializes a new instance
///
public StringValue(string value)
: base(value)
{
}
///
/// Gets the type.
///
public override PropertyValueType Type => PropertyValueType.String;
///
/// Gets the suggsted property definition type for this value
///
///
/// The suggsted property definition type.
///
public override PropertyDefinitionType PropertyDefType => PropertyDefinitionType.Data;
///
/// Gets the value as a string
///
///
public override string ValueAsString()
{
if (IsNull)
throw new Exception(Strings.ErrorNullValue);
return this.Value;
}
}
}