001package 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 022import org.apache.maven.scm.ScmException; 023import org.apache.maven.scm.provider.vss.repository.VssScmProviderRepository; 024 025import java.io.File; 026import java.text.DateFormat; 027import java.text.ParseException; 028import java.util.Calendar; 029import java.util.Date; 030import java.util.GregorianCalendar; 031 032 033/** 034 * @author <a href="mailto:triek@thrx.de">Thorsten Riek</a> 035 * 036 */ 037public 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 431 + VssConstants.SS_EXE; 432 } 433 434 public String getVssPath() 435 { 436 return vssPath; 437 } 438 439 440 /** 441 * Gets the Version date string. 442 * 443 * @return An empty string if neither Todate or from date are set. 444 * @throws ScmException 445 */ 446 public String getVersionDate() 447 throws ScmException 448 { 449 if ( fromDate == null && toDate == null && numDays == Integer.MIN_VALUE ) 450 { 451 return ""; 452 } 453 if ( fromDate != null && toDate != null ) 454 { 455 return VssConstants.FLAG_VERSION_DATE + toDate + VssConstants.VALUE_FROMDATE + fromDate; 456 } 457 else if ( toDate != null && numDays != Integer.MIN_VALUE ) 458 { 459 try 460 { 461 return VssConstants.FLAG_VERSION_DATE + toDate + VssConstants.VALUE_FROMDATE 462 + calcDate( toDate, numDays ); 463 } 464 catch ( ParseException ex ) 465 { 466 String msg = "Error parsing date: " + toDate; 467 throw new ScmException( msg ); 468 } 469 } 470 else if ( fromDate != null && numDays != Integer.MIN_VALUE ) 471 { 472 try 473 { 474 return VssConstants.FLAG_VERSION_DATE + calcDate( fromDate, numDays ) + VssConstants.VALUE_FROMDATE 475 + fromDate; 476 } 477 catch ( ParseException ex ) 478 { 479 String msg = "Error parsing date: " + fromDate; 480 throw new ScmException( msg ); 481 } 482 } 483 else 484 { 485 return fromDate != null ? VssConstants.FLAG_VERSION + VssConstants.VALUE_FROMDATE + fromDate 486 : VssConstants.FLAG_VERSION_DATE + toDate; 487 } 488 } 489 490 /** 491 * Gets the output file string. "-Ooutput.file" 492 * 493 * @return An empty string if user is not set. 494 */ 495 public String getOutput() 496 { 497 return outputFileName != null ? VssConstants.FLAG_OUTPUT + outputFileName : ""; 498 } 499 500 /** 501 * Gets the value to determine the behaviour when encountering writable 502 * files. 503 * 504 * @return An empty String, if not set. 505 */ 506 public String getWritableFiles() 507 { 508 // FIXME: Fix this 509 if ( writableFiles == null ) 510 { 511 return ""; 512 } 513 return writableFiles; 514 } 515 516}