package Cipres::CipresProperties; use File::Spec; use File::Basename; use Exception::Class::TCF; use Cipres::Registry::Observable; use Cipres::SuperClasses::CorbaClient; use Cipres::SuperClasses::Authenticator; use Cipres::SuperClasses::ProcessLauncher; use Cipres::IDL::CipresIDL_api1; use Cipres::IDL::CipresIDL_api1::Scriptable; use Cipres::IDL::CipresIDL_api1::LifeCycle; use Cipres::IDL::CipresIDL_api1::CipresProperties; use vars '@ISA'; @ISA=qw( Cipres::SuperClasses::CorbaClient Cipres::SuperClasses::Authenticator Cipres::SuperClasses::ProcessLauncher ); # object constructor sub new { my $class = shift; my $self = { # holds (at first) empy array ref, to be populated with # the available keys modifiable by the property service '_keys' => Cipres::Registry::Observable->new([]), # holds the most recently retrieved property value '_value' => Cipres::Registry::Observable->new(), # holds the most recently retrieved k/v pair '_prop' => Cipres::Registry::Observable->new({}), }; # instantiate SUPER classes $_->new( $self ) for ( @ISA ); bless $self, __PACKAGE__; # hardcoded interface $self->set_iface( 'Cipres::IDL::CipresIDL_api1::CipresProperties' ); return $self; } sub get_property_observable { shift->{'_prop'} } # set a property value, args: # 'system' => 0, [ 1 = systemwide, 0 = per-user ] # 'name' => $key [ property key ] # 'value' => $value [ property value ] sub set_value { my ( $self, %vars ) = @_; if ( $self->is_connected ) { $self->get_connection->setProperty( @vars{ 'system', 'name', 'value'} ); return $self; } else { throw new Cipres::Exception::ConnectionError Message => 'Not connected!'; } } # get a property value, args: property key sub get_value { my ( $self, $key ) = @_; my $value; if ( $self->is_connected ) { $self->get_connection->getProperty( $key, \$value ); $self->get_value_observable->set( $value ); $self->get_property_observable->set( { $key => $value } ); return $value; } else { throw new Cipres::Exception::ConnectionError Message => 'Not connected!'; } } sub get_value_observable { shift->{'_value'} } # get all keys modifiable by the property service sub get_keys { my $self = shift; if ( $self->is_connected ) { my @keys; for my $prop ( @{ $self->get_connection->getProperties() } ) { push @keys, $prop->[0]; $self->get_property_observable->set( { $prop->[0] => $prop->[1] } ); } $self->get_keys_observable->set( \@keys ); return \@keys; } else { throw new Cipres::Exception::ConnectionError Message => 'Not connected!'; } } sub get_keys_observable { shift->{'_keys'} } # hardcoded name to find logs and pid files sub get_name { 'propsvc' }; # command to launch process sub get_command { my $self = shift; my $file = __FILE__; my ( $name, $path, $suffix ) = fileparse( $file ); my $jarpath = File::Spec->catfile( $path, '../../../../lib/cipres', 'cipres-classpath.jar' ); my $jar_file = File::Spec->canonpath( $jarpath ); my $lib_path = `java -classpath $jar_file org.cipres.jni.JavaLibPath`; chomp( $lib_path ); my ( $libname, $libpath, $libsuffix ) = fileparse( $jar_file ); $lib_path = $libpath . ':' . $lib_path; return "java -Djava.library.path=${lib_path} -ea -classpath ${jar_file} org.cipres.properties.PropertiesApp & |"; } sub DESTROY { shift->stop } 1;