001package org.apache.maven.scm;
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 java.io.File;
023import java.io.IOException;
024import java.io.Serializable;
025import java.util.ArrayList;
026import java.util.Arrays;
027import java.util.List;
028
029import org.codehaus.plexus.util.DirectoryScanner;
030import org.codehaus.plexus.util.FileUtils;
031import org.codehaus.plexus.util.StringUtils;
032
033/**
034 * Set of files used for SCM operations.
035 * Consists of the base directory of the files and a list of files relative to that directory.
036 *
037 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
038 *
039 */
040public class ScmFileSet
041    implements Serializable
042{
043    private static final long serialVersionUID = -5978597349974797556L;
044
045    private static final String DELIMITER = ",";
046    
047    /** @see DirectoryScanner#DEFAULTEXCLUDES */
048    private static final String DEFAULT_EXCLUDES = StringUtils.join( DirectoryScanner.DEFAULTEXCLUDES, DELIMITER );
049
050    private final File basedir;
051
052    private String includes;
053
054    private String excludes;
055
056    /**
057     * List of File objects, all relative to the basedir.
058     */
059    private final List<File> files;
060
061    /**
062     * Create a file set with no files, only the base directory.
063     *
064     * @param basedir directory files in the set are relative to
065     */
066    public ScmFileSet( File basedir )
067    {
068        this( basedir, new ArrayList<File>( 0 ) );
069    }
070
071    /**
072     * Create a file set with only the file provided, relative to basedir.
073     *
074     * @param basedir directory file is relative to
075     * @param file    file that the set will contain, has to be relative to basedir
076     */
077    public ScmFileSet( File basedir, File file )
078    {
079        this( basedir, new File[]{file} );
080    }
081
082    /**
083     * Create a file set with only files (not directories) from basefile,
084     * using includes and excludes provided.
085     *
086     * @param basedir  directory files are relative to
087     * @param includes Ant pattern for files to include
088     * @param excludes Ant pattern for files to exclude,
089     *                 if null DEFAULT_EXCLUDES is used, else DEFAULT_EXCLUDES is added.
090     * @throws IOException if any
091     */
092    public ScmFileSet( File basedir, String includes, String excludes )
093        throws IOException
094    {
095        this.basedir = basedir;
096
097        if ( excludes != null && excludes.length() > 0 )
098        {
099            excludes += DELIMITER + DEFAULT_EXCLUDES;
100        }
101        else
102        {
103            excludes = DEFAULT_EXCLUDES;
104        }
105        @SuppressWarnings( "unchecked" )
106        List<File> fileList = (List<File>) FileUtils.getFiles( basedir, includes, excludes, false ); 
107        this.files = fileList;
108        this.includes = includes;
109        this.excludes = excludes;
110    }
111
112    /**
113     * Create a file set with files from basefile, using includes provided and default excludes.
114     *
115     * @param basedir  directory files are relative to
116     * @param includes Ant pattern for files to include
117     * @throws IOException if any
118     * @since 1.0
119     */
120    public ScmFileSet( File basedir, String includes )
121        throws IOException
122    {
123        this( basedir, includes, null );
124    }
125
126    /**
127     * Create a file set with the files provided, relative to basedir.
128     *
129     * @param basedir directory files are relative to
130     * @param files   files that the set will contain, have to be relative to basedir
131     * @deprecated use ScmFileSet( File, List )
132     */
133    public ScmFileSet( File basedir, File[] files )
134    {
135        this( basedir, Arrays.asList( files ) );
136    }
137
138    /**
139     * Create a file set with the files provided, relative to basedir.
140     *
141     * @param basedir directory files are relative to
142     * @param files   list of File objects, files that the set will contain, have to be relative to basedir
143     */
144    public ScmFileSet( File basedir, List<File> files )
145    {
146        if ( basedir == null )
147        {
148            throw new NullPointerException( "basedir must not be null" );
149        }
150
151        if ( files == null )
152        {
153            throw new NullPointerException( "files must not be null" );
154        }
155
156        this.basedir = basedir;
157        this.files = files;
158    }
159
160    /**
161     * Get the base directory of the file set. It's the directory files in the set are relative to.
162     *
163     * @return base directory
164     */
165    public File getBasedir()
166    {
167        return basedir;
168    }
169
170    /**
171     * Get the list of files in the set, relative to basedir
172     *
173     * @return files in this set
174     * @deprecated use getFileList() instead
175     */
176    public File[] getFiles()
177    {
178        return this.files.toArray( new File[this.files.size()] );
179    }
180
181    /**
182     * Get the list of files in the set, relative to basedir
183     *
184     * @return List of File objects
185     */
186    public List<File> getFileList()
187    {
188        return this.files;
189    }
190
191
192    /**
193     * @return the includes files as a comma separated string
194     */
195    public String getIncludes()
196    {
197        return this.includes;
198    }
199
200
201    /**
202     * @return the excludes files as a comma separated string
203     */
204    public String getExcludes()
205    {
206        return this.excludes;
207    }
208
209    /** {@inheritDoc} */
210    public String toString()
211    {
212        return "basedir = " + basedir + "; files = " + files;
213    }
214}