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

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