Author: spadkins
Date: Tue Jun 26 08:29:24 2007
New Revision: 9682

Modified:
   p5ee/trunk/App-Context/lib/App/Context.pm

Log:
added conf file includes and service clones

Modified: p5ee/trunk/App-Context/lib/App/Context.pm
==============================================================================
--- p5ee/trunk/App-Context/lib/App/Context.pm   (original)
+++ p5ee/trunk/App-Context/lib/App/Context.pm   Tue Jun 26 08:29:24 2007
@@ -459,37 +459,71 @@
 
     $session = $self->{session};
     $service = $session->{cache}{$type}{$name};  # check the cache
+    $conf = $self->{conf};
+    $service_conf = $conf->{$type}{$name};
+    my $temporary = $args->{temporary};
+    my $service_initialized = ($service && ref($service) ne "HASH");
 
     ##############################################################
     # Load extra conf on demand
     ##############################################################
-    $conf = $self->{conf};
-    $service_conf = $conf->{$type}{$name};
-    if (!$service_conf) {
+    if (!$service_initialized && !$service_conf && $name !~ /-/) {   # if it's 
not a contained widget, try the file system
         my $options = $self->{options};
         my $prefix = $options->{prefix};
         my $conf_type = $options->{conf_type} || "pl";
         my $conf_file = "$prefix/etc/app/$type.$name.$conf_type";
-        if (-r $conf_file) {
-            $service_conf = App::Conf::File->create({ conf_file => $conf_file 
});
-            $conf->{$type}{$name} = $service_conf;
+        if (!$self->{conf_included}{$conf_file} && -r $conf_file) {
+            my $aux_conf = App::Conf::File->create({ conf_file => $conf_file 
});
+            $conf->overlay($aux_conf);
+            $service_conf = $conf->{$type}{$name};
         }
+        $self->{conf_included}{$conf_file} = 1;
     }
 
     ##############################################################
     # aliases
     ##############################################################
-    if (defined $service_conf) {
+    if (!$service_initialized && $service_conf) {
         my $alias = $service_conf->{alias};
         if ($alias) {
             $name = $alias;
             $service = $session->{cache}{$type}{$name};
             $service_conf = $conf->{$type}{$name};
         }
+        elsif ($type ne "Authorization" && ($service_conf->{clone} || 
$service_conf->{auth_clone})) {
+            my $clone = $self->get_auth_attrib_value($service_conf, $type, 
$name, "clone");
+            if ($clone) {
+                $service_conf = $conf->{$type}{$clone};
+            }
+        }
+    }
+
+    ##############################################################
+    # conf includes
+    ##############################################################
+    if (!$service_initialized && $service_conf && $service_conf->{include}) {
+        my $options = $self->{options};
+        my $prefix = $options->{prefix};
+        my (@include_files);
+        my $include_files = $service_conf->{include};
+        if (ref($include_files) eq "ARRAY") {
+            @include_files = @$include_files;
+        }
+        elsif (ref($include_files) eq "") {
+            @include_files = ( $include_files );
+        }
+        foreach my $conf_file (@include_files) {
+            $conf_file = "$prefix/etc/app/$conf_file" if ($conf_file !~ m!^/!);
+            next if ($self->{conf_included}{$conf_file});
+            if (-r $conf_file) {
+                my $aux_conf = App::Conf::File->create({ conf_file => 
$conf_file });
+                $conf->overlay($aux_conf);
+            }
+            $self->{conf_included}{$conf_file} = 1;
+        }
     }
 
     $new_service = 0;
-    my $temporary = $args->{temporary};
 
     #   NEVER DEFINED     OR   NON-BLESSED HASH (fully defined services are 
blessed into classes)
     if ($temporary || !defined $service || ref($service) eq "HASH") {
@@ -851,6 +885,60 @@
 }
 
 #############################################################################
+# get_auth_attrib_value()
+#############################################################################
+
+=head2 get_auth_attrib_value()
+
+The get_auth_attrib_value() consults the "default" Authorization service to 
determine
+the "authorized" value of a service configuration's attribute.
+
+    * Signature: $attrib_value = $self->get_auth_attrib_value($service_conf, 
$service_type, $service_name, $attrib);
+    * Param:  $service_conf            HASH
+    * Param:  $service_type            string
+    * Param:  $service_name            string
+    * Param:  $attrib                  string
+    * Return: $attrib_value            ANY
+    * Throws: <none>
+    * Since:  0.01
+
+    Sample Usage: 
+
+    $service_type = "SessionObject";
+    $service_name = "foo";
+    $service_conf = $self->{conf}{$service_type}{$service_name};
+    $clone_name = $self->get_auth_attrib_value($service_conf, $service_type, 
$service_name, "clone");
+
+=cut
+
+sub get_auth_attrib_value {
+    my ($self, $service_conf, $service_type, $service_name, $attrib) = @_;
+    my ($auth_value);
+    my $auth_value_list = $service_conf->{"auth_$attrib"};
+    if ($auth_value_list && ref($auth_value_list) eq "ARRAY") {
+        my ($auth_key, $auth_name);
+        my $auth = $self->authorization();
+        for (my $i = 0; $i <= $#$auth_value_list; $i += 2) {
+            $auth_name = $auth_value_list->[$i];
+            if ($auth_name =~ m!^/!) {
+                $auth_key = $auth_name;
+            }
+            else {
+                $auth_key = "/App/$service_type/$service_name/$auth_name";
+            }
+            if ($auth->is_authorized($auth_key)) {
+                $auth_value = $auth_value_list->[$i+1];
+                last;
+            }
+        }
+    }
+    if (!$auth_value) {
+        $auth_value = $service_conf->{$attrib};
+    }
+    return($auth_value);
+}
+
+#############################################################################
 # so_get()
 #############################################################################
 

Reply via email to