xref: /aoo4110/main/solenv/bin/modules/Cws.pm (revision b1cdbd2c)
1#**************************************************************
2#
3#  Licensed to the Apache Software Foundation (ASF) under one
4#  or more contributor license agreements.  See the NOTICE file
5#  distributed with this work for additional information
6#  regarding copyright ownership.  The ASF licenses this file
7#  to you under the Apache License, Version 2.0 (the
8#  "License"); you may not use this file except in compliance
9#  with the License.  You may obtain a copy of the License at
10#
11#    http://www.apache.org/licenses/LICENSE-2.0
12#
13#  Unless required by applicable law or agreed to in writing,
14#  software distributed under the License is distributed on an
15#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16#  KIND, either express or implied.  See the License for the
17#  specific language governing permissions and limitations
18#  under the License.
19#
20#**************************************************************
21
22
23
24
25#
26# Cws.pm - package for accessing/manipulating child workspaces
27#
28
29# TODO: needs some cleanup
30
31package Cws;
32use strict;
33
34use Eis;
35use CwsConfig;
36use Carp;
37use URI::Escape;
38
39my $config = CwsConfig::get_config();
40
41##### class data #####
42
43my %CwsClassData = (
44    # EIS database connectivity
45    EIS_URI        => 'urn:ChildWorkspaceDataService',
46    EIS_PROXY_LIST => $config->cws_db_url_list_ref(),
47    NET_PROXY      => $config->net_proxy(),
48    EIS            => undef
49);
50
51##### ctor #####
52
53sub new
54{
55    my $invocant = shift;
56    my $class = ref($invocant) || $invocant;
57    my $self = {};
58    # instance data
59    # initialize CWS name from environment
60    $self->{CHILD}        = undef;    # name of child workspace
61    $self->{MASTER}       = undef;    # name of master workspace
62    $self->{EIS_ID}       = undef;    # id of child workspace in EIS
63    $self->{FILES}        = undef;    # list of files registered with child
64                                      # any file can be registered multiple times
65    $self->{PATCH_FILES}  = undef     # list of product patch files registered with
66                                      # child, each file can be added only once
67    $self->{MILESTONE}    = undef;    # master milestone to which child is related
68    $self->{MODULES}      = undef;    # list of modules belonging to child
69    $self->{INCOMPATIBLE_MODULES}      = undef;    # list of modules belonging to child
70    $self->{NEW_MODULES}      = undef; # list of public new modules belonging to child
71    $self->{NEW_MODULES_PRIV}      = undef; # list of private new modules belonging to child
72    $self->{TASKIDS}      = undef;    # list of tasks registered with child
73    $self->{_CACHED_TAGS} = undef;    # list of cached tags (tags are looked up frequently)
74    bless($self, $class);
75    return $self;
76}
77
78#### methods to access instance data ####
79
80# Get the EIS ID for child workspace,
81# return value: undef => not yet asked EIS for ID
82#                        or connection failed
83#               0     => queried EIS but didn't find such
84#                        a child workspace for this master
85# silently ignore any parameter, only the EIS database,
86# hands out EIS IDs.
87sub eis_id
88{
89    my $self = shift;
90    if ( !defined($self->{EIS_ID} ) ) {
91            $self->{EIS_ID} = $self->get_eis_id();
92    }
93    return $self->{EIS_ID};
94}
95
96# Generate remaining instance data accessor methods;
97# if this looks strange see 'perldoc perltootc'
98
99# Accessor methods for single value instance data
100for my $datum (qw(master milestone)) {
101    no strict "refs";
102    *$datum = sub {
103        my $self = shift;
104        my $ucdatum = uc($datum);
105        if ( @_ ) {
106            # set item in database
107            my $item = shift;
108            # if we already have a valid EIS registered CWS then reset EIS value
109            # otherwise just set member to the given value
110            if ( !$self->{uc($datum)} # keep order of evaluation
111                || !$self->eis_id()
112                || $self->set_item_in_eis($datum, $item) )
113            {
114               $self->{uc($datum)} = $item;
115
116            }
117        }
118        else {
119            if ( !defined($self->{$ucdatum} ) ) {
120                # fetch item from database
121                $self->{$ucdatum} = $self->fetch_item_from_eis($datum);
122            }
123        }
124        return $self->{uc($datum)};
125    }
126}
127
128# Accessor methods for instance data consisting of item lists
129# like modules and taskids
130for my $datum (qw(files patch_files modules incompatible_modules new_modules new_modules_priv taskids)) {
131    no strict "refs";
132    *$datum = sub {
133        # get current item list
134        # fetch list from EIS database if called the first time
135        my $self = shift;
136        my $ucdatum = uc($datum);
137        if ( !defined($self->{$ucdatum}) ) {
138            # fetch item list from databse
139            $self->{$ucdatum} = $self->fetch_items_from_eis($datum);
140            return undef if !defined($self->{$ucdatum});
141        }
142        return wantarray ? @{$self->{$ucdatum}} : $self->{$ucdatum}
143    }
144}
145
146for my $datum (qw(child)) {
147    no strict "refs";
148    *$datum = sub {
149        my $self = shift;
150        $self->{uc($datum)} = shift if @_;
151        return $self->{uc($datum)};
152    }
153}
154
155
156#### additional public methods ####
157
158# For resync: Sets master and milestone simultaneously
159# In case of a cross master resync it does not make sense to
160# change both items separately
161sub set_master_and_milestone
162{
163    my $self      = shift;
164    my $master    = shift or return undef;
165    my $milestone = shift or return undef;
166
167    # if we do not yet have a valid EIS registered CWS use the above more basic methods
168    if ( !$self->master()
169         || !$self->milestone()
170         || !$self->eis_id() )
171    {
172        $self->master($master);
173        $self->milestone($milestone);
174    } else {
175        if ( $self->set_master_and_milestone_in_eis($master, $milestone) ) {
176            $self->{'MASTER'} = $self->fetch_item_from_eis('master');
177            $self->{'MILESTONE'} = $self->fetch_item_from_eis('milestone');
178        }
179    }
180    my @retarray = ($self->{'MASTER'}, $self->{'MILESTONE'});
181    return wantarray ? @retarray : \@retarray;
182}
183
184# Query if CWS name is still available. Does not yet register
185# anything with EIS.
186sub is_cws_name_available
187{
188    my $self     = shift;
189
190    my $is_available = $self->is_cws_name_available_in_eis();
191    return $is_available;
192}
193
194# Register new child workspace with the EIS database.
195sub register
196{
197    my $self     = shift;
198    my $vcsid    = shift;
199    my $location = shift;
200
201    my $child_id = $self->register_child_with_eis($vcsid, $location);
202    return $child_id;
203}
204
205# Promote a child workspace with status 'planned' to a full CWS
206sub promote
207{
208    my $self     = shift;
209    my $vcsid    = shift;
210    my $location = shift;
211
212    my $rc = $self->promote_child_in_eis($vcsid, $location);
213    return $rc;
214}
215
216# New style add_module method. Takes an additional bool indicating if
217# a module is public or private. Obsoletes add_modules()
218sub add_module
219{
220    my $self   = shift;
221    my $module = shift;
222    my $public = shift;
223
224    my $items_ref =  $self->add_items('modules', $public, $module);
225    if (defined ($items_ref->[0]) &&  ($items_ref->[0] eq $module)) {
226        return 1;  # module has been added
227    }
228    elsif ( defined($items_ref) ) {
229        return 0;  # module was already add
230    }
231    return undef;  # something went wrong
232}
233
234# Add module to modules list.
235sub add_modules
236{
237    my $self   = shift;
238
239    my $items_ref =  $self->add_items('modules', undef, @_);
240    return undef unless defined($items_ref);
241    return wantarray ? @{$items_ref} : $items_ref;
242}
243
244# Add tasksids to taskids list.
245sub add_taskids
246{
247    my $self   = shift;
248    my $vcsid  = shift;
249
250    my $items_ref = $self->add_items('taskids', $vcsid, @_);
251    return undef unless defined($items_ref);
252    return wantarray ? @{$items_ref} : $items_ref;
253}
254
255# Add a file to the files list.
256sub add_file
257{
258    my $self         = shift;
259    my $module       = shift;
260    my $file         = shift;
261    my $revision     = shift;
262    my $authors_ref  = shift;
263    my $taskids_ref  = shift;
264    my $archive_path = shift;
265
266    my $files_ref = $self->files();
267
268    if ( $self->add_file_to_eis($module, $file, $revision,
269            $authors_ref, $taskids_ref, $archive_path) )
270    {
271        push(@{$files_ref}, $file);
272        return 1;
273    }
274    return 0;
275}
276
277# Add a file to the patch file list.
278sub add_patch_file
279{
280    my $self         = shift;
281    my $file         = shift;
282
283    my $patch_files_ref = $self->patch_files();
284
285    foreach (@{$patch_files_ref}) {
286        return 0 if $file eq $_;
287    }
288
289    if ( $self->add_patch_file_to_eis($file) )
290    {
291        push(@{$patch_files_ref}, $file);
292        return 1;
293    }
294    return 0;
295}
296
297#
298# Procedure retrieves the workspace which
299# is based on cvs head (not branch)
300#
301sub get_cvs_head {
302    my $eis = Cws::eis();
303    my $result;
304    eval { $result = $eis->getCVSHead() };
305    if ( $@ ) {
306        carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
307    }
308    return $result;
309};
310
311#### public class methods ####
312
313sub get_master_tag {
314    my ($self, $master, $milestone) = @_;
315    $master = $self->master() if (!defined $master);
316    $milestone = $self->milestone() if (!defined $milestone);
317    return uc($master) . '_' . lc($milestone);
318};
319
320sub get_master_branch_tag {
321    my ($self, $master) = @_;
322    $master = $self->master() if (!defined $master);
323    # check in environment if master is on the the HEAD branch
324    my $cvs_head = get_cvs_head();
325    if ( $master eq $cvs_head ) {
326        return undef;
327    }
328    else {
329        return 'mws_' . lc($master);
330    }
331};
332
333sub get_mws {
334    my $self = shift;
335    my $eis = Cws::eis();
336    my $masters;
337    my $child  = Eis::to_string($self->child());
338    eval { $masters = $eis->getMastersForCWS($child) };
339    if ( $@ ) {
340        carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
341    }
342    return $$masters[0];
343};
344
345# Returns the branch and root tags for child workspace.
346sub get_tags
347{
348    my $self = shift;
349
350    # look up if tags have already been retrieved
351    if ( defined($self->{_CACHED_TAGS}) ) {
352        return @{$self->{_CACHED_TAGS}};
353    }
354
355    # check if child workspace is valid
356    my $id = $self->eis_id();
357    if ( !$id ) {
358        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
359        return undef;
360    }
361
362    my $childws = $self->child();
363    # check if child workspace is a clone,
364    if ( $childws =~ /(\w+)_[[:upper:]]{3}\d{3}/ ) {
365        $childws = $1;
366    }
367
368    # check in environment if master is on the the HEAD branch
369    my $cvs_head = get_cvs_head();
370    my $current_master = $self->master();
371    my $creation_master = $self->get_creation_master();
372    if ( !$creation_master ) {
373        carp("ERROR: Can't determine creation MWS.\n");
374        return undef;
375    }
376    my $milestone = $self->milestone();
377
378    my $master_branch_tag
379        = (lc($current_master) eq lc($cvs_head)) ? '' : 'mws_' . lc($current_master);
380    my $cws_branch_tag = 'cws_' . lc($creation_master) . '_' . lc($childws);
381    my $cws_root_tag   = uc($cws_branch_tag) . "_ANCHOR";
382    my $master_milestone_tag = uc($current_master) . "_" . $milestone;
383
384    $self->{_CACHED_TAGS} = [$master_branch_tag, $cws_branch_tag, $cws_root_tag, $master_milestone_tag];
385    return @{$self->{_CACHED_TAGS}};
386}
387
388# Get childworkspace owner
389sub get_owner
390{
391    my $self = shift;
392
393    return $self->get_owner_from_eis();
394}
395
396# get childworkspace qarep
397sub get_qarep
398{
399    my $self = shift;
400
401    return $self->get_qarep_from_eis();
402}
403
404# store an Attachment to a given CWS
405sub save_attachment
406{
407    my $self = shift;
408    my $name = shift;
409    my $mediatype = shift;
410    my $data = shift;
411
412    return $self->save_attachment_in_eis($name, $mediatype, $data);
413}
414
415# Get child workspace approval status,
416# return values can be:
417# 'planned', 'new', 'nominated', 'integrated'
418# and undef in case of error.
419sub get_approval
420{
421    my $self = shift;
422
423    return $self->get_status_from_eis();
424}
425
426# Set child workspace approval status
427# to 'integrated'. Return true if successful
428# or undef in case of error
429sub set_integrated
430{
431    my $self = shift;
432
433    return $self->set_status_in_eis();
434}
435
436# Set child workspace integration milestone
437# Return true if successful or undef in case of error
438sub set_integration_milestone
439{
440    my $self      = shift;
441    my $milestone = shift;
442    my $buildid   = shift;
443
444    return $self->set_integration_milestone_in_eis($milestone, $buildid);
445}
446
447# Get the MWS on which a CWS was created
448sub get_creation_master
449{
450    my $self = shift;
451
452    return $self->get_creation_master_from_eis();
453}
454
455# Get the 'public' flag indicating whether a CWS is visible on OOo
456sub get_public_flag
457{
458    my $self = shift;
459
460    return $self->get_public_flag_from_eis();
461}
462
463
464# Get the 'publicmaster' flag indicating whether a MWS is visible on OOo
465sub get_publicmaster_flag
466{
467    my $self = shift;
468
469    return $self->get_publicmaster_flag_from_eis();
470}
471
472
473sub get_subversion_flag {
474
475    my $self      = shift;
476
477    return $self->get_subversion_flag_from_eis();
478}
479
480sub set_subversion_flag {
481
482    my $self      = shift;
483    my $value	  = shift;
484
485    return $self->set_subversion_flag_in_eis($value);
486}
487
488sub get_scm {
489    my $self  = shift;
490
491    return $self->get_scm_from_eis();
492}
493
494sub set_scm {
495    my $self     = shift;
496    my $scm_name = shift;
497
498    return $self->set_scm_in_eis($scm_name);
499}
500
501
502# Check if milestone exists
503sub is_milestone
504{
505    my $self      = shift;
506    my $master    = shift;
507    my $milestone = shift;
508
509    return $self->is_milestone_registered_with_eis($master, $milestone);
510}
511
512# Check if this cws contains new ui
513sub is_uirelevant
514{
515    my $self      = shift;
516
517    return $self->is_uirelevant_from_eis();
518}
519
520# Check if this cws contains new online help
521sub is_helprelevant
522{
523    my $self      = shift;
524
525    return $self->is_helprelevant_from_eis();
526}
527
528# Set the l10n status
529sub set_l10n_status
530{
531    my $self        = shift;
532    my $status      = shift;
533
534    return $self->set_l10n_status_in_eis( $status );
535}
536
537# Get the l10n status
538sub get_l10n_status
539{
540    my $self        = shift;
541
542    return $self->get_l10n_status_from_eis();
543}
544sub set_word_count
545{
546    my $self        = shift;
547    my $language    = shift;
548    my $wordcount   = shift;
549
550    return $self->set_word_count_in_eis( $language , $wordcount );
551}
552
553
554# Get target release for CWS
555sub get_release
556{
557    my $self        = shift;
558
559    return $self->get_release_from_eis();
560}
561
562# Get due date
563sub get_due_date
564{
565    my $self        = shift;
566
567    return $self->get_due_date_from_eis();
568}
569
570# Get due date QA
571sub get_due_date_qa
572{
573    my $self        = shift;
574
575    return $self->get_due_date_qa_from_eis();
576}
577
578# Query master milestone combination for being used by an
579# active CWS
580sub is_milestone_used
581{
582    my $self      = shift;
583    my $master    = shift;
584    my $milestone = shift;
585
586    return $self->get_is_milestone_used_from_eis($master, $milestone);
587}
588
589# Set current milestone for MWS.
590sub set_current_milestone
591{
592    my $self      = shift;
593    my $master    = shift;
594    my $milestone = shift;
595
596    return $self->set_current_milestone_in_eis($master, $milestone);
597}
598
599# Get current milestone for MWS.
600sub get_current_milestone
601{
602    my $self      = shift;
603    my $master    = shift;
604
605    return $self->get_current_milestone_from_eis($master);
606}
607
608sub get_milestone_integrated
609{
610    my $self      = shift;
611
612    return $self->get_milestone_integrated_from_eis();
613}
614
615# Get masters
616sub get_masters
617{
618
619    my $self      = shift;
620
621    return $self->get_masters_from_eis();
622}
623
624# Get milestones for MWS.
625sub get_milestones
626{
627    my $self      = shift;
628    my $master    = shift;
629
630    return $self->get_milestones_from_eis($master);
631}
632# get build string for CWS
633
634sub get_build
635{
636    my $self      = shift;
637    my $master = $self->master();
638    my $milestone = $self->milestone();
639    if ( ! defined($milestone) ) {
640        return undef;
641    }
642    my $bid=$self->get_buildid($master,$milestone);
643    if ( ! defined($bid) ) {
644        return undef;
645    }
646    return $self->expand_buildid($bid);
647}
648
649
650
651# expand build for given cwsname
652sub expand_buildid
653{
654    my $self      = shift;
655    my $bid    = shift;
656    return $self->expand_buildid_in_eis($bid);
657}
658
659
660# Set BuildID of milestone
661sub set_milestone_buildid
662{
663    my $self         = shift;
664    my $master      = shift;
665    my $milestone   = shift;
666    my $buildid     = shift;
667
668    return $self->set_milestone_buildid_in_eis($master, $milestone, $buildid);
669}
670
671# Declare milestone 'removed'
672# This triggers EIS to send emails to all (SO-internal) CWS owners
673# with living CWSs based on that milestone.
674sub milestone_removed
675{
676    my $self      = shift;
677    my $master    = shift;
678    my $milestone = shift;
679
680    return $self->set_milestone_removed_in_eis($master, $milestone);
681}
682
683
684# Get all child workspaces which have been integrated on a
685# given master and milestone.
686sub get_integrated_cws
687{
688    my $self      = shift;
689    my $master    = shift;
690    my $milestone = shift;
691
692    my $childworkspaces_arrref = $self->get_childworkspaces_for_milestone($master, $milestone);
693    if ( !$childworkspaces_arrref ) {
694        $childworkspaces_arrref = [];
695    }
696    return wantarray ? @$childworkspaces_arrref : $childworkspaces_arrref;
697}
698
699
700# Get builid for given master and milestone.
701sub get_buildid
702{
703    my $self      = shift;
704    my $master    = shift;
705    my $milestone = shift;
706
707    return $self->get_buildid_for_milestone($master, $milestone);
708}
709
710#
711# Get all cws' with a status passed
712#
713sub get_cws_with_state
714{
715    my $self = shift;
716    my $mws = shift;
717    my $status = shift;
718
719    return wantarray ? @{$self->get_cws_with_state_from_eis($mws, $status)}
720                    :   $self->get_cws_with_state_from_eis($mws, $status);
721}
722
723sub get_task_prio_cws
724{
725    my $self        = shift;
726    my $ref_taskids = shift;
727    return @{$self->get_task_prios_of_tasks($ref_taskids)};
728}
729
730# Check is CWS is cloneable for specified master
731sub is_cws_cloneable
732{
733    my $self      = shift;
734    my $master    = shift;
735
736    return $self->get_is_cws_cloneable_from_eis($master);
737}
738
739# Clone CWS for specified master
740sub clone_cws
741{
742    my $self      = shift;
743    my $master    = shift;
744
745    return $self->clone_cws_in_eis($master);
746}
747
748sub set_log_entry
749{
750	my $self      	= shift;
751    my $commandline = shift;
752	my $vcsid		= shift;
753	my $start		= shift;
754	my $stop		= shift;
755	my $comment		= shift;
756    return $self->set_log_entry_in_eis($commandline, $vcsid, $start, $stop, $comment);
757}
758
759sub set_log_entry_extended
760{
761	my $self      	= shift;
762    my $commandname = shift;
763	my $parameter	= shift;
764	my $vcsid		= shift;
765	my $start		= shift;
766	my $stop		= shift;
767	my $comment		= shift;
768	my $mastername  = shift;
769	my $childname	= shift;
770#set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
771    return $self->set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
772}
773
774
775#### private ####
776
777# class data accessor methods
778sub eis
779{
780    shift; # ignore calling class/object
781    $CwsClassData{EIS} = shift if @_;
782    if ( !defined($CwsClassData{EIS}) ) {
783        $CwsClassData{EIS} = init_eis_connector();
784    }
785    return $CwsClassData{EIS};
786}
787
788# generate remaining class data accessor methods
789# if this looks strange see 'perldoc perltootc'
790for my $datum (qw(eis_uri eis_proxy_list net_proxy)) {
791    no strict "refs";
792    *$datum = sub {
793        shift; # ignore calling class/object
794        return $CwsClassData{uc($datum)};
795    }
796}
797
798#### helper methods ####
799
800# instance methods
801
802# Add item to items list,
803# update eis database,
804# returns a list of newly added items,
805# specifying an existing item is not an
806# error, but it want appear in the return list.
807sub add_items
808{
809    my $self          = shift;
810    my $type          = shift;
811    my $optional_data = shift;
812
813    my $items_ref;
814    if ( $type eq 'modules' ) {
815        $items_ref   = $self->modules();
816    }
817    elsif ( $type eq 'taskids' ) {
818        $items_ref   = $self->taskids();
819    }
820    else {
821        # fall through, can't happen
822        carp("ERROR: wrong item type\n");
823        return undef;
824    }
825
826    my $item;
827    my @new_items = ();
828    return undef if !defined($items_ref);
829    # find which items which are not already in items list
830    ITEM: while ( $item = shift ) {
831        foreach ( @{$items_ref} ) {
832            next ITEM if $_ eq $item;
833        }
834        push(@new_items, $item);
835    }
836    if ( $#new_items > -1 ) {
837        # add items to database
838        if ( $self->add_items_to_eis($type, $optional_data, \@new_items) ) {
839            push(@{$items_ref}, @new_items);
840        }
841        else {
842            # something went wrong
843            return undef;
844        }
845    }
846    return \@new_items;
847}
848
849# Get EIS id for workspace from EIS database
850sub get_eis_id
851{
852    my $self = shift;
853    my $eis = Cws::eis();
854
855    # It's not an error if one of these is unset, so don't carp().
856    if ( !$self->master() || !$self->child() ) {
857        return undef;
858    }
859
860    my $master = Eis::to_string($self->master());
861    my $child  = Eis::to_string($self->child());
862
863    my $result;
864    eval { $result = int($eis->getChildWorkspaceId($master, $child)) };
865    if ( $@ ) {
866        carp("ERROR: get_eis_id(): EIS database transaction failed. Reason:\n$@\n");
867    }
868    return $result;
869}
870
871sub fetch_item_from_eis
872{
873    my $self = shift;
874    my $type = shift;
875
876    my $eis = Cws::eis();
877    my $id = $self->eis_id();
878
879    if ( !$id ) {
880        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
881        return undef;
882    }
883
884    my $result;
885    if ( $type eq 'milestone' ) {
886        eval { $result = $eis->getMilestone($id) };
887    }
888    elsif ( $type eq 'master' ) {
889        # master can't be queried from the EIS database,
890        # just return what already in member
891        return $self->{MASTER}
892    }
893    else {
894        # fall through, can't happen
895        carp("ERROR: wrong item type\n");
896        return undef;
897    }
898    if ( $@ ) {
899        carp("ERROR: fetch_item(): EIS database transaction failed. Reason:\n$@\n");
900    }
901    return $result;
902}
903
904sub set_item_in_eis
905{
906    my $self     = shift;
907    my $type     = shift;
908    my $item     = shift;
909
910    my $eis = Cws::eis();
911    my $id = $self->eis_id();
912
913    if ( !$id ) {
914        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
915        return undef;
916    }
917
918    # make certain that the item is a string, otherwise
919    # autotyping will occasionally choose the wrong type
920    $item = Eis::to_string($item);
921
922    my $result;
923    if ( $type eq 'milestone' ) {
924        # this operation invalidates the cached tags list
925        $self->{_CACHED_TAGS} = undef;
926        eval { $result = $eis->setMilestone($id, $item) };
927    }
928    elsif ( $type eq 'master' ) {
929        # this operation invalidates the cached tags list
930        $self->{_CACHED_TAGS} = undef;
931        eval { $result = $eis->setMasterWorkspace($id, $item) };
932    }
933    else {
934        # fall through, can't happen
935        carp("ERROR: wrong item type\n");
936        return 0;
937    }
938
939    if ( $@ ) {
940        carp("ERROR: set_item(): EIS database transaction failed. Reason:\n$@\n");
941        return undef;
942    }
943    return 1 if $result;
944    return 0;
945}
946
947sub set_master_and_milestone_in_eis
948{
949    my $self      = shift;
950    my $master    = shift;
951    my $milestone = shift;
952
953    my $eis = Cws::eis();
954    my $id = $self->eis_id();
955
956    if ( !$id ) {
957        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
958        return undef;
959    }
960
961    # make certain that the item is a string, otherwise
962    # autotyping will occasionally choose the wrong type
963    $master = Eis::to_string($master);
964    $milestone = Eis::to_string($milestone);
965
966    my $result;
967    # this operation invalidates the cached tags list
968    $self->{_CACHED_TAGS} = undef;
969    eval { $result = $eis->setMasterWorkspaceAndMilestone($id, $master, $milestone) };
970
971    if ( $@ ) {
972        carp("ERROR: set_master_and_milestone(): EIS database transaction failed. Reason:\n$@\n");
973        return undef;
974    }
975    return 1 if $result;
976    return 0;
977}
978
979sub fetch_items_from_eis
980{
981    my $self = shift;
982    my $type = shift;
983
984    my $eis = Cws::eis();
985    my $id = $self->eis_id();
986
987    if ( !$id ) {
988        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
989        return undef;
990    }
991
992    my $result;
993    if ( $type eq 'modules' ) {
994        eval { $result = $eis->getModules($id) };
995    }
996    elsif ( $type eq 'incompatible_modules' ) {
997        eval { $result = $eis->getIncompatibleModules($id) };
998    }
999    elsif ( $type eq 'new_modules' ) {
1000        eval { $result = $eis->getNewModules($id) };
1001    }
1002    elsif ( $type eq 'new_modules_priv' ) {
1003        eval { $result = $eis->getNewModulesPriv($id) };
1004    }
1005    elsif ( $type eq 'taskids' ) {
1006        eval { $result = $eis->getTaskIds($id) };
1007    }
1008    elsif ( $type eq 'files' ) {
1009        eval { $result = $eis->getFiles($id) };
1010    }
1011    elsif ( $type eq 'patch_files' ) {
1012        eval { $result = $eis->getOutputFiles($id) };
1013    }
1014    else {
1015        # fall through, can't happen
1016        carp("ERROR: wrong item type\n");
1017        return undef;
1018    }
1019    if ( $@ ) {
1020        carp("ERROR: fetch_item(): EIS database transaction failed. Reason:\n$@\n");
1021    }
1022    return $result;
1023}
1024
1025sub add_items_to_eis
1026{
1027    my $self          = shift;
1028    my $type          = shift;
1029    my $optional_data = shift;
1030    my $item_ref      = shift;
1031
1032    my $eis = Cws::eis();
1033    my $id = $self->eis_id();
1034
1035    if ( !$id ) {
1036        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1037        return undef;
1038    }
1039
1040    # make certain that all items are strings, otherwise
1041    # autotyping will occasionally choose the wrong type
1042    my @items = ();
1043    foreach ( @{$item_ref} ) {
1044        push(@items, Eis::to_string($_));
1045    }
1046
1047    my $result;
1048    if ( $type eq 'modules' ) {
1049        if ( defined($optional_data) ) {
1050            # add a module new style, with public attribute
1051            eval { $result = $eis->addModule($id, $items[0], $optional_data) };
1052        }
1053        else {
1054            # old style, add a list of modules
1055            eval { $result = $eis->addModules($id, \@items) };
1056        }
1057    }
1058    elsif ( $type eq 'taskids' ) {
1059        eval { $result = $eis->addTaskIds($id, \@items, $optional_data) };
1060    }
1061    else {
1062        # fall through, can't happen
1063        carp("ERROR: wrong item type\n");
1064        return 0;
1065    }
1066
1067    if ( $@ ) {
1068        carp("ERROR: add_item(): EIS database transaction failed. Reason:\n$@\n");
1069        return undef;
1070    }
1071    return 1 if $result;
1072    return 0;
1073}
1074
1075sub add_file_to_eis
1076{
1077    my $self         = shift;
1078    my $module       = shift;
1079    my $file         = shift;
1080    my $revision     = shift;
1081    my $authors_ref  = shift;
1082    my $taskids_ref  = shift;
1083    my $archive_path = shift;
1084
1085
1086    my $eis = Cws::eis();
1087    my $id = $self->eis_id();
1088
1089    if ( !$id ) {
1090        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1091        return undef;
1092    }
1093
1094    # make certain that all task_ids are strings, otherwise
1095    # autotyping will choose the wrong type
1096    # Note: I think typing just the first element should suffice, but ...
1097    my @taskids = ();
1098    foreach ( @{$taskids_ref} ) {
1099        push(@taskids, Eis::to_string($_));
1100    }
1101    # HACK Its possible that we get no valid taskid.
1102    # Autotyping will fail for a list without elements;
1103    if ( !@taskids ) {
1104        push(@taskids, Eis::to_string(''));
1105    }
1106
1107    # same for revision
1108    $revision = Eis::to_string($revision);
1109
1110    if ( !$archive_path ) {
1111        $archive_path = Eis::to_string('');
1112    }
1113
1114    my $result;
1115    eval {
1116        $result = $eis->addFile($id, $module, $file, $archive_path,
1117                                $revision, $authors_ref, \@taskids)
1118    };
1119    if ( $@ ) {
1120        carp("ERROR: add_file(): EIS database transaction failed. Reason:\n$@\n");
1121        return undef;
1122    }
1123    return 1 if $result;
1124    return 0;
1125}
1126
1127sub add_patch_file_to_eis
1128{
1129    my $self         = shift;
1130    my $file         = shift;
1131
1132    my $eis = Cws::eis();
1133    my $id = $self->eis_id();
1134
1135    if ( !$id ) {
1136        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1137        return undef;
1138    }
1139
1140    my $result;
1141    eval { $result = $eis->addOutputFile($id, $file) };
1142    if ( $@ ) {
1143        carp("ERROR: add_patch_file(): EIS database transaction failed. Reason:\n$@\n");
1144        return undef;
1145    }
1146    return $1;# appOutputFile has void as return value ...
1147}
1148
1149sub is_cws_name_available_in_eis
1150{
1151    my $self     = shift;
1152
1153    if ( !$self->master() ) {
1154        carp("ERROR: master workspace name not set\n");
1155        return undef;
1156    }
1157
1158    if ( !$self->child() ) {
1159        carp("ERROR: child workspace name not set\n");
1160        return undef;
1161    }
1162
1163    my $eis = Cws::eis();
1164    my $master    = Eis::to_string($self->master());
1165    my $child     = Eis::to_string($self->child());
1166
1167    my $result;
1168    eval { $result = $eis->isChildWorkspaceUnique($master, $child) };
1169    if ( $@ ) {
1170        carp("ERROR: is_cws_name_available(): EIS database transaction failed. Reason:\n$@\n");
1171    }
1172    return $result;
1173}
1174
1175sub register_child_with_eis
1176{
1177    my $self     = shift;
1178    my $vcsid    = shift;
1179    my $location = shift;
1180
1181    if ( !$self->master() ) {
1182        carp("ERROR: master workspace name not set\n");
1183        return undef;
1184    }
1185
1186    if ( !$self->milestone() ) {
1187        carp("ERROR: master milestone not set\n");
1188        return undef;
1189    }
1190
1191    if ( !$self->child() ) {
1192        carp("ERROR: child workspace name not set\n");
1193        return undef;
1194    }
1195
1196    $vcsid    = '' unless $vcsid;
1197    $location = '' unless $location;
1198
1199    my $eis = Cws::eis();
1200    my $master    = Eis::to_string($self->master());
1201    my $milestone = Eis::to_string($self->milestone());
1202    my $child     = Eis::to_string($self->child());
1203
1204    $vcsid        = Eis::to_string($vcsid);
1205    $location     = Eis::to_string($location);
1206
1207    my $result;
1208    eval {
1209        $result = $eis->createChildWorkspace($master, $milestone, $child,
1210                                                 $vcsid, $location)
1211    };
1212
1213    if ( $@ ) {
1214        carp("ERROR: create_child_workspace(): EIS database transaction failed. Reason:\n$@\n");
1215        return undef;
1216    }
1217    # set EIS_ID directly, since $self->eis_id() is not
1218    # supposed to take parameters.
1219    $self->{EIS_ID} = $result;
1220    return $result;
1221}
1222
1223sub promote_child_in_eis
1224{
1225    my $self     = shift;
1226    my $vcsid    = shift;
1227    my $location = shift;
1228
1229    my $eis = Cws::eis();
1230    my $id = $self->eis_id();
1231
1232    if ( !$id ) {
1233        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1234        return undef;
1235    }
1236
1237    if ( !$self->milestone() ) {
1238        carp("ERROR: master milestone not set\n");
1239        return undef;
1240    }
1241
1242    my $milestone = Eis::to_string($self->milestone());
1243
1244    $vcsid    = '' unless $vcsid;
1245    $location = '' unless $location;
1246
1247    $vcsid        = Eis::to_string($vcsid);
1248    $location     = Eis::to_string($location);
1249
1250    my $result;
1251    eval {
1252        $result = $eis->initializeChildWorkspace($id, $milestone, $vcsid, $location)
1253    };
1254
1255    eval { $result = $eis->getStatus($id) };
1256    if ( $@ ) {
1257        carp("ERROR: promote(): EIS database transaction failed. Reason:\n$@\n");
1258        return 0;
1259    }
1260    return 1;
1261}
1262
1263# Get child workspace owner from EIS,
1264# return undef in case of error.
1265sub get_owner_from_eis
1266{
1267    my $self = shift;
1268
1269    # check if child workspace is valid
1270    my $id = $self->eis_id();
1271    if ( !$id ) {
1272        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1273        return undef;
1274    }
1275
1276    my $eis = Cws::eis();
1277    my $result;
1278    eval { $result = $eis->getOwnerEmail($id) };
1279    if ( $@ ) {
1280        carp("ERROR: get_OwnerEmail(): EIS database transaction failed. Reason:\n$@\n");
1281    }
1282    return $result;
1283}
1284
1285# Get child workspace qarep from EIS,
1286# return undef in case of error.
1287sub get_qarep_from_eis
1288{
1289    my $self = shift;
1290
1291    # check if child workspace is valid
1292    my $id = $self->eis_id();
1293    if ( !$id ) {
1294        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1295        return undef;
1296    }
1297
1298    my $eis = Cws::eis();
1299    my $result;
1300    eval { $result = $eis->getQARepresentativeEmail($id) };
1301    if ( $@ ) {
1302        carp("ERROR: get_qarep(): EIS database transaction failed. Reason:\n$@\n");
1303    }
1304    return $result;
1305}
1306
1307# store an attachment to a given CWS
1308# return undef in case of error.
1309sub save_attachment_in_eis
1310{
1311    my $self      = shift;
1312    my $name      = shift;
1313    my $mediatype = shift;
1314    my $text      = shift;
1315
1316    # check if child workspace is valid
1317    my $eisid = $self->eis_id();
1318    if ( !$eisid )
1319    {
1320        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1321        return undef;
1322    }
1323
1324    my $eisname =      Eis::to_string($name);
1325    my $eismediatype = Eis::to_string($mediatype);
1326    my $eistextstring = Eis::to_string($text);
1327
1328    my $eis = Cws::eis();
1329    my $result;
1330
1331    eval { $result = $eis->saveAttachment($eisid, $eisname, $eismediatype, $eistextstring ) };
1332    if ( $@ ) {
1333        carp("ERROR: save_attachment_in_eis(): EIS database transaction failed. Reason:\n$@\n");
1334    }
1335    return $result;
1336}
1337
1338# Get child workspace approval status from EIS,
1339# return undef in case of error.
1340sub get_status_from_eis
1341{
1342    my $self = shift;
1343
1344    # check if child workspace is valid
1345    my $id = $self->eis_id();
1346    if ( !$id ) {
1347        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1348        return undef;
1349    }
1350
1351    my $eis = Cws::eis();
1352    my $result;
1353    eval { $result = $eis->getStatus($id) };
1354    if ( $@ ) {
1355        carp("ERROR: get_status(): EIS database transaction failed. Reason:\n$@\n");
1356    }
1357    return $result;
1358}
1359
1360# Get child workspace approval status from EIS,
1361# return undef in case of error.
1362sub set_status_in_eis
1363{
1364    my $self = shift;
1365    my $status = shift;
1366    my $method = 'set';
1367    $method .= (defined $status) ? $status : 'Integrated';
1368
1369    # check if child workspace is valid
1370    my $id = $self->eis_id();
1371    if ( !$id ) {
1372        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1373        return undef;
1374    }
1375    my $eis = Cws::eis();
1376    my $result;
1377    if (defined $status) {
1378        eval { $result = $eis->setFixedOnMaster($id) };
1379    } else {
1380        eval { $result = $eis->setIntegrated($id) };
1381    }
1382    if ( $@ ) {
1383        carp("ERROR: $method(): EIS database transaction failed. Reason:\n$@\n");
1384    }
1385    return $result;
1386}
1387
1388# Get child workspace approval status from EIS,
1389# return undef in case of error.
1390sub set_integration_milestone_in_eis
1391{
1392    my $self      = shift;
1393    my $milestone = shift;
1394    my $buildid   = shift;
1395
1396    # check if child workspace is valid
1397    my $id = $self->eis_id();
1398    if ( !$id ) {
1399        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1400        return undef;
1401    }
1402
1403    my $eis = Cws::eis();
1404
1405    # just in case ...
1406    if ( !defined($milestone) ) {
1407        $milestone = Eis::to_string('');
1408    }
1409    # $buildid must be transfered as string
1410    if ( !defined($buildid) ) {
1411        $buildid = Eis::to_string('');
1412    }
1413    else {
1414        $buildid = Eis::to_string($buildid);
1415    }
1416
1417    my $result;
1418    eval { $result = $eis->setIntegrationMilestone($id, $milestone, $buildid) };
1419    if ( $@ ) {
1420        carp("ERROR: set_integration_milestone(): EIS database transaction failed. Reason:\n$@\n");
1421    }
1422    return $result;
1423}
1424
1425sub set_milestone_buildid_in_eis
1426{
1427    my $self      = shift;
1428    my $master    = shift;
1429    my $milestone = shift;
1430    my $buildid   = shift;
1431
1432    $master    = Eis::to_string($master);
1433    $milestone = Eis::to_string($milestone);
1434    $buildid   = Eis::to_string($buildid);
1435
1436    my $eis = Cws::eis();
1437    my $result;
1438    eval { $result = $eis->setMilestoneBuild( $master, $milestone, $buildid ) };
1439    if ( $@ ) {
1440        carp("ERROR: set_milestone_buildid(): EIS database transaction failed. Reason:\n$@\n");
1441    }
1442    return $result;
1443}
1444
1445sub set_current_milestone_in_eis
1446{
1447    my $self      = shift;
1448    my $master    = shift;
1449    my $milestone = shift;
1450
1451    $master    = Eis::to_string($master);
1452    $milestone = Eis::to_string($milestone);
1453
1454    my $eis = Cws::eis();
1455    my $result;
1456    eval { $result = $eis->setCurrentMilestone( $master, $milestone ) };
1457    if ( $@ ) {
1458        carp("ERROR: set_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
1459    }
1460    return $result;
1461}
1462
1463sub get_current_milestone_from_eis
1464{
1465    my $self      = shift;
1466    my $master    = shift;
1467
1468    $master    = Eis::to_string($master);
1469
1470    my $eis = Cws::eis();
1471    my $result;
1472    eval { $result = $eis->getCurrentMilestone( $master ) };
1473    if ( $@ ) {
1474        carp("ERROR: get_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
1475    }
1476    return $result;
1477}
1478
1479sub get_masters_from_eis
1480{
1481    my $self      = shift;
1482
1483    my $eis = Cws::eis();
1484    my @result;
1485    eval { @result = $eis->getMasterWorkspaces() };
1486    if ( $@ ) {
1487        carp("ERROR: get_masters(): EIS database transaction failed. Reason:\n$@\n");
1488    }
1489
1490    my @result2=();
1491    my $i=0;
1492    while ( defined($result[0][$i]) ) {
1493        push @result2,$result[0][$i];
1494        $i++;
1495    }
1496    return @result2;
1497}
1498
1499
1500sub get_milestones_from_eis
1501{
1502    my $self      = shift;
1503    my $master    = shift;
1504
1505    $master    = Eis::to_string($master);
1506
1507    my $eis = Cws::eis();
1508    my @result;
1509    eval { @result = $eis->getMilestones( $master ) };
1510    if ( $@ ) {
1511        carp("ERROR: get_milestones(): EIS database transaction failed. Reason:\n$@\n");
1512    }
1513    my @result2=();
1514    my $i=0;
1515    while ( defined($result[0][$i]) ) {
1516        push @result2,$result[0][$i];
1517        $i++;
1518    }
1519    return @result2;
1520}
1521
1522# Get child workspace owner from EIS,
1523# return undef in case of error.
1524sub expand_buildid_in_eis
1525{
1526    my $self = shift;
1527    my $bid = shift;
1528
1529    # check if child workspace is valid
1530    my $id = $self->eis_id();
1531    if ( !$id ) {
1532        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1533        return undef;
1534    }
1535
1536    my $name = $self->child();
1537
1538    my $eis = Cws::eis();
1539    my $result;
1540    eval { $result = $eis->expandBuildId($bid, $name) };
1541    if ( $@ ) {
1542        carp("ERROR: expand_builid(): EIS database transaction failed. Reason:\n$@\n");
1543    }
1544    return $result;
1545}
1546
1547sub set_milestone_removed_in_eis
1548{
1549    my $self      = shift;
1550    my $master    = shift;
1551    my $milestone = shift;
1552
1553    $master    = Eis::to_string($master);
1554    $milestone = Eis::to_string($milestone);
1555
1556    my $eis = Cws::eis();
1557    eval { $eis->minorRemoved( $master, $milestone ) };
1558    if ( $@ ) {
1559        carp("ERROR: set_current_milestone(): EIS database transaction failed. Reason:\n$@\n");
1560    }
1561    return;
1562}
1563
1564sub is_milestone_registered_with_eis
1565{
1566    my $self      = shift;
1567    my $master    = shift;
1568    my $milestone = shift;
1569
1570    $master    = Eis::to_string($master);
1571    $milestone = Eis::to_string($milestone);
1572
1573    my $eis = Cws::eis();
1574    my $result;
1575    eval { $result = $eis->isMilestoneValid($master, $milestone) };
1576    if ( $@ ) {
1577        carp("ERROR: is_milestone(): EIS database transaction failed. Reason:\n$@\n");
1578    }
1579    return $result;
1580}
1581
1582sub get_is_milestone_used_from_eis
1583{
1584    my $self      = shift;
1585    my $master    = shift;
1586    my $milestone = shift;
1587
1588    $master    = Eis::to_string($master);
1589    $milestone = Eis::to_string($milestone);
1590
1591    my $eis = Cws::eis();
1592    my $result;
1593    eval { $result = $eis->isMilestoneInUse($master, $milestone) };
1594    if ( $@ ) {
1595        carp("ERROR: is_milestone_used(): EIS database transaction failed. Reason:\n$@\n");
1596    }
1597    return $result;
1598}
1599
1600sub get_buildid_for_milestone
1601{
1602    my $self      = shift;
1603    my $master    = shift;
1604    my $milestone = shift;
1605
1606    $master    = Eis::to_string($master);
1607    $milestone = Eis::to_string($milestone);
1608
1609    my $eis = Cws::eis();
1610    my $result;
1611    eval { $result = $eis->getMilestoneBuild($master, $milestone) };
1612    if ( $@ ) {
1613        carp("ERROR: get_buildid_for_milestone(): EIS database transaction failed. Reason:\n$@\n");
1614    }
1615    return $result;
1616}
1617
1618sub get_childworkspaces_for_milestone
1619{
1620    my $self      = shift;
1621    my $master    = shift;
1622    my $milestone = shift;
1623
1624    $master    = Eis::to_string($master);
1625    $milestone = Eis::to_string($milestone);
1626
1627    my $eis = Cws::eis();
1628    my $result;
1629    eval { $result = $eis->searchChildWorkspacesForMilestone($master, $milestone) };
1630    if ( $@ ) {
1631        carp("ERROR: get_childworkspaces_for_milestone(): EIS database transaction failed. Reason:\n$@\n");
1632    }
1633    return $result;
1634}
1635
1636sub get_cws_with_state_from_eis {
1637    my $self = shift;
1638    my $mws = shift;
1639    my $status = shift;
1640
1641    my $eis = Cws::eis();
1642    my $result;
1643    eval { $result = $eis->getCWSWithState($mws, $status) };
1644    if ( $@ ) {
1645        carp("ERROR: get_cws_with_state_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1646    }
1647    return $result;
1648}
1649
1650sub get_task_prios_of_tasks
1651{
1652    my $self        = shift;
1653    my $ref_taskids = shift;
1654
1655    my $eis = Cws::eis();
1656    my $result;
1657    my @items = ();
1658    foreach ( @{$ref_taskids} ) {
1659        push(@items, Eis::to_string($_));
1660    }
1661
1662    eval { $result = $eis->getTasksPriorities( \@items ) };
1663    if ( $@ ) {
1664        carp("ERROR: get_task_prios_of_tasks(): EIS database transaction failed. Reason:\n$@\n");
1665    }
1666    return $result;
1667}
1668
1669sub get_creation_master_from_eis
1670{
1671    my $self      = shift;
1672
1673    # check if child workspace is valid
1674    my $id = $self->eis_id();
1675    if ( !$id ) {
1676        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1677        return undef;
1678    }
1679
1680    my $eis = Cws::eis();
1681    my $result;
1682    eval { $result = $eis->getCreationMasterWorkspace($id) };
1683    if ( $@ ) {
1684        carp("ERROR: get_creation_master(): EIS database transaction failed. Reason:\n$@\n");
1685    }
1686    return $result;
1687
1688}
1689
1690sub get_milestone_integrated_from_eis
1691{
1692    my $self      = shift;
1693
1694    # check if child workspace is valid
1695    my $id = $self->eis_id();
1696    if ( !$id ) {
1697        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1698        return undef;
1699    }
1700
1701    my $eis = Cws::eis();
1702    my $result;
1703    eval { $result = $eis->getMilestoneIntegrated($id) };
1704    if ( $@ ) {
1705        carp("ERROR: get_milestone_integrated(): EIS database transaction failed. Reason:\n$@\n");
1706    }
1707    return $result;
1708
1709}
1710
1711# get isPublic flag from eis
1712sub get_public_flag_from_eis
1713{
1714    my $self      = shift;
1715
1716    # check if child workspace is valid
1717    my $id = $self->eis_id();
1718    if ( !$id ) {
1719        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1720        return undef;
1721    }
1722
1723    my $eis = Cws::eis();
1724    my $result;
1725    eval { $result = $eis->isPublic($id) };
1726    if ( $@ ) {
1727        carp("ERROR: get_public_flag(): EIS database transaction failed. Reason:\n$@\n");
1728    }
1729    return $result;
1730}
1731
1732# get isPublicMaster flag from eis
1733sub get_publicmaster_flag_from_eis
1734{
1735    my $self      = shift;
1736
1737    # check if child workspace is valid
1738    my $master = $self->master();
1739    if ( !$master ) {
1740        carp("ERROR: MasterWorkspace not defined.\n");
1741        return undef;
1742    }
1743
1744    my $eis = Cws::eis();
1745    my $result;
1746    eval { $result = $eis->isPublicMaster($master) };
1747    if ( $@ ) {
1748        carp("ERROR: get_publicmaster_flag(): EIS database transaction failed. Reason:\n$@\n");
1749    }
1750    return $result;
1751}
1752
1753# get isSubVersion flag from eis
1754sub get_subversion_flag_from_eis
1755{
1756    my $self = shift;
1757
1758    # check if child workspace is valid
1759    my $id = $self->eis_id();
1760    if ( !$id ) {
1761        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1762        return undef;
1763    }
1764
1765    my $eis = Cws::eis();
1766    my $result;
1767    eval { $result = $eis->isSubVersion($id) };
1768    if ( $@ ) {
1769        carp("ERROR: get_subversion_flag(): EIS database transaction failed. Reason:\n$@\n");
1770    }
1771    return $result;
1772}
1773
1774# set isSubVersion flag in eis
1775sub set_subversion_flag_in_eis
1776{
1777    my $self=shift;
1778    my $status=shift;
1779
1780    my $bool_status=SOAP::Data->type(boolean => $status);
1781
1782    # check if child workspace is valid
1783    my $id = $self->eis_id();
1784    if ( !$id ) {
1785        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1786        return undef;
1787    }
1788
1789    my $eis = Cws::eis();
1790    my $result;
1791    eval { $result = $eis->setSubVersion($id,$bool_status) };
1792    if ( $@ ) {
1793        carp("ERROR: get_subversion_flag(): EIS database transaction failed. Reason:\n$@\n");
1794    }
1795    return $result;
1796}
1797
1798sub get_scm_from_eis
1799{
1800    my $self = shift;
1801
1802    # check if child workspace is valid
1803    my $id = $self->eis_id();
1804    if ( !$id ) {
1805        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1806        return undef;
1807    }
1808
1809    my $eis = Cws::eis();
1810    my $result;
1811    eval { $result = $eis->getSCMName($id) };
1812    if ( $@ ) {
1813        carp("ERROR: get_scm_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1814    }
1815    return $result;
1816}
1817
1818sub set_scm_in_eis
1819{
1820    my $self     = shift;
1821    my $scm_name = shift;
1822
1823    $scm_name = Eis::to_string($scm_name);
1824    # check if child workspace is valid
1825    my $id = $self->eis_id();
1826    if ( !$id ) {
1827        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1828        return undef;
1829    }
1830
1831    my $eis = Cws::eis();
1832    eval { $eis->setSCMName($id, $scm_name) };
1833    if ( $@ ) {
1834        carp("ERROR: set_scm_in_eis(): EIS database transaction failed. Reason:\n$@\n");
1835        return 0;
1836    }
1837    return 1;
1838}
1839
1840sub is_uirelevant_from_eis
1841{
1842    my $self        = shift;
1843
1844    # check if child workspace is valid
1845    my $id = $self->eis_id();
1846    if ( !$id ) {
1847        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1848        return undef;
1849    }
1850
1851    my $eis = Cws::eis();
1852    my $result;
1853    eval { $result = $eis->isUIRelevant($id) };
1854    if ( $@ ) {
1855        carp("ERROR: is_uirelevant_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1856    }
1857
1858    return $result;
1859}
1860
1861sub is_helprelevant_from_eis
1862{
1863    my $self        = shift;
1864
1865    # check if child workspace is valid
1866    my $id = $self->eis_id();
1867    if ( !$id ) {
1868        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1869        return undef;
1870    }
1871
1872    my $eis = Cws::eis();
1873    my $result;
1874    eval { $result = $eis->isHelpRelevant( $id ) };
1875    if ( $@ ) {
1876        carp("ERROR: is_helprelevant_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1877    }
1878
1879    return $result;
1880}
1881sub set_word_count_in_eis
1882{
1883    my $self        = shift;
1884    my $language    = shift;
1885    my $wordcount   = shift;
1886
1887    # check if child workspace is valid
1888    my $id = $self->eis_id();
1889    if ( !$id ) {
1890        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1891        return undef;
1892    }
1893
1894    my $eis = Cws::eis();
1895    my $result;
1896    eval { $result = $eis->setWordCount( $id , $language , $wordcount ) };
1897    if ( $@ ) {
1898        carp("ERROR: set_word_count_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1899    }
1900
1901    return $result;
1902}
1903
1904
1905sub get_l10n_status_from_eis
1906{
1907    my $self        = shift;
1908
1909    # check if child workspace is valid
1910    my $id = $self->eis_id();
1911    if ( !$id ) {
1912        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1913        return undef;
1914    }
1915
1916    my $eis = Cws::eis();
1917    my $result;
1918    eval { $result = $eis->getL10n( $id ) };
1919    if ( $@ ) {
1920        carp("ERROR: get_l10n_status_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1921    }
1922
1923    return $result;
1924}
1925
1926sub set_l10n_status_in_eis
1927{
1928    my $self        = shift;
1929    my $status      = Eis::to_string( shift );
1930
1931    # check if child workspace is valid
1932    my $id = $self->eis_id();
1933    if ( !$id ) {
1934        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1935        return undef;
1936    }
1937
1938    my $eis = Cws::eis();
1939    my $result;
1940
1941    eval { $result = $eis->setL10n( $id , $status ) };
1942    if ( $@ ) {
1943        carp("ERROR: set_l10n_status_in_eis(): EIS database transaction failed. Reason:\n$@\n");
1944    }
1945
1946    return $result;
1947}
1948
1949sub get_is_cws_cloneable_from_eis
1950{
1951    my $self   = shift;
1952    my $master = Eis::to_string( shift );
1953
1954    # check if child workspace is valid
1955    my $id = $self->eis_id();
1956    if ( !$id ) {
1957        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1958        return undef;
1959    }
1960
1961    my $eis = Cws::eis();
1962    my $result;
1963
1964    eval { $result = $eis->isClonableForMaster($id, $master) };
1965    if ( $@ ) {
1966        carp("ERROR:  get_is_cws_cloneable_from_eis(): EIS database transaction failed. Reason:\n$@\n");
1967    }
1968
1969    return $result;
1970}
1971
1972sub clone_cws_in_eis
1973{
1974    my $self   = shift;
1975    my $master = Eis::to_string( shift );
1976
1977    # check if child workspace is valid
1978    my $id = $self->eis_id();
1979    if ( !$id ) {
1980        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
1981        return undef;
1982    }
1983
1984    my $eis = Cws::eis();
1985    my $result;
1986
1987    eval { $eis->cloneForMaster($id, $master) };
1988    if ( $@ ) {
1989        carp("ERROR:  clone_cws_in_eis(): EIS database transaction failed. Reason:\n$@\n");
1990        return 0;
1991    }
1992
1993    return 1;
1994}
1995
1996sub get_release_from_eis
1997{
1998    my $self   = shift;
1999    my $master = Eis::to_string( shift );
2000
2001    # check if child workspace is valid
2002    my $id = $self->eis_id();
2003    if ( !$id ) {
2004        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
2005        return undef;
2006    }
2007
2008    my $eis = Cws::eis();
2009    my $result;
2010
2011    eval { $result = $eis->getRelease($id) };
2012    if ( $@ ) {
2013        carp("ERROR:  get_release_from_eis(): EIS database transaction failed. Reason:\n$@\n");
2014    }
2015
2016    return $result;
2017}
2018
2019sub get_due_date_from_eis
2020{
2021    my $self   = shift;
2022    my $master = Eis::to_string( shift );
2023
2024    # check if child workspace is valid
2025    my $id = $self->eis_id();
2026    if ( !$id ) {
2027        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
2028        return undef;
2029    }
2030
2031    my $eis = Cws::eis();
2032    my $result;
2033
2034    eval { $result = $eis->getDueDate($id) };
2035    if ( $@ ) {
2036        carp("ERROR:  get_due_date_from_eis(): EIS database transaction failed. Reason:\n$@\n");
2037    }
2038
2039    return $result;
2040}
2041
2042sub get_due_date_qa_from_eis
2043{
2044    my $self   = shift;
2045    my $master = Eis::to_string( shift );
2046
2047    # check if child workspace is valid
2048    my $id = $self->eis_id();
2049    if ( !$id ) {
2050        carp("ERROR: Childworkspace not (yet) registered with EIS.\n");
2051        return undef;
2052    }
2053
2054    my $eis = Cws::eis();
2055    my $result;
2056
2057    eval { $result = $eis->getDueDateQA($id) };
2058    if ( $@ ) {
2059        carp("ERROR:  get_due_date_qa_from_eis(): EIS database transaction failed. Reason:\n$@\n");
2060    }
2061
2062    return $result;
2063}
2064
2065
2066#logging
2067sub set_log_entry_in_eis
2068{
2069    my $self     	= shift;
2070    my $commandline = shift;
2071	my $vcsid		= shift;
2072    my $start 		= shift;
2073    my $end	   		= shift;
2074	my $comment		= shift;
2075
2076    $commandline    = SOAP::Data->type(string => $commandline);
2077    $comment	    = SOAP::Data->type(string => $comment);
2078
2079	# *format* for  $start and $end = "2003-05-28 12:34:59";
2080
2081#=====================================================
2082	#TO DO:
2083	#experimenell f�r saubere schnittstelle
2084	#$start = SOAP::Data->type(dateTime => $start);
2085	#$end = SOAP::Data->type(dateTime => $end);
2086#=====================================================
2087
2088    my $eis = Cws::eis();
2089	my $result;
2090    eval { $result = $eis->storeCommandLogEntry( $commandline, $vcsid, $start, $end, $comment ) };
2091    if ( $@ ) {
2092        carp("ERROR: set_log_entry(): Logging failed. Reason:\n$@\n");
2093    }
2094    return $result;
2095}
2096
2097#set_log_entry_extended_in_eis($commandname, $parameter, $vcsid, $start, $stop, $comment, $mastername, $childname);
2098sub set_log_entry_extended_in_eis
2099{
2100    my $self     	= shift;
2101    my $commandname = shift;
2102	my $parameter	= shift;
2103	my $vcsid		= shift;
2104    my $start 		= shift;
2105    my $end	   		= shift;
2106	my $comment		= shift;
2107	my $mastername	= shift;
2108	my $childname	= shift;
2109
2110    $commandname    = SOAP::Data->type(string => $commandname);
2111    $parameter	    = SOAP::Data->type(string => $parameter);
2112    $comment	    = SOAP::Data->type(string => $comment);
2113	$mastername		= SOAP::Data->type(string => $mastername);
2114	$childname      = SOAP::Data->type(string => $childname);
2115
2116	# *format* for  $start and $end = "2003-05-28 12:34:59";
2117
2118#=====================================================
2119	#TO DO:
2120	#experimenell f�r saubere schnittstelle
2121	#$start = SOAP::Data->type(dateTime => $start);
2122	#$end = SOAP::Data->type(dateTime => $end);
2123#=====================================================
2124
2125    my $eis = Cws::eis();
2126	my $result;
2127    eval { $result = $eis->storeCommandLogEntry($commandname, $parameter, $vcsid, $start, $end, $comment, $mastername, $childname) };
2128    if ( $@ ) {
2129        carp("ERROR: set_log_entry_extended(): Logging failed. Reason:\n$@\n");
2130    }
2131    return $result;
2132}
2133
2134
2135#### class methods ####
2136
2137sub init_eis_connector
2138{
2139    my $eis = Eis->new( uri => Cws::eis_uri(),
2140                        proxy_list => Cws::eis_proxy_list(),
2141                        net_proxy => Cws::net_proxy()
2142                      );
2143    return $eis;
2144}
2145
2146####
2147
21481; # needed by "use" or "require"
2149# vim: set ts=4 shiftwidth=4 expandtab syntax=perl:
2150