/*******************************************************************************
* Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com).
*
* This file is part of Dawg6's Demon Hunter DPS Calculator.
*
* Dawg6's Demon Hunter DPS Calculator is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Dawg6's Demon Hunter DPS Calculator 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package com.dawg6.web.dhcalc.server;
import com.dawg6.d3api.server.Cache;
import com.dawg6.d3api.server.D3IO;
import com.dawg6.d3api.server.oauth.Token;
import com.dawg6.d3api.shared.ItemInformation;
import com.dawg6.d3api.shared.Realm;
import com.dawg6.web.dhcalc.server.db.couchdb.CouchDBDHCalcParameters;
import com.dawg6.web.dhcalc.server.util.DHCalcProperties;
public class IO extends D3IO {
private static IO instance;
// private final Set<String> itemLocks = new HashSet<String>();
// private final Set<String> setLocks = new HashSet<String>();
public static synchronized IO getInstance() {
if (instance == null)
instance = new IO();
return instance;
}
private IO() {
String value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.MAX_REQUESTS,
String.valueOf(DEFAULT_MAX_REQUESTS_PER_SECOND),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setMaxRequests(Integer.parseInt(value));
}
});
setMaxRequests(Integer.parseInt(value));
value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.CACHE_SIZE,
String.valueOf(Cache.DEFAULT_MAX_SIZE),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setCacheSize(Integer.parseInt(value));
}
});
setCacheSize(Integer.parseInt(value));
value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.CONNECT_TIMEOUT,
String.valueOf(DEFAULT_CONNECT_TIMEOUT),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setConnectTimeout(Integer.parseInt(value));
}
});
setConnectTimeout(Integer.parseInt(value));
value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.READ_TIMEOUT,
String.valueOf(DEFAULT_READ_TIMEOUT),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setReadTimeout(Integer.parseInt(value));
}
});
setReadTimeout(Integer.parseInt(value));
value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.TIMEOUT_RETRIES,
String.valueOf(DEFAULT_TIMEOUT_RETRIES),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setTimeoutRetries(Integer.parseInt(value));
}
});
setTimeoutRetries(Integer.parseInt(value));
value = CouchDBDHCalcParameters.getInstance().getParameter(
CouchDBDHCalcParameters.ITEM_REALM, DEFAULT_ITEM_REALM.name(),
new CouchDBDHCalcParameters.Listener() {
@Override
public void parameterChanged(String parameter, String value) {
setItemRealm(Realm.valueOf(value));
}
});
setItemRealm(Realm.valueOf(value));
}
protected void setTimeoutRetries(int value) {
this.timeoutRetries = value;
}
protected void setItemRealm(Realm realm) {
this.itemRealm = realm;
}
protected void setReadTimeout(int value) {
this.readTimeout = value;
}
protected void setConnectTimeout(int value) {
this.connectTimeout = value;
}
protected void setCacheSize(int value) {
synchronized (itemCache) {
log.info("Setting ItemCache Size to " + value);
itemCache.setMaxSize(value);
}
}
private void setMaxRequests(int value) {
synchronized (requests) {
log.info("Setting Max # of Requests Per Second to " + value);
maxRequests = value;
}
}
@Override
public synchronized String getApiKey() {
if (apiKey == null) {
apiKey = DHCalcProperties.getInstance().getApiKey();
}
return super.getApiKey();
}
@Override
protected synchronized Token requestToken() throws Exception {
if (apiKey == null) {
apiKey = DHCalcProperties.getInstance().getApiKey();
}
if (apiSecret == null) {
apiSecret = DHCalcProperties.getInstance().getApiSecret();
}
return super.requestToken();
}
public long getNumRequests() {
synchronized (requests) {
return numRequests;
}
}
public Realm getItemRealm() {
return itemRealm;
}
public Cache<String, ItemInformation> getItemCache() {
return this.itemCache;
}
// @Override
// protected void newItem(ItemInformation item) {
// // log.info("Potential new Item " + item.name);
//
// String name = item.name;
//
// String color = item.displayColor;
//
// if ((color == null) || color.equals("blue") || color.equals("white") || color.equals("yellow"))
// return;
//
// if (name.equals(Const.HELLFIRE_AMULET)) {
// if ((item.attributes != null) && (item.attributes.passive != null)
// && (item.attributes.passive.length == 1)) {
// int i = item.attributes.passive[0].text.indexOf(Const.PASSIVE);
// String sub = item.attributes.passive[0].text.substring(
// Const.HELLFIRE_PASSIVE.length(), i)
// .replaceAll(" ", "_");
// name = name + "." + sub;
// }
// }
//
// synchronized (itemLocks) {
// while (itemLocks.contains(name)) {
// try {
// itemLocks.wait();
// } catch (Exception e) {
// }
// }
//
// itemLocks.add(name);
// }
//
// try {
// ItemDocument doc = CouchDBDHCalcDatabase.getInstance().get(
// ItemDocument.class, name);
// boolean changed = false;
//
// if (doc == null) {
// // log.info("New Item " + item.name);
//
// doc = new ItemDocument();
// doc.setId(name);
//
// doc.setIcon(item.icon);
// doc.setItemId(item.id);
// doc.setTooltipParams(item.tooltipParams);
// changed = true;
// }
//
// if (doc.getRawAttributes() == null)
// doc.setRawAttributes(new TreeSet<String>());
//
// if ((doc.getTooltipParams() == null)
// && (item.tooltipParams != null)) {
// doc.setTooltipParams(item.tooltipParams);
// changed = true;
// }
//
// if (item.attributesRaw != null) {
// Set<String> set = doc.getRawAttributes();
//
// for (String a : item.attributesRaw.keySet()) {
// if (!set.contains(a)) {
// set.add(a);
// changed = true;
// }
// }
// }
//
// if (changed) {
// if (doc.getRevision() == null)
// log.info("Creating Item " + doc.getId());
// else
// log.info("Updating Item " + doc.getId());
//
// CouchDBDHCalcDatabase.getInstance().persist(doc);
// }
// } finally {
// synchronized (itemLocks) {
// itemLocks.remove(name);
// itemLocks.notifyAll();
// }
// }
//
// if (item.set != null) {
// newSetItem(item);
// }
//
// }
// private void newSetItem(ItemInformation item) {
//
// synchronized (setLocks) {
// while (setLocks.contains(item.set.name)) {
// try {
// setLocks.wait();
// } catch (Exception e) {
// }
// }
// }
//
// try {
// SetDocument doc = CouchDBDHCalcDatabase.getInstance().get(
// SetDocument.class, item.set.name);
// boolean changed = false;
//
// if (doc == null) {
// doc = new SetDocument();
// doc.setId(item.set.name);
// doc.setSlug(item.set.slug);
// changed = true;
// }
//
// if (doc.getRawAttributes() == null)
// doc.setRawAttributes(new TreeMap<String, Integer>());
//
// if (doc.getTooltipParams() == null) {
// doc.setTooltipParams(item.tooltipParams);
// changed = true;
// }
//
// if (item.set.ranks != null) {
// Map<String, Integer> map = doc.getRawAttributes();
//
// for (Rank r : item.set.ranks) {
// Integer n = r.required;
//
// for (String a : r.attributesRaw.keySet()) {
//
// Integer o = map.get(a);
//
// if ((o == null) || (o != n)) {
// map.put(a, n);
// changed = true;
// }
// }
// }
// }
//
// if (changed) {
// if (doc.getRevision() == null)
// log.info("Creating Set Type " + doc.getId());
// else
// log.info("Updating Set Type " + doc.getId());
//
// CouchDBDHCalcDatabase.getInstance().persist(doc);
// }
// } finally {
// synchronized (setLocks) {
// setLocks.remove(item.set.name);
// setLocks.notifyAll();
// }
// }
// }
}