ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLclass.pm
Revision: 1.12
Committed: Fri Aug 4 07:47:43 2000 UTC (24 years, 9 months ago) by williamc
Content type: text/plain
Branch: MAIN
CVS Tags: V1_2_1b, V1_2_1a, V1_2_3, V1_2_2, V1_2_2_relcand2, V1_2_1, V1_2_0, V1_2_0-cand11, V1_1_7, V1_1_6, V1_2_0-cand10, V1_1_5, V1_2_0-cand9, V1_2_0-cand8, V1_2_0-cand7, V1_2_0-cand6, V1_2_0-cand5, V1_2_0-cand4, V1_2_0-cand3, V1_2_0-cand2, V1_2_0-cand1, V1_1_4, V1_1_3, V1_1_2, V1_1_0_reltag8, V1_1_0_reltag7, V1_1_0_reltag6, V1_1_1, V1_1_0_reltag5, V1_1_0_reltag4, V1_1_0_reltag3, V1_1_0_reltag2, V1_1_0_reltag1, V1_1_0_reltag, V1_0_3-p4, V1_1_0_cand3, V1_1_0_cand2, V1_1_0_cand1, HEAD_SM_071214, forV1_1_0, v103_xml_071106, V1_0_3-p3, V1_0_3-p2, V1_1_0, v110p1, V110p6, V110p5, V110p4, V110p3, before110xmlBRmerge, V110p2, V110p1, V1_0_4p1, V1_0_3-p1, V1_0_3, V1_0_2, V1_0_2_p1, v102p1, V1_0_1, V1_0_0, V1_pre0, SCRAM_V1, SCRAMV1_IMPORT, V0_19_7, V0_19_6, V0_19_6p1, V0_19_5, SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2, V0_19_4_pre1, V0_19_3, V0_19_2, V0_19_1, V0_19_0, V0_18_5, V0_18_4, V_18_3_TEST, VO_18_3, V0_18_2, V0_18_1, ProtoEnd
Branch point for: forBinLess_SCRAM, HEAD_BRANCH_SM_071214, v200branch, v103_with_xml, v103_branch, V1_pre1, SCRAM_V1_BRANCH, V0_19_4_B, HPWbranch
Changes since 1.11: +17 -2 lines
Log Message:
working versions

File Contents

# Content
1 #
2 # URLclass.pm
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 #
8 # Interface
9 # ---------
10 # new(url) : A new URLclass object
11 # origurl() : return the original url as originally provided in new
12 # url() : return the full url name with all expansion
13 # path() : return the path (all after server name - no vars)
14 # file() : return the filename from the end of the path
15 # param(var) : return the value of a url parameter
16 # servername() : return/set the name of the server
17 # equals(URLclass) : compare with another URLclass object for equality
18 # 0=false 1=true
19 # merge(URLclass) : merge the given URL into the current one according to the
20 # following rules -
21 # - types are identical
22 # - servername is taken only if not set locally
23 # - the local path is appended to that passed in the arg
24 # - variables are added only if they dont already exist
25 # type() : get/set the url type
26 # vars() : get/set the url parameter hash
27 # transfervars(varhash) : transfer any variables from varhash into vars
28 # only if they do not already exist
29
30 package URL::URLclass;
31 require 5.004;
32
33 sub new {
34 my $class=shift;
35 $self={};
36 bless $self, $class;
37 $self->{origurl}=shift;
38 $self->_init();
39 $self->_url($self->{origurl});
40 return $self;
41 }
42
43 sub _init {
44 my $self=shift;
45 $self->{vars}={};
46 $self->{servername}="";
47 $self->{path}="";
48 $self->{type}="";
49 }
50
51 sub origurl {
52 my $self=shift;
53 return $self->{origurl};
54 }
55
56
57 sub servername {
58 my $self=shift;
59 @_?$self->{servername}=shift
60 :$self->{servername};
61 }
62
63 sub path {
64 my $self=shift;
65 @_?$self->{path}=shift
66 :$self->{path};
67 }
68
69 sub type {
70 my $self=shift;
71 @_?$self->{type}=shift
72 :$self->{type};
73 }
74
75 sub vars {
76 my $self=shift;
77 @_?$self->{vars}=shift
78 :$self->{vars};
79 }
80
81 sub url {
82 my $self=shift;
83
84 my $vars=$self->_vartostring();
85 my $server=$self->servername();
86 my $fullurl=$self->type().":".(($server ne "")?"//".$server."/":"").
87 $self->path().(($vars ne "")?"\?".$vars:"");
88 return $fullurl;
89 }
90
91 sub merge {
92 my $self=shift;
93 my $url=shift;
94
95 my $rv=1;
96 # -- can only merge url's of the same type
97 if ( (defined $url) && ($self->type() eq $url->type()) ) {
98 # -- merge server only if it dosnt exist locally
99 if ( (! defined $self->{servername}) || ($self->{servername} eq "") ) {
100 $self->servername($url->servername());
101 }
102 # -- merge path - insert at beginning of existing path
103 if ( defined $url->{path} ) {
104 $self->{path}=$url->{path}.$self->{path};
105 }
106
107 # -- now merge vars
108 $self->transfervars($url->vars());
109 $rv=0;
110 }
111
112 return $rv;
113 }
114
115 sub equals {
116 my $self=shift;
117 my $testurl=shift;
118
119 my $rv=0;
120 if ( $self->servername() eq $testurl->servername() ) {
121 if ( $self->path() eq $testurl->path() ) {
122 # -- check the passed variables
123 my @testkeys=keys %{$testurl->vars()};
124 if ( $#{keys %{$self->{vars}}} == $#testkeys ) {
125 my $okvar=-1;
126 foreach $var ( @testkeys ) {
127 if ( exists $self->{vars}{$var} ) {
128 if ( $self->{vars}{$var} eq $testurl->{vars}{$var} ) {
129 $okvar++;
130 }
131 }
132 }
133 # if we get this far and all the testvars have been tested then
134 if ( $okvar == $#{keys %{$self->{vars}}} ) {
135 $rv=1;
136 }
137 }
138 }
139 }
140 return $rv;
141 }
142
143 sub transfervars {
144 my $self=shift;
145 my $basevars=shift;
146
147 foreach $key ( keys %$basevars ) {
148 if ( ! exists $self->{vars}{$key} ) {
149 $self->{vars}{$key}=$$basevars{$key};
150 }
151 }
152 }
153
154 sub file {
155 my $self=shift;
156 my $file;
157
158 if ( $self->{path}=~/\// ) {
159 ($file=$self->{path})=~s/.*\///g;
160 }
161 else {
162 $file=$self->{path};
163 }
164 return $file;
165 }
166
167 sub param {
168 my $self=shift;
169 my $param=shift;
170
171 $self->{vars}{$param};
172 }
173
174 #
175 # --- Support Routines
176 #
177
178 sub _vartostring {
179 my $self=shift;
180
181 my $string="";
182 foreach $key ( sort(keys %{$self->{vars}}) ) {
183 $string=$string.(($string eq "")?"":"\&").$key."=".$self->{vars}{$key};
184 }
185 return $string;
186 }
187
188 sub _splitvarstring {
189 my $self=shift;
190 my $varstring=shift;
191
192 my @pairs=split /\&/, $varstring;
193 foreach $pair ( @pairs ) {
194 my ($var,$val)= split /=/, $pair;
195 $self->{vars}{$var}=$val;
196 }
197 }
198
199 # process a url string into its component parts
200 sub _url {
201 my $self=shift;
202 my $url=shift;
203
204 if ( $url!~/:/ ) {
205 $self->error("Invalid URL specification - no type: in $url");
206 }
207 else {
208 # -- split out type and lowercase it
209 my ($type, @rest)= split ":", $url;
210 ($self->{type}=$type)=~tr[A-Z][a-z];
211
212 # -- sort out variables
213 my $tmp=join ':' ,@rest;
214 my($path, @varsarray)=split /\?/, $tmp;
215 my $varstring=join '?' ,@varsarray;
216 if ( $varstring ) { $self->_splitvarstring($varstring);}
217
218 # -- extract servername from path
219 if ( ! defined $path ) {
220 $path="";
221 }
222 elsif ( $path=~/^\/\// ) {
223 my $server;
224 ($server,$path)=($path=~/^\/\/(.*?)\/(.*)/);
225 $self->servername($server);
226 }
227 $self->path($path);
228 }
229 }
230
231 sub error {
232 my $self=shift;
233 my $string=shift;
234 print "URLClass: ".$string."\n";
235 die;
236 }