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    }