blob: a48e1b86481398bb267a6f8bee391a93a92e16bf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.jackrabbit.vault.vlt;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.vault.vlt.meta.Ignored;
import org.apache.jackrabbit.vault.vlt.meta.VltEntries;
import org.apache.jackrabbit.vault.vlt.meta.VltEntry;
/**
* {@code FileList}...
*
*/
public class FileList {
private final Map<String, VltFile> files = new TreeMap<String, VltFile>();
private final VltDirectory dir;
private final VltEntries entries;
private final Set<String> globalIgnores;
private List<Pattern> ignored = new LinkedList<Pattern>();
public FileList(VltDirectory dir, VltEntries entries) throws VltException {
this.dir = dir;
this.entries = entries;
globalIgnores = new HashSet<String>(
dir.getContext().getMetaInf().getSettings().getIgnoredNames());
globalIgnores.add(Ignored.FILE_NAME);
loadIgnored(dir.getDirectory());
scanDirectory(dir.getDirectory());
scanEntries();
}
private void loadIgnored(File directory) throws VltException {
try {
File file = new File(directory, Ignored.FILE_NAME);
if (file.isFile() && file.canRead()) {
for (Object o: FileUtils.readLines(file, "utf-8")) {
ignored.add(createPatternFromGlob(o.toString()));
}
}
} catch (IOException e) {
throw new VltException("Unable to load .vltignore file", e);
}
}
private static Pattern createPatternFromGlob(String glob) {
// only support * and ?
glob = glob.replace(".", "\\.");
glob = glob.replace("*", ".*");
glob = glob.replace("?", ".+");
return Pattern.compile(glob);
}
public boolean isVltIgnored(String name) {
for (Pattern p: ignored) {
if (p.matcher(name).matches()) {
return true;
}
}
return false;
}
private void scanEntries() throws VltException {
for (VltEntry entry: entries.entries()) {
if (!files.containsKey(entry.getName())) {
VltFile file = new VltFile(dir, entry.getName(), entry);
files.put(file.getName(), file);
}
}
}
private void scanDirectory(File localDir) throws VltException {
File[] localFiles = localDir.listFiles();
if (localFiles != null) {
for (File localFile : localFiles) {
if (!isIgnored(localFile)) {
String name = localFile.getName();
VltEntry entry = entries.getEntry(name);
VltFile file = new VltFile(dir, name, entry);
files.put(name, file);
}
}
}
}
public boolean isIgnored(File file) {
// currently only check for extension for conflict files
String name = file.getName();
return name.equals(VltDirectory.META_DIR_NAME)
|| globalIgnores.contains(name) || isVltIgnored(name);
}
public VltFile getFile(String name) {
return files.get(name);
}
public boolean hasFile(String name) {
return files.containsKey(name);
}
public Collection<VltFile> getFiles() {
return files.values();
}
public Set<String> getFileNames() {
return new HashSet<String>(files.keySet());
}
public void addFile(VltFile file) {
files.put(file.getName(), file);
}
}