001    package 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    
022    import java.io.File;
023    import java.io.IOException;
024    import java.io.Serializable;
025    import java.util.ArrayList;
026    import java.util.Arrays;
027    import java.util.List;
028    
029    import org.codehaus.plexus.util.DirectoryScanner;
030    import org.codehaus.plexus.util.FileUtils;
031    import 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     * @version $Id: ScmFileSet.java 1306861 2012-03-29 13:42:02Z olamy $
039     */
040    public 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    }