001 package org.apache.maven.scm.provider.vss.commands; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import org.apache.maven.scm.ScmException; 023 import org.apache.maven.scm.provider.vss.repository.VssScmProviderRepository; 024 025 import java.io.File; 026 import java.text.DateFormat; 027 import java.text.ParseException; 028 import java.util.Calendar; 029 import java.util.Date; 030 import java.util.GregorianCalendar; 031 032 033 /** 034 * @author <a href="mailto:triek@thrx.de">Thorsten Riek</a> 035 * @version $Id: VssParameterContext.java 687495 2008-08-20 22:54:52Z olamy $ 036 */ 037 public class VssParameterContext 038 { 039 040 private String vssPath = null; 041 042 private String autoResponse; 043 044 private String ssDir; 045 046 private String vssLogin; 047 048 private String comment; 049 050 private String user; 051 052 private String fromLabel; 053 054 private String toLabel; 055 056 private boolean quiet; 057 058 private boolean recursive; 059 060 private boolean writable; 061 062 private String label; 063 064 private String style; 065 066 private String version; 067 068 private String date; 069 070 private String localPath; 071 072 private String timestamp; 073 074 /** 075 * Behaviour for writable files 076 */ 077 private String writableFiles = null; 078 079 /** 080 * From date 081 */ 082 private String fromDate = null; 083 084 /** 085 * To date 086 */ 087 private String toDate = null; 088 089 /** 090 * Number of days offset for History 091 */ 092 private int numDays = Integer.MIN_VALUE; 093 094 /** 095 * Get local copy for checkout defaults to true 096 */ 097 private boolean getLocalCopy = true; 098 099 /** 100 * Date format for History 101 */ 102 private DateFormat dateFormat = DateFormat 103 .getDateInstance( DateFormat.SHORT ); 104 105 private String outputFileName; 106 107 public static VssParameterContext getInstance( Object obj ) 108 { 109 return new VssParameterContext( (VssScmProviderRepository) obj ); 110 } 111 112 public VssParameterContext( VssScmProviderRepository repo ) 113 { 114 autoResponse = System.getProperty( "maven.scm.autoResponse" ); 115 this.ssDir = repo.getVssdir(); 116 this.user = repo.getUser(); 117 // this.vssLogin = this.user + (repos.getPassword() == null ? "" : ","+repos.getPassword()); 118 } 119 120 /** 121 * Builds and returns the -G- flag if required. 122 * 123 * @return An empty string if get local copy is true. 124 */ 125 public String getGetLocalCopy() 126 { 127 return ( !getLocalCopy ) ? VssConstants.FLAG_NO_GET : ""; 128 } 129 130 /** 131 * Calculate the start date for version comparison. 132 * <p/> 133 * Calculate the date numDay days earlier than startdate. 134 * 135 * @param startDate The start date. 136 * @param daysToAdd The number of days to add. 137 * @return The calculated date. 138 * @throws ParseException 139 */ 140 private String calcDate( String startDate, int daysToAdd ) 141 throws ParseException 142 { 143 Date currentDate = new Date(); 144 Calendar calendar = new GregorianCalendar(); 145 currentDate = dateFormat.parse( startDate ); 146 calendar.setTime( currentDate ); 147 calendar.add( Calendar.DATE, daysToAdd ); 148 return dateFormat.format( calendar.getTime() ); 149 } 150 151 /** 152 * Gets the value set for the FileTimeStamp. if it equals "current" then we 153 * return -GTC if it equals "modified" then we return -GTM if it equals 154 * "updated" then we return -GTU otherwise we return -GTC 155 * 156 * @return The default file time flag, if not set. 157 */ 158 public String getFileTimeStamp() 159 { 160 if ( timestamp == null ) 161 { 162 return ""; 163 } 164 return timestamp; 165 } 166 167 /** 168 * Gets the localpath string. "-GLc:\source" 169 * <p/> 170 * The localpath is created if it didn't exist. 171 * 172 * @return An empty string if localpath is not set. 173 */ 174 public String getLocalpath() 175 throws ScmException 176 { 177 String lclPath = ""; // set to empty str if no local path return 178 if ( localPath != null ) 179 { 180 // make sure m_LocalDir exists, create it if it doesn't 181 File dir = new File( localPath ); 182 if ( !dir.exists() ) 183 { 184 boolean done = dir.mkdirs(); 185 if ( !done ) 186 { 187 String msg = "Directory " + localPath + " creation was not " + "successful for an unknown reason"; 188 throw new ScmException( msg ); 189 } 190 // getLogger().info("Created dir: " + dir.getAbsolutePath()); 191 } 192 lclPath = VssConstants.FLAG_OVERRIDE_WORKING_DIR + localPath; 193 } 194 return lclPath; 195 } 196 197 /** 198 * Gets the label string. "-Lbuild1" Max label length is 32 chars 199 * 200 * @return An empty string if label is not set. 201 */ 202 public String getLabel() 203 { 204 String shortLabel = ""; 205 if ( label != null && label.length() > 0 ) 206 { 207 shortLabel = VssConstants.FLAG_LABEL + getShortLabel(); 208 } 209 return shortLabel; 210 } 211 212 /** 213 * Gets the version string. Returns the first specified of version "-V1.0", 214 * date "-Vd01.01.01", label "-Vlbuild1". 215 * 216 * @return An empty string if a version, date and label are not set. 217 */ 218 public String getVersionDateLabel() 219 { 220 String versionDateLabel = ""; 221 if ( version != null ) 222 { 223 versionDateLabel = VssConstants.FLAG_VERSION + version; 224 } 225 else if ( date != null ) 226 { 227 versionDateLabel = VssConstants.FLAG_VERSION_DATE + date; 228 } 229 else 230 { 231 // Use getShortLabel() so labels longer then 30 char are truncated 232 // and the user is warned 233 String shortLabel = getShortLabel(); 234 if ( shortLabel != null && !shortLabel.equals( "" ) ) 235 { 236 versionDateLabel = VssConstants.FLAG_VERSION_LABEL + shortLabel; 237 } 238 } 239 return versionDateLabel; 240 } 241 242 /** 243 * Gets the version string. 244 * 245 * @return An empty string if a version is not set. 246 */ 247 public String getVersion() 248 { 249 return version != null ? VssConstants.FLAG_VERSION + version : ""; 250 } 251 252 /** 253 * Return at most the 30 first chars of the label, logging a warning message 254 * about the truncation 255 * 256 * @return at most the 30 first chars of the label 257 */ 258 private String getShortLabel() 259 { 260 String shortLabel; 261 if ( label != null && label.length() > 31 ) 262 { 263 shortLabel = this.label.substring( 0, 30 ); 264 // getLogger().warn( 265 // "Label is longer than 31 characters, truncated to: " 266 // + shortLabel); 267 } 268 else 269 { 270 shortLabel = label; 271 } 272 return shortLabel; 273 } 274 275 /** 276 * Gets the style string. "-Lbuild1" 277 * 278 * @return An empty string if label is not set. 279 */ 280 public String getStyle() 281 { 282 return style != null ? style : ""; 283 } 284 285 /** 286 * Gets the recursive string. "-R" 287 * 288 * @return An empty string if recursive is not set or is false. 289 */ 290 public String getRecursive() 291 { 292 return recursive ? VssConstants.FLAG_RECURSION : ""; 293 } 294 295 /** 296 * Gets the writable string. "-W" 297 * 298 * @return An empty string if writable is not set or is false. 299 */ 300 public String getWritable() 301 { 302 return writable ? VssConstants.FLAG_WRITABLE : ""; 303 } 304 305 /** 306 * Gets the quiet string. -O- 307 * 308 * @return An empty string if quiet is not set or is false. 309 */ 310 public String getQuiet() 311 { 312 return quiet ? VssConstants.FLAG_QUIET : ""; 313 } 314 315 public String getVersionLabel() 316 { 317 if ( fromLabel == null && toLabel == null ) 318 { 319 return ""; 320 } 321 if ( fromLabel != null && toLabel != null ) 322 { 323 if ( fromLabel.length() > 31 ) 324 { 325 fromLabel = fromLabel.substring( 0, 30 ); 326 // getLogger().warn( 327 // "FromLabel is longer than 31 characters, truncated to: " 328 // + fromLabel); 329 } 330 if ( toLabel.length() > 31 ) 331 { 332 toLabel = toLabel.substring( 0, 30 ); 333 // getLogger().warn( 334 // "ToLabel is longer than 31 characters, truncated to: " 335 // + toLabel); 336 } 337 return VssConstants.FLAG_VERSION_LABEL + toLabel + VssConstants.VALUE_FROMLABEL + fromLabel; 338 } 339 else if ( fromLabel != null ) 340 { 341 if ( fromLabel.length() > 31 ) 342 { 343 fromLabel = fromLabel.substring( 0, 30 ); 344 // getLogger().warn( 345 // "FromLabel is longer than 31 characters, truncated to: " 346 // + fromLabel); 347 } 348 return VssConstants.FLAG_VERSION + VssConstants.VALUE_FROMLABEL + fromLabel; 349 } 350 else 351 { 352 if ( toLabel.length() > 31 ) 353 { 354 toLabel = toLabel.substring( 0, 30 ); 355 // getLogger().warn( 356 // "ToLabel is longer than 31 characters, truncated to: " 357 // + toLabel); 358 } 359 return VssConstants.FLAG_VERSION_LABEL + toLabel; 360 } 361 } 362 363 /** 364 * Gets the user string. "-Uusername" 365 * 366 * @return An empty string if user is not set. 367 */ 368 public String getUser() 369 { 370 return user != null ? VssConstants.FLAG_USER + user : ""; 371 } 372 373 /** 374 * Gets the comment string. "-Ccomment text" 375 * 376 * @return A comment of "-" if comment is not set. 377 */ 378 public String getComment() 379 { 380 return comment != null ? VssConstants.FLAG_COMMENT + comment : VssConstants.FLAG_COMMENT + "-"; 381 } 382 383 /** 384 * Gets the login string. This can be user and password, "-Yuser,password" 385 * or just user "-Yuser". 386 * 387 * @return An empty string if login is not set. 388 */ 389 public String getLogin() 390 { 391 return vssLogin != null ? ( VssConstants.FLAG_LOGIN + vssLogin ) : ""; 392 } 393 394 /** 395 * Gets the auto response string. This can be Y "-I-Y" or N "-I-N". 396 * 397 * @return The default value "-I-" if autoresponse is not set. 398 */ 399 public String getAutoresponse() 400 { 401 if ( autoResponse == null ) 402 { 403 return VssConstants.FLAG_AUTORESPONSE_DEF; 404 } 405 else if ( autoResponse.equalsIgnoreCase( "Y" ) ) 406 { 407 return VssConstants.FLAG_AUTORESPONSE_YES; 408 } 409 else if ( autoResponse.equalsIgnoreCase( "N" ) ) 410 { 411 return VssConstants.FLAG_AUTORESPONSE_NO; 412 } 413 else 414 { 415 return VssConstants.FLAG_AUTORESPONSE_DEF; 416 } 417 } 418 419 /** 420 * Gets the sscommand string. "ss" or "c:\path\to\ss" 421 * 422 * @return The path to ss.exe or just ss if sscommand is not set. 423 */ 424 public String getSSCommand() 425 { 426 if ( ssDir == null ) 427 { 428 return VssConstants.SS_EXE; 429 } 430 return ssDir.endsWith( File.separator ) ? ssDir + VssConstants.SS_EXE : ssDir + File.separator + VssConstants.SS_EXE; 431 } 432 433 public String getVssPath() 434 { 435 return vssPath; 436 } 437 438 439 /** 440 * Gets the Version date string. 441 * 442 * @return An empty string if neither Todate or from date are set. 443 * @throws ScmException 444 */ 445 public String getVersionDate() 446 throws ScmException 447 { 448 if ( fromDate == null && toDate == null && numDays == Integer.MIN_VALUE ) 449 { 450 return ""; 451 } 452 if ( fromDate != null && toDate != null ) 453 { 454 return VssConstants.FLAG_VERSION_DATE + toDate + VssConstants.VALUE_FROMDATE + fromDate; 455 } 456 else if ( toDate != null && numDays != Integer.MIN_VALUE ) 457 { 458 try 459 { 460 return VssConstants.FLAG_VERSION_DATE + toDate + VssConstants.VALUE_FROMDATE + calcDate( toDate, numDays ); 461 } 462 catch ( ParseException ex ) 463 { 464 String msg = "Error parsing date: " + toDate; 465 throw new ScmException( msg ); 466 } 467 } 468 else if ( fromDate != null && numDays != Integer.MIN_VALUE ) 469 { 470 try 471 { 472 return VssConstants.FLAG_VERSION_DATE + calcDate( fromDate, numDays ) + VssConstants.VALUE_FROMDATE + fromDate; 473 } 474 catch ( ParseException ex ) 475 { 476 String msg = "Error parsing date: " + fromDate; 477 throw new ScmException( msg ); 478 } 479 } 480 else 481 { 482 return fromDate != null ? VssConstants.FLAG_VERSION + VssConstants.VALUE_FROMDATE + fromDate : VssConstants.FLAG_VERSION_DATE + toDate; 483 } 484 } 485 486 /** 487 * Gets the output file string. "-Ooutput.file" 488 * 489 * @return An empty string if user is not set. 490 */ 491 public String getOutput() 492 { 493 return outputFileName != null ? VssConstants.FLAG_OUTPUT + outputFileName : ""; 494 } 495 496 /** 497 * Gets the value to determine the behaviour when encountering writable 498 * files. 499 * 500 * @return An empty String, if not set. 501 */ 502 public String getWritableFiles() 503 { 504 // FIXME: Fix this 505 if ( writableFiles == null ) 506 { 507 return ""; 508 } 509 return writableFiles; 510 } 511 512 }