ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLhandler.pm
Revision: 1.1
Committed: Mon Aug 23 08:56:49 1999 UTC (25 years, 8 months ago) by williamc
Content type: text/plain
Branch: MAIN
Log Message:
Move to URL - Before Breakdown into seperate URL objects

File Contents

# User Rev Content
1 williamc 1.1 # url handler -> returns the location of the file
2     #
3     # Interface
4     # ---------
5     # new() :
6     # new(cachedir) : A new urlhandler with a defined default cahce directory
7     # get(url) : download from the specified url to the default cache
8     # get(url,location) : dowload to the specified directory
9     # setcvsco("checkout_cmd") : Default cvs is "co" change with this cmd
10     # setbase(type,@args) : set the url defaults for a specific url type
11     # arguments are dependent on type
12     # http:
13     # file:
14     # cvs: servername,servertype [ ,user,passkey ]
15     # label:
16     # unsetbase(type) : deactivate a previously set base
17     # usedb($data) : Set databasecontainer from which to search for tags
18     #
19     # ----------------------------------------------------------------------
20     # returns file location - or crashes out
21     # can pass a file name for the item to be stored as
22     # if not then stores in a default cache.
23    
24     package URLhandler;
25     require 5.004;
26     use Utilities::AddDir;
27     use Carp;
28    
29     sub new {
30     my $class=shift;
31     my $cache=shift;
32     $self={};
33     bless $self, $class;
34     $self->init($cache);
35     return $self;
36     }
37    
38     sub init {
39     use Utilities::AddDir;
40     my $self=shift;
41     my $cache=shift;
42     if (! defined $cache ) { $cache="/tmp/SCRAMcache" }; # default cache
43     AddDir::adddir($cache);
44     $self->{cache}=$cache;
45     $self->{cvsco}="co";
46     @{$self->{urltypes}} = qw(label file cvs http);
47     $self->{filebase}="";
48     }
49    
50     sub get ($@) {
51     my $self=shift;
52     my $origurl=shift;
53     my $filename=shift;
54     my $rest;
55     my $type;
56     my $url;
57     my $version;
58    
59     if ( ! defined $filename ) {
60     $filename="";
61     }
62     chomp $origurl;
63     # get our version info from the url (after last ??)
64     ( $url, $version) = split /\?\?/, $origurl;
65     if ( $url=~/:/ ) {
66     ($type,$rest) = split /:/, $url;
67     }
68     else {
69     $type='label';
70     $rest=$url.":".$version;
71     }
72     foreach $ty ( @{$self->{urltypes}} ) {
73     do { return &$ty($self, $rest, $filename); $supported='yes'; last;}
74     , if $type eq $ty;
75     }
76     if ( ! ( $supported=~/yes/ )) {
77     print "URLhandler: Unsupported type $type\n";
78     carp;
79     }
80     }
81    
82     sub usedb {
83     my $self=shift;
84     my $db=shift;
85    
86     $self->{db}=$db;
87     print "URLhandler warning: db containers not yet Implemented\n";
88     }
89    
90     #
91     # setcvsco --- to change nature of cvs co (e.g "export" rather than "co")
92     #
93     sub setcvsco {
94     my $self=shift;
95     $self->{cvsco}=shift;
96     }
97    
98     sub setbase {
99     my $self=shift;
100     my $type=shift;
101     my @args=@_;
102    
103     # Check type is supported
104     if ( ! grep( $type, @{$self->{urltypes}}) ) {
105     print "URLhandler error: Unsupported type $type\n";
106     return 1;
107     }
108     else {
109     &{$type."_setbase"}($self,@args);
110     }
111     }
112    
113     sub unsetbase {
114     my $self=shift;
115     my $type=shift;
116    
117     # Check type is supported
118     if ( ! grep( $type, @{$self->{urltypes}}) ) {
119     print "URLhandler error: Unsupported type $type\n";
120     return 1;
121     }
122     else {
123     &{$type."_unsetbase"}($self, @args);
124     }
125     }
126    
127     # ------------------------- Type Support Routines ----------------------------
128     #
129     # label:
130     #
131     sub label {
132     my $self=shift;
133     my $label=shift;
134     my $filename=shift;
135     my $returnval="";
136    
137     open ( LOOKUP, "$ENV{SCRAM_LOOKUPDB}" )
138     || die "URLhandler: Unable to open DataBase $ENV{SCRAM_LOOKUPDB} $!";
139     while ( <LOOKUP> ) {
140     next if /^#/;
141     if ( $_=~s/^$label\:// ) {
142     $returnval = urlhandler($_,$filename);
143     }
144     }
145     close LOOKUP;
146     if ( $returnval ne "" ) {
147     return $returnval;
148     }
149     ($proj,$ver)=split /:/, $label;
150     print "Error : Unknown project name or version (".$proj." ".$ver.")\n";
151     carp;
152     }
153    
154     sub label_setbase {
155     my $self=shift;
156     }
157    
158     sub label_unsetbase {
159     my $self=shift;
160     }
161    
162     #
163     # file:
164     #
165     sub file {
166     my $self=shift;
167     use File::Copy;
168     my $urlfile=shift;
169     my $filename=shift;
170    
171     if ( $self->{filebase} ne "" ) { # add a base if it exists
172     $urlfile=$self->{filebase}."/".$urlfile;
173     }
174     if ( -e "$urlfile" ) {
175     if ( $filename ne "" ) {
176     copy ( $urlfile, $filename ) || return $urlfile;
177     return $filename;
178     }
179     return $urlfile;
180     }
181     else {
182     print "URLhandler: Unable to find file $urlfile : $!\n";
183     die "";
184     }
185     }
186    
187     #
188     #
189     #
190     sub file_setbase {
191     my $self=shift;
192     my $filebase=shift;
193    
194     if ( -d $filebase ) {
195     $self->{filebase}=$filebase;
196     push @{$self->{filebasestack}}, $self->{filebase};
197     }
198     else {
199     print "Directory Does Not Exist \n";
200     carp;
201     }
202     }
203    
204     sub file_unsetbase {
205     my $self=shift;
206     pop @{$self->{filebasestack}};
207     $self->{filebase}=@{$self->{filebasestack}}
208     [$#{$self->{filebasestack}}];
209     }
210    
211     #
212     # cvs:
213     #
214    
215     sub cvs {
216     my $self=shift;
217     my $url=shift;
218     my $dirname=shift;
219    
220     my $cvscmd;
221     my $module;
222     my $version="";
223    
224     # Where should we co to?
225     if ( $dirname eq "" ) {
226     $dirname=$self->{cache};
227     }
228    
229     # Split up our url into its components
230     if ( $url=~/\?/ ) {
231     ($module, $version)= split /\?/, $url;
232     }
233     print $url." -----\n";
234    
235     if ( $version ne "" ) {
236     $cvscmd=$self->{cvsco}." -r $version";
237     }
238     else {
239     $cvscmd=$self->{cvsco};
240     }
241     #
242     # Check to see we have a server and if so attempt the checkout
243     #
244     if ( ! defined $self->{cvsobject} ) {
245     print "urlhandler error: undefined cvs server for $module\n";
246     return 1;
247     }
248     else {
249     chdir $dirname or carp "Unable to Enter Directory $dirname $!\n";
250     $self->{cvsobject}->invokecvs($cvscmd, $module);
251     }
252     }
253    
254     sub cvs_setbase {
255     my $self=shift;
256     my $base=shift;
257     my $auth=shift;
258     my $user=shift;
259     my $passkey=shift;
260     use Utilities::CVSmodule;
261    
262     # Push a new cvs object onto the cvs stack
263     $self->{cvsobject}=CVSmodule->new();
264     push @{$self->{cvsobjectstack}},$self->{cvsobject};
265     $self->{cvsobject}->set_base($base);
266     $self->{cvsobject}->set_auth($auth);
267     if ( $user ne "" ) {
268     $self->{cvsobject}->set_user($user);
269     }
270     if ( $passkey ne "" ) {
271     $self->{cvsobject}->set_passkey($passkey);
272     }
273     }
274    
275     sub cvs_unsetbase {
276     my $self=shift;
277     pop @{$self->{cvsobjectstack}};
278     $self->{cvsobject}=@{$self->{cvsobjectstack}}
279     [$#{$self->{cvsobjectstack}}];
280     }
281    
282     #
283     # http:
284     #
285    
286     sub http {
287     my $self=shift;
288     my $urlfile=shift;
289     my $filename=shift;
290     # use LWP::Simple;
291     print "Hello $filename, $urlfile\n";
292     # open (STORE, ">$filename") || carp "unable to open file $filename $!\n";
293     # print STORE (get 'http:'.$urlfile);
294     close STORE;
295     }
296    
297     sub http_setbase {
298     my $self=shift;
299     }
300    
301     sub http_unsetbase {
302     my $self=shift;
303     }
304    
305     # ------------------------ General Support Routines ----------------------------
306    
307     sub cachefilename {
308     my $self=shift;
309     use File::Basename;
310     use Utilities::AddDir;
311     my $filebase=dirname($rest);
312     $cache="/tmp/williamc/urlhandler$$";
313     adddir($cache);
314     $filename=$cache."/".$filebase;
315     }
316