blob: ebf78c5a57b0211dd66bfaa033422f5242b89c93 [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.lucene.luke.app.desktop;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.luke.app.desktop.util.inifile.IniFile;
import org.apache.lucene.luke.app.desktop.util.inifile.SimpleIniFile;
import org.apache.lucene.store.FSDirectory;
/** Default implementation of {@link Preferences} */
public final class PreferencesImpl implements Preferences {
private static final String CONFIG_DIR = System.getProperty("user.home") + FileSystems.getDefault().getSeparator() + ".luke.d";
private static final String INIT_FILE = "luke.ini";
private static final String HISTORY_FILE = "history";
private static final int MAX_HISTORY = 10;
private final IniFile ini = new SimpleIniFile();
private final List<String> history = new ArrayList<>();
public PreferencesImpl() throws IOException {
// create config dir if not exists
Path confDir = FileSystems.getDefault().getPath(CONFIG_DIR);
if (!Files.exists(confDir)) {
Files.createDirectory(confDir);
}
// load configs
if (Files.exists(iniFile())) {
ini.load(iniFile());
} else {
ini.store(iniFile());
}
// load history
Path histFile = historyFile();
if (Files.exists(histFile)) {
List<String> allHistory = Files.readAllLines(histFile);
history.addAll(allHistory.subList(0, Math.min(MAX_HISTORY, allHistory.size())));
}
}
public List<String> getHistory() {
return history;
}
@Override
public void addHistory(String indexPath) throws IOException {
if (history.indexOf(indexPath) >= 0) {
history.remove(indexPath);
}
history.add(0, indexPath);
saveHistory();
}
private void saveHistory() throws IOException {
Files.write(historyFile(), history);
}
private Path historyFile() {
return FileSystems.getDefault().getPath(CONFIG_DIR, HISTORY_FILE);
}
@Override
public ColorTheme getColorTheme() {
String theme = ini.getString("settings", "theme");
return (theme == null) ? ColorTheme.GRAY : ColorTheme.valueOf(theme);
}
@Override
public void setColorTheme(ColorTheme theme) throws IOException {
ini.put("settings", "theme", theme.name());
ini.store(iniFile());
}
@Override
public boolean isReadOnly() {
Boolean readOnly = ini.getBoolean("opener", "readOnly");
return (readOnly == null) ? false : readOnly;
}
@Override
public String getDirImpl() {
String dirImpl = ini.getString("opener", "dirImpl");
return (dirImpl == null) ? FSDirectory.class.getName() : dirImpl;
}
@Override
public boolean isNoReader() {
Boolean noReader = ini.getBoolean("opener", "noReader");
return (noReader == null) ? false : noReader;
}
@Override
public boolean isUseCompound() {
Boolean useCompound = ini.getBoolean("opener", "useCompound");
return (useCompound == null) ? false : useCompound;
}
@Override
public boolean isKeepAllCommits() {
Boolean keepAllCommits = ini.getBoolean("opener", "keepAllCommits");
return (keepAllCommits == null) ? false : keepAllCommits;
}
@Override
public void setIndexOpenerPrefs(boolean readOnly, String dirImpl, boolean noReader, boolean useCompound, boolean keepAllCommits) throws IOException {
ini.put("opener", "readOnly", readOnly);
ini.put("opener", "dirImpl", dirImpl);
ini.put("opener", "noReader", noReader);
ini.put("opener", "useCompound", useCompound);
ini.put("opener", "keepAllCommits", keepAllCommits);
ini.store(iniFile());
}
private Path iniFile() {
return FileSystems.getDefault().getPath(CONFIG_DIR, INIT_FILE);
}
}