ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/DOChandler.pm
Revision: 1.1
Committed: Mon Sep 20 16:28:14 1999 UTC (25 years, 7 months ago) by williamc
Content type: text/plain
Branch: MAIN
Log Message:
Basic Working Level

File Contents

# User Rev Content
1 williamc 1.1 #
2     # The base ActiveDoc generator and support utility
3     # Create the appropriate object for a document given its url
4     # Class type determined by <DocType class=> tag
5     # Will create and return the pointer to the apporpriate object rather than
6     # itself.
7     #
8     # Interface
9     # ---------
10     # new(UserQuery) : Add a new DOChandler with a UserQuery
11     # UserQuery Parameters :
12     # cache -> cache directory
13     # UserInterface -> Set a User interface to use
14     # (default is that of the UserQuery)
15     #
16     # newdoc(filename) : Create an Object of the appropriate type for the
17     # document specified in filename
18     # defaultcache() : Return the default cache location
19     # inputvalue(param) : return the value of param as given by the
20     # initialising UserQuery
21     # asksingleinputvalue(param, string) : Query the user to supply a given input
22     # value the initialising UserQuery)
23    
24     package ActiveDoc::DOChandler;
25     require 5.001;
26    
27     use ActiveDoc::BaseTags;
28     use ActiveDoc::ActiveDoc;
29     use ActiveDoc::UserInterface_basic;
30     use ActiveDoc::UserQuery;
31     use ObjectStore;
32    
33     sub new {
34     my $class=shift;
35     my $UserQuery=shift;
36     my $cache=shift;
37    
38     $self={};
39     bless $self, $class;
40    
41     # set up data
42     $self->{UserQuery}=$UserQuery;
43     $self->{objectstore}=ObjectStore->new();
44     $self->{treenode}=ActiveDoc::TreeNode->new("/"); # create a root node
45     $self->{treenode}->setassociate($self);
46    
47     # set our cache area - and ask user if not
48     $self->{defaultcache}=$self->inputvalue('cache');
49     while ( ! defined $self->{defaultcache} ) {
50     $self->asksingleinputvalue( "cache",
51     "No cache directory Has Been Specified - Please enter a".
52     "suitable directory to use as a cache");
53     $self->{defaultcache}=$self->inputvalue('cache');
54     }
55    
56     # Determine the UserInterface
57     if ( ! defined $self->inputvalue('UserInterface') ) {
58     $self->{UserInterface}=$self->{UserQuery}->interface();
59     }
60     else {
61     $self->{UserInterface}=$self->inputvalue('UserInterface');
62     }
63    
64     return $self;
65     }
66    
67     sub newdoc {
68     my $self=shift;
69     my $filename=shift;
70    
71     # Set up the required service objects
72     $self->{base}=BaseTags->new($filename);
73     $self->{base}->{tags}->addtag("DocType", \&DocTypeTag, "", "");
74     $self->{base}->{gc}->include("doctype");
75     $self->{base}->{gc}->uninclude("all");
76     $self->{base}->{otherself}=$self;
77    
78     # Set up a parser and parse the File
79     $self->{base}->{tagfound}=0;
80     $self->{base}->parse();
81     if ( ! defined $self->{object} ) {
82     print "No <DocType type=> Specified in $filename\n";
83     exit 1;
84     }
85     undef $self->{base};
86     return $self->{object};
87     }
88    
89     sub addobj {
90     my $self=shift;
91    
92     # --- Add to our local objectstore
93     $self->{objectstore}->add(@_);
94    
95     # Now indicate weve found one
96     $self->{object}=shift;
97     }
98    
99     sub defaultcache {
100     my $self=shift;
101     return $self->{defaultcache};
102     }
103    
104     sub inputvalue {
105     my $self=shift;
106     my $value=shift;
107    
108     return $self->{UserQuery}->getparam($value);
109     }
110    
111     sub asksingleinputvalue {
112     my $self=shift;
113     my $param=shift;
114     my $string=shift;
115    
116     $self->{UserQuery}->clearquery();
117     $self->{UserQuery}->setquery('basic', $param, $string );
118     $self->{UserQuery}->askuser();
119     }
120    
121     # ------------------------------- Tag Routines --------------------------
122     #
123     # Check type and create object of appropriate type
124     #
125     # !! remember that $self refers to the base
126     #
127    
128     sub DocTypeTag {
129     my $self=shift;
130     my $name=shift;
131     my $hashref=shift;
132    
133     my $object;
134     my $res;
135    
136     # - Syntax Checking
137     $self->{switch}->checkparam($name, "type");
138    
139     # -- Check for default types - and convert
140     if ( $$hashref{type}=~/ActiveDoc/i ) {
141     $$hashref{type}="ActiveDoc::ActiveDoc";
142     }
143     $res = eval { eval "require $$hashref{type}"; };
144     if ( ! defined $res ) {
145     $self->report("Unknown Document Type : $$hashref{type}\n $@");
146     }
147    
148     # --- create an object of the appropriate type
149     $object=$$hashref{type}->new($self->{filename}, $self->{otherself});
150    
151     # --- store it in our Object Storage Facility
152     if ( defined $object ) {
153     $self->{otherself}->addobj(
154     $object, $$hashref{type}, $self->{otherself}->{url} );
155     }
156     else {
157     $self->report(
158     "Unable to Initialise Object of type $$hashref{type}");
159     }
160     }