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