/*
* 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.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/**
* Specifies directory layout based on XDG Base Directory Specification.
* @see <a href="http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html">XDG Base Directory Specification</a>
*/
public class XdgDirectoryLayout implements WriteableDirectoryLayout {
private final Path homeDirectory;
private final Path configHome;
private final Path dataHome;
private final Path cacheHome;
private final List<Path> configDirs = new ArrayList<>();
private final List<Path> dataDirs = new ArrayList<>();
public XdgDirectoryLayout(String applicationName) {
homeDirectory = Paths.get(System.getProperty("user.home"));
String xdgConfigHome = System.getenv("XDG_CONFIG_HOME");
if (xdgConfigHome != null) {
configHome = Paths.get(xdgConfigHome, applicationName);
} else {
configHome = homeDirectory.resolve(".config").resolve(applicationName);
}
String xdgDataHome = System.getenv("XDG_DATA_HOME");
if (xdgDataHome != null) {
dataHome = Paths.get(xdgDataHome, applicationName);
} else {
dataHome = homeDirectory.resolve(".local/share").resolve(applicationName);
}
String xdgCacheHome = System.getenv("XDG_CACHE_HOME");
if (xdgCacheHome != null) {
cacheHome = Paths.get(xdgCacheHome, applicationName);
} else {
cacheHome = homeDirectory.resolve(".cache").resolve(applicationName);
}
String xdgConfigDirs = System.getenv("XDG_CONFIG_DIRS");
if (xdgConfigDirs == null) {
xdgConfigDirs = "/etc/xdg";
}
for (String dir : xdgConfigDirs.split(":")) {
configDirs.add(Paths.get(dir));
}
String xdgDataDirs = System.getenv("XDG_CONFIG_DIRS");
if (xdgDataDirs == null) {
xdgDataDirs = "/usr/local/share/:/usr/share/";
}
for (String dir : xdgDataDirs.split(":")) {
dataDirs.add(Paths.get(dir));
}
}
@Override
public Path getConfigHome() {
return configHome;
}
@Override
public Path getDataHome() {
return dataHome;
}
@Override
public Path getCacheHome() {
return cacheHome;
}
@Override
public Path getLogHome() {
return dataHome.resolve("logs");
}
@Override
public Iterable<Path> getConfigDirs() {
return configDirs;
}
@Override
public Iterable<Path> getDataDirs() {
return dataDirs;
}
}