/*
* Copyright 2013 Atteo.
*
* 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.atteo.moonshine.directories;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import com.google.common.collect.Iterables;
/**
* Manages directory structure of the application.
*/
public class DefaultFileAccessor implements FileAccessorFactory {
private FileAccessorCommandLineParameters parameters = new FileAccessorCommandLineParameters();
private WriteableDirectoryLayout writeableLayout;
private List<ReadOnlyDirectoryLayout> readOnlyLayouts = new ArrayList<>();
private List<Path> extraConfigDirs = new ArrayList<>();
private List<Path> extraDataDirs = new ArrayList<>();
public DefaultFileAccessor() {
}
@Override
public Object getParameters() {
return parameters;
}
@Override
public void addConfigDir(String path) {
extraConfigDirs.add(Paths.get(path));
}
@Override
public void addDataDir(String path) {
extraDataDirs.add(Paths.get(path));
}
@Override
public void setWriteableLayout(WriteableDirectoryLayout writeableLayout) {
this.writeableLayout = writeableLayout;
}
@Override
public FileAccessor getFileAccessor() throws IOException {
final Path configHome;
final Path dataHome;
final Path cacheHome;
final Path logHome;
final List<Path> configDirs = new ArrayList<>();
final List<Path> dataDirs = new ArrayList<>();
WriteableDirectoryLayout layout = writeableLayout;
if (parameters.getHomeDirectory() != null) {
layout = new SubdirectoryLayout(Paths.get(parameters.getHomeDirectory()));
}
if (layout == null) {
layout = new SubdirectoryLayout((Paths.get("")));
}
if (parameters.getConfigHome() != null) {
configHome = Paths.get(parameters.getConfigHome());
} else {
configHome = layout.getConfigHome();
}
if (parameters.getDataHome() != null) {
dataHome = Paths.get(parameters.getDataHome());
} else {
dataHome = layout.getDataHome();
}
if (parameters.getCacheHome() != null) {
cacheHome = Paths.get(parameters.getCacheHome());
} else {
cacheHome = layout.getCacheHome();
}
if (parameters.getLogHome() != null) {
logHome = Paths.get(parameters.getLogHome());
} else {
logHome = layout.getLogHome();
}
Iterables.addAll(configDirs, layout.getConfigDirs());
Iterables.addAll(dataDirs, layout.getDataDirs());
Iterables.addAll(configDirs, extraConfigDirs);
Iterables.addAll(dataDirs, extraDataDirs);
for (ReadOnlyDirectoryLayout readOnlyLayout : readOnlyLayouts) {
Iterables.addAll(configDirs, readOnlyLayout.getConfigDirs());
Iterables.addAll(dataDirs, readOnlyLayout.getDataDirs());
}
Files.createDirectories(configHome);
Files.createDirectories(dataHome);
Files.createDirectories(cacheHome);
Files.createDirectories(logHome);
return new FileAccessor() {
private Path getFile(Path home, Iterable<Path> dirs, String fileName) {
Path filePath = home.resolve(fileName);
if (Files.exists(filePath)) {
return filePath;
}
for (Path path : dirs) {
filePath = path.resolve(fileName);
if (Files.exists(filePath)) {
return filePath;
}
}
return null;
}
private Iterable<Path> getFiles(Path home, Iterable<Path> dirs, String fileName) {
List<Path> files = new ArrayList<>();
Path filePath = home.resolve(fileName);
if (Files.exists(filePath)) {
files.add(filePath);
}
for (Path path : dirs) {
filePath = path.resolve(fileName);
if (Files.exists(filePath)) {
files.add(filePath);
}
}
return files;
}
@Override
public Path getConfigFile(String fileName) {
return getFile(configHome, configDirs, fileName);
}
@Override
public Iterable<Path> getConfigFiles(String fileName) {
return getFiles(configHome, configDirs, fileName);
}
@Override
public Path getWritableConfigFile(String fileName) {
return configHome.resolve(fileName);
}
@Override
public Path getDataFile(String fileName) {
return getFile(dataHome, dataDirs, fileName);
}
@Override
public Iterable<Path> getDataFiles(String fileName) {
return getFiles(configHome, configDirs, fileName);
}
@Override
public Path getWriteableDataFile(String fileName) {
return dataHome.resolve(fileName);
}
@Override
public Path getWriteableCacheFile(String fileName) {
return cacheHome.resolve(fileName);
}
@Override
public Path getWriteableLogfile(String fileName) {
return logHome.resolve(fileName);
}
@Override
public Properties getProperties() {
Properties properties = new Properties();
properties.setProperty("configHome", configHome.toAbsolutePath().toString());
properties.setProperty("dataHome", dataHome.toAbsolutePath().toString());
properties.setProperty("cacheHome", cacheHome.toAbsolutePath().toString());
properties.setProperty("logHome", logHome.toAbsolutePath().toString());
return properties;
}
};
}
}