Class SMSTimeStamp
- java.lang.Object
-
- com.opencloud.util.AbstractDataObject
-
- com.opencloud.util.AbstractFieldsObject
-
- AbstractEncodedDataObject<T>
-
- AbstractLazyEncodedDataObject<byte[]>
-
- AbstractLazyEncodedByteArray
-
- com.opencloud.slee.resources.in.datatypes.sms.SMSTimeStamp
-
- All Implemented Interfaces:
DataObject
,FastSerializable
,Serializable
public final class SMSTimeStamp extends AbstractLazyEncodedByteArray implements FastSerializable
Class SMSTimeStamp represents timestamps such as in TP-SCTS and TP-VP fields, which appear inside SMSTPDUs, hence it represents part of a larger octet string.The API offered by this class is as if the type were defined in ASN.1 as follows.
SMSTimeStamp ::= SEQUENCE { year INTEGER (0..99), month INTEGER (0..99), day INTEGER (0..99), hour INTEGER (0..99), minute INTEGER (0..99), second INTEGER (0..99), timezone INTEGER (-79..79) }
The class takes care of encoding the field values into a byte-array and decoding field values from a byte-array, the encoded representation being as tabulated below.Data Encoding - based on 3GPP TS 23.040 V9.0.0 (2009-06) §9.2.3.11 pp67-68 and http://discussion.forum.nokia.com/forum/showthread.php?t=4050 7 6 5 4 3 2 1 0 Octet 0 Year units Year tens Octet 1 Month units Month tens Octet 2 Day units Day tens Octet 3 Hour units Hours tens Octet 4 Minute units Minutes tens Octet 5 Seconds units Seconds tens Octet 6 Timezone units Sign Timezone tens
Note that the year is only two digits. The standards do not say how to determine a century from that. Where this class needs a century, it chooses one such that the year is in the period [1991, 2090].
The timezone digits are those of the number of quarter hours between local time and GMT, the Sign being that of this difference: 0 for positive, 1 for negative.- See Also:
- Serialized Form
-
-
Field Summary
-
Fields inherited from class com.opencloud.slee.resources.cgin.AbstractLazyEncodedDataObject
isDecoded
-
Fields inherited from class com.opencloud.slee.resources.cgin.AbstractEncodedDataObject
encoded
-
Fields inherited from class com.opencloud.util.AbstractFieldsObject
FIELD_ABSENT, FIELD_UNINITIALISED
-
-
Constructor Summary
Constructors Constructor Description SMSTimeStamp()
Constructs a new SMSTimeStamp object with no fields set.SMSTimeStamp(byte[] data)
Constructs a new SMSTimeStamp object from network-encoded data.SMSTimeStamp(byte[] data, int start, int len)
Constructs a new SMSTimeStamp object from part of network-encoded data.SMSTimeStamp(int year, int month, int day, int hour, int minute, int second, int timezone)
Constructs a new SMSTimeStamp object from given values for all fields.SMSTimeStamp(DataInput in)
Constructs a new SMSTimeStamp object from data deserialized from a stream that was written bytoStream(DataOutput)
.SMSTimeStamp(Calendar calendar)
Constructs a new SMSTimeStamp object from the given calendar.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
checkFieldsSet()
Checks that all mandatory fields are present.SMSTimeStamp
clone()
Constructs a copy of this object and everything reachable from it.static SMSTimeStamp
copyOf(SMSTimeStamp from)
Creates a new object of this type, cloning the values of common fields from the given object of any subclass of the same base type.protected void
decode()
Computes the decoded form from the encoded form.protected void
encode()
Computes the encoded form from the decoded form.protected boolean
encodedIsInvalid()
Determines whether the encoded form is invalid.static int
getContainedLength(byte[] data, int start, int len)
Determines the length of the encoded value that commences at offsetstart
in the givendata
.int
getDay()
Gets the value of the day of the month, in range [0,99] (but usually [1,31]).byte[]
getEncodedForm()
Gets the encoded form.static FieldAccessor[]
getFieldAccessors()
Gets a new array of the accessors for fields of this type.Map<String,Object>
getFieldsMap(boolean withAbsents)
Gets a Map from field-name to field-value for the fields of a sequence.int
getHour()
Gets the value of the hour, in range [0,99] (but usually [0,23]).int
getMinute()
Gets the value of the minute, in range [0,99] (but usually [0,59]).int
getMonth()
Gets the value of the month, in range [0,99] (but usually [1,12]).int
getSecond()
Gets the value of the second, in range [0,99] (but usually [0,59]).int
getTimezone()
Gets the value of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC.int
getYear()
Gets the value of the year, in range [0,99].boolean
hasDay()
Tests whether the field Day has a value.boolean
hasHour()
Tests whether the field Hour has a value.boolean
hasMinute()
Tests whether the field Minute has a value.boolean
hasMonth()
Tests whether the field Month has a value.boolean
hasSecond()
Tests whether the field Second has a value.boolean
hasTimezone()
Tests whether the field Timezone has a value.boolean
hasYear()
Tests whether the field Year has a value.SMSTimeStamp
setDay(int value)
Sets the value of the day of the month, in range [0,99] (but usually [1,31]).SMSTimeStamp
setDayPresent(boolean flag)
Sets the presence or absence of the field Day.SMSTimeStamp
setHour(int value)
Sets the value of the hour, in range [0,99] (but usually [0,23]).SMSTimeStamp
setHourPresent(boolean flag)
Sets the presence or absence of the field Hour.SMSTimeStamp
setMinute(int value)
Sets the value of the minute, in range [0,99] (but usually [0,59]).SMSTimeStamp
setMinutePresent(boolean flag)
Sets the presence or absence of the field Minute.SMSTimeStamp
setMonth(int value)
Sets the value of the month, in range [0,99] (but usually [1,12]).SMSTimeStamp
setMonthPresent(boolean flag)
Sets the presence or absence of the field Month.SMSTimeStamp
setSecond(int value)
Sets the value of the second, in range [0,99] (but usually [0,59]).SMSTimeStamp
setSecondPresent(boolean flag)
Sets the presence or absence of the field Second.SMSTimeStamp
setTimezone(int value)
Sets the value of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC.SMSTimeStamp
setTimezonePresent(boolean flag)
Sets the presence or absence of the field Timezone.SMSTimeStamp
setYear(int value)
Sets the value of the year, in range [0,99].SMSTimeStamp
setYearPresent(boolean flag)
Sets the presence or absence of the field Year.Calendar
toCalendar()
Gets a Calendar representing the time in this SMSTimeStamp, choosing a century such that the year is in the period [now-98,now+1].String
toDateFormat()
Gets a description of the Calendar returned bytoCalendar()
inDateFormat
's FULL format.void
toStream(DataOutput out)
Serializes this object to a stream in a form suitable for reading bySMSTimeStamp(DataInput)
.-
Methods inherited from class com.opencloud.slee.resources.cgin.AbstractLazyEncodedDataObject
checkDecode, checkModifyAndDecode
-
Methods inherited from class com.opencloud.util.AbstractFieldsObject
equals, hashCode, toString
-
Methods inherited from class com.opencloud.util.AbstractDataObject
checkModify, isReadOnly, setReadOnly
-
-
-
-
Constructor Detail
-
SMSTimeStamp
public SMSTimeStamp()
Constructs a new SMSTimeStamp object with no fields set.
-
SMSTimeStamp
public SMSTimeStamp(byte[] data)
Constructs a new SMSTimeStamp object from network-encoded data. The data is not decoded and might not be decodable.- Parameters:
data
- network-encoded data- Throws:
NullPointerException
- if data is null
-
SMSTimeStamp
public SMSTimeStamp(byte[] data, int start, int len)
Constructs a new SMSTimeStamp object from part of network-encoded data. The part starts at indexstart
and islen
bytes long. The data is not decoded and might not be decodable.- Parameters:
data
- network-encoded datastart
- starting offset of network-encoded data in byte arraylen
- default length if not predictable- Throws:
NullPointerException
- if data is nullIllegalArgumentException
- if len is negative
-
SMSTimeStamp
public SMSTimeStamp(int year, int month, int day, int hour, int minute, int second, int timezone)
Constructs a new SMSTimeStamp object from given values for all fields.- Parameters:
year
- the year, in range [0,99]month
- the month, in range [0,99] (but usually [1,12])day
- the day of the month, in range [0,99] (but usually [1,31])hour
- the hour, in range [0,99] (but usually [0,23])minute
- the minute, in range [0,99] (but usually [0,59])second
- the second, in range [0,99] (but usually [0,59])timezone
- the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC
-
SMSTimeStamp
public SMSTimeStamp(DataInput in) throws IOException
Constructs a new SMSTimeStamp object from data deserialized from a stream that was written bytoStream(DataOutput)
.- Parameters:
in
- the stream to read from- Throws:
EOFException
- if reading is pre-empted by end-of-fileIOException
- if the data cannot be read
-
SMSTimeStamp
public SMSTimeStamp(Calendar calendar)
Constructs a new SMSTimeStamp object from the given calendar.- Parameters:
calendar
- a time represented by a Calendar- Throws:
IllegalArgumentException
- if the Calendar is out of range (year before 1991 or after 2090)
-
-
Method Detail
-
toStream
public void toStream(DataOutput out) throws IOException
Serializes this object to a stream in a form suitable for reading bySMSTimeStamp(DataInput)
.- Specified by:
toStream
in interfaceFastSerializable
- Parameters:
out
- the stream to write to- Throws:
IOException
- if an I/O error occurs
-
hasYear
public boolean hasYear() throws DecodeException
Tests whether the field Year has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setYearPresent
public SMSTimeStamp setYearPresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Year.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasMonth
public boolean hasMonth() throws DecodeException
Tests whether the field Month has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setMonthPresent
public SMSTimeStamp setMonthPresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Month.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasDay
public boolean hasDay() throws DecodeException
Tests whether the field Day has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setDayPresent
public SMSTimeStamp setDayPresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Day.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasHour
public boolean hasHour() throws DecodeException
Tests whether the field Hour has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setHourPresent
public SMSTimeStamp setHourPresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Hour.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasMinute
public boolean hasMinute() throws DecodeException
Tests whether the field Minute has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setMinutePresent
public SMSTimeStamp setMinutePresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Minute.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasSecond
public boolean hasSecond() throws DecodeException
Tests whether the field Second has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setSecondPresent
public SMSTimeStamp setSecondPresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Second.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
hasTimezone
public boolean hasTimezone() throws DecodeException
Tests whether the field Timezone has a value.- Returns:
- whether the field has a value
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setTimezonePresent
public SMSTimeStamp setTimezonePresent(boolean flag) throws IllegalStateException
Sets the presence or absence of the field Timezone.- Parameters:
flag
- whether the field should be marked as present- Returns:
- this
- Throws:
IllegalStateException
- if this instance has been marked as read-only
-
checkFieldsSet
public void checkFieldsSet() throws EncodeException
Checks that all mandatory fields are present. Should be called immediately before all calls to encode().- Specified by:
checkFieldsSet
in classAbstractLazyEncodedDataObject<byte[]>
- Throws:
EncodeException
- if any mandatory field is not present
-
getYear
public int getYear() throws DecodeException
Gets the value of the year, in range [0,99].- Returns:
- int representation of the year, in range [0,99]
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getMonth
public int getMonth() throws DecodeException
Gets the value of the month, in range [0,99] (but usually [1,12]).- Returns:
- int representation of the month, in range [0,99] (but usually [1,12])
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getDay
public int getDay() throws DecodeException
Gets the value of the day of the month, in range [0,99] (but usually [1,31]).- Returns:
- int representation of the day of the month, in range [0,99] (but usually [1,31])
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getHour
public int getHour() throws DecodeException
Gets the value of the hour, in range [0,99] (but usually [0,23]).- Returns:
- int representation of the hour, in range [0,99] (but usually [0,23])
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getMinute
public int getMinute() throws DecodeException
Gets the value of the minute, in range [0,99] (but usually [0,59]).- Returns:
- int representation of the minute, in range [0,99] (but usually [0,59])
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getSecond
public int getSecond() throws DecodeException
Gets the value of the second, in range [0,99] (but usually [0,59]).- Returns:
- int representation of the second, in range [0,99] (but usually [0,59])
- Throws:
DecodeException
- if encoded state cannot be decoded
-
getTimezone
public int getTimezone() throws DecodeException
Gets the value of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC.- Returns:
- int representation of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC
- Throws:
DecodeException
- if encoded state cannot be decoded
-
setYear
public SMSTimeStamp setYear(int value) throws IllegalStateException
Sets the value of the year, in range [0,99].- Parameters:
value
- int representation of the year, in range [0,99]- Returns:
- this
- Throws:
IllegalStateException
-
setMonth
public SMSTimeStamp setMonth(int value) throws IllegalStateException
Sets the value of the month, in range [0,99] (but usually [1,12]).- Parameters:
value
- int representation of the month, in range [0,99] (but usually [1,12])- Returns:
- this
- Throws:
IllegalStateException
-
setDay
public SMSTimeStamp setDay(int value) throws IllegalStateException
Sets the value of the day of the month, in range [0,99] (but usually [1,31]).- Parameters:
value
- int representation of the day of the month, in range [0,99] (but usually [1,31])- Returns:
- this
- Throws:
IllegalStateException
-
setHour
public SMSTimeStamp setHour(int value) throws IllegalStateException
Sets the value of the hour, in range [0,99] (but usually [0,23]).- Parameters:
value
- int representation of the hour, in range [0,99] (but usually [0,23])- Returns:
- this
- Throws:
IllegalStateException
-
setMinute
public SMSTimeStamp setMinute(int value) throws IllegalStateException
Sets the value of the minute, in range [0,99] (but usually [0,59]).- Parameters:
value
- int representation of the minute, in range [0,99] (but usually [0,59])- Returns:
- this
- Throws:
IllegalStateException
-
setSecond
public SMSTimeStamp setSecond(int value) throws IllegalStateException
Sets the value of the second, in range [0,99] (but usually [0,59]).- Parameters:
value
- int representation of the second, in range [0,99] (but usually [0,59])- Returns:
- this
- Throws:
IllegalStateException
-
setTimezone
public SMSTimeStamp setTimezone(int value) throws IllegalStateException
Sets the value of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC.- Parameters:
value
- int representation of the timezone, in range [-79,79], as a multiple of 15 minutes difference from GMT/UTC- Returns:
- this
- Throws:
IllegalStateException
-
copyOf
public static SMSTimeStamp copyOf(SMSTimeStamp from)
Creates a new object of this type, cloning the values of common fields from the given object of any subclass of the same base type.- Parameters:
from
- the object from which to copy- Returns:
- SMSTimeStamp
-
clone
public SMSTimeStamp clone()
Constructs a copy of this object and everything reachable from it.- Specified by:
clone
in interfaceDataObject
- Specified by:
clone
in classAbstractDataObject
- Returns:
- copy of object
-
getFieldAccessors
public static FieldAccessor[] getFieldAccessors()
Gets a new array of the accessors for fields of this type.- Returns:
- FieldAccessor[]
-
getFieldsMap
public Map<String,Object> getFieldsMap(boolean withAbsents)
Gets a Map from field-name to field-value for the fields of a sequence. For a field of primitive type, the field-value is boxed. For an absent optional field, the field-value is AbstractFieldsObject.FIELD_ABSENT. For an uninitialised mandatory field, the field-value is AbstractFieldsObject.FIELD_UNINITIALISED. For a field of String type, the encoded form is used if the String cannot be decoded. For a type that represents an OCTET STRING that cannot be decoded, a map from "encodedValue" to the byte array value is returned.- Specified by:
getFieldsMap
in classAbstractFieldsObject
- Parameters:
withAbsents
- whether to put absent optional fields into Map- Returns:
- Map from field-name to field-value
-
encodedIsInvalid
protected boolean encodedIsInvalid()
Determines whether the encoded form is invalid.- Returns:
- boolean
-
getEncodedForm
public byte[] getEncodedForm() throws EncodeException
Gets the encoded form.- Returns:
- encoded form
- Throws:
EncodeException
- if encoding fails
-
getContainedLength
public static int getContainedLength(byte[] data, int start, int len)
Determines the length of the encoded value that commences at offsetstart
in the givendata
. The value is not fully decoded and might not be decodable. Values of this type are of a fixed length, so that length is returned if the data is long enough, otherwise 0 is returned.- Parameters:
data
- network-encoded datastart
- index into data where value commenceslen
- length in data to be considered- Returns:
- 7, or 0 if encoded value is not long enough
-
toDateFormat
public String toDateFormat()
Gets a description of the Calendar returned bytoCalendar()
inDateFormat
's FULL format. The exact output varies with Locale. It shows the timestamp in the timezone of the encoded SMSTimeStamp, hence FULL is needed to reveal that timezone.- Returns:
- a description of this object
-
toCalendar
public Calendar toCalendar()
Gets a Calendar representing the time in this SMSTimeStamp, choosing a century such that the year is in the period [now-98,now+1].- Returns:
- Calendar
-
encode
protected void encode() throws EncodeException
Computes the encoded form from the decoded form.- Specified by:
encode
in classAbstractLazyEncodedDataObject<byte[]>
- Throws:
EncodeException
- if address cannot be encoded
-
decode
protected void decode()
Computes the decoded form from the encoded form.- Specified by:
decode
in classAbstractLazyEncodedDataObject<byte[]>
- Throws:
DecodeException
- if less or more than 7 octets to be decoded, or if the contained data is badly formatted
-
-