/*************************GO-LICENSE-START********************************* * Copyright 2014 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.config.materials; import java.io.Serializable; import java.util.regex.Pattern; import com.thoughtworks.go.config.ConfigAttribute; import com.thoughtworks.go.config.ConfigTag; import com.thoughtworks.go.config.Validatable; import com.thoughtworks.go.config.ValidationContext; import com.thoughtworks.go.domain.ConfigErrors; import com.thoughtworks.go.domain.materials.MaterialConfig; import com.thoughtworks.go.util.FileUtil; import org.apache.commons.lang.StringUtils; @ConfigTag(value = "ignore") public class IgnoredFiles implements Serializable, Validatable { @ConfigAttribute(value = "pattern") private String pattern; private String processedPattern; private ConfigErrors configErrors = new ConfigErrors(); private final Pattern punctuationRegex = Pattern.compile("\\p{Punct}"); public static final String PATTERN = "pattern"; public IgnoredFiles() { } public IgnoredFiles(String pattern) { this.pattern = pattern; } public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } IgnoredFiles ignore = (IgnoredFiles) o; return !(pattern != null ? !pattern.equals(ignore.pattern) : ignore.pattern != null); } public int hashCode() { return (pattern != null ? pattern.hashCode() : 1); } //our algorithom is replace the ** with ([^/]*/)* and replace the * with [^/]* public boolean shouldIgnore(MaterialConfig materialConfig, String name) { return materialConfig.matches(FileUtil.normalizePath(name), processedPattern()); } private String processedPattern() { if (this.processedPattern == null) { String[] parts = FileUtil.normalizePath(pattern).split("/"); StringBuilder sb = new StringBuilder(); for (String part : parts) { part = escape(part); if ("**".equals(part)) { sb.append(part.replace("**", "([^/]*/)*")); } else if (part.contains("*")) { sb.append(part.replace("*", "[^/]*")); sb.append("/"); } else { sb.append(part); sb.append("/"); } } this.processedPattern = StringUtils.chomp(sb.toString(), "/"); } return this.processedPattern; } private String escape(String pattern) { StringBuilder result = new StringBuilder(); for(char c : pattern.toCharArray()){ if( c != '*' && punctuationRegex.matcher(String.valueOf(c)).matches()){ result.append("\\").append(c); }else{ result.append(String.valueOf(c)); } } return result.toString(); } public String toString() { return "The ignore pattern is [" + pattern + "]"; } public String getPattern() { return pattern; } public void validate(ValidationContext validationContext) { } public ConfigErrors errors() { return configErrors; } public void addError(String fieldName, String message) { configErrors.add(fieldName, message); } }