/*
* This file is part of ELKI:
* Environment for Developing KDD-Applications Supported by Index-Structures
*
* Copyright (C) 2017
* ELKI Development Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.lmu.ifi.dbs.elki.gui.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import de.lmu.ifi.dbs.elki.utilities.pairs.Pair;
/**
* Class to manage saved settings in a text file.
*
* @author Erich Schubert
* @since 0.3
*/
public class SavedSettingsFile implements Iterable<Pair<String, ArrayList<String>>> {
/**
* Comment prefix
*/
public static final String COMMENT_PREFIX = "#";
/**
* File to read and write
*/
private File file;
/**
* Data store
*/
private ArrayList<Pair<String, ArrayList<String>>> store;
/**
* Constructor.
*
* @param filename Filename
*/
public SavedSettingsFile(String filename) {
super();
this.file = new File(filename);
this.store = new ArrayList<>();
}
/**
* Save the current data to the given file.
*
* @throws FileNotFoundException thrown on output errors.
*/
public void save() throws FileNotFoundException {
PrintStream p = new PrintStream(file);
p.println(COMMENT_PREFIX + "Saved ELKI settings. First line is title, remaining lines are parameters.");
for (Pair<String, ArrayList<String>> settings : store) {
p.println(settings.first);
for (String str : settings.second) {
p.println(str);
}
p.println();
}
p.close();
}
/**
* Read the current file
*
* @throws FileNotFoundException thrown when file not found
* @throws IOException thrown on IO errprs
*/
public void load() throws FileNotFoundException, IOException {
BufferedReader is = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
ArrayList<String> buf = new ArrayList<>();
while (is.ready()) {
String line = is.readLine();
// skip comments
if (line.startsWith(COMMENT_PREFIX)) {
continue;
}
if (line.length() == 0 && !buf.isEmpty()) {
String title = buf.remove(0);
store.add(new Pair<>(title, buf));
buf = new ArrayList<>();
} else {
buf.add(line);
}
}
if (!buf.isEmpty()) {
String title = buf.remove(0);
store.add(new Pair<>(title, buf));
buf = new ArrayList<>();
}
is.close();
}
@Override
public Iterator<Pair<String, ArrayList<String>>> iterator() {
return store.iterator();
}
/**
* Remove a given key from the file.
*
* @param key Key to remove
*/
public void remove(String key) {
Iterator<Pair<String, ArrayList<String>>> it = store.iterator();
while (it.hasNext()) {
String thisKey = it.next().first;
if (key.equals(thisKey)) {
it.remove();
break;
}
}
}
/**
* Find a saved setting by key.
*
* @param key Key to search for
* @return saved settings for this key
*/
public ArrayList<String> get(String key) {
Iterator<Pair<String, ArrayList<String>>> it = store.iterator();
while (it.hasNext()) {
Pair<String, ArrayList<String>> pair = it.next();
if (key.equals(pair.first)) {
return pair.second;
}
}
return null;
}
/**
* Remove all saved settings.
*/
public void clear() {
store.clear();
}
/**
* Add/Replace a saved setting
*
* @param key Key
* @param value (New) value.
*/
public void put(String key, ArrayList<String> value) {
Iterator<Pair<String, ArrayList<String>>> it = store.iterator();
while (it.hasNext()) {
Pair<String, ArrayList<String>> pair = it.next();
if (key.equals(pair.first)) {
pair.second = value;
return;
}
}
store.add(new Pair<>(key, value));
}
/**
* Return number of saved settings profiles.
*
* @return Number of saved settings profiles
*/
public int size() {
return store.size();
}
/**
* Array access.
*
* @param index settings index
* @return pair at this index
*/
public Pair<String, ArrayList<String>> getElementAt(int index) {
return store.get(index);
}
}