Blame | Last modification | View Log | RSS feed
################################################################################ CLASS Clearcase::CmdProc# Derived Class of CCCmd that provides the basic framework for storing the results# of executing the command in the base class. It also provides the framework# to allow further processing of the stored data.# Derived classes should override the CCCmd base classes CCProcess member to# allow the derived class to process the result of the Cmd and use the framework# provided to store information about the files produced by the CCCmd output.## The class stores information in a member called FILEINFO that is an array of# annonymous hashes. The contents of the hash's store information about each file.# A Hash FILEINDEX is used to as an index into the array the hash is keyed by the# file name and each key stores the index number of that file in the array.# A CURRENTFILEINDEX element hold the index of the current element being processed## A new element is added to the array by using the addToFileList member. It sets# the array element hash to contain the file name and also updates the index &# sets the CURRENTFILEINDEX to the index of the file in the array.## The updateCurrentFile member allows additional fields to be added to the current# elements hash by supplying hash key & value to be added.###############################################################################package Clearcase::CmdProc;use strict;use DeployUtils::Logger;use Clearcase::Cmd;# Inherits from CCCmduse vars qw( @ISA );@ISA = qw( Clearcase::Cmd );#==============================================================================# Constructor#==============================================================================sub new{my $obclass = shift;my $class = ref($obclass) || $obclass;LogDebug("Clearcase::CmdProc::new Instantiating new object of class $class");# Call base class's constructormy $self = $class->SUPER::new();# Add this class's data to the class object$self->{FILEINFO} = []; # array whose elements are hashes used to hold information about CC files$self->{FILEINDEX} = { }; # hash on file names storing position of file in array above$self->{CURRENTFILEINDEX} = undef; # holds the index of the current element in the array,bless($self, $class); # reconsecratereturn($self);} # new#==============================================================================# FileInfoDump prints the contents of the FILEINFO array# It simply uses the Data::Dumper to dump the contents of the array#==============================================================================sub FileInfoDump{use Data::Dumper;my $self = shift;print Data::Dumper->Dump([$self->{FILEINFO}], ["FileList"]);} # CCprint#==============================================================================# addToFileList adds the information to the File list# The 1st parameter is the file to add.# If the name is not in the list it pushes a hash containing the file name# onto array and adds it to the index hash with the array element number.# The contents of the array element can be updated as needed# If name is in hash it does nothing.# Regardless it returns the array element number for name and is stored locally# in the class hash to allow additional changes to element#==============================================================================sub addToFileList{my $self = shift;my $name = shift;if ( ! defined($self->{FILEINDEX}{$name}) ){push(@{$self->{FILEINFO}}, { NAME => $name } );$self->{CURRENTFILEINDEX} = $#{$self->{FILEINFO}};$self->{FILEINDEX}{$name} = $self->{CURRENTFILEINDEX};LogDebug("Clearcase::CmdProc::addToFileList Added $name to list at index $self->{CURRENTFILEINDEX}");}else{$self->{CURRENTFILEINDEX} = $self->{FILEINDEX}{$name};LogDebug("Clearcase::CmdProc::addToFileList File $name exists in list just return index $self->{CURRENTFILEINDEX}");}return $self->{CURRENTFILEINDEX};} # addToFileList#==============================================================================# updateCurrentFile# Updates/adds fields to the current FILEINFO element $self->{CURRENTFILEINDEX}.# The paramaters should be passed in groups of 2 so that each group of 2 contains# The Hash key Name and its value# eg updateCurrentFileListElement("STATE", "CHECKEDOUT", "VERSION", 2);#==============================================================================sub updateCurrentFile{my $self = shift;# correct number of parameters?if ( ($#_+1)%2 != 0 ){LogError("Clearcase::CmdProc::updateCurrentFile Incorrect number of params passed to function.");}my $index = $self->{CURRENTFILEINDEX};LogError("Clearcase::CmdProc::updateCurrentFile Calling this member when CurrentFileIndex is undefined") if ( !defined($index) );for ( my $i=0; $i < $#_; $i+=2 ){$self->{FILEINFO}[$index]{$_[$i]} = $_[$i+1];}} # updateCurrentFile#==============================================================================# getNumElements# Returns the number of elements in the FILEINFO ARRAY#==============================================================================sub getNumElements{my $self = shift;return ($#{$self->{FILEINFO}} + 1 );} # getNumElements#==============================================================================# getFirstElement# Returns a reference to the hash in the first element of the array & sets# $self->{CURRENTFILEINDEX} to 0. Returns undef if array is empty#==============================================================================sub getFirstElement{my $self = shift;if ( $#{$self->{FILEINFO}} >= 0 ){$self->{CURRENTFILEINDEX} = 0;return \%{$self->{FILEINFO}[$self->{CURRENTFILEINDEX}]};}else{$self->{CURRENTFILEINDEX} = undef;return undef;}} # getFirstElement#==============================================================================# getNextElement# Increments $self->{CURRENTFILEINDEX} and returns a reference to the hash in# that element of the array, returns undef at end of array#==============================================================================sub getNextElement{my $self = shift;if ( $self->{CURRENTFILEINDEX} < $#{$self->{FILEINFO}} ){return \%{$self->{FILEINFO}[++$self->{CURRENTFILEINDEX}]};}else{$self->{CURRENTFILEINDEX} = undef;return undef;}} # getNextElement#==============================================================================# getElement# Returns a reference to the hash located at the index supplied. Returns undef# if that index is invalid or does not exist. Sets $self->{CURRENTFILEINDEX}# to index if successfull#==============================================================================sub getElement{my $self = shift;my $index = shift;if ( $index >= 0 && $index <= $#{$self->{FILEINFO}} ){$self->{CURRENTFILEINDEX} = $index;return \%{$self->{FILEINFO}[$self->{CURRENTFILEINDEX}]};}else{LogWarn("Clearcase::CmdProc::getElement Index out of range");$self->{CURRENTFILEINDEX} = undef;return undef;}} # getElement#==============================================================================# findName# Seaches for element defined by name supplied.# if found returns a reference to the hash for that element, otherwise undef#==============================================================================sub findName{my $self = shift;my $name = shift;LogError("CmdProc::findName must supply name to find") if ( ! defined($name) );if ( defined($self->{FILEINDEX}{$name}) ){return \%{$self->{FILEINFO}[$self->{FILEINDEX}{$name}]};}else{return undef;}} # findName1;