1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.maven.scm;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.io.Serializable;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.List;
27
28 import org.apache.commons.lang3.StringUtils;
29 import org.codehaus.plexus.util.DirectoryScanner;
30 import org.codehaus.plexus.util.FileUtils;
31
32 /**
33 * Set of files used for SCM operations.
34 * Consists of the base directory of the files and a list of files relative to that directory.
35 *
36 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
37 */
38 public class ScmFileSet implements Serializable {
39 private static final long serialVersionUID = -5978597349974797556L;
40
41 private static final String DELIMITER = ",";
42
43 /**
44 * @see DirectoryScanner#DEFAULTEXCLUDES
45 */
46 private static final String DEFAULT_EXCLUDES = StringUtils.join(DirectoryScanner.DEFAULTEXCLUDES, DELIMITER);
47
48 private final File basedir;
49
50 private String includes;
51
52 private String excludes;
53
54 /**
55 * List of File objects, all relative to the basedir.
56 */
57 private final List<File> files;
58
59 /**
60 * Create a file set with no files, only the base directory.
61 *
62 * @param basedir directory files in the set are relative to
63 */
64 public ScmFileSet(File basedir) {
65 this(basedir, new ArrayList<>(0));
66 }
67
68 /**
69 * Create a file set with only the file provided, relative to basedir.
70 *
71 * @param basedir directory file is relative to
72 * @param file file that the set will contain, has to be relative to basedir
73 */
74 public ScmFileSet(File basedir, File file) {
75 this(basedir, new File[] {file});
76 }
77
78 /**
79 * Create a file set with only files (not directories) from basefile,
80 * using includes and excludes provided.
81 *
82 * @param basedir directory files are relative to
83 * @param includes ant pattern for files to include
84 * @param excludes ant pattern for files to exclude,
85 * if null DEFAULT_EXCLUDES is used, else DEFAULT_EXCLUDES is added
86 * @throws IOException if any
87 */
88 public ScmFileSet(File basedir, String includes, String excludes) throws IOException {
89 this.basedir = basedir;
90
91 if (excludes != null && excludes.length() > 0) {
92 excludes += DELIMITER + DEFAULT_EXCLUDES;
93 } else {
94 excludes = DEFAULT_EXCLUDES;
95 }
96 this.files = FileUtils.getFiles(basedir, includes, excludes, false);
97 this.includes = includes;
98 this.excludes = excludes;
99 }
100
101 /**
102 * Create a file set with files from basefile, using includes provided and default excludes.
103 *
104 * @param basedir directory files are relative to
105 * @param includes ant pattern for files to include
106 * @throws IOException if any
107 * @since 1.0
108 */
109 public ScmFileSet(File basedir, String includes) throws IOException {
110 this(basedir, includes, null);
111 }
112
113 /**
114 * Create a file set with the files provided, relative to basedir.
115 *
116 * @param basedir directory files are relative to
117 * @param files files that the set will contain, have to be relative to basedir
118 * @deprecated use ScmFileSet( File, List )
119 */
120 public ScmFileSet(File basedir, File[] files) {
121 this(basedir, Arrays.asList(files));
122 }
123
124 /**
125 * Create a file set with the files provided, relative to basedir.
126 *
127 * @param basedir directory files are relative to
128 * @param files list of File objects, files that the set will contain, have to be relative to basedir
129 */
130 public ScmFileSet(File basedir, List<File> files) {
131 if (basedir == null) {
132 throw new NullPointerException("basedir must not be null");
133 }
134
135 if (files == null) {
136 throw new NullPointerException("files must not be null");
137 }
138
139 this.basedir = basedir;
140 this.files = files;
141 }
142
143 /**
144 * Get the base directory of the file set. It's the directory files in the set are relative to.
145 *
146 * @return base directory
147 */
148 public File getBasedir() {
149 return basedir;
150 }
151
152 /**
153 * Get the list of files in the set, relative to basedir.
154 *
155 * @return files in this set
156 * @deprecated use getFileList() instead
157 */
158 public File[] getFiles() {
159 return this.files.toArray(new File[this.files.size()]);
160 }
161
162 /**
163 * Get the list of files in the set, relative to basedir.
164 *
165 * @return list of File objects
166 */
167 public List<File> getFileList() {
168 return this.files;
169 }
170
171 /**
172 * @return the includes files as a comma separated string
173 */
174 public String getIncludes() {
175 return this.includes;
176 }
177
178 /**
179 * @return the excludes files as a comma separated string
180 */
181 public String getExcludes() {
182 return this.excludes;
183 }
184
185 /**
186 * {@inheritDoc}
187 */
188 public String toString() {
189 return "basedir = " + basedir + "; files = " + files;
190 }
191 }