indexing description: "Represents a JXTA ID" author: "Beat Strasser " date: "$Date$" revision: "$Revision$" deferred class P2P_ID inherit ANY redefine out, is_equal end feature {NONE} -- Initialization make_from_urn (urn: STRING) is -- Create id from `urn' string require Urn_valid: urn /= Void do parse_urn (urn) if is_valid then build_urn end ensure Parsed: is_valid implies unique_id /= Void end make_with_id (an_id: STRING) is -- Create id with given string id require Id_valid: an_id /= Void and not an_id.is_empty do if is_unique_id_valid (an_id) then unique_id := an_id is_valid := True build_urn end ensure Id_set: is_valid implies unique_id = an_id Valid_id: is_valid = is_unique_id_valid (an_id) end feature -- Access format: STRING is -- JXTA ID format deferred end unique_id: STRING feature -- Status report is_valid: BOOLEAN is_unique_id_valid (an_id: STRING): BOOLEAN is -- Is `an_id' valid as a unique id? require Id_existent: an_id /= Void do Result := not an_id.is_empty end feature -- Comparison is_equal (other: like Current): BOOLEAN is -- Is `other' equal to current? do Result := out.is_equal (other.out) end feature -- Output out: STRING -- Cached string representation feature {NONE} -- Implementation Colon: CHARACTER is ':' Dash: CHARACTER is '-' urn_encoding: STRING is "urn" jxta_namespace: STRING is "jxta" build_urn is -- Build string representation and set `out' require Valid_id: is_valid do out := urn_encoding + colon.out + jxta_namespace + colon.out + format + dash.out + unique_id ensure Cache_valid: out /= Void end parse_urn (urn: STRING) is -- Try to parse a JXTA id from `urn'. require Source_valid: urn /= Void local pos: INTEGER parsed_id: STRING do pos := urn_encoding.count + 1 + jxta_namespace.count + 1 + format.count + 1 if urn.substring (1, pos).is_equal (urn_encoding + colon.out + jxta_namespace + colon.out + format + dash.out) then parsed_id := urn.substring (pos + 1, urn.count) if is_unique_id_valid (parsed_id) then unique_id := parsed_id parse_unique_id end end is_valid := unique_id /= Void ensure Status_set: is_valid implies unique_id /= Void end parse_unique_id is -- Do nothing. Redefine if necessary. do end end