View Javadoc
1   package org.apache.maven.scm.provider.vss.commands;
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.provider.vss.repository.VssScmProviderRepository;
24  
25  import java.io.File;
26  import java.text.DateFormat;
27  import java.text.ParseException;
28  import java.util.Calendar;
29  import java.util.Date;
30  import java.util.GregorianCalendar;
31  
32  
33  /**
34   * @author <a href="mailto:triek@thrx.de">Thorsten Riek</a>
35   *
36   */
37  public class VssParameterContext
38  {
39  
40      private String vssPath = null;
41  
42      private String autoResponse;
43  
44      private String ssDir;
45  
46      private String vssLogin;
47  
48      private String comment;
49  
50      private String user;
51  
52      private String fromLabel;
53  
54      private String toLabel;
55  
56      private boolean quiet;
57  
58      private boolean recursive;
59  
60      private boolean writable;
61  
62      private String label;
63  
64      private String style;
65  
66      private String version;
67  
68      private String date;
69  
70      private String localPath;
71  
72      private String timestamp;
73  
74      /**
75       * Behaviour for writable files
76       */
77      private String writableFiles = null;
78  
79      /**
80       * From date
81       */
82      private String fromDate = null;
83  
84      /**
85       * To date
86       */
87      private String toDate = null;
88  
89      /**
90       * Number of days offset for History
91       */
92      private int numDays = Integer.MIN_VALUE;
93  
94      /**
95       * Get local copy for checkout defaults to true
96       */
97      private boolean getLocalCopy = true;
98  
99      /**
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 }