ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/ActiveDoc.pm
Revision: 1.29
Committed: Mon Dec 3 19:02:04 2001 UTC (23 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_0_3-p4, V1_0_3-p3, V1_0_3-p2, before110xmlBRmerge, V1_0_4p1, V1_0_3-p1, V1_0_3, V1_0_2, V1_0_2_p1, v102p1, V1_0_1, V1_0_0, V1_pre0, SCRAM_V1, SCRAMV1_IMPORT, V0_19_7, V0_19_6, V0_19_6p1, V0_19_5, SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2, V0_19_4_pre1, V0_19_3, V0_19_2, V0_19_1
Branch point for: v103_with_xml, v103_branch, V1_pre1, SCRAM_V1_BRANCH, V0_19_4_B
Changes since 1.28: +0 -2 lines
Log Message:
*** empty log message ***

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->url($url);
90 $fileref->update();
91 }
92 return $fileref;
93 }
94
95 sub activatedoc {
96 my $self=shift;
97 my $url=shift;
98
99 # first get a preprocessed copy of the file
100 my $fileobj=$self->getfile($url);
101
102 # now parse it for the <Doc> tag
103 my $tempdoc=ActiveDoc::SimpleURLDoc->new($self->{cache});
104 $tempdoc->filetoparse($fileobj->ProcessFile());
105 my ($doctype,$docversion)=$tempdoc->doctype();
106 undef $tempdoc;
107
108 if ( ! defined $doctype ) {
109 $self->parseerror("No <Doc type=> Specified in ".$url);
110 }
111 $self->verbose("doctype required is $doctype $docversion");
112
113 # Set up a new object of the specified type
114 eval "require $doctype";
115 die $@ if $@;
116 my $newobj=$doctype->new($self->{Ostore}, $url);
117 $newobj->url($url);
118 return $newobj;
119 }
120
121 sub parent {
122 my $self=shift;
123
124 @_?$self->{parent}=shift
125 :$self->{parent};
126 }
127
128 # -------- Error Handling and Error services --------------
129
130 sub parseerror {
131 my $self=shift;
132 my $string=shift;
133
134 if ( $self->currentparsename() eq "" ) {
135 $self->error($string);
136 }
137 elsif ( ! defined $self->{File} ) {
138 print "Parse Error in ".$self->filenameref()." line "
139 .$self->{currentparser}->line()."\n";
140 print $string."\n";
141 }
142 else {
143 ($line, $file)=$self->line();
144 print "Parse Error in ".$file->url().", line ".
145 $line."\n";
146 print $string."\n";
147 }
148 exit;
149 }
150
151 sub line {
152 my $self=shift;
153 my $parseline;
154
155 if ( @_ ) {
156 $parseline=shift;
157 }
158 else {
159 $parseline=$self->{currentparser}->line();
160 }
161
162 my ($line, $fileobj)=
163 $self->{File}->realline($parseline);
164 return ($line, $fileobj);
165 }
166
167 sub tagstartline {
168 my $self=shift;
169 my ($line, $fileobj)=$self->{File}->line(
170 $self->{currentparser}->tagstartline());
171 return ($line, $fileobj);
172 }
173
174 sub file {
175 my $self=shift;
176
177 $self->{File}->file();
178 }
179
180 sub ProcessFile {
181 my $self=shift;
182
183 return $self->{File}->ProcessedFile();
184 }
185
186 # ------------------- Tag Routines -----------------------------------
187 sub Doc_Start {
188 my $self=shift;
189 my $name=shift;
190 my $hashref=shift;
191
192 $self->checktag($name, $hashref, "type");
193 $self->{doctypefound}++;
194 if ( $self->{doctypefound} == 1 ) { # only take first doctype
195 $self->{docobject}=$$hashref{'type'};
196 }
197 }