/usr/local/CPAN/new.spirit/NewSpirit/CIPP/ProdReplace.pm
# $Id: ProdReplace.pm,v 1.5 2003/01/30 16:25:50 joern Exp $
package NewSpirit::CIPP::ProdReplace;
$VERSION = "0.01";
#---------------------------------------------------------------------
# This module is for CIPP object types, which need the functionality
# of multiple versions for different installation targets, i.e.
# Config and Database objects.
#---------------------------------------------------------------------
use strict;
use Carp;
use File::Find;
sub property_widget_target_config {
my $self = shift;
my %par = @_;
my $name = $par{name};
my $data = $par{data_href};
my $q = $self->{q};
my $files = $self->get_base_configs;
my (@files, %labels);
foreach my $file (sort keys %{$files}) {
my $tmp = $file;
$tmp =~ s!/!.!g;
$tmp =~ s!\.cipp-base-config$!!;
$tmp =~ s!\.cipp-driver-config$!!;
next if $tmp eq 'configuration';
push @files, $file;
$labels{$file} = "$self->{project}.$tmp";
}
print $q->popup_menu (
-name => $name,
-values => [ @files ],
-default => $data->{$name},
-labels => \%labels
);
print qq{<a href="$self->{object_url}&e=refresh_base_config_popup&next_e=properties"><b>Refresh Base Configuration Popup</b></a>},
}
#---------------------------------------------------------------------
# get_base_configs - Returns a hash of base config objects
#---------------------------------------------------------------------
# SYNOPSIS:
# $config_href = $self->get_base_configs
#
# DESCRIPTION:
# This method returns a hash of base config object names defined
# in this project. This hash ist stored in a project specific
# file. If this file does not exist, the information will
# be gathered from the filesystem and stored to the file.
#
# If base configuration objects are created or deleted this
# file must be updated.
#---------------------------------------------------------------------
sub get_base_configs {
my $self = shift;
my $base_configs_file = $self->{project_base_configs_file};
if ( not -f $base_configs_file ) {
# uh oh, not there yet, we must scan the source
# tree for cipp-base-config files
my %files;
my $src_dir = $self->{project_src_dir};
find (
sub {
return 1 if /^\./;
if ( /\.(cipp-base-config|cipp-driver-config)$/ ) {
my $filename = "$File::Find::dir/$_";
$filename =~ s!^$src_dir/!!;
$files{$filename} = 1;
}
1;
},
$src_dir
);
my $df = new NewSpirit::DataFile ($base_configs_file);
$df->write (\%files);
$df = undef;
return \%files;
} else {
my $df = new NewSpirit::DataFile ($base_configs_file);
return $df->read;
}
}
#---------------------------------------------------------------------
# refresh_base_config_popup - Creates a new base config hash file
#---------------------------------------------------------------------
# SYNOPSIS:
# $self->refresh_base_config_popup
#
# DESCRIPTION:
# The base_config hash file will be recreated. Then the to
# $q->param('next_e') corresponding _ctrl method ist called.
#---------------------------------------------------------------------
sub refresh_base_config_popup {
my $self = shift;
my $file = $self->{project_base_configs_file};
unlink $file;
$self->get_base_configs;
my $e = $self->{q}->param('next_e');
my $method = "${e}_ctrl";
$self->{event} = $e;
$self->$method();
}
#---------------------------------------------------------------------
# get_install_object_name - returns target object name for actual base config
#---------------------------------------------------------------------
# SYNOPSIS:
# $self->get_install_object_name
#
# DESCRIPTION:
# Depending on $self->{project_base_conf} the target object
# name will be determined.
#
#---------------------------------------------------------------------
sub get_install_object_name {
my $self = shift;
my $project_base_conf = $self->{project_base_conf};
return $self->{object_name}
if $project_base_conf eq $CFG::default_base_conf;
my $prop = $self->get_meta_data;
if ( $prop->{target_config} eq $self->{project_base_conf} and
$prop->{replace_object} ) {
return $self->canonify_object_name ($prop->{replace_object});
}
return $self->{object_name};
}
sub replace_target_prod_file {
my $self = shift;
my $object_name = $self->get_install_object_name;
if ( $object_name ne $self->{object_name} ) {
print "$self->{object_name} replaces $object_name ... ";
print "<FONT COLOR=green><B>OK</B></FONT><br>\n";
$self->install_file;
return $object_name;
} else {
return;
}
}
sub installation_allowed {
my $self = shift;
if ( $self->{project_base_conf} eq $CFG::default_base_conf ) {
# print STDERR "$self->{object_name}: normal install\n";
return 1;
} else {
# ok we have an alternate base config
my $object_name = $self->get_install_object_name;
if ( $object_name ne $self->{object_name} ) {
# only install, if we are a replace object
# print STDERR "$self->{object_name}: replace install -> $object_name\n";
return 2;
}
}
# print STDERR "$self->{object_name}: NO install\n";
0;
}
sub check_properties {
my $self = shift;
my ($meta) = @_;
return if not $meta->{replace_object};
my $filename = $self->get_object_src_file ( $meta->{replace_object} );
if ( not $filename ) {
return "Replace object '$meta->{replace_object}' does not exist!";
} else {
return;
}
return;
}
1;