001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2009 SonarSource SA
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.api.resources;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.apache.commons.lang.builder.ToStringBuilder;
024 import org.sonar.api.utils.WildcardPattern;
025
026 import java.util.List;
027
028 /**
029 * This class is an implementation of a resource of type FILE
030 * @since 1.10
031 */
032 public class File implements Resource<Directory> {
033
034 private String directoryKey;
035 private String key;
036 private String filename;
037 private Language language;
038 private Directory parent;
039
040 /**
041 * File in project. Key is the path relative to project source directories. It is not the absolute path
042 * and it does not include the path to source directories. Example : <code>new File("org/sonar/foo.sql")</code>. The
043 * absolute path may be c:/myproject/src/main/sql/org/sonar/foo.sql. Project root is c:/myproject and source dir
044 * is src/main/sql.
045 */
046 public File(String key) {
047 if (key == null) {
048 throw new IllegalArgumentException("File key is null");
049 }
050 this.key = parseKey(key);
051 if (this.key.indexOf(Directory.SEPARATOR) >= 0) {
052 this.directoryKey = Directory.parseKey(StringUtils.substringBeforeLast(key, Directory.SEPARATOR));
053 this.filename = StringUtils.substringAfterLast(this.key, Directory.SEPARATOR);
054 this.key = new StringBuilder().append(this.directoryKey).append(Directory.SEPARATOR).append(filename).toString();
055
056 } else {
057 this.filename = key;
058 }
059 }
060
061 /**
062 * Creates a file from its containing directory and name
063 */
064 public File(String directory, String filename) {
065 this.filename = StringUtils.trim(filename);
066 if (StringUtils.isBlank(directory)) {
067 this.key = filename;
068
069 } else {
070 this.directoryKey = Directory.parseKey(directory);
071 this.key = new StringBuilder().append(directoryKey).append(Directory.SEPARATOR).append(this.filename).toString();
072 }
073 }
074
075 /**
076 * Creates a File from its language and its key
077 */
078 public File(Language language, String key) {
079 this(key);
080 this.language = language;
081 }
082
083 /**
084 * Creates a File from language, directory and filename
085 */
086 public File(Language language, String directory, String filename) {
087 this(directory, filename);
088 this.language = language;
089 }
090
091 /**
092 * {@inheritDoc}
093 *
094 * @see Resource#getParent()
095 */
096 public Directory getParent() {
097 if (parent == null) {
098 parent = new Directory(directoryKey);
099 }
100 return parent;
101 }
102
103 private static String parseKey(String key) {
104 if (StringUtils.isBlank(key)) {
105 return null;
106 }
107
108 key = key.replace('\\', '/');
109 key = StringUtils.trim(key);
110 return key;
111 }
112
113 /**
114 * {@inheritDoc}
115 *
116 * @see Resource#matchFilePattern(String)
117 */
118 public boolean matchFilePattern(String antPattern) {
119 WildcardPattern matcher = WildcardPattern.create(antPattern, "/");
120 return matcher.match(getKey());
121 }
122
123 /**
124 * Creates a File from an io.file and a list of sources directories
125 */
126 public static File fromIOFile(java.io.File file, List<java.io.File> sourceDirs) {
127 String relativePath = DefaultProjectFileSystem.getRelativePath(file, sourceDirs);
128 if (relativePath != null) {
129 return new File(relativePath);
130 }
131 return null;
132 }
133
134 /**
135 * Creates a File from its name and a project
136 */
137 public static File fromIOFile(java.io.File file, Project project) {
138 return fromIOFile(file, project.getFileSystem().getSourceDirs());
139 }
140
141 /**
142 * {@inheritDoc}
143 *
144 * @see Resource#getKey()
145 */
146 public String getKey() {
147 return key;
148 }
149
150 /**
151 * {@inheritDoc}
152 *
153 * @see Resource#getName()
154 */
155 public String getName() {
156 return filename;
157 }
158
159 /**
160 * {@inheritDoc}
161 *
162 * @see Resource#getLongName()
163 */
164 public String getLongName() {
165 return key;
166 }
167
168 /**
169 * {@inheritDoc}
170 *
171 * @see Resource#getDescription()
172 */
173 public String getDescription() {
174 return null;
175 }
176
177 /**
178 * {@inheritDoc}
179 *
180 * @see Resource#getLanguage()
181 */
182 public Language getLanguage() {
183 return language;
184 }
185
186 /**
187 * Sets the language of the file
188 */
189 public void setLanguage(Language language) {
190 this.language = language;
191 }
192
193 /**
194 * @return SCOPE_ENTITY
195 */
196 public String getScope() {
197 return Resource.SCOPE_ENTITY;
198 }
199
200 /**
201 * @return QUALIFIER_FILE
202 */
203 public String getQualifier() {
204 return Resource.QUALIFIER_FILE;
205 }
206
207 @Override
208 public boolean equals(Object obj) {
209 if (!(obj instanceof File)) {
210 return false;
211 }
212 if (this == obj) {
213 return true;
214 }
215 File other = (File) obj;
216 return StringUtils.equals(key, other.getKey());
217 }
218
219 @Override
220 public int hashCode() {
221 return key.hashCode();
222 }
223
224 @Override
225 public String toString() {
226 return new ToStringBuilder(this)
227 .append("key", key)
228 .append("dir", directoryKey)
229 .append("filename", filename)
230 .append("language", language)
231 .toString();
232 }
233 }