Coverage Report - org.apache.maven.scm.provider.synergy.util.SynergyUtil
 
Classes in this File Line Coverage Branch Coverage Complexity
SynergyUtil
0 %
0/243
0 %
0/100
3,179
 
 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 java.io.File;
 23  
 import java.io.IOException;
 24  
 import java.text.SimpleDateFormat;
 25  
 import java.util.ArrayList;
 26  
 import java.util.Date;
 27  
 import java.util.List;
 28  
 import java.util.Locale;
 29  
 
 30  
 import org.apache.maven.scm.ChangeFile;
 31  
 import org.apache.maven.scm.ScmException;
 32  
 import org.apache.maven.scm.ScmVersion;
 33  
 import org.apache.maven.scm.log.ScmLogger;
 34  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyCreateTaskConsumer;
 35  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyGetCompletedTasksConsumer;
 36  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyGetTaskObjectsConsumer;
 37  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyGetWorkingFilesConsumer;
 38  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyGetWorkingProjectConsumer;
 39  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyShowDefaultTaskConsumer;
 40  
 import org.apache.maven.scm.provider.synergy.consumer.SynergyWorkareaConsumer;
 41  
 import org.codehaus.plexus.util.cli.CommandLineException;
 42  
 import org.codehaus.plexus.util.cli.CommandLineUtils;
 43  
 import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
 44  
 import org.codehaus.plexus.util.cli.Commandline;
 45  
 import org.codehaus.plexus.util.cli.StreamConsumer;
 46  
 
 47  
 /**
 48  
  * This class contains functional methodsfor Synergy.
 49  
  *
 50  
  * @author <a href="mailto:julien.henry@capgemini.com">Julien Henry</a>
 51  
  * @author Olivier Lamy
 52  
  * @version $Id: SynergyUtil.java 1134992 2011-06-12 21:54:27Z godin $
 53  
  */
 54  
 public final class SynergyUtil
 55  
 {
 56  
 
 57  
     private SynergyUtil()
 58  0
     {
 59  0
     }
 60  
 
 61  
     /**
 62  
      * Separator used with formatted result
 63  
      */
 64  
     public static final String SEPARATOR = "#####";
 65  
 
 66  
     /**
 67  
      * Remove prefix path from a path. Example: removeParent("c:\tmp",
 68  
      * "c:\tmp\foo.bar") returns "foo.bar"
 69  
      *
 70  
      * @param prefix parent path (prefix).
 71  
      * @param file   file path.
 72  
      * @return suffix
 73  
      * @throws ScmException if parent is not a prefix of file
 74  
      */
 75  
     public static String removePrefix( File prefix, File file )
 76  
         throws ScmException
 77  
     {
 78  
         try
 79  
         {
 80  0
             String prefixStr = prefix.getCanonicalPath();
 81  0
             String fileStr = file.getCanonicalPath();
 82  0
             if ( !fileStr.startsWith( prefixStr ) )
 83  
             {
 84  0
                 throw new ScmException( prefixStr + " is not a prefix of " + fileStr );
 85  
             }
 86  0
             return fileStr.substring( prefixStr.length() );
 87  
         }
 88  0
         catch ( IOException e )
 89  
         {
 90  0
             throw new ScmException( "IOException", e );
 91  
         }
 92  
 
 93  
     }
 94  
 
 95  
     /**
 96  
      * Get a working project whose predecessor is given.
 97  
      *
 98  
      * @param logger       a logger.
 99  
      * @param projectSpec predecessor (prep project)
 100  
      * @param username     owner of working project
 101  
      * @param ccmAddr      Synergy session ID.
 102  
      * @return projectSpec of the working checkout, or null if none
 103  
      */
 104  
     public static String getWorkingProject( ScmLogger logger, String projectSpec, String username, String ccmAddr )
 105  
         throws ScmException
 106  
     {
 107  0
         if ( logger.isDebugEnabled() )
 108  
         {
 109  0
             logger.debug( "Synergy : Entering getWorkingProject method" );
 110  
         }
 111  
 
 112  0
         String query =
 113  
             "owner='" + username + "' and status='working' and type='project' and has_predecessor('" + projectSpec +"')";
 114  
                 //+ ":project:1')"; SCM-261
 115  
 
 116  0
         Commandline cl = SynergyCCM.query( query, "%objectname", ccmAddr );
 117  
 
 118  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 119  0
         SynergyGetWorkingProjectConsumer stdout = new SynergyGetWorkingProjectConsumer( logger );
 120  
 
 121  0
         int errorCode = executeSynergyCommand( logger, cl, stderr, stdout, false );
 122  
 
 123  0
         if ( logger.isDebugEnabled() )
 124  
         {
 125  0
             logger.debug( "Synergy : getWorkingProject returns " + stdout.getProjectSpec() + " with code "
 126  
                 + errorCode );
 127  
         }
 128  
 
 129  0
         return stdout.getProjectSpec();
 130  
     }
 131  
 
 132  
     /**
 133  
      * Get working file(s) in a given project.
 134  
      *
 135  
      * @param logger       a logger.
 136  
      * @param projectSpec (project)
 137  
      * @param release      release
 138  
      * @param ccmAddr      Synergy session ID.
 139  
      * @return list of working files.
 140  
      */
 141  
     public static List<String> getWorkingFiles( ScmLogger logger, String projectSpec, String release, String ccmAddr )
 142  
         throws ScmException
 143  
     {
 144  0
         if ( logger.isDebugEnabled() )
 145  
         {
 146  0
             logger.debug( "Synergy : Entering getWorkingFiles method" );
 147  
         }
 148  
 
 149  0
         String query = "status='working' and release='" + release + "' and is_member_of('" + projectSpec + "')";
 150  
 
 151  0
         Commandline cl = SynergyCCM.query( query, SynergyGetWorkingFilesConsumer.OUTPUT_FORMAT, ccmAddr );
 152  
 
 153  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 154  0
         SynergyGetWorkingFilesConsumer stdout = new SynergyGetWorkingFilesConsumer( logger );
 155  
 
 156  0
         int errorCode = executeSynergyCommand( logger, cl, stderr, stdout, false );
 157  
 
 158  0
         if ( logger.isDebugEnabled() )
 159  
         {
 160  0
             logger.debug( "Synergy : getWorkingFiles returns " + stdout.getFiles().size() + " files with code "
 161  
                 + errorCode );
 162  
         }
 163  
 
 164  0
         return stdout.getFiles();
 165  
     }
 166  
 
 167  
     /**
 168  
      * Populate the object list of a Modification by querying for objects
 169  
      * associated with the task.
 170  
      *
 171  
      * @param logger  a logger.
 172  
      * @param numTask task number.
 173  
      * @param ccmAddr Synergy session ID.
 174  
      */
 175  
     public static List<ChangeFile> getModifiedObjects( ScmLogger logger, int numTask, String ccmAddr )
 176  
         throws ScmException
 177  
     {
 178  0
         if ( logger.isDebugEnabled() )
 179  
         {
 180  0
             logger.debug( "Synergy : Entering getModifiedObjects method" );
 181  
         }
 182  
 
 183  0
         Commandline cl = SynergyCCM.showTaskObjects( numTask, SynergyGetTaskObjectsConsumer.OUTPUT_FORMAT, ccmAddr );
 184  
 
 185  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 186  0
         SynergyGetTaskObjectsConsumer stdout = new SynergyGetTaskObjectsConsumer( logger );
 187  0
         int errorCode = executeSynergyCommand( logger, cl, stderr, stdout, false );
 188  
 
 189  0
         if ( logger.isDebugEnabled() )
 190  
         {
 191  0
             logger.debug( "Synergy : getModifiedObjects returns " + stdout.getFiles().size() + " files with code "
 192  
                 + errorCode );
 193  
         }
 194  
 
 195  0
         return stdout.getFiles();
 196  
 
 197  
     }
 198  
 
 199  
     /**
 200  
      * Get a list of all tasks which are contained in all folders in the
 201  
      * reconfigure properties of the specified project and were completed after
 202  
      * startDate and before endDate.
 203  
      *
 204  
      * @param logger      a logger.
 205  
      * @param projectSpec projectSpec.
 206  
      * @param startDate   start date.
 207  
      * @param endDate     end date.
 208  
      * @param ccmAddr     Synergy session ID.
 209  
      * @return A list of  {@link SynergyTask}
 210  
      */
 211  
     public static List<SynergyTask> getCompletedTasks( ScmLogger logger, String projectSpec, Date startDate, Date endDate,
 212  
                                           String ccmAddr )
 213  
         throws ScmException
 214  
     {
 215  0
         if ( logger.isDebugEnabled() )
 216  
         {
 217  0
             logger.debug( "Synergy : Entering getCompletedTasks method" );
 218  
         }
 219  
 
 220  
         // The format used for converting Java dates into CM Synergy dates
 221  
         // Note that the format used to submit commands differs from the
 222  
         // format used in the results of that command!?!
 223  0
         SimpleDateFormat toCcmDate = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss", new Locale( "en", "US" ) );
 224  
 
 225  
         // Construct the query string
 226  0
         String query = "is_task_in_folder_of(is_folder_in_rp_of('" + projectSpec + "'))";
 227  0
         if ( startDate != null )
 228  
         {
 229  0
             query = query + "and completion_date>time('" + toCcmDate.format( startDate ) + "')";
 230  
         }
 231  0
         if ( endDate != null )
 232  
         {
 233  0
             query = query + "and completion_date<time('" + toCcmDate.format( endDate ) + "')";
 234  
         }
 235  
 
 236  0
         Commandline cl = SynergyCCM.query( query, SynergyGetCompletedTasksConsumer.OUTPUT_FORMAT, ccmAddr );
 237  
 
 238  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 239  0
         SynergyGetCompletedTasksConsumer stdout = new SynergyGetCompletedTasksConsumer( logger );
 240  
 
 241  0
         executeSynergyCommand( logger, cl, stderr, stdout, false );
 242  
 
 243  0
         if ( logger.isDebugEnabled() )
 244  
         {
 245  0
             logger.debug( "Synergy : getCompletedTasks method returns " + stdout.getTasks().size() + " tasks" );
 246  
         }
 247  
 
 248  0
         return stdout.getTasks();
 249  
     }
 250  
 
 251  
     /**
 252  
      * Create a baseline.
 253  
      *
 254  
      * @param logger      a logger.
 255  
      * @param projectSpec the projectSpec.
 256  
      * @param name        name of the baseline.
 257  
      * @param release     the release.
 258  
      * @param purpose     the purpose.
 259  
      * @param ccmAddr     used to run in multi-session.
 260  
      * @throws ScmException
 261  
      */
 262  
     public static void createBaseline( ScmLogger logger, String projectSpec, String name, String release,
 263  
                                        String purpose, String ccmAddr )
 264  
         throws ScmException
 265  
     {
 266  0
         if ( logger.isDebugEnabled() )
 267  
         {
 268  0
             logger.debug( "Synergy : Entering createBaseline method" );
 269  
         }
 270  
 
 271  0
         Commandline cl = SynergyCCM.createBaseline( projectSpec, name, release, purpose, ccmAddr );
 272  
 
 273  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 274  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 275  
 
 276  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 277  0
     }
 278  
 
 279  
     /**
 280  
      * Add new file to Synergy database.
 281  
      *
 282  
      * @param logger  a logger.
 283  
      * @param file    file to be added.
 284  
      * @param message log message for Synergy.
 285  
      * @param ccmAddr used to run in multi-session.
 286  
      * @throws ScmException
 287  
      */
 288  
     public static void create( ScmLogger logger, File file, String message, String ccmAddr )
 289  
         throws ScmException
 290  
     {
 291  0
         if ( logger.isDebugEnabled() )
 292  
         {
 293  0
             logger.debug( "Synergy : Entering create method" );
 294  
         }
 295  
 
 296  0
         List<File> files = new ArrayList<File>();
 297  0
         files.add( file );
 298  0
         Commandline cl = SynergyCCM.create( files, message, ccmAddr );
 299  
 
 300  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 301  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 302  
 
 303  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 304  0
     }
 305  
 
 306  
     /**
 307  
      * Create new task.
 308  
      *
 309  
      * @param logger      a logger.
 310  
      * @param synopsis    short description of task.
 311  
      * @param release     release.
 312  
      * @param defaultTask should this task become the default task?
 313  
      * @param ccmAddr     used to run in multi-session.
 314  
      * @return Task number
 315  
      * @throws ScmException
 316  
      */
 317  
     public static int createTask( ScmLogger logger, String synopsis, String release, boolean defaultTask,
 318  
                                   String ccmAddr )
 319  
         throws ScmException
 320  
     {
 321  0
         if ( logger.isDebugEnabled() )
 322  
         {
 323  0
             logger.debug( "Synergy : Entering createTask method of SynergyUtil" );
 324  
         }
 325  
 
 326  0
         if ( synopsis == null || synopsis.equals( "" ) )
 327  
         {
 328  0
             throw new ScmException( "A synopsis must be specified to create a task." );
 329  
         }
 330  
 
 331  0
         Commandline cl = SynergyCCM.createTask( synopsis, release, defaultTask, ccmAddr );
 332  
 
 333  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 334  0
         SynergyCreateTaskConsumer stdout = new SynergyCreateTaskConsumer( logger );
 335  
 
 336  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 337  
 
 338  0
         if ( logger.isDebugEnabled() )
 339  
         {
 340  0
             logger.debug( "createTask returns " + stdout.getTask() );
 341  
         }
 342  
 
 343  0
         return stdout.getTask();
 344  
     }
 345  
 
 346  
     /**
 347  
      * Checkin the default task.
 348  
      *
 349  
      * @param logger  a logger.
 350  
      * @param comment a comment.
 351  
      * @param ccmAddr Synergy session ID.
 352  
      * @throws ScmException
 353  
      */
 354  
     public static void checkinDefaultTask( ScmLogger logger, String comment, String ccmAddr )
 355  
         throws ScmException
 356  
     {
 357  0
         if ( logger.isDebugEnabled() )
 358  
         {
 359  0
             logger.debug( "Synergy : Entering checkinDefaultTask method" );
 360  
         }
 361  
 
 362  0
         Commandline cl = SynergyCCM.checkinTask( "default", comment, ccmAddr );
 363  
 
 364  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 365  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 366  
 
 367  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 368  0
     }
 369  
 
 370  
     /**
 371  
      * Checkin a task.
 372  
      *
 373  
      * @param logger     a logger.
 374  
      * @param taskNumber task number.
 375  
      * @param comment    a comment.
 376  
      * @param ccmAddr    Synergy session ID.
 377  
      * @throws ScmException
 378  
      */
 379  
     public static void checkinTask( ScmLogger logger, int taskNumber, String comment, String ccmAddr )
 380  
         throws ScmException
 381  
     {
 382  0
         if ( logger.isDebugEnabled() )
 383  
         {
 384  0
             logger.debug( "Synergy : Entering checkinTask method" );
 385  
         }
 386  
 
 387  0
         Commandline cl = SynergyCCM.checkinTask( "" + taskNumber, comment, ccmAddr );
 388  
 
 389  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 390  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 391  
 
 392  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 393  0
     }
 394  
 
 395  
     /**
 396  
      * Delete file from Synergy database.
 397  
      *
 398  
      * @param logger  a logger.
 399  
      * @param file    file to be deleted.
 400  
      * @param ccmAddr used to run in multi-session.
 401  
      * @throws ScmException
 402  
      */
 403  
     public static void delete( ScmLogger logger, File file, String ccmAddr, boolean replace )
 404  
         throws ScmException
 405  
     {
 406  0
         if ( logger.isDebugEnabled() )
 407  
         {
 408  0
             logger.debug( "Synergy : Entering delete method" );
 409  
         }
 410  
 
 411  0
         List<File> list = new ArrayList<File>();
 412  0
         list.add( file );
 413  
 
 414  0
         Commandline cl = SynergyCCM.delete( list, ccmAddr, replace );
 415  
 
 416  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 417  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 418  
 
 419  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 420  0
     }
 421  
 
 422  
     /**
 423  
      * Reconfigure a project.
 424  
      *
 425  
      * @param logger       a logger.
 426  
      * @param projectSpec projectSpec (i.e. myProject~1).
 427  
      * @param ccmAddr      used to run in multi-session.
 428  
      * @throws ScmException
 429  
      */
 430  
     public static void reconfigure( ScmLogger logger, String projectSpec, String ccmAddr )
 431  
         throws ScmException
 432  
     {
 433  0
         if ( logger.isDebugEnabled() )
 434  
         {
 435  0
             logger.debug( "Synergy : Entering reconfigure method" );
 436  
         }
 437  0
         Commandline cl = SynergyCCM.reconfigure( projectSpec, ccmAddr );
 438  
 
 439  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 440  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 441  
 
 442  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 443  0
     }
 444  
 
 445  
     /**
 446  
      * Reconfigure properties of a project.
 447  
      *
 448  
      * @param logger       a logger.
 449  
      * @param projectSpec projectSpec (i.e. myProject~1).
 450  
      * @param ccmAddr      used to run in multi-session.
 451  
      * @throws ScmException
 452  
      */
 453  
     public static void reconfigureProperties( ScmLogger logger, String projectSpec, String ccmAddr )
 454  
         throws ScmException
 455  
     {
 456  0
         if ( logger.isDebugEnabled() )
 457  
         {
 458  0
             logger.debug( "Synergy : Entering reconfigureProperties method" );
 459  
         }
 460  0
         Commandline cl = SynergyCCM.reconfigureProperties( projectSpec, ccmAddr );
 461  
 
 462  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 463  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 464  
 
 465  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 466  0
     }
 467  
 
 468  
     /**
 469  
      * Reconcile a project with -uwa option.
 470  
      *
 471  
      * @param logger       a logger.
 472  
      * @param projectSpec projectSpec (i.e. myProject~1).
 473  
      * @param ccmAddr      used to run in multi-session.
 474  
      * @throws ScmException
 475  
      */
 476  
     public static void reconcileUwa( ScmLogger logger, String projectSpec, String ccmAddr )
 477  
         throws ScmException
 478  
     {
 479  0
         if ( logger.isDebugEnabled() )
 480  
         {
 481  0
             logger.debug( "Synergy : Entering reconcileUwa method" );
 482  
         }
 483  0
         Commandline cl = SynergyCCM.reconcileUwa( projectSpec, ccmAddr );
 484  
 
 485  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 486  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 487  
 
 488  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 489  0
     }
 490  
 
 491  
     /**
 492  
      * Reconcile a project with -udb option.
 493  
      *
 494  
      * @param logger       a logger.
 495  
      * @param projectSpec projectSpec (i.e. myProject~1).
 496  
      * @param ccmAddr      used to run in multi-session.
 497  
      * @throws ScmException
 498  
      */
 499  
     public static void reconcileUdb( ScmLogger logger, String projectSpec, String ccmAddr )
 500  
         throws ScmException
 501  
     {
 502  0
         if ( logger.isDebugEnabled() )
 503  
         {
 504  0
             logger.debug( "Synergy : Entering reconcileUdb method" );
 505  
         }
 506  0
         Commandline cl = SynergyCCM.reconcileUdb( projectSpec, ccmAddr );
 507  
 
 508  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 509  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 510  
 
 511  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 512  0
     }
 513  
 
 514  
     /**
 515  
      * Checkout given files or directory.
 516  
      *
 517  
      * @param logger  a logger.
 518  
      * @param files   files to add.
 519  
      * @param ccmAddr Synergy session ID.
 520  
      * @throws ScmException
 521  
      */
 522  
     public static void checkoutFiles( ScmLogger logger, List<File> files, String ccmAddr )
 523  
         throws ScmException
 524  
     {
 525  0
         if ( logger.isDebugEnabled() )
 526  
         {
 527  0
             logger.debug( "Synergy : Entering checkoutFiles files method" );
 528  
         }
 529  
 
 530  0
         Commandline cl = SynergyCCM.checkoutFiles( files, ccmAddr );
 531  
 
 532  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 533  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 534  
 
 535  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 536  0
     }
 537  
 
 538  
     /**
 539  
      * Checkout a given project.
 540  
      *
 541  
      * @param logger       a logger.
 542  
      * @param directory    new project work area, or null if you want to use default wa.
 543  
      * @param projectSpec projectSpec (i.e. myProject~1).
 544  
      * @param ccmAddr      used to run in multi-session.
 545  
      * @return checkout directory (directory + new project spec)
 546  
      * @throws ScmException
 547  
      */
 548  
     public static void checkoutProject( ScmLogger logger, File directory, String projectSpec, ScmVersion version,
 549  
                                         String purpose, String release, String ccmAddr )
 550  
         throws ScmException
 551  
     {
 552  0
         if ( logger.isDebugEnabled() )
 553  
         {
 554  0
             logger.debug( "Synergy : Entering checkoutProject project method" );
 555  
         }
 556  
 
 557  0
         Commandline cl = SynergyCCM.checkoutProject( directory, projectSpec, version, purpose, release, ccmAddr );
 558  
 
 559  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 560  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 561  
 
 562  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 563  
 
 564  0
     }
 565  
 
 566  
     /**
 567  
      * Checkin a given project.
 568  
      *
 569  
      * @param logger       a logger.
 570  
      * @param projectSpec projectSpec (i.e. myProject~1).
 571  
      * @param comment      message.
 572  
      * @param ccmAddr      used to run in multi-session.
 573  
      * @return checkout directory (directory + new project spec)
 574  
      * @throws ScmException
 575  
      */
 576  
     public static void checkinProject( ScmLogger logger, String projectSpec, String comment, String ccmAddr )
 577  
         throws ScmException
 578  
     {
 579  0
         if ( logger.isDebugEnabled() )
 580  
         {
 581  0
             logger.debug( "Synergy : Entering checkinProject project method" );
 582  
         }
 583  
 
 584  0
         Commandline cl = SynergyCCM.checkinProject( projectSpec, comment, ccmAddr );
 585  
 
 586  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 587  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 588  
 
 589  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 590  
 
 591  0
     }
 592  
 
 593  
     /**
 594  
      * Checkin a file set.
 595  
      *
 596  
      * @param logger  a logger.
 597  
      * @param ccmAddr used to run in multi-session.
 598  
      * @return checkout directory (directory + new project spec)
 599  
      * @throws ScmException
 600  
      */
 601  
     public static void checkinFiles( ScmLogger logger, List<File> files, String comment, String ccmAddr )
 602  
         throws ScmException
 603  
     {
 604  0
         if ( logger.isDebugEnabled() )
 605  
         {
 606  0
             logger.debug( "Synergy : Entering checkinFiles project method" );
 607  
         }
 608  
 
 609  0
         Commandline cl = SynergyCCM.checkinFiles( files, comment, ccmAddr );
 610  
 
 611  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 612  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 613  
 
 614  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 615  
 
 616  0
     }
 617  
     
 618  
     /**
 619  
      * Get the number of the current (ie default) task.
 620  
      * 
 621  
      * @param logger  a logger.
 622  
      * @param ccmAddr current Synergy session id.
 623  
      * @return the number of the current (ie default) task. 0 if current task 
 624  
      *                    is not set.
 625  
      * @throws ScmException
 626  
      */
 627  
     public static int getDefaultTask( ScmLogger logger, String ccmAddr )
 628  
             throws ScmException
 629  
     {
 630  0
         if ( logger.isDebugEnabled() )
 631  
         {
 632  0
             logger.debug( "Synergy : Entering getDefaultTask method" );
 633  
         }
 634  
 
 635  0
         Commandline cl = SynergyCCM.showDefaultTask( ccmAddr );
 636  
 
 637  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 638  0
         SynergyShowDefaultTaskConsumer stdout = new SynergyShowDefaultTaskConsumer(logger);
 639  
 
 640  0
         int errorCode = executeSynergyCommand( logger, cl, stderr, stdout, false );
 641  
 
 642  0
         if ( logger.isDebugEnabled() )
 643  
         {
 644  0
             logger.debug( "getDefaultTask returns " + stdout.getTask() + " with error code " + errorCode );
 645  
         }
 646  
 
 647  0
         return stdout.getTask();
 648  
     }
 649  
     
 650  
     /**
 651  
      * Set the current (ie default) task.
 652  
      * 
 653  
      * @param logger  a logger.
 654  
      * @param task          the number of the task to set as current task. 
 655  
      * @param ccmAddr current Synergy session id.
 656  
      * @throws ScmException
 657  
      */
 658  
     public static void setDefaultTask( ScmLogger logger, int task, String ccmAddr )
 659  
             throws ScmException
 660  
     {
 661  0
         if ( logger.isDebugEnabled() )
 662  
         {
 663  0
             logger.debug( "Synergy : Entering setDefaultTask method" );
 664  
         }
 665  
 
 666  0
         Commandline cl = SynergyCCM.setDefaultTask( task, ccmAddr );
 667  
 
 668  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 669  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 670  
 
 671  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 672  0
     }
 673  
 
 674  
     /**
 675  
      * Synchronize a given project.
 676  
      *
 677  
      * @param logger       a logger.
 678  
      * @param projectSpec projectSpec (i.e. myProject~1).
 679  
      * @param ccmAddr      used to run in multi-session.
 680  
      * @throws ScmException
 681  
      */
 682  
     public static void synchronize( ScmLogger logger, String projectSpec, String ccmAddr )
 683  
         throws ScmException
 684  
     {
 685  0
         if ( logger.isDebugEnabled() )
 686  
         {
 687  0
             logger.debug( "Synergy : Entering synchronize method" );
 688  
         }
 689  
 
 690  0
         Commandline cl = SynergyCCM.synchronize( projectSpec, ccmAddr );
 691  
 
 692  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 693  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 694  
 
 695  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 696  0
     }
 697  
 
 698  
     /**
 699  
      * Get the work area of a given project.
 700  
      *
 701  
      * @param logger       a logger.
 702  
      * @param projectSpec projectSpec (i.e. myProject~1).
 703  
      * @param ccmAddr      used to run in multi-session.
 704  
      * @throws ScmException
 705  
      */
 706  
     public static File getWorkArea( ScmLogger logger, String projectSpec, String ccmAddr )
 707  
         throws ScmException
 708  
     {
 709  0
         if ( logger.isDebugEnabled() )
 710  
         {
 711  0
             logger.debug( "Synergy : Entering getWorkArea method" );
 712  
         }
 713  
 
 714  0
         Commandline cl = SynergyCCM.showWorkArea( projectSpec, ccmAddr );
 715  
 
 716  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 717  0
         SynergyWorkareaConsumer stdout = new SynergyWorkareaConsumer( logger );
 718  
 
 719  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 720  
 
 721  0
         if ( logger.isDebugEnabled() )
 722  
         {
 723  0
             logger.debug( "Synergy : getWorkArea returns " + stdout.getWorkAreaPath() );
 724  
         }
 725  
 
 726  0
         return stdout.getWorkAreaPath();
 727  
     }
 728  
 
 729  
     /**
 730  
      * Stop a ccm session.
 731  
      *
 732  
      * @param logger  a logger.
 733  
      * @param ccmAddr used to run in multi-session.
 734  
      * @throws ScmException
 735  
      */
 736  
     public static void stop( ScmLogger logger, String ccmAddr )
 737  
         throws ScmException
 738  
     {
 739  0
         if ( logger.isDebugEnabled() )
 740  
         {
 741  0
             logger.debug( "Synergy : Entering stop method" );
 742  
         }
 743  0
         Commandline cl = SynergyCCM.stop( ccmAddr );
 744  
 
 745  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 746  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 747  
 
 748  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 749  0
     }
 750  
 
 751  
     /**
 752  
      * Start a session Synergy
 753  
      *
 754  
      * @param logger   a logger.
 755  
      * @param username username.
 756  
      * @param password password.
 757  
      * @param role     role or null if none.
 758  
      * @return ccmAddr value to use with this session.
 759  
      */
 760  
     public static String start( ScmLogger logger, String username, String password, SynergyRole role )
 761  
         throws ScmException
 762  
     {
 763  0
         if ( logger.isDebugEnabled() )
 764  
         {
 765  0
             logger.debug( "Synergy : Entering start method" );
 766  
         }
 767  
 
 768  0
         if ( username == null )
 769  
         {
 770  0
             throw new ScmException( "username can't be null" );
 771  
         }
 772  
 
 773  0
         if ( password == null )
 774  
         {
 775  0
             throw new ScmException( "password can't be null" );
 776  
         }
 777  
 
 778  0
         Commandline cl = SynergyCCM.start( username, password, role );
 779  
 
 780  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 781  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 782  
 
 783  
         //executeSynergyCommand( logger, cl, stderr, stdout, true );
 784  
                 
 785  0
         int exitCode = executeSynergyCommand( logger, cl, stderr, stdout, false );
 786  
                 
 787  0
         if ( logger.isDebugEnabled() )
 788  
         {
 789  0
             logger.debug( "Synergy : start returns with error code " + exitCode );
 790  
         }                
 791  
                 
 792  0
         if ( exitCode != 0 ) 
 793  
         {
 794  0
             cl = SynergyCCM.startRemote( username, password, role );
 795  
             
 796  0
             stderr = new CommandLineUtils.StringStreamConsumer();
 797  0
             stdout = new CommandLineUtils.StringStreamConsumer();                        
 798  
             
 799  0
             executeSynergyCommand( logger, cl, stderr, stdout, true );                        
 800  
         }
 801  
 
 802  0
         return stdout.getOutput();
 803  
     }
 804  
 
 805  
     /**
 806  
      * Get Database delimiter
 807  
      *
 808  
      * @param logger  a logger.
 809  
      * @param ccmAddr Synergy session ID.
 810  
      * @return delimiter of the database (i.e. ~).
 811  
      */
 812  
     public static String delimiter( ScmLogger logger, String ccmAddr )
 813  
         throws ScmException
 814  
     {
 815  0
         if ( logger.isDebugEnabled() )
 816  
         {
 817  0
             logger.debug( "Synergy : Entering delimiter method" );
 818  
         }
 819  
 
 820  0
         Commandline cl = SynergyCCM.delimiter( ccmAddr );
 821  
 
 822  0
         CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
 823  0
         CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
 824  
 
 825  0
         executeSynergyCommand( logger, cl, stderr, stdout, true );
 826  
 
 827  0
         return stdout.getOutput();
 828  
     }
 829  
 
 830  
     /**
 831  
      * Execute a command line for Synergy.
 832  
      *
 833  
      * @param logger      a logger.
 834  
      * @param cl          command line.
 835  
      * @param stderr      stderr.
 836  
      * @param stdout      stdout.
 837  
      * @param failOnError should we raise an exception when exit code != 0
 838  
      * @return exit code.
 839  
      * @throws ScmException on error or if exit code != 0 and failOnError = true
 840  
      */
 841  
     protected static int executeSynergyCommand( ScmLogger logger, Commandline cl, StringStreamConsumer stderr,
 842  
                                                 StreamConsumer stdout, boolean failOnError )
 843  
         throws ScmException
 844  
     {
 845  
         int exitCode;
 846  
 
 847  
         try
 848  
         {
 849  0
             if ( logger.isDebugEnabled() )
 850  
             {
 851  0
                 logger.debug( "Executing: " + cl.toString() );
 852  
             }
 853  0
             exitCode = CommandLineUtils.executeCommandLine( cl, stdout, stderr );
 854  
         }
 855  0
         catch ( CommandLineException ex )
 856  
         {
 857  0
             throw new ScmException( "Error while executing synergy command [" + cl.toString() + "].", ex );
 858  0
         }
 859  
 
 860  0
         if ( logger.isDebugEnabled() )
 861  
         {
 862  0
             logger.debug( "Exit code :" + exitCode );
 863  
         }
 864  0
         if ( stdout instanceof StringStreamConsumer )
 865  
         {
 866  0
             if ( logger.isDebugEnabled() )
 867  
             {
 868  0
                 logger.debug( "STDOUT :" + ( (StringStreamConsumer) stdout ).getOutput() );
 869  
             }
 870  
         }
 871  
         else
 872  
         {
 873  0
             if ( logger.isDebugEnabled() )
 874  
             {
 875  0
                 logger.debug( "STDOUT : unavailable" );
 876  
             }
 877  
         }
 878  0
         if ( logger.isDebugEnabled() )
 879  
         {
 880  0
             logger.debug( "STDERR :" + stderr.getOutput() );
 881  
         }
 882  
 
 883  0
         if ( exitCode != 0 && failOnError )
 884  
         {
 885  0
             if ( stdout instanceof StringStreamConsumer )
 886  
             {
 887  0
                 throw new ScmException( "Commandeline = " + cl.toString() + "\nSTDOUT = "
 888  
                     + ( (StringStreamConsumer) stdout ).getOutput() + "\nSTDERR = " + stderr.getOutput() + "\n" );
 889  
             }
 890  
             else
 891  
             {
 892  0
                 throw new ScmException( "Commandeline = " + cl.toString() + "\nSTDOUT = unavailable" + "\nSTDERR = "
 893  
                     + stderr.getOutput() + "\n" );
 894  
             }
 895  
         }
 896  
 
 897  0
         return exitCode;
 898  
     }
 899  
 
 900  
 }