All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.atteo.moonshine.directories.DefaultFileAccessor Maven / Gradle / Ivy

The newest version!
/*
 * 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 readOnlyLayouts = new ArrayList<>();
	private List extraConfigDirs = new ArrayList<>();
	private List 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 configDirs = new ArrayList<>();
		final List 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 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 getFiles(Path home, Iterable dirs, String fileName) {
				List 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 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 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;
			}
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy