/* Copyright (c) 2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Gabriel Roldan (Boundless) - initial implementation
*/
package org.locationtech.geogig.test.integration;
import java.io.File;
import java.io.IOException;
import org.locationtech.geogig.storage.fs.INIFile;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
public class OnlineTestProperties {
private String propertiesFileName;
private String[] defaults;
private class SectionOptionPair {
String section;
String option;
public SectionOptionPair(String key) {
final int index = key.indexOf('.');
if (index == -1) {
throw new RuntimeException("Section.key invalid!");
}
section = key.substring(0, index);
option = key.substring(index + 1);
if (section.length() == 0 || option.length() == 0) {
throw new RuntimeException("Section.key invalid!");
}
}
}
/**
* @param propertiesFileName name of the .properties file to place/use under $HOME (e.g.
* .geogig-mongo-test.properties, .geogig-pg-test.properties, etc)
*/
public OnlineTestProperties(final String propertiesFileName, final String... defaultsKvp) {
this.propertiesFileName = propertiesFileName;
this.defaults = defaultsKvp;
}
private File config() {
File f = new File(System.getProperty("user.home"), propertiesFileName);
try {
if (!f.exists()) {
f.createNewFile();
// Populate the file with default values
if (defaults != null) {
for (int i = 0; i < defaults.length; i += 2) {
String k = defaults[i];
String v = defaults[i + 1];
put(k, v);
}
}
}
} catch (IOException e) {
throw new RuntimeException("Cannot write to the home directory.");
}
return f;
}
@SuppressWarnings("unchecked")
public <T> Optional<T> get(String key, Class<T> c) {
if (key == null) {
throw new RuntimeException("Section.key not provided to get.");
}
File configFile = config();
final SectionOptionPair pair = new SectionOptionPair(key);
try {
final INIFile ini = INIFile.forFile(configFile);
Optional<String> val = ini.get(pair.section, pair.option);
if (!val.isPresent())
return Optional.absent();
String value = val.get();
if (Strings.isNullOrEmpty(value))
return Optional.absent();
if (int.class.equals(c) || Integer.class.equals(c)) {
return Optional.of((T) Integer.valueOf(value));
} else {
return Optional.of(c.cast(value));
}
} catch (IllegalArgumentException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException("Config location invalid.");
}
}
public void put(String key, String value) {
final SectionOptionPair pair = new SectionOptionPair(key);
File configFile = config();
try {
final INIFile ini = INIFile.forFile(configFile);
ini.set(pair.section, pair.option, value);
} catch (Exception e) {
throw new RuntimeException("Config location invalid.");
}
}
}