本ライブラリが使用する(主に)Reference System 用のオブジェクトをユニークに識別するため IRIを用います。
(厳密には逸脱もあるかもしれませんが…)
→関連クラス図 02.BasicTypes
timezone | IRI | object creation & reference |
+09:00 | http://hosi.org/When/TM/Clock?label=+09:00 (*) | Resource('_tm:Clock?label=+09:00') |
+00:00 | http://hosi.org/When/CalendarTypes/UTC | Resource('_c:UTC') |
ISO19108では時間帯を表現するクラスは TM_Clock です。これを本ライブラリでは When::TM::Clockというクラスで実装しています。このとき、IRI http://hosi.org/When/TM/Clock は、 オブジェクトWhen::TM::Clock.new を意味します。時間帯 +09:00 を表す TM_Clock オブジェクトのIRIは、 http://hosi.org/When/TM/Clock?label=+09:00 です。'?'の後ろの書式は、原型となるオブジェクトと 指定した属性の分だけ異なるオブジェクトであることを示しています。when.exe のリソースファイルで やっていたことを、より国際規格にマッチした方法で実現しようと意図したものです。
Coordinated Universal Time は使用頻度が高いため、専用のクラスWhen::CalendarTypes::UTCを 定義しています。このクラスのオブジェクトのIRIは http://hosi.org/When/CalendarTypes/UTC です。
Resourceメソッドは IRI文字列から対応するオブジェクトを取得するメソッドです。prefix を用いて簡略化した文字列が使用できます。
_wp: = https://en.wikipedia.org/wiki/ _w: = http://hosi.org/When/ _p: = http://hosi.org/When/Parts/ _b: = http://hosi.org/When/BasicTypes/ _m: = http://hosi.org/When/BasicTypes/M17n/ _co: = http://hosi.org/When/Coordinates/ _l: = http://hosi.org/When/Coordinates/Spatial? _v: = http://hosi.org/When/V/ _rs: = http://hosi.org/When/RS/ _ex: = http://hosi.org/When/EX/ _tm: = http://hosi.org/When/TM/ _e: = http://hosi.org/When/TM/CalendarEra/ _t: = http://hosi.org/When/TimeStandard/ _ep: = http://hosi.org/When/Ephemeris/ _c: = http://hosi.org/When/CalendarTypes/ _n: = http://hosi.org/When/CalendarTypes/CalendarNote _sc: = http://hosi.org/When/Ephemeris/V50/
ユーザー定義の prefix と衝突しないように、これらの予約済みの prefix には '_' をつけています。
(*) application/x-www-form-urlencoded は ' ' を '+' にエンコードしますが、これは IRI/URIの仕様ではないようです。 Ruby の URI.encode/decode もこの変換は行いません。
もし http://example.org/JapanHolidays.ics に日本の祝日を定義したiCalendar形式のファイルがあったとします。 そうすると、Resource('http://example.org/JapanHolidays.ics') により When::V::Calendarクラスのオブジェクトが生成され、その IRI は http://example.org/JapanHolidays.ics になります。 iCalendar は05.RFC5545継承と包含に示すようなモデリングになっており、When::V::Calendarオブジェクトは、各々の祝日を定義した When::V::Eventクラスのオブジェクトを包含する構造になっています。つまり、暗黙のうちにWhen::V::Eventクラスのオブジェクトも 生成しているのです。仮にWhen::V::Eventオブジェクトのlabelが'Bunka_no_hi'(*)であれば、このWhen::V::Eventオブジェクトの IRI は http://example.org/JapanHolidays.ics::Bunka_no_hi になりResource('http://example.org/JapanHolidays.ics::Bunka_no_hi')で オブジェクトを取得できます。
(*) 本来は universal にユニークなUID属性をlabelに用いるので、When::V:Event の場合は親のIRIがなくともユニークです。
本ライブラリでは一般に、互いに包含関係にあるオブジェクトでは、
子のIRI = 親のIRI + :: + 子のlabel.to_s (→<補足>)
です。
ISO19108では暦年代を表現するクラスは TM_CalendarEra です。これを本ライブラリでは When::TM::CalendarEraというクラスで実装しています。when.exe Ruby版で実装済みの 暦年代の IRI は、その暦年代の属する国名や暦年代の年号名を用いて、例えば元の至正年号なら
http://hosi.org/When/TM/CalendarEra/Chinese::元::至正
としています。通常は同一の王朝で同じ年号が複数回使用されることはないのですが、元の至元年号 は例外のひとつで、世祖フビライと順帝の2度にわたって用いられています。このため両年号を、
http://hosi.org/When/TM/CalendarEra/Chinese::元::世祖#至元 http://hosi.org/When/TM/CalendarEra/Chinese::元::順帝#至元
として識別しています。
When::TM::CalendarEra/Chinese と同様の定義方法でユーザが独自に暦年代を定義する場合、 このような配慮をせず IRI の重複があったときは、本ライブラリでは後ろで定義された方の オブジェクトを参照する実装となっています。
現在のRailsアプリケーションの実装では、例えば東経139度44分41秒北緯35度39分16秒での イスラム暦1434年11月11日の各暦法での日付を計算するURLは、
http://hosi.org:3000/Date/1434-11-11%5E%5EEphemerisBasedIslamic%253Flong=139@4441E&lat=35@3916N
となります。本来であれば、
long=139@4441E&lat=35@3916N
は、
long=139.4441E&lat=35.3916N
なのですが、'.'を用いると Rails が '.' 以降を MIMEタイプの判別に用いてしまいエラーとなってしまうからです。
このため現在の実装では、'.' の代用として '@' を用いることができるようにしています。
('%'の代用としての'@'については<1.日付時刻の表現>の区切り文字注*(1)を参照してください)