File: LTM.pm

package info (click to toggle)
libxtm-perl 0.37-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,536 kB
  • ctags: 410
  • sloc: perl: 23,045; makefile: 37
file content (274 lines) | stat: -rw-r--r-- 6,079 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
package XTM::LTM;

use strict;
use vars qw($VERSION @EXPORT_OK);

require Exporter;
require AutoLoader;

use base qw (XTM::IO);

$VERSION = '0.02';

use Carp;
use XTM::Log ('elog');
use XTM::Memory;

=pod

=head1 NAME

XTM::LTM - Topic Map Parsing of LTM instances.

=head1 SYNOPSIS

  # reading a topic map description from a file/url
  $ltm = new XTM::LTM (file => 'mymap.ltm');
  $tm  = $ltm->sync_in();

=head1 DESCRIPTION

This package provides parsing functionality for LTM instances as described in the
package documentation (doc directory) or at

=begin html

<BLOCKQUOTE>
<A HREF="http://www.ontopia.net/download/ltm.html">http://www.ontopia.net/download/ltm.html</A>
</BLOCKQUOTE>

=end html

=begin man

   http://www.ontopia.net/download/ltm.html

=end man

Following clarifications and deviations relative to the LTM specification hold:

=over

=item B<comments>:

The parser does NOT recognizes nested comments. Any closest following */ sequence
terminates a comment.

=item B<scope>:

Only exactly ONE topic can be specified for a scope, but violations are currently
not captured (open issue).

=item B<role type>:

If a role is not specified, it will remain empty and not - as the specification
mandates - will be substituted by the topic type. 

The reasons for this are that, first, a topic might have several
types (which one to use?), secondly that there might be several topics in a member and
thirdly, a role should generally NOT be the type of a member.

This approach would somehow violate the idea of roles in associations, so this should
not be encouraged by any tool.

=item B<merging>:

Merging happens according to the XTM standard. This may affect the item 4 of
section 3.2 according to which topics may be merged without error having different 
subject addresses.

=item B<encoding>:

Only the encodings supported by the local Text::Iconv module are supported.

=item B<BASEURI directive>:

Not (yet) implemented.

=item B<TOPICMAP directive>:

Not implemented.

This directive can give a name to the current topic map. The idea is that this
name can be used inside the map to I<point> to the map. An example would be a
topic reifying the map.

As the map is a resource (either explicit or via a map expression, L<XTM::Virtual>),
there seems to be no good reason to provide an additional name.

=item B<MERGEMAP directive>:

The HyTime, ISO13250 format is not implemented as there is currently no driver in 
XTM::base.
The strings determining the format are checked case-insensitive, so ASTMA and AsTMa
are treated equally.

The location of the map can be defined via any URI handled by LWP::Simple.
If no scheme is provided I<file:> will be assumed.

The format string can be omitted. Then the parser will interpret the location
string as tau expression (L<XTM::Virtual>).

=back


=head1 INTERFACE

=head2 Constructor

The constructor expects a hash as parameter containing one of the following fields:

=over

=item I<url>:

If given, then the LTM instance will be read from this url.

=item I<file>:

If given, then the LTM data will be read from this file (This
is just a convenience function as it will be mapped to I<url>).

=item I<text>:

If given, then the LTM instance will be read directly from this text.

=back

If several fields (C<file>, C<url>, C<text>) are specified, it is undefined which
one will be taken.

Examples:

   $ltm = new XTM::LTM (file => 'here.ltm');
   $ltm = new XTM::LTM (text => '/* this is LTM */ [ ltm ]');

=cut

sub new {
  my $class = shift;
  my %options = @_;
  elog ($class, 4, 'new');

  my $self = bless { }, $class;
  $self->{url} = 'inline:'.$options{text} if $options{text};
  $self->{url} = 'file:'.  $options{file} if $options{file};
  $self->{url} =           $options{url}  if $options{url};

  return $self;
}

=pod

=head2 Methods

=over

=item C<last_mod>

I<$time> = I<$ltm>->last_mod

returns the UNIX time when the resource has been modified last. C<undef> is
returned if the result cannot be determined.


=cut

sub last_mod {
  my $self = shift;

  elog ('XTM::LTM', 4, "last mod on LTM ".$self->{url});
  if ($self->{url} =~ /^file:(.+)/) {
    use File::stat;
    my $stats = stat($1);
    return $stats->mtime;
  } elsif ($self->{url} =~ /^inline:/) {
    return undef;
  } else {
    elog ('XTM::LTM', 3, "Warning: unimplemented scheme '".$self->{url}."' in last_mod");
    return undef;
  }
}

=pod

=item C<sync_in>

I<$tmmemory> = I<$ltm>->sync_in


loads an LTM instance and returns a L<XTM::Memory> object. The only optional parameter is 
C<consistency>. It will be used when building the map while reading the LTM instance. 
See L<XTM> for details.

Notes:

=over

=item All undefined topics will be defined automatically. There is no way to suppress this.

=item Automatically generated topic will NOT have any baseName

=back


=cut

sub sync_in {
  my $self        = shift;
  my $consistency = shift || $XTM::default_consistency;

  elog ('XTM::LTM', 3, 'sync in '.$self->{url});

  my $ltm_stream;                             # fetch the stuff in there
  if ($self->{url} =~ /^inline:(.*)/s) {
    $ltm_stream = $1;
  } else {                                    # some kind of URL
    use LWP::Simple;
    $ltm_stream = get($self->{url}) || die "XTM::LTM: Unable to load '$self->{url}'\n";
    elog ('XTM::LTM', 5, "synced in stream", \$ltm_stream);
  }

  use XTM::LTM::MemoryBuilder;
  my $ap = new XTM::LTM::MemoryBuilder(tm => new XTM::Memory (consistency => $consistency));
  $ap->handle_ltm (text          => $ltm_stream,
		   ##		     log_level     => 2,
		   #auto_complete => $self->{auto_complete}
		  );
  return $ap->{tm};
}

=pod

=item C<sync_out>

is not implemented.

=cut

sub sync_out {
  die "XTM::LTM: sync_out not implementable.";
}

=pod

=back

=head1 SEE ALSO

L<XTM::base>

=head1 AUTHOR INFORMATION

Copyright 200[2], Robert Barta <rho@telecoma.net>, All rights reserved.

This library is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
http://www.perl.com/perl/misc/Artistic.html

=cut

1;

__END__