ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/ActiveDoc.pm
Revision: 1.27
Committed: Tue Jul 10 15:04:15 2001 UTC (23 years, 10 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_0
Changes since 1.26: +2 -2 lines
Log Message:
Adding recent changes.

File Contents

# Content
1 #
2 # ActiveDoc.pm
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 #
8 # Interface
9 # ---------
10 # new(ActiveStore) : A new ActiveDoc object
11 # url() : Return/set the docs url - essential
12 # file() : Return the local filename of document
13 # ProcessFile() : Return the filename of PreProcessed document
14 #
15 # parent() : return the object ref of the calling parent
16 # getfile(url) : get a processedfile object given a url
17 # activatedoc(url) : Return the object ref for a doc described by the given url
18 #
19 # -- error methods --
20 # error(string) : Report an general error to the user
21 # parseerror(string) : Report an error during parsing a file
22 # line([linenumber]) : Return the line number of the document
23 # and the ProcessedFileObj it is in corresponding to the
24 # supplied number of the expanded document
25 # If no number supplied - the currentparse number will be
26 # used
27
28 package ActiveDoc::ActiveDoc;
29 require 5.004;
30 use ActiveDoc::SimpleURLDoc;
31 use ActiveDoc::PreProcessedFile;
32 use Utilities::Verbose;
33
34 @ISA = qw(ActiveDoc::SimpleURLDoc Utilities::Verbose);
35
36 sub new {
37 my $class=shift;
38 my $self={};
39 bless $self, $class;
40 $self->{Ostore}=shift;
41 $self->cache($self->{Ostore}->cache());
42 $self->{dbstore}=$self->{Ostore};
43 $self->_initdoc("doc",@_);
44 return $self;
45 }
46
47 sub url {
48 my $self=shift;
49 # get file & preprocess
50 if ( @_ ) {
51 $self->{origurl}=shift;
52 $self->{File}=$self->getfile($self->{origurl});
53 $self->filetoparse($self->{File}->ProcessedFile());
54 $self->verbose("url downloaded to ".$self->{File}->ProcessedFile());
55 }
56 if ( defined $self->{File} ) {
57 return $self->{File}->url();
58 }
59 else { return "undefined"; }
60 }
61
62 sub getfile {
63 my $self=shift;
64 my $origurl=shift;
65
66 my $fileref;
67 my ($url, $file);
68 if ( 0 ) {
69 $self->verbose("Forced download of $origurl");
70 ($url, $file)=$self->urldownload($origurl);
71 }
72 else {
73 $self->verbose("Attempting to get $origurl");
74 ($url, $file)=$self->urlget($origurl);
75 }
76 # do we already have an appropriate object?
77 ($fileref)=$self->{dbstore}->find($url);
78 if ( defined $fileref ) {
79 $self->verbose("Found $url in database");
80 $fileref->update();
81 }
82 else {
83 if ( $file eq "" ) {
84 $self->parseerror("Unable to get $origurl");
85 }
86 # -- set up a new preprocess file
87 $self->verbose("Making a new preprocessed file $url");
88 $fileref=ActiveDoc::PreProcessedFile->new($self->{Ostore});
89 #$fileref->cache($self->{cache});
90 $fileref->url($url);
91 $fileref->update();
92 }
93 return $fileref;
94 }
95
96 sub activatedoc {
97 my $self=shift;
98 my $url=shift;
99
100 # first get a preprocessed copy of the file
101 my $fileobj=$self->getfile($url);
102
103 # now parse it for the <Doc> tag
104 my $tempdoc=ActiveDoc::SimpleURLDoc->new($self->{cache});
105 $tempdoc->filetoparse($fileobj->ProcessFile());
106 my ($doctype,$docversion)=$tempdoc->doctype();
107 undef $tempdoc;
108
109 if ( ! defined $doctype ) {
110 $self->parseerror("No <Doc type=> Specified in ".$url);
111 }
112 $self->verbose("doctype required is $doctype $docversion");
113
114 # Set up a new object of the specified type
115 eval "require $doctype";
116 die $@ if $@;
117 my $newobj=$doctype->new($self->{Ostore}, $url);
118 $newobj->url($url);
119 #$newobj->parent($self);
120 return $newobj;
121 }
122
123 sub parent {
124 my $self=shift;
125
126 @_?$self->{parent}=shift
127 :$self->{parent};
128 }
129
130 # -------- Error Handling and Error services --------------
131
132 sub parseerror {
133 my $self=shift;
134 my $string=shift;
135
136 if ( $self->currentparsename() eq "" ) {
137 $self->error($string);
138 }
139 elsif ( ! defined $self->{File} ) {
140 print "Parse Error in ".$self->filenameref()." line "
141 .$self->{currentparser}->line()."\n";
142 print $string."\n";
143 }
144 else {
145 ($line, $file)=$self->line();
146 print "Parse Error in ".$file->url().", line ".
147 $line."\n";
148 print $string."\n";
149 }
150 exit;
151 }
152
153 sub line {
154 my $self=shift;
155 my $parseline;
156
157 if ( @_ ) {
158 $parseline=shift;
159 }
160 else {
161 $parseline=$self->{currentparser}->line();
162 }
163
164 my ($line, $fileobj)=
165 $self->{File}->realline($parseline);
166 return ($line, $fileobj);
167 }
168
169 sub tagstartline {
170 my $self=shift;
171 my ($line, $fileobj)=$self->{File}->line(
172 $self->{currentparser}->tagstartline());
173 return ($line, $fileobj);
174 }
175
176 sub file {
177 my $self=shift;
178
179 $self->{File}->file();
180 }
181
182 sub ProcessFile {
183 my $self=shift;
184
185 return $self->{File}->ProcessedFile();
186 }
187
188 #
189 # Delegate all else to the switch
190 #
191 #sub AUTOLOAD {
192 # my $self=shift;
193
194 # dont propogate destroy methods
195 # return if $AUTOLOAD=~/::DESTROY/;
196
197 # remove this package name
198 # ($name=$AUTOLOAD)=~s/ActiveDoc::ActiveDoc:://;
199
200 # pass the message to SimpleDoc
201 # $self->{switch}->$name(@_);
202 #}
203
204
205 # ------------------- Tag Routines -----------------------------------
206 sub Doc_Start {
207 my $self=shift;
208 my $name=shift;
209 my $hashref=shift;
210
211 $self->checktag($name, $hashref, "type");
212 $self->{doctypefound}++;
213 if ( $self->{doctypefound} == 1 ) { # only take first doctype
214 $self->{docobject}=$$hashref{'type'};
215 }
216 }