/*
* Copyright (C) 2011 Google 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.
*/
package org.ros.internal.message;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.commons.io.DirectoryWalker;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.ros.exception.RosRuntimeException;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* @author damonkohler@google.com (Damon Kohler)
*/
public class StringFileProvider {
private final Collection<File> directories;
private final Map<File, String> strings;
private final StringFileDirectoryWalker stringFileDirectoryWalker;
private final class StringFileDirectoryWalker extends DirectoryWalker {
private final Set<File> directories;
private StringFileDirectoryWalker(FileFilter filter, int depthLimit) {
super(filter, depthLimit);
directories = Sets.newHashSet();
}
// TODO(damonkohler): Update Apache Commons IO to the latest version.
@SuppressWarnings("rawtypes")
@Override
protected boolean handleDirectory(File directory, int depth, Collection results)
throws IOException {
File canonicalDirectory = directory.getCanonicalFile();
if (directories.contains(canonicalDirectory)) {
return false;
}
directories.add(canonicalDirectory);
return true;
}
@SuppressWarnings("rawtypes")
@Override
protected void handleFile(File file, int depth, Collection results) {
String content;
try {
content = FileUtils.readFileToString(file, "US-ASCII");
} catch (IOException e) {
throw new RosRuntimeException(e);
}
strings.put(file, content);
}
public void update(File directory) {
try {
walk(directory, null);
} catch (IOException e) {
throw new RosRuntimeException(e);
}
}
}
public StringFileProvider(IOFileFilter ioFileFilter) {
directories = Lists.newArrayList();
strings = Maps.newConcurrentMap();
IOFileFilter directoryFilter = FileFilterUtils.directoryFileFilter();
FileFilter fileFilter = FileFilterUtils.orFileFilter(directoryFilter, ioFileFilter);
stringFileDirectoryWalker = new StringFileDirectoryWalker(fileFilter, -1);
}
public void update() {
for (File directory : directories) {
stringFileDirectoryWalker.update(directory);
}
}
/**
* Adds a new directory to be scanned for topic definition files.
*
* @param directory
* the directory to add
*/
public void addDirectory(File directory) {
Preconditions.checkArgument(directory.isDirectory());
directories.add(directory);
}
public Map<File, String> getStrings() {
return ImmutableMap.copyOf(strings);
}
public String get(File file) {
if (!has(file)) {
throw new NoSuchElementException("File does not exist: " + file);
}
return strings.get(file);
}
public boolean has(File file) {
return strings.containsKey(file);
}
}