ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/URL/URLclass.pm
(Generate patch)

Comparing COMP/SCRAM/src/URL/URLclass.pm (file contents):
Revision 1.10 by williamc, Fri Dec 17 08:46:09 1999 UTC vs.
Revision 1.11 by williamc, Fri Jul 28 17:06:00 2000 UTC

# Line 8 | Line 8
8   # Interface
9   # ---------
10   # new(url)      : A new URLclass object
11 < # origurl()     : retunr the original url without any expansion
11 > # origurl()     : return the original url as originally provided in new
12   # url()         : return the full url name with all expansion
13 < # expandurl(URLbase) : expand the url to include the given base
13 > # path()        : return the path (all after server name - no vars)
14   # file()        : return the filename from the end of the path
15 # base()        : return the basename of the path
16 # fullfile()    : return base/file
15   # param(var)    : return the value of a url parameter
16 < #
17 < # -- specialised use methods
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 vars hash
22 < # base(base)    : push a base into the url path if it dosnt already match
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  
# Line 30 | Line 34 | sub new {
34          my $class=shift;
35          $self={};
36          bless $self, $class;
33        $self->{vars}={};
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
# Line 54 | Line 78 | sub vars {
78            :$self->{vars};
79   }
80  
81 < sub expandurl {
81 > sub url {
82          my $self=shift;
59        my $base=shift;
83          
84 <        $self->{vars}={};
85 <        $self->_url($self->{origurl}); # reset the current url;
86 <        $self->transfervars($base->cmds());
87 <        $self->_base($base->base());
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 <
68 < sub url {
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 ( $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 <        my $vars=$self->_vartostring();
113 <        my $base=$self->base();
114 <        my $fullurl=$self->type()."://".(($base ne "")?$base."//":"").
115 <                        $self->file().(($vars ne "")?"\?".$vars:"");
116 <        return $fullurl;
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 {
# Line 86 | Line 151 | sub transfervars {
151          }
152   }
153  
89 sub fullfile {
90        my $self=shift;
91        return $self->{server}
92 }
93
94 sub base {
95        my $self=shift;
96        my $base="";
97        if ( $self->{server}=~/\/\// ) {
98          ($base=$self->{server})=~s/(.*)\/\/.*/$1/;
99        }
100        elsif ( $self->{server}=~/\// ) {
101          ($base=$self->{server})=~s/(.*)\/.*/$1/;
102        }  
103        return $base;
104 }
105        
154   sub file {
155          my $self=shift;
156          my $file;
157  
158 <        if ( $self->{server}=~/\/\// ) {
159 <          ($file=$self->{server})=~s/.*\/\/(.*)/$1/;
112 <        }
113 <        elsif ( $self->{server}=~/\// ) {
114 <          ($file=$self->{server})=~s/.*\///g;
158 >        if ( $self->{path}=~/\// ) {
159 >          ($file=$self->{path})=~s/.*\///g;
160          }
161          else {
162 <          $file=$self->{server};
162 >          $file=$self->{path};
163          }
164          return $file;
165   }
# Line 130 | Line 175 | sub param {
175   # --- Support Routines
176   #
177  
133 # push a base name into the url string
134 sub _base {
135        my $self=shift;
136        if ( @_ ) {
137          my $server=shift;
138          if ( ($server ne "") && ($self->{server}!~/\/\//) &&
139                        ($self->{server}!~/$server/) ) {
140             # only set if not already in there
141             $self->{server}=$server."\/\/".$self->{server};
142          }
143        }
144        return $self->{server};
145 }
146
178   sub _vartostring {
179          my $self=shift;
180  
# Line 165 | Line 196 | sub _splitvarstring {
196          }
197   }
198  
199 + # process a url string into its component parts
200   sub _url {
201          my $self=shift;
202          my $url=shift;
171        my @rest;
203  
204 <        ($self->{type}, @rest)= split ":", $url;
204 >        # -- split out type and lowercase it
205 >        my ($type, @rest)= split ":", $url;
206 >        ($self->{type}=$type)=~tr[A-Z][a-z];
207 >
208 >        # -- sort out variables
209          my $tmp=join ':' ,@rest;
210 <        ($self->{server}, @varsarray)=split /\?/, $tmp;
210 >        my($path, @varsarray)=split /\?/, $tmp;
211          my $varstring=join '?' ,@varsarray;
177        $self->{server}=~s/^\/\///;
212          if ( $varstring ) { $self->_splitvarstring($varstring);}
213 +
214 +        # -- extract servername from path
215 +        if  ( $path=~/^\/\// ) {
216 +          my $server;
217 +         ($server,$path)=($path=~/^\/\/(.*?)\/(.*)/);
218 +         $self->servername($server);
219 +        }
220 +        $self->path($path);
221   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines