ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLhandler.pm
Revision: 1.13
Committed: Wed Mar 29 09:48:33 2000 UTC (25 years, 1 month ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.12: +3 -1 lines
Log Message:
handlers for test type

File Contents

# Content
1 # url handler -> returns the location of the file
2 # Interface
3 # ---------
4 # new(cache) : A new urlhandler with a defined default cahce directory
5 # download(url,[location]) : as get but always download
6 # get(url,[location]) : download from the specified url to cache or location
7 # return the full url path name incl. any base expansion
8 # and the filename downloaded to
9 # setbase(type,variablehash) : set the url defaults for a specific url type
10 # arguments are dependent on type
11 # unsetbase(type) : deactivate a previously set base
12 # currentbase(type) : return the current base for the given type
13 #
14 # ----------------------------------------------------------------------
15
16 package URL::URLhandler;
17 require 5.004;
18 use Utilities::AddDir;
19 use URL::URLcache;
20 use URL::URLclass;
21 use URL::URLbase;
22 use Carp;
23
24 sub new {
25 my $class=shift;
26 my $cache=shift;
27 $self={};
28 bless $self, $class;
29 $self->init($cache);
30 return $self;
31 }
32
33 sub init {
34 use Utilities::AddDir;
35 my $self=shift;
36 my $cache=shift;
37 $self->{cache}=$cache;
38 $self->{dummybase}=URL::URLbase->new({});
39 $self->{cachestore}=$self->{cache}->filestore();
40 use URL::URL_cvs;
41 use URL::URL_cvsfile;
42 use URL::URL_file;
43 use URL::URL_test;
44 use URL::URL_filed;
45 $self->{urlmodules}={
46 'cvsfile' => 'URL::URL_cvsfile',
47 'cvs' => 'URL::URL_cvs',
48 'file' => 'URL::URL_file',
49 'filed' => 'URL::URL_filed',
50 'test' => 'URL::URL_test'
51 };
52 }
53
54 sub get {
55 my $self=shift;
56 my $origurl=shift;
57 my $file="";
58
59 my $url=URL::URLclass->new($origurl);
60 my $type=$url->type();
61 $url->expandurl($self->currentbase($type));
62 my $fullurl=$url->url();
63
64 $file=$self->{cache}->file($fullurl);
65 if ( $file eq "" ) {
66 ($fullurl,$file)=$self->download($origurl, @_);
67 }
68 return ($fullurl, $file);
69 }
70
71 sub download {
72 my $self=shift;
73 my $origurl=shift;
74
75 # Process the URL string
76 my $url=URL::URLclass->new($origurl);
77 my $type=$url->type();
78 $urltypehandler=$self->_typehandler($type);
79 $url->expandurl($self->currentbase($type));
80
81 # Generate a location name if not provided
82 $nocache=1;
83 if ( @_ ) {
84 $location=shift;
85 $nocache=0; # dont cache if downloaded to an external location
86 }
87 else {
88 $location=$self->{cache}->filename($url->url());
89 }
90 # -- get the file from the appropriate handler
91 if ( defined $urltypehandler ) {
92 # Call the download module
93 $file=eval{$urltypehandler->get($url, $location)};
94 }
95
96 # now register it in the cache if successful
97 if ( $file && $nocache) {
98 $self->{cache}->store($url->url(), $location);
99 }
100 return ($url->url(), $file);
101 }
102
103 sub setbase {
104 my $self=shift;
105 my $type=shift;
106 my @args=@_;
107 my $oref;
108
109 $self->checktype($type);
110 # make a new base object
111 my $base=URL::URLbase->new(@_);
112 push @{$self->{"basestack"}{$type}}, $base;
113 }
114
115 sub unsetbase {
116 my $self=shift;
117 my $type=shift;
118 my $oref;
119
120 $self->checktype($type);
121 # pop off the stack and call the unset base method
122 if ( $#{$self->{basestack}{$type}} >=0 ) {
123 my $base=pop @{$self->{basestack}{$type}};
124 undef $base;
125 }
126 else {
127 die "URLhandler error: Unable to unset type $type\n";
128 }
129 # remove the stack if its empty
130 if ( $#{$self->{basestack}{$type}} == -1 ) {
131 delete $self->{basestack}{$type};
132 }
133 }
134
135 sub currentbase {
136 my $self=shift;
137 my $type=shift;
138 my $rv;
139
140 if ( exists $self->{basestack}{$type} ) {
141 $rv=${$self->{basestack}{$type}}[$#{$self->{basestack}{$type}}];
142 }
143 else {
144 $rv=$self->{dummybase};
145 }
146 return $rv;
147 }
148
149 sub checktype($type) {
150 my $self=shift;
151 my $type=shift;
152
153 # Check type is supported
154 if ( ! exists $self->{urlmodules}{$type} ) {
155 die "URLhandler error: Unsupported type $type\n";
156 }
157 }
158
159 sub _typehandler {
160 my $self=shift;
161 my $type=shift;
162
163 $self->checktype($type);
164
165 # instantiate only if it dosnt already exist;
166 if ( exists $self->{'urlobjs'}{$type} ) {
167 $self->{'urlobjs'}{$type};
168 }
169 else {
170 $self->{'urlobjs'}{$type}=$self->{urlmodules}{$type}->new();
171 }
172 }