package settings;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import network.Peer;
public class Settings {
//NETWORK
private static final int DEFAULT_MIN_CONNECTIONS = 5;
private static final int DEFAULT_MAX_CONNECTIONS = 20;
private static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
private static final int DEFAULT_PING_INTERVAL = 30000;
//RPC
private static final int DEFAULT_RPC_PORT = 9085;
private static final String DEFAULT_RPC_ALLOWED = "127.0.0.1";
//DATA
private static final String DEFAULT_DATA_DIR = "data";
private static final String DEFAULT_WALLET_DIR = "wallet";
private static final boolean DEFAULT_GENERATOR_KEY_CACHING = false;
private static final int DEFAULT_MAX_BYTE_PER_FEE = 512;
private static Settings instance;
private JSONObject settingsJSON;
public static Settings getInstance()
{
if(instance == null)
{
instance = new Settings();
}
return instance;
}
private Settings()
{
BufferedReader reader;
try
{
//OPEN FILE
File file = new File("settings.json");
//CREATE FILE IF IT DOESNT EXIST
if(!file.exists())
{
file.createNewFile();
}
//READ SETTINGS FILE
reader = new BufferedReader(new FileReader(file));
String line;
String jsonString = "";
//READ LINE
while ((line = reader.readLine()) != null)
{
jsonString += line;
}
//CREATE JSON OBJECT
this.settingsJSON = (JSONObject) JSONValue.parse(jsonString);
//CLOSE
reader.close();
}
catch(Exception e)
{
//STOP
System.out.println("ERROR reading settings.ini. closing");
System.exit(0);
}
}
public List<Peer> getKnownPeers()
{
try
{
//GET PEERS FROM JSON
JSONArray peersArray = (JSONArray) this.settingsJSON.get("knownpeers");
//CREATE LIST WITH PEERS
List<Peer> peers = new ArrayList<Peer>();
for(int i=0; i<peersArray.size(); i++)
{
InetAddress address = InetAddress.getByName((String) peersArray.get(i));
//CHECK IF SOCKET IS NOT LOCALHOST
if(!address.equals(InetAddress.getLocalHost()))
{
//CREATE PEER
Peer peer = new Peer(address);
//ADD TO LIST
peers.add(peer);
}
}
//RETURN
return peers;
}
catch(Exception e)
{
//RETURN EMPTY LIST
return new ArrayList<Peer>();
}
}
public int getMaxConnections()
{
if(this.settingsJSON.containsKey("maxconnections"))
{
return ((Long) this.settingsJSON.get("maxconnections")).intValue();
}
return DEFAULT_MAX_CONNECTIONS;
}
public int getMinConnections()
{
if(this.settingsJSON.containsKey("minconnections"))
{
return ((Long) this.settingsJSON.get("minconnections")).intValue();
}
return DEFAULT_MIN_CONNECTIONS;
}
public int getConnectionTimeout()
{
if(this.settingsJSON.containsKey("connectiontimeout"))
{
return ((Long) this.settingsJSON.get("connectiontimeout")).intValue();
}
return DEFAULT_CONNECTION_TIMEOUT;
}
public int getRpcPort()
{
if(this.settingsJSON.containsKey("rpcport"))
{
return ((Long) this.settingsJSON.get("rpcport")).intValue();
}
return DEFAULT_RPC_PORT;
}
public String[] getRpcAllowed()
{
try
{
if(this.settingsJSON.containsKey("rpcallowed"))
{
//GET PEERS FROM JSON
JSONArray allowedArray = (JSONArray) this.settingsJSON.get("rpcallowed");
//CREATE LIST WITH PEERS
String[] allowed = new String[allowedArray.size()];
for(int i=0; i<allowedArray.size(); i++)
{
allowed[i] = (String) allowedArray.get(i);
}
//RETURN
return allowed;
}
//RETURN
return DEFAULT_RPC_ALLOWED.split(";");
}
catch(Exception e)
{
//RETURN EMPTY LIST
return new String[0];
}
}
public String getWalletDir()
{
if(this.settingsJSON.containsKey("walletdir"))
{
return (String) this.settingsJSON.get("walletdir");
}
return DEFAULT_WALLET_DIR;
}
public String getDataDir()
{
if(this.settingsJSON.containsKey("datadir"))
{
return (String) this.settingsJSON.get("datadir");
}
return DEFAULT_DATA_DIR;
}
public int getPingInterval()
{
if(this.settingsJSON.containsKey("pinginterval"))
{
return ((Long) this.settingsJSON.get("pinginterval")).intValue();
}
return DEFAULT_PING_INTERVAL;
}
public boolean isGeneratorKeyCachingEnabled()
{
if(this.settingsJSON.containsKey("generatorkeycaching"))
{
return ((Boolean) this.settingsJSON.get("generatorkeycaching")).booleanValue();
}
return DEFAULT_GENERATOR_KEY_CACHING;
}
public int getMaxBytePerFee()
{
if(this.settingsJSON.containsKey("maxbyteperfee"))
{
return ((Long) this.settingsJSON.get("maxbyteperfee")).intValue();
}
return DEFAULT_MAX_BYTE_PER_FEE;
}
}