package shedar.mods.ic2.nuclearcontrol.panel.http;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import argo.jdom.JsonNodeBuilder;
import argo.jdom.JsonNodeBuilders;
import argo.jdom.JsonObjectNodeBuilder;
import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl;
public class HttpCardSender {
private static final String ID_URL_TEMPLATE = "http://sensors.modstats.org/api/v1/register?p=";
private static final String DATA_URL_TEMPLATE = "http://sensors.modstats.org/api/v1/report";
public static HttpCardSender instance = new HttpCardSender();
@SuppressWarnings("rawtypes")
private final ConcurrentHashMap<Long, JsonNodeBuilder> unsent = new ConcurrentHashMap<Long, JsonNodeBuilder>();
public ConcurrentLinkedQueue<Long> availableIds = new ConcurrentLinkedQueue<Long>();
// single thread executor service with a maximum queue size of 64 elements
private final ExecutorService executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(64));
private HttpCardSender() {}
public void requestId() {
try {
executor.submit(new Request(new URL(ID_URL_TEMPLATE + IC2NuclearControl.instance.httpSensorKey), null));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RejectedExecutionException e) {
// the server isn't processing requests fast enough, drop the request
// TODO: reschedule? fallback?
}
}
public void send() {
try {
executor.submit(new Request(new URL(DATA_URL_TEMPLATE), unsent));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RejectedExecutionException e) {
// the server isn't processing requests fast enough, drop the request
// TODO: reschedule? fallback?
}
}
public void add(NBTTagCompound cardData, UUID cardType, Long id) {
JsonObjectNodeBuilder builder = JsonNodeBuilders.anObjectBuilder();
builder.withField("id", JsonNodeBuilders.aNumberBuilder(id.toString()));
builder.withField("type", JsonNodeBuilders.aStringBuilder(cardType.toString().replace("-", "")));
Iterator iterator = cardData.func_150296_c().iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
NBTBase tag = cardData.getTag(s);
if (!s.equals("_webSensorId")) {
if (s.equals("energyL") || s.equals("maxStorageL")) {
builder.withField(s, JsonNodeBuilders.aStringBuilder(String.valueOf(Double.valueOf(tag.toString()).longValue())));
} else {
builder.withField(s, JsonNodeBuilders.aStringBuilder(tag.toString()));
}
}
}
unsent.put(id, builder);
}
}