summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/Cws.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/Cws.pm')
-rwxr-xr-xsolenv/bin/modules/Cws.pm2153
1 files changed, 2153 insertions, 0 deletions
diff --git a/solenv/bin/modules/Cws.pm b/solenv/bin/modules/Cws.pm
new file mode 100755
index 000000000000..6948c21d554e
--- /dev/null
+++ b/solenv/bin/modules/Cws.pm
@@ -0,0 +1,2153 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+
+#
+# Cws.pm - package for accessing/manipulating child workspaces
+#
+
+# TODO: needs some cleanup
+
+package Cws;
+use strict;
+
+use Eis;
+use CwsConfig;
+use Carp;
+use URI::Escape;
+
+my $config = CwsConfig::get_config();
+
+##### class data #####
+
+my %CwsClassData = (
+ # EIS database connectivity
+ EIS_URI => 'urn:ChildWorkspaceDataService',
+ EIS_PROXY_LIST => $config->cws_db_url_list_ref(),
+ NET_PROXY => $config->net_proxy(),
+ EIS => undef
+);
+
+##### ctor #####
+
+sub new
+{
+ my $invocant = shift;
+ my $class = ref($invocant) || $invocant;
+ my $self = {};
+ # instance data
+ # initialize CWS name from environment
+ $self->{CHILD} = undef; # name of child workspace
+ $self->{MASTER} = undef; # name of master workspace
+ $self->{EIS_ID} = undef; # id of child workspace in EIS
+ $self->{FILES} = undef; # list of files registered with child
+ # any file can be registered multiple times
+ $self->{PATCH_FILES} = undef # list of product patch files registered with
+ # child, each file can be added only once
+ $self->{MILESTONE} = undef; # master milestone to which child is related
+ $self->{MODULES} = undef; # list of modules belonging to child
+ $self->{INCOMPATIBLE_MODULES} = undef; # list of modules belonging to child
+ $self->{NEW_MODULES} = undef; # list of public new modules belonging to child
+ $self->{NEW_MODULES_PRIV} = undef; # list of private new modules belonging to child
+ $self->{TASKIDS} = undef; # list of tasks registered with child
+ $self->{_CACHED_TAGS} = undef; # list of cached tags (tags are looked up frequently)
+ bless($self, $class);
+ return $self;
+}
+
+#### methods to access instance data ####
+
+# Get the EIS ID for child workspace,
+# return value: undef => not yet asked EIS for ID
+# or connection failed
+# 0 => queried EIS but didn't find such
+# a child workspace for this master
+# silently ignore any parameter, only the EIS database,
+# hands out EIS IDs.
+sub eis_id
+{
+ my $self = shift;
+ if ( !defined($self->{EIS_ID} ) ) {
+ $self->{EIS_ID} = $self->get_eis_id();
+ }
+ return $self->{EIS_ID};
+}
+
+# Generate remaining instance data accessor methods;
+# if this looks strange see 'perldoc perltootc'
+
+# Accessor methods for single value instance data
+for my $datum (qw(master milestone)) {
+ no strict "refs";
+ *$datum = sub {
+ my $self = shift;
+ my $ucdatum = uc($datum);
+ if ( @_ ) {
+ # set item in database
+ my $item = shift;
+ # if we already have a valid EIS registered CWS then reset EIS value
+ # otherwise just set member to the given value
+ if ( !$self->{uc($datum)} # keep order of evaluation
+ || !$self->eis_id()
+ || $self->set_item_in_eis($datum, $item) )
+ {
+ $self->{uc($datum)} = $item;
+
+ }
+ }
+ else {
+ if ( !defined($self->{$ucdatum} ) ) {
+ # fetch item from database
+ $self->{$ucdatum} = $self->fetch_item_from_eis($datum);
+ }
+ }
+ return $self->{uc($datum)};
+ }
+}
+
+# Accessor methods for instance data consisting of item lists
+# like modules and taskids
+for my $datum (qw(files patch_files modules incompatible_modules new_modules new_modules_priv taskids)) {
+ no strict "refs";
+ *$datum = sub {
+ # get current item list
+ # fetch list from EIS database if called the first time
+ my $self = shift;
+ my $ucdatum = uc($datum);
+ if ( !defined($self->{$ucdatum}) ) {
+ # fetch item list from databse
+ $self->{$ucdatum} = $self->fetch_items_from_eis($datum);
+ return undef if !defined($self->{$ucdatum});
+ }
+ return wantarray ? @{$self->{$ucdatum}} : $self->{$ucdatum}
+ }
+}
+
+for my $datum (qw(child)) {
+ no strict "refs";
+ *$datum = sub {
+ my $self = shift;
+ $self->{uc($datum)} = shift if @_;
+ return $self->{uc($datum)};
+ }
+}
+
+
+#### additional public methods ####
+
+# For resync: Sets master and milestone simultaneously
+# In case of a cross master resync it does not make sense to
+# change both items separately
+sub set_master_and_milestone
+{
+ my $self = shift;
+ my $master = shift or return undef;
+ my $milestone = shift or return undef;
+
+ # if we do not yet have a valid EIS registered CWS use the above more basic methods
+ if ( !$self->master()
+ || !$self->milestone()
+ || !$self->eis_id() )
+ {
+ $self->master($master);
+ $self->milestone($milestone);
+ } else {
+ if ( $self->set_master_and_milestone_in_eis($master, $milestone) ) {
+ $self->{'MASTER'} = $self->fetch_item_from_eis('master');
+ $self->{'MILESTONE'} = $self->fetch_item_from_eis('milestone');
+ }
+ }
+ my @retarray = ($self->{'MASTER'}, $self->{'MILESTONE'});
+ return wantarray ? @retarray : \@retarray;
+}
+
+# Query if CWS name is still available. Does not yet register
+# anything with EIS.
+sub is_cws_name_available
+{
+ my $self = shift;
+
+ my $is_available = $self->is_cws_name_available_in_eis();
+ return $is_available;
+}
+
+# Register new child workspace with the EIS database.
+sub register
+{
+ my $self = shift;
+ my $vcsid = shift;
+ my $location = shift;
+
+ my $child_id = $self->register_child_with_eis($vcsid, $location);
+ return $child_id;
+}
+
+# Promote a child workspace with status 'planned' to a full CWS
+sub promote
+{
+ my $self = shift;
+ my $vcsid = shift;
+ my $location = shift;
+
+ my $rc = $self->promote_child_in_eis($vcsid, $location);
+ return $rc;
+}
+
+# New style add_module method. Takes an additional bool indicating if
+# a module is public or private. Obsoletes add_modules()
+sub add_module
+{
+ my $self = shift;
+ my $module = shift;
+ my $public = shift;
+
+ my $items_ref = $self->add_items('modules', $public, $module);
+ if (defined ($items_ref->[0]) && ($items_ref->[0] eq $module)) {
+ return 1; # module has been added
+ }
+ elsif ( defined($items_ref) ) {
+ return 0; # module was already add
+ }
+ return undef; # something went wrong
+}
+
+# Add module to modules list.
+sub add_modules
+{
+ my $self = shift;
+
+ my $items_ref = $self->add_items('modules', undef, @_);
+ return undef unless defined($items_ref);
+ return wantarray ? @{$items_ref} : $items_ref;
+}
+
+# Add tasksids to taskids list.
+sub add_taskids
+{
+ my $self = shift;
+ my $vcsid = shift;
+
+ my $items_ref = $self->add_items('taskids', $vcsid, @_);
+ return undef unless defined($items_ref);
+ return wantarray ? @{$items_ref} : $items_ref;
+}
+
+# Add a file to the files list.
+sub add_file
+{
+ my $self = shift;
+ my $module = shift;
+ my $file = shift;
+ my $revision = shift;
+ my $authors_ref = shift;
+ my $taskids_ref = shift;
+ my $archive_path = shift;
+
+ my $files_ref = $self->files();
+
+ if ( $self->add_file_to_eis($module, $file, $revision,
+ $authors_ref, $taskids_ref, $archive_path) )
+ {
+ push(@{$files_ref}, $file);
+ return 1;
+ }
+ return 0;
+}
+
+# Add a file to the patch file list.
+sub add_patch_file
+{
+ my $self = shift;
+ my $file = shift;
+
+ my $patch_files_ref = $self->patch_files();
+
+ foreach (@{$patch_files_ref}) {
+ return 0 if $file eq $_;
+ }
+
+ if ( $self->add_patch_file_to_eis($file) )
+ {
+ push(@{$patch_files_ref}, $file);
+ return 1;
+ }
+ return 0;
+}
+
+#
+# Procedure retrieves the workspace which
+# is based on cvs head (not branch)
+#
+sub get_cvs_head {
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getCVSHead() };
+ if ( $@ ) {
+ carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+};
+
+#### public class methods ####
+
+sub get_master_tag {
+ my ($self, $master, $milestone) = @_;
+ $master = $self->master() if (!defined $master);
+ $milestone = $self->milestone() if (!defined $milestone);
+ return uc($master) . '_' . lc($milestone);
+};
+
+sub get_master_branch_tag {
+ my ($self, $master) = @_;
+ $master = $self->master() if (!defined $master);
+ # check in environment if master is on the the HEAD branch
+ my $cvs_head = get_cvs_head();
+ if ( $master eq $cvs_head ) {
+ return undef;
+ }
+ else {
+ return 'mws_' . lc($master);
+ }
+};
+
+sub get_mws {
+ my $self = shift;
+ my $eis = Cws::eis();
+ my $masters;
+ my $child = Eis::to_string($self->child());
+ eval { $masters = $eis->getMastersForCWS($child) };
+ if ( $@ ) {
+ carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $$masters[0];
+};
+
+# Returns the branch and root tags for child workspace.
+sub get_tags
+{
+ my $self = shift;
+
+ # look up if tags have already been retrieved
+ if ( defined($self->{_CACHED_TAGS}) ) {
+ return @{$self->{_CACHED_TAGS}};
+ }
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $childws = $self->child();
+ # check if child workspace is a clone,
+ if ( $childws =~ /(\w+)_[[:upper:]]{3}\d{3}/ ) {
+ $childws = $1;
+ }
+
+ # check in environment if master is on the the HEAD branch
+ my $cvs_head = get_cvs_head();
+ my $current_master = $self->master();
+ my $creation_master = $self->get_creation_master();
+ if ( !$creation_master ) {
+ carp("ERROR: Can't determine creation MWS.\n");
+ return undef;
+ }
+ my $milestone = $self->milestone();
+
+ my $master_branch_tag
+ = (lc($current_master) eq lc($cvs_head)) ? '' : 'mws_' . lc($current_master);
+ my $cws_branch_tag = 'cws_' . lc($creation_master) . '_' . lc($childws);
+ my $cws_root_tag = uc($cws_branch_tag) . "_ANCHOR";
+ my $master_milestone_tag = uc($current_master) . "_" . $milestone;
+
+ $self->{_CACHED_TAGS} = [$master_branch_tag, $cws_branch_tag, $cws_root_tag, $master_milestone_tag];
+ return @{$self->{_CACHED_TAGS}};
+}
+
+# Get childworkspace owner
+sub get_owner
+{
+ my $self = shift;
+
+ return $self->get_owner_from_eis();
+}
+
+# get childworkspace qarep
+sub get_qarep
+{
+ my $self = shift;
+
+ return $self->get_qarep_from_eis();
+}
+
+# store an Attachment to a given CWS
+sub save_attachment
+{
+ my $self = shift;
+ my $name = shift;
+ my $mediatype = shift;
+ my $data = shift;
+
+ return $self->save_attachment_in_eis($name, $mediatype, $data);
+}
+
+# Get child workspace approval status,
+# return values can be:
+# 'planned', 'new', 'nominated', 'integrated'
+# and undef in case of error.
+sub get_approval
+{
+ my $self = shift;
+
+ return $self->get_status_from_eis();
+}
+
+# Set child workspace approval status
+# to 'integrated'. Return true if successful
+# or undef in case of error
+sub set_integrated
+{
+ my $self = shift;
+
+ return $self->set_status_in_eis();
+}
+
+# Set child workspace integration milestone
+# Return true if successful or undef in case of error
+sub set_integration_milestone
+{
+ my $self = shift;
+ my $milestone = shift;
+ my $buildid = shift;
+
+ return $self->set_integration_milestone_in_eis($milestone, $buildid);
+}
+
+# Get the MWS on which a CWS was created
+sub get_creation_master
+{
+ my $self = shift;
+
+ return $self->get_creation_master_from_eis();
+}
+
+# Get the 'public' flag indicating whether a CWS is visible on OOo
+sub get_public_flag
+{
+ my $self = shift;
+
+ return $self->get_public_flag_from_eis();
+}
+
+
+# Get the 'publicmaster' flag indicating whether a MWS is visible on OOo
+sub get_publicmaster_flag
+{
+ my $self = shift;
+
+ return $self->get_publicmaster_flag_from_eis();
+}
+
+
+sub get_subversion_flag {
+
+ my $self = shift;
+
+ return $self->get_subversion_flag_from_eis();
+}
+
+sub set_subversion_flag {
+
+ my $self = shift;
+ my $value = shift;
+
+ return $self->set_subversion_flag_in_eis($value);
+}
+
+sub get_scm {
+ my $self = shift;
+
+ return $self->get_scm_from_eis();
+}
+
+sub set_scm {
+ my $self = shift;
+ my $scm_name = shift;
+
+ return $self->set_scm_in_eis($scm_name);
+}
+
+
+# Check if milestone exists
+sub is_milestone
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ return $self->is_milestone_registered_with_eis($master, $milestone);
+}
+
+# Check if this cws contains new ui
+sub is_uirelevant
+{
+ my $self = shift;
+
+ return $self->is_uirelevant_from_eis();
+}
+
+# Check if this cws contains new online help
+sub is_helprelevant
+{
+ my $self = shift;
+
+ return $self->is_helprelevant_from_eis();
+}
+
+# Set the l10n status
+sub set_l10n_status
+{
+ my $self = shift;
+ my $status = shift;
+
+ return $self->set_l10n_status_in_eis( $status );
+}
+
+# Get the l10n status
+sub get_l10n_status
+{
+ my $self = shift;
+
+ return $self->get_l10n_status_from_eis();
+}
+sub set_word_count
+{
+ my $self = shift;
+ my $language = shift;
+ my $wordcount = shift;
+
+ return $self->set_word_count_in_eis( $language , $wordcount );
+}
+
+
+# Get target release for CWS
+sub get_release
+{
+ my $self = shift;
+
+ return $self->get_release_from_eis();
+}
+
+# Get due date
+sub get_due_date
+{
+ my $self = shift;
+
+ return $self->get_due_date_from_eis();
+}
+
+# Get due date QA
+sub get_due_date_qa
+{
+ my $self = shift;
+
+ return $self->get_due_date_qa_from_eis();
+}
+
+# Query master milestone combination for being used by an
+# active CWS
+sub is_milestone_used
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ return $self->get_is_milestone_used_from_eis($master, $milestone);
+}
+
+# Set current milestone for MWS.
+sub set_current_milestone
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ return $self->set_current_milestone_in_eis($master, $milestone);
+}
+
+# Get current milestone for MWS.
+sub get_current_milestone
+{
+ my $self = shift;
+ my $master = shift;
+
+ return $self->get_current_milestone_from_eis($master);
+}
+
+sub get_milestone_integrated
+{
+ my $self = shift;
+
+ return $self->get_milestone_integrated_from_eis();
+}
+
+# Get masters
+sub get_masters
+{
+
+ my $self = shift;
+
+ return $self->get_masters_from_eis();
+}
+
+# Get milestones for MWS.
+sub get_milestones
+{
+ my $self = shift;
+ my $master = shift;
+
+ return $self->get_milestones_from_eis($master);
+}
+# get build string for CWS
+
+sub get_build
+{
+ my $self = shift;
+ my $master = $self->master();
+ my $milestone = $self->milestone();
+ if ( ! defined($milestone) ) {
+ return undef;
+ }
+ my $bid=$self->get_buildid($master,$milestone);
+ if ( ! defined($bid) ) {
+ return undef;
+ }
+ return $self->expand_buildid($bid);
+}
+
+
+
+# expand build for given cwsname
+sub expand_buildid
+{
+ my $self = shift;
+ my $bid = shift;
+ return $self->expand_buildid_in_eis($bid);
+}
+
+
+# Set BuildID of milestone
+sub set_milestone_buildid
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+ my $buildid = shift;
+
+ return $self->set_milestone_buildid_in_eis($master, $milestone, $buildid);
+}
+
+# Declare milestone 'removed'
+# This triggers EIS to send emails to all (SO-internal) CWS owners
+# with living CWSs based on that milestone.
+sub milestone_removed
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ return $self->set_milestone_removed_in_eis($master, $milestone);
+}
+
+
+# Get all child workspaces which have been integrated on a
+# given master and milestone.
+sub get_integrated_cws
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ my $childworkspaces_arrref = $self->get_childworkspaces_for_milestone($master, $milestone);
+ if ( !$childworkspaces_arrref ) {
+ $childworkspaces_arrref = [];
+ }
+ return wantarray ? @$childworkspaces_arrref : $childworkspaces_arrref;
+}
+
+
+# Get builid for given master and milestone.
+sub get_buildid
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ return $self->get_buildid_for_milestone($master, $milestone);
+}
+
+#
+# Get all cws' with a status passed
+#
+sub get_cws_with_state
+{
+ my $self = shift;
+ my $mws = shift;
+ my $status = shift;
+
+ return wantarray ? @{$self->get_cws_with_state_from_eis($mws, $status)}
+ : $self->get_cws_with_state_from_eis($mws, $status);
+}
+
+sub get_task_prio_cws
+{
+ my $self = shift;
+ my $ref_taskids = shift;
+ return @{$self->get_task_prios_of_tasks($ref_taskids)};
+}
+
+# Check is CWS is cloneable for specified master
+sub is_cws_cloneable
+{
+ my $self = shift;
+ my $master = shift;
+
+ return $self->get_is_cws_cloneable_from_eis($master);
+}
+
+# Clone CWS for specified master
+sub clone_cws
+{
+ my $self = shift;
+ my $master = shift;
+
+ return $self->clone_cws_in_eis($master);
+}
+
+sub set_log_entry
+{
+ my $self = shift;
+ my $commandline = shift;
+ my $vcsid = shift;
+ my $start = shift;
+ my $stop = shift;
+ my $comment = shift;
+ return $self->set_log_entry_in_eis($commandline, $vcsid, $start, $stop, $comment);
+}
+
+sub set_log_entry_extended
+{
+ my $self = shift;
+ my $commandname = shift;
+ my $parameter = shift;
+ my $vcsid = shift;
+ my $start = shift;
+ my $stop = shift;
+ my $comment = shift;
+ my $mastername = shift;
+ my $childname = shift;
+#set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
+ return $self->set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
+}
+
+
+#### private ####
+
+# class data accessor methods
+sub eis
+{
+ shift; # ignore calling class/object
+ $CwsClassData{EIS} = shift if @_;
+ if ( !defined($CwsClassData{EIS}) ) {
+ $CwsClassData{EIS} = init_eis_connector();
+ }
+ return $CwsClassData{EIS};
+}
+
+# generate remaining class data accessor methods
+# if this looks strange see 'perldoc perltootc'
+for my $datum (qw(eis_uri eis_proxy_list net_proxy)) {
+ no strict "refs";
+ *$datum = sub {
+ shift; # ignore calling class/object
+ return $CwsClassData{uc($datum)};
+ }
+}
+
+#### helper methods ####
+
+# instance methods
+
+# Add item to items list,
+# update eis database,
+# returns a list of newly added items,
+# specifying an existing item is not an
+# error, but it want appear in the return list.
+sub add_items
+{
+ my $self = shift;
+ my $type = shift;
+ my $optional_data = shift;
+
+ my $items_ref;
+ if ( $type eq 'modules' ) {
+ $items_ref = $self->modules();
+ }
+ elsif ( $type eq 'taskids' ) {
+ $items_ref = $self->taskids();
+ }
+ else {
+ # fall through, can't happen
+ carp("ERROR: wrong item type\n");
+ return undef;
+ }
+
+ my $item;
+ my @new_items = ();
+ return undef if !defined($items_ref);
+ # find which items which are not already in items list
+ ITEM: while ( $item = shift ) {
+ foreach ( @{$items_ref} ) {
+ next ITEM if $_ eq $item;
+ }
+ push(@new_items, $item);
+ }
+ if ( $#new_items > -1 ) {
+ # add items to database
+ if ( $self->add_items_to_eis($type, $optional_data, \@new_items) ) {
+ push(@{$items_ref}, @new_items);
+ }
+ else {
+ # something went wrong
+ return undef;
+ }
+ }
+ return \@new_items;
+}
+
+# Get EIS id for workspace from EIS database
+sub get_eis_id
+{
+ my $self = shift;
+ my $eis = Cws::eis();
+
+ # It's not an error if one of these is unset, so don't carp().
+ if ( !$self->master() || !$self->child() ) {
+ return undef;
+ }
+
+ my $master = Eis::to_string($self->master());
+ my $child = Eis::to_string($self->child());
+
+ my $result;
+ eval { $result = int($eis->getChildWorkspaceId($master, $child)) };
+ if ( $@ ) {
+ carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub fetch_item_from_eis
+{
+ my $self = shift;
+ my $type = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $result;
+ if ( $type eq 'milestone' ) {
+ eval { $result = $eis->getMilestone($id) };
+ }
+ elsif ( $type eq 'master' ) {
+ # master can't be queried from the EIS database,
+ # just return what already in member
+ return $self->{MASTER}
+ }
+ else {
+ # fall through, can't happen
+ carp("ERROR: wrong item type\n");
+ return undef;
+ }
+ if ( $@ ) {
+ carp("ERROR: fetch_item(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub set_item_in_eis
+{
+ my $self = shift;
+ my $type = shift;
+ my $item = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ # make certain that the item is a string, otherwise
+ # autotyping will occasionally choose the wrong type
+ $item = Eis::to_string($item);
+
+ my $result;
+ if ( $type eq 'milestone' ) {
+ # this operation invalidates the cached tags list
+ $self->{_CACHED_TAGS} = undef;
+ eval { $result = $eis->setMilestone($id, $item) };
+ }
+ elsif ( $type eq 'master' ) {
+ # this operation invalidates the cached tags list
+ $self->{_CACHED_TAGS} = undef;
+ eval { $result = $eis->setMasterWorkspace($id, $item) };
+ }
+ else {
+ # fall through, can't happen
+ carp("ERROR: wrong item type\n");
+ return 0;
+ }
+
+ if ( $@ ) {
+ carp("ERROR: set_item(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ return 1 if $result;
+ return 0;
+}
+
+sub set_master_and_milestone_in_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ # make certain that the item is a string, otherwise
+ # autotyping will occasionally choose the wrong type
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $result;
+ # this operation invalidates the cached tags list
+ $self->{_CACHED_TAGS} = undef;
+ eval { $result = $eis->setMasterWorkspaceAndMilestone($id, $master, $milestone) };
+
+ if ( $@ ) {
+ carp("ERROR: set_master_and_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ return 1 if $result;
+ return 0;
+}
+
+sub fetch_items_from_eis
+{
+ my $self = shift;
+ my $type = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $result;
+ if ( $type eq 'modules' ) {
+ eval { $result = $eis->getModules($id) };
+ }
+ elsif ( $type eq 'incompatible_modules' ) {
+ eval { $result = $eis->getIncompatibleModules($id) };
+ }
+ elsif ( $type eq 'new_modules' ) {
+ eval { $result = $eis->getNewModules($id) };
+ }
+ elsif ( $type eq 'new_modules_priv' ) {
+ eval { $result = $eis->getNewModulesPriv($id) };
+ }
+ elsif ( $type eq 'taskids' ) {
+ eval { $result = $eis->getTaskIds($id) };
+ }
+ elsif ( $type eq 'files' ) {
+ eval { $result = $eis->getFiles($id) };
+ }
+ elsif ( $type eq 'patch_files' ) {
+ eval { $result = $eis->getOutputFiles($id) };
+ }
+ else {
+ # fall through, can't happen
+ carp("ERROR: wrong item type\n");
+ return undef;
+ }
+ if ( $@ ) {
+ carp("ERROR: fetch_item(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub add_items_to_eis
+{
+ my $self = shift;
+ my $type = shift;
+ my $optional_data = shift;
+ my $item_ref = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ # make certain that all items are strings, otherwise
+ # autotyping will occasionally choose the wrong type
+ my @items = ();
+ foreach ( @{$item_ref} ) {
+ push(@items, Eis::to_string($_));
+ }
+
+ my $result;
+ if ( $type eq 'modules' ) {
+ if ( defined($optional_data) ) {
+ # add a module new style, with public attribute
+ eval { $result = $eis->addModule($id, $items[0], $optional_data) };
+ }
+ else {
+ # old style, add a list of modules
+ eval { $result = $eis->addModules($id, \@items) };
+ }
+ }
+ elsif ( $type eq 'taskids' ) {
+ eval { $result = $eis->addTaskIds($id, \@items, $optional_data) };
+ }
+ else {
+ # fall through, can't happen
+ carp("ERROR: wrong item type\n");
+ return 0;
+ }
+
+ if ( $@ ) {
+ carp("ERROR: add_item(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ return 1 if $result;
+ return 0;
+}
+
+sub add_file_to_eis
+{
+ my $self = shift;
+ my $module = shift;
+ my $file = shift;
+ my $revision = shift;
+ my $authors_ref = shift;
+ my $taskids_ref = shift;
+ my $archive_path = shift;
+
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ # make certain that all task_ids are strings, otherwise
+ # autotyping will choose the wrong type
+ # Note: I think typing just the first element should suffice, but ...
+ my @taskids = ();
+ foreach ( @{$taskids_ref} ) {
+ push(@taskids, Eis::to_string($_));
+ }
+ # HACK Its possible that we get no valid taskid.
+ # Autotyping will fail for a list without elements;
+ if ( !@taskids ) {
+ push(@taskids, Eis::to_string(''));
+ }
+
+ # same for revision
+ $revision = Eis::to_string($revision);
+
+ if ( !$archive_path ) {
+ $archive_path = Eis::to_string('');
+ }
+
+ my $result;
+ eval {
+ $result = $eis->addFile($id, $module, $file, $archive_path,
+ $revision, $authors_ref, \@taskids)
+ };
+ if ( $@ ) {
+ carp("ERROR: add_file(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ return 1 if $result;
+ return 0;
+}
+
+sub add_patch_file_to_eis
+{
+ my $self = shift;
+ my $file = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $result;
+ eval { $result = $eis->addOutputFile($id, $file) };
+ if ( $@ ) {
+ carp("ERROR: add_patch_file(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ return $1;# appOutputFile has void as return value ...
+}
+
+sub is_cws_name_available_in_eis
+{
+ my $self = shift;
+
+ if ( !$self->master() ) {
+ carp("ERROR: master workspace name not set\n");
+ return undef;
+ }
+
+ if ( !$self->child() ) {
+ carp("ERROR: child workspace name not set\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $master = Eis::to_string($self->master());
+ my $child = Eis::to_string($self->child());
+
+ my $result;
+ eval { $result = $eis->isChildWorkspaceUnique($master, $child) };
+ if ( $@ ) {
+ carp("ERROR: is_cws_name_available(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub register_child_with_eis
+{
+ my $self = shift;
+ my $vcsid = shift;
+ my $location = shift;
+
+ if ( !$self->master() ) {
+ carp("ERROR: master workspace name not set\n");
+ return undef;
+ }
+
+ if ( !$self->milestone() ) {
+ carp("ERROR: master milestone not set\n");
+ return undef;
+ }
+
+ if ( !$self->child() ) {
+ carp("ERROR: child workspace name not set\n");
+ return undef;
+ }
+
+ $vcsid = '' unless $vcsid;
+ $location = '' unless $location;
+
+ my $eis = Cws::eis();
+ my $master = Eis::to_string($self->master());
+ my $milestone = Eis::to_string($self->milestone());
+ my $child = Eis::to_string($self->child());
+
+ $vcsid = Eis::to_string($vcsid);
+ $location = Eis::to_string($location);
+
+ my $result;
+ eval {
+ $result = $eis->createChildWorkspace($master, $milestone, $child,
+ $vcsid, $location)
+ };
+
+ if ( $@ ) {
+ carp("ERROR: create_child_workspace(): EIS database transaction failed. Reason:\n$@\n");
+ return undef;
+ }
+ # set EIS_ID directly, since $self->eis_id() is not
+ # supposed to take parameters.
+ $self->{EIS_ID} = $result;
+ return $result;
+}
+
+sub promote_child_in_eis
+{
+ my $self = shift;
+ my $vcsid = shift;
+ my $location = shift;
+
+ my $eis = Cws::eis();
+ my $id = $self->eis_id();
+
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ if ( !$self->milestone() ) {
+ carp("ERROR: master milestone not set\n");
+ return undef;
+ }
+
+ my $milestone = Eis::to_string($self->milestone());
+
+ $vcsid = '' unless $vcsid;
+ $location = '' unless $location;
+
+ $vcsid = Eis::to_string($vcsid);
+ $location = Eis::to_string($location);
+
+ my $result;
+ eval {
+ $result = $eis->initializeChildWorkspace($id, $milestone, $vcsid, $location)
+ };
+
+ eval { $result = $eis->getStatus($id) };
+ if ( $@ ) {
+ carp("ERROR: promote(): EIS database transaction failed. Reason:\n$@\n");
+ return 0;
+ }
+ return 1;
+}
+
+# Get child workspace owner from EIS,
+# return undef in case of error.
+sub get_owner_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getOwnerEmail($id) };
+ if ( $@ ) {
+ carp("ERROR: get_OwnerEmail(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# Get child workspace qarep from EIS,
+# return undef in case of error.
+sub get_qarep_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getQARepresentativeEmail($id) };
+ if ( $@ ) {
+ carp("ERROR: get_qarep(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# store an attachment to a given CWS
+# return undef in case of error.
+sub save_attachment_in_eis
+{
+ my $self = shift;
+ my $name = shift;
+ my $mediatype = shift;
+ my $text = shift;
+
+ # check if child workspace is valid
+ my $eisid = $self->eis_id();
+ if ( !$eisid )
+ {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eisname = Eis::to_string($name);
+ my $eismediatype = Eis::to_string($mediatype);
+ my $eistextstring = Eis::to_string($text);
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->saveAttachment($eisid, $eisname, $eismediatype, $eistextstring ) };
+ if ( $@ ) {
+ carp("ERROR: save_attachment_in_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# Get child workspace approval status from EIS,
+# return undef in case of error.
+sub get_status_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getStatus($id) };
+ if ( $@ ) {
+ carp("ERROR: get_status(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# Get child workspace approval status from EIS,
+# return undef in case of error.
+sub set_status_in_eis
+{
+ my $self = shift;
+ my $status = shift;
+ my $method = 'set';
+ $method .= (defined $status) ? $status : 'Integrated';
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+ my $eis = Cws::eis();
+ my $result;
+ if (defined $status) {
+ eval { $result = $eis->setFixedOnMaster($id) };
+ } else {
+ eval { $result = $eis->setIntegrated($id) };
+ }
+ if ( $@ ) {
+ carp("ERROR: $method(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# Get child workspace approval status from EIS,
+# return undef in case of error.
+sub set_integration_milestone_in_eis
+{
+ my $self = shift;
+ my $milestone = shift;
+ my $buildid = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+
+ # just in case ...
+ if ( !defined($milestone) ) {
+ $milestone = Eis::to_string('');
+ }
+ # $buildid must be transfered as string
+ if ( !defined($buildid) ) {
+ $buildid = Eis::to_string('');
+ }
+ else {
+ $buildid = Eis::to_string($buildid);
+ }
+
+ my $result;
+ eval { $result = $eis->setIntegrationMilestone($id, $milestone, $buildid) };
+ if ( $@ ) {
+ carp("ERROR: set_integration_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub set_milestone_buildid_in_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+ my $buildid = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+ $buildid = Eis::to_string($buildid);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->setMilestoneBuild( $master, $milestone, $buildid ) };
+ if ( $@ ) {
+ carp("ERROR: set_milestone_buildid(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub set_current_milestone_in_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->setCurrentMilestone( $master, $milestone ) };
+ if ( $@ ) {
+ carp("ERROR: set_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_current_milestone_from_eis
+{
+ my $self = shift;
+ my $master = shift;
+
+ $master = Eis::to_string($master);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getCurrentMilestone( $master ) };
+ if ( $@ ) {
+ carp("ERROR: get_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_masters_from_eis
+{
+ my $self = shift;
+
+ my $eis = Cws::eis();
+ my @result;
+ eval { @result = $eis->getMasterWorkspaces() };
+ if ( $@ ) {
+ carp("ERROR: get_masters(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ my @result2=();
+ my $i=0;
+ while ( defined($result[0][$i]) ) {
+ push @result2,$result[0][$i];
+ $i++;
+ }
+ return @result2;
+}
+
+
+sub get_milestones_from_eis
+{
+ my $self = shift;
+ my $master = shift;
+
+ $master = Eis::to_string($master);
+
+ my $eis = Cws::eis();
+ my @result;
+ eval { @result = $eis->getMilestones( $master ) };
+ if ( $@ ) {
+ carp("ERROR: get_milestones(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ my @result2=();
+ my $i=0;
+ while ( defined($result[0][$i]) ) {
+ push @result2,$result[0][$i];
+ $i++;
+ }
+ return @result2;
+}
+
+# Get child workspace owner from EIS,
+# return undef in case of error.
+sub expand_buildid_in_eis
+{
+ my $self = shift;
+ my $bid = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $name = $self->child();
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->expandBuildId($bid, $name) };
+ if ( $@ ) {
+ carp("ERROR: expand_builid(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub set_milestone_removed_in_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ eval { $eis->minorRemoved( $master, $milestone ) };
+ if ( $@ ) {
+ carp("ERROR: set_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return;
+}
+
+sub is_milestone_registered_with_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isMilestoneValid($master, $milestone) };
+ if ( $@ ) {
+ carp("ERROR: is_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_is_milestone_used_from_eis
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isMilestoneInUse($master, $milestone) };
+ if ( $@ ) {
+ carp("ERROR: is_milestone_used(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_buildid_for_milestone
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getMilestoneBuild($master, $milestone) };
+ if ( $@ ) {
+ carp("ERROR: get_buildid_for_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_childworkspaces_for_milestone
+{
+ my $self = shift;
+ my $master = shift;
+ my $milestone = shift;
+
+ $master = Eis::to_string($master);
+ $milestone = Eis::to_string($milestone);
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->searchChildWorkspacesForMilestone($master, $milestone) };
+ if ( $@ ) {
+ carp("ERROR: get_childworkspaces_for_milestone(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_cws_with_state_from_eis {
+ my $self = shift;
+ my $mws = shift;
+ my $status = shift;
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getCWSWithState($mws, $status) };
+ if ( $@ ) {
+ carp("ERROR: get_cws_with_state_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_task_prios_of_tasks
+{
+ my $self = shift;
+ my $ref_taskids = shift;
+
+ my $eis = Cws::eis();
+ my $result;
+ my @items = ();
+ foreach ( @{$ref_taskids} ) {
+ push(@items, Eis::to_string($_));
+ }
+
+ eval { $result = $eis->getTasksPriorities( \@items ) };
+ if ( $@ ) {
+ carp("ERROR: get_task_prios_of_tasks(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_creation_master_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getCreationMasterWorkspace($id) };
+ if ( $@ ) {
+ carp("ERROR: get_creation_master(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+
+}
+
+sub get_milestone_integrated_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getMilestoneIntegrated($id) };
+ if ( $@ ) {
+ carp("ERROR: get_milestone_integrated(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+
+}
+
+# get isPublic flag from eis
+sub get_public_flag_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isPublic($id) };
+ if ( $@ ) {
+ carp("ERROR: get_public_flag(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# get isPublicMaster flag from eis
+sub get_publicmaster_flag_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $master = $self->master();
+ if ( !$master ) {
+ carp("ERROR: MasterWorkspace not defined.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isPublicMaster($master) };
+ if ( $@ ) {
+ carp("ERROR: get_publicmaster_flag(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# get isSubVersion flag from eis
+sub get_subversion_flag_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isSubVersion($id) };
+ if ( $@ ) {
+ carp("ERROR: get_subversion_flag(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+# set isSubVersion flag in eis
+sub set_subversion_flag_in_eis
+{
+ my $self=shift;
+ my $status=shift;
+
+ my $bool_status=SOAP::Data->type(boolean => $status);
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->setSubVersion($id,$bool_status) };
+ if ( $@ ) {
+ carp("ERROR: get_subversion_flag(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub get_scm_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getSCMName($id) };
+ if ( $@ ) {
+ carp("ERROR: get_scm_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+sub set_scm_in_eis
+{
+ my $self = shift;
+ my $scm_name = shift;
+
+ $scm_name = Eis::to_string($scm_name);
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ eval { $eis->setSCMName($id, $scm_name) };
+ if ( $@ ) {
+ carp("ERROR: set_scm_in_eis(): EIS database transaction failed. Reason:\n$@\n");
+ return 0;
+ }
+ return 1;
+}
+
+sub is_uirelevant_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isUIRelevant($id) };
+ if ( $@ ) {
+ carp("ERROR: is_uirelevant_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub is_helprelevant_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->isHelpRelevant( $id ) };
+ if ( $@ ) {
+ carp("ERROR: is_helprelevant_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+sub set_word_count_in_eis
+{
+ my $self = shift;
+ my $language = shift;
+ my $wordcount = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->setWordCount( $id , $language , $wordcount ) };
+ if ( $@ ) {
+ carp("ERROR: set_word_count_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+
+sub get_l10n_status_from_eis
+{
+ my $self = shift;
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->getL10n( $id ) };
+ if ( $@ ) {
+ carp("ERROR: get_l10n_status_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub set_l10n_status_in_eis
+{
+ my $self = shift;
+ my $status = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->setL10n( $id , $status ) };
+ if ( $@ ) {
+ carp("ERROR: set_l10n_status_in_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub get_is_cws_cloneable_from_eis
+{
+ my $self = shift;
+ my $master = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->isClonableForMaster($id, $master) };
+ if ( $@ ) {
+ carp("ERROR: get_is_cws_cloneable_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub clone_cws_in_eis
+{
+ my $self = shift;
+ my $master = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $eis->cloneForMaster($id, $master) };
+ if ( $@ ) {
+ carp("ERROR: clone_cws_in_eis(): EIS database transaction failed. Reason:\n$@\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+sub get_release_from_eis
+{
+ my $self = shift;
+ my $master = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->getRelease($id) };
+ if ( $@ ) {
+ carp("ERROR: get_release_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub get_due_date_from_eis
+{
+ my $self = shift;
+ my $master = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->getDueDate($id) };
+ if ( $@ ) {
+ carp("ERROR: get_due_date_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+sub get_due_date_qa_from_eis
+{
+ my $self = shift;
+ my $master = Eis::to_string( shift );
+
+ # check if child workspace is valid
+ my $id = $self->eis_id();
+ if ( !$id ) {
+ carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
+ return undef;
+ }
+
+ my $eis = Cws::eis();
+ my $result;
+
+ eval { $result = $eis->getDueDateQA($id) };
+ if ( $@ ) {
+ carp("ERROR: get_due_date_qa_from_eis(): EIS database transaction failed. Reason:\n$@\n");
+ }
+
+ return $result;
+}
+
+
+#logging
+sub set_log_entry_in_eis
+{
+ my $self = shift;
+ my $commandline = shift;
+ my $vcsid = shift;
+ my $start = shift;
+ my $end = shift;
+ my $comment = shift;
+
+ $commandline = SOAP::Data->type(string => $commandline);
+ $comment = SOAP::Data->type(string => $comment);
+
+ # *format* for $start and $end = "2003-05-28 12:34:59";
+
+#=====================================================
+ #TO DO:
+ #experimenell fr saubere schnittstelle
+ #$start = SOAP::Data->type(dateTime => $start);
+ #$end = SOAP::Data->type(dateTime => $end);
+#=====================================================
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->storeCommandLogEntry( $commandline, $vcsid, $start, $end, $comment ) };
+ if ( $@ ) {
+ carp("ERROR: set_log_entry(): Logging failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+#set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
+sub set_log_entry_extended_in_eis
+{
+ my $self = shift;
+ my $commandname = shift;
+ my $parameter = shift;
+ my $vcsid = shift;
+ my $start = shift;
+ my $end = shift;
+ my $comment = shift;
+ my $mastername = shift;
+ my $childname = shift;
+
+ $commandname = SOAP::Data->type(string => $commandname);
+ $parameter = SOAP::Data->type(string => $parameter);
+ $comment = SOAP::Data->type(string => $comment);
+ $mastername = SOAP::Data->type(string => $mastername);
+ $childname = SOAP::Data->type(string => $childname);
+
+ # *format* for $start and $end = "2003-05-28 12:34:59";
+
+#=====================================================
+ #TO DO:
+ #experimenell fr saubere schnittstelle
+ #$start = SOAP::Data->type(dateTime => $start);
+ #$end = SOAP::Data->type(dateTime => $end);
+#=====================================================
+
+ my $eis = Cws::eis();
+ my $result;
+ eval { $result = $eis->storeCommandLogEntry($commandname, $parameter, $vcsid, $start, $end, $comment, $mastername, $childname) };
+ if ( $@ ) {
+ carp("ERROR: set_log_entry_extended(): Logging failed. Reason:\n$@\n");
+ }
+ return $result;
+}
+
+
+#### class methods ####
+
+sub init_eis_connector
+{
+ my $eis = Eis->new( uri => Cws::eis_uri(),
+ proxy_list => Cws::eis_proxy_list(),
+ net_proxy => Cws::net_proxy()
+ );
+ return $eis;
+}
+
+####
+
+1; # needed by "use" or "require"
+# vim: set ts=4 shiftwidth=4 expandtab syntax=perl: