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 + 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}