ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLhandler.pm
Revision: 1.14
Committed: Thu May 18 14:57:30 2000 UTC (24 years, 11 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.13: +0 -4 lines
Log Message:
Update to minimum reqs

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_file;
42 use URL::URL_test;
43 $self->{urlmodules}={
44 'cvs' => 'URL::URL_cvs',
45 'file' => 'URL::URL_file',
46 'test' => 'URL::URL_test'
47 };
48 }
49
50 sub get {
51 my $self=shift;
52 my $origurl=shift;
53 my $file="";
54
55 my $url=URL::URLclass->new($origurl);
56 my $type=$url->type();
57 $url->expandurl($self->currentbase($type));
58 my $fullurl=$url->url();
59
60 $file=$self->{cache}->file($fullurl);
61 if ( $file eq "" ) {
62 ($fullurl,$file)=$self->download($origurl, @_);
63 }
64 return ($fullurl, $file);
65 }
66
67 sub download {
68 my $self=shift;
69 my $origurl=shift;
70
71 # Process the URL string
72 my $url=URL::URLclass->new($origurl);
73 my $type=$url->type();
74 $urltypehandler=$self->_typehandler($type);
75 $url->expandurl($self->currentbase($type));
76
77 # Generate a location name if not provided
78 $nocache=1;
79 if ( @_ ) {
80 $location=shift;
81 $nocache=0; # dont cache if downloaded to an external location
82 }
83 else {
84 $location=$self->{cache}->filename($url->url());
85 }
86 # -- get the file from the appropriate handler
87 if ( defined $urltypehandler ) {
88 # Call the download module
89 $file=eval{$urltypehandler->get($url, $location)};
90 }
91
92 # now register it in the cache if successful
93 if ( $file && $nocache) {
94 $self->{cache}->store($url->url(), $location);
95 }
96 return ($url->url(), $file);
97 }
98
99 sub setbase {
100 my $self=shift;
101 my $type=shift;
102 my @args=@_;
103 my $oref;
104
105 $self->checktype($type);
106 # make a new base object
107 my $base=URL::URLbase->new(@_);
108 push @{$self->{"basestack"}{$type}}, $base;
109 }
110
111 sub unsetbase {
112 my $self=shift;
113 my $type=shift;
114 my $oref;
115
116 $self->checktype($type);
117 # pop off the stack and call the unset base method
118 if ( $#{$self->{basestack}{$type}} >=0 ) {
119 my $base=pop @{$self->{basestack}{$type}};
120 undef $base;
121 }
122 else {
123 die "URLhandler error: Unable to unset type $type\n";
124 }
125 # remove the stack if its empty
126 if ( $#{$self->{basestack}{$type}} == -1 ) {
127 delete $self->{basestack}{$type};
128 }
129 }
130
131 sub currentbase {
132 my $self=shift;
133 my $type=shift;
134 my $rv;
135
136 if ( exists $self->{basestack}{$type} ) {
137 $rv=${$self->{basestack}{$type}}[$#{$self->{basestack}{$type}}];
138 }
139 else {
140 $rv=$self->{dummybase};
141 }
142 return $rv;
143 }
144
145 sub checktype($type) {
146 my $self=shift;
147 my $type=shift;
148
149 # Check type is supported
150 if ( ! exists $self->{urlmodules}{$type} ) {
151 die "URLhandler error: Unsupported type $type\n";
152 }
153 }
154
155 sub _typehandler {
156 my $self=shift;
157 my $type=shift;
158
159 $self->checktype($type);
160
161 # instantiate only if it dosnt already exist;
162 if ( exists $self->{'urlobjs'}{$type} ) {
163 $self->{'urlobjs'}{$type};
164 }
165 else {
166 $self->{'urlobjs'}{$type}=$self->{urlmodules}{$type}->new();
167 }
168 }