package ru.semiot.services.analyzing.wamp;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.semiot.services.analyzing.ServiceConfig;
import rx.Subscription;
@ApplicationScoped
@Named
public class Subsciber {
private static final Logger logger = LoggerFactory
.getLogger(Subsciber.class);
private final WAMPClient wampClient = WAMPClient.getInstance();
private Map<String, Subsc> listTopics;
@Inject
TopicListener topicListener;
public Subsciber() {
connectWithDataStore();
try {
wampClient.init();
Thread.sleep(3000);
wampClient.subscribe("someTopic").subscribe(topicListener);
listTopics = new HashMap<>();
} catch (Exception ex) {
logger.error("Something went wrong! " + ex.getMessage());
}
}
public void subscribeTopics(List<String> topics, int query_id) {
for (String topic : topics) {
if (listTopics.containsKey(topic)) {
if (!listTopics.get(topic).ids.contains(query_id)) {
listTopics.get(topic).ids.add(query_id);
}
} else {
listTopics.put(topic, new Subsc(wampClient.subscribe(topic).subscribe(topicListener), query_id));
}
}
}
public void unsubscribeTopics(List<String> topics, int query_id) {
for (String topic : topics) {
if (listTopics.containsKey(topic)) {
if (listTopics.get(topic).ids.contains(query_id)) {
if (listTopics.get(topic).ids.size() == 1) {
listTopics.get(topic).subscription.unsubscribe();
listTopics.remove(topic);
} else {
listTopics.get(topic).ids.remove((Integer) query_id);
}
}
}
}
}
private void connectWithDataStore() {
try {
URI uri = new URI(ServiceConfig.config.storeUrl());
String URL = "http://" + uri.getHost() + ":" + uri.getPort();
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(URL);
HttpResponse resp = null;
while (true) {
try {
resp = client.execute(request);
if (resp.getStatusLine().getStatusCode() == 200) {
logger.info("Connected to " + URL);
break;
}
} catch (HttpHostConnectException ex) {
logger.info("Try to connect with " + URL + "after 2s");
try {
Thread.sleep(2000);
} catch (InterruptedException ex1) {
logger.error("Something went wrong with error:\n" + ex1.getMessage());
}
} catch (IOException ex) {
logger.error("Something went wrong with error:\n" + ex.getMessage());
}
}
} catch (URISyntaxException ex) {
logger.error("The storeURL is WRONG!!!");
}
}
private static class Subsc {
Subscription subscription;
List<Integer> ids;
public Subsc(Subscription subsc, int id) {
subscription = subsc;
ids = new ArrayList<>();
ids.add(id);
}
}
}