View Javadoc
1   package org.apache.maven.scm.provider.synergy.util;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.scm.ScmException;
23  import org.apache.maven.scm.log.ScmLogger;
24  
25  /**
26   * In some Synergy versions (ie. 6.5) closing a session results in de-selecting
27   * the current (default) task. Therefore, the maven release-plugin fails, as the
28   * Synergy commands, as implemented in the Synergy-SCM-Provider, always close
29   * their session after being executed.<br>
30   * This manager circumvents this problem by storing the last created task which
31   * causes all check outs to be associated with it. Then, when this task gets
32   * checked in, all associated files get checked in as well.
33   * 
34   * @author <a href="jan.malcomess@steria-mummert.de">Jan Malcomess</a>
35   * @since 1.5
36   */
37  public class SynergyTaskManager
38  {
39      /**
40       * No Synergy-Task was created yet.
41       */
42      private static final short TASK_STATE_NONE = 0;
43  
44      /**
45       * The current Synergy-Task is created but not yet completed.
46       */
47      private static final short TASK_STATE_CREATED = 1;
48  
49      /**
50       * The current Synergy-Task is completed.
51       */
52      private static final short TASK_STATE_COMPLETED = 2;
53  
54      /**
55       * singleton instance.
56       */
57      private static final SynergyTaskManager INSTANCE = new SynergyTaskManager();
58  
59      /**
60       * The number of the current Synergy-Task.
61       */
62      private int currentTaskNumber;
63  
64      /**
65       * The state of the current Synergy-Task.
66       */
67      private short currentTaskState = TASK_STATE_NONE;
68  
69      /**
70       * @return singleton instance.
71       */
72      public static SynergyTaskManager getInstance()
73      {
74          return INSTANCE;
75      }
76  
77      /**
78       * If necessary create a new task. Otherwise return the current task.
79       * 
80       * @param logger a logger.
81       * @param synopsis short description of task.
82       * @param release release.
83       * @param defaultTask should this task become the default task?
84       * @param ccmAddr current Synergy session ID. Used to run in multi-session.
85       * @return Task number
86       * @throws ScmException
87       */
88      public int createTask( ScmLogger logger, String synopsis, String release, boolean defaultTask, String ccmAddr )
89          throws ScmException
90      {
91          if ( logger.isDebugEnabled() )
92          {
93              logger.debug( "Synergy : Entering createTask method of SynergyTaskManager" );
94          }
95          switch ( currentTaskState )
96          {
97              case TASK_STATE_CREATED:
98                  if ( defaultTask )
99                  {
100                     // make sure the current task is the default task
101                     if ( SynergyUtil.getDefaultTask( logger, ccmAddr ) != currentTaskNumber )
102                     {
103                         SynergyUtil.setDefaultTask( logger, currentTaskNumber, ccmAddr );
104                     }
105                 }
106                 break;
107             case TASK_STATE_NONE: // fall through
108             case TASK_STATE_COMPLETED:
109                 currentTaskNumber = SynergyUtil.createTask( logger, synopsis, release, defaultTask, ccmAddr );
110                 currentTaskState = TASK_STATE_CREATED;
111                 break;
112             default:
113                 throw new IllegalStateException( "Programming error: SynergyTaskManager is in unkown state." );
114         }
115         if ( logger.isDebugEnabled() )
116         {
117             logger.debug( "createTask returns " + currentTaskNumber );
118         }
119         return currentTaskNumber;
120     }
121 
122     /**
123      * Check in (that is: complete) the default task. This is either the current task managed by
124      * <code>SynergyTaskManager</code> or, if none is managed, the default task.<br>
125      * In case no task has yet been created by <code>SynergyTaskManager</code> AND no default task is set, then this is
126      * an error.<br>
127      * However, if the task that was created by <code>SynergyTaskManager</code> has already been checked in AND no
128      * default task is set, then it is assumed that all files that were checked out are already checked in because
129      * checking in a task checks in all files associated with it.
130      * 
131      * @param logger a logger.
132      * @param comment a comment for checkin.
133      * @param ccmAddr current Synergy session ID. Used to run in multi-session.
134      * @throws ScmException
135      */
136     public void checkinDefaultTask( ScmLogger logger, String comment, String ccmAddr )
137         throws ScmException
138     {
139         if ( logger.isDebugEnabled() )
140         {
141             logger.debug( "Synergy : Entering checkinDefaultTask method of SynergyTaskManager" );
142         }
143         switch ( currentTaskState )
144         {
145             case TASK_STATE_NONE:
146                 // if a default task is set, then check in that
147                 // otherwise we have an error
148                 if ( SynergyUtil.getDefaultTask( logger, ccmAddr ) != 0 )
149                 {
150                     SynergyUtil.checkinDefaultTask( logger, comment, ccmAddr );
151                 }
152                 else
153                 {
154                     throw new ScmException( "Check in not possible: no default task is set and "
155                         + "no task has been created with SynergyTaskManager." );
156                 }
157                 break;
158             case TASK_STATE_CREATED:
159                 SynergyUtil.checkinTask( logger, currentTaskNumber, comment, ccmAddr );
160                 currentTaskState = TASK_STATE_COMPLETED;
161                 break;
162             case TASK_STATE_COMPLETED:
163                 // if a default task is set, then check in that
164                 // otherwise do nothing, as all tasks and all files with them have
165                 // been checked in
166                 if ( SynergyUtil.getDefaultTask( logger, ccmAddr ) != 0 )
167                 {
168                     SynergyUtil.checkinDefaultTask( logger, comment, ccmAddr );
169                 }
170                 else
171                 {
172                     if ( logger.isDebugEnabled() )
173                     {
174                         logger.debug( "Synergy : No check in necessary as default task and "
175                             + "all tasks created with SynergyTaskManager have already been checked in." );
176                     }
177                 }
178                 break;
179             default:
180                 throw new IllegalStateException( "Programming error: SynergyTaskManager is in unkown state." );
181         }
182     }
183 }