ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLclass.pm
Revision: 1.13
Committed: Fri Jan 14 17:36:43 2011 UTC (14 years, 3 months ago) by muzaffar
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.12: +0 -0 lines
State: FILE REMOVED
Error occurred while calculating annotation data.
Log Message:
merged SCRAM_V2 branch in to head

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 }