package com.bagri.server.hazelcast.impl; import static com.bagri.core.Constants.pn_client_memberId; import static com.bagri.core.Constants.pn_schema_user; import java.util.Properties; import java.util.Set; import java.util.concurrent.BlockingQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bagri.core.server.api.ClientManagement; import com.bagri.server.hazelcast.predicate.PropertyPredicate; import com.bagri.support.stats.StatisticsEvent; import com.hazelcast.core.Client; import com.hazelcast.core.ClientListener; import com.hazelcast.core.DistributedObject; import com.hazelcast.core.EntryEvent; import com.hazelcast.core.EntryListener; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; import com.hazelcast.core.MapEvent; import com.hazelcast.core.ReplicatedMap; public class ClientManagementImpl implements ClientManagement, ClientListener, EntryListener<String, Properties> { private static final transient Logger logger = LoggerFactory.getLogger(ClientManagementImpl.class); private SchemaRepositoryImpl repo; private HazelcastInstance hzInstance; //private IMap<String, Properties> clientsCache; private ReplicatedMap<String, Properties> clientsCache; private boolean enableStats = true; private BlockingQueue<StatisticsEvent> queue; public void setHzInstance(HazelcastInstance hzInstance) { this.hzInstance = hzInstance; hzInstance.getClientService().addClientListener(this); logger.debug("setHzInstange; got instance: {}", hzInstance.getName()); } public void setClientsCache(ReplicatedMap<String, Properties> clientsCache) { this.clientsCache = clientsCache; clientsCache.addEntryListener(this); //, false); } public void setRepository(SchemaRepositoryImpl repo) { this.repo = repo; } public void setStatsQueue(BlockingQueue<StatisticsEvent> queue) { this.queue = queue; } public void setStatsEnabled(boolean enable) { this.enableStats = enable; } private void updateStats(String name, boolean success, long duration) { if (enableStats) { if (!queue.offer(new StatisticsEvent(name, success, new Object[] {duration}))) { logger.warn("updateStats; queue is full!!"); } } } @Override public String[] getClients() { Set<String> clients = clientsCache.keySet(); return clients.toArray(new String[clients.size()]); } @Override public String getCurrentUser() { String result = null; String clientId = repo.getClientId(); logger.trace("getCurrentUser.enter; client: {}", clientId); if (clientId != null) { Properties props = clientsCache.get(clientId); logger.trace("getCurrentUser; props: {}; ", props); if (props != null) { result = props.getProperty(pn_schema_user); } else { logger.trace("getCurrentUser; cache: {}; ", clientsCache.keySet()); } } return result; } @Override public Properties getClientProperties(String clientId) { return clientsCache.get(clientId); } @Override public void clientConnected(Client client) { String clientId = client.getUuid(); logger.trace("clientConnected.enter; client: {}", clientId); // create queue //IQueue queue = hzInstance.getQueue("client:" + clientId); // create/cache new XQProcessor //XQProcessor proc = getXQProcessor(client.getUuid()); //logger.trace("clientConnected.exit; queue {} created for client: {}; XQProcessor: {}", // queue.getName(), clientId, proc); } @Override public void clientDisconnected(Client client) { String clientId = client.getUuid(); logger.trace("clientDisconnected.enter; client: {}", clientId); // TODO: repair this! //PropertyPredicate pp = new PropertyPredicate(pn_client_memberId, clientId); //Set<String> members = clientsCache.localKeySet(pp); //for (String member: members) { // clientsCache.delete(member); //} //String qName = "client:" + clientId; //boolean destroyed = false; //Collection<DistributedObject> all = hzInstance.getDistributedObjects(); //int sizeBefore = all.size(); //for (DistributedObject obj: all) { // if (qName.equals(obj.getName())) { // remove queue //IQueue queue = hzInstance.getQueue(qName); //queue.destroy(); // obj.destroy(); // destroyed = true; // break; // } //} //int sizeAfter = hzInstance.getDistributedObjects().size(); //XQProcessor proc = processors.remove(client.getUuid()); //logger.trace("clientDisconnected.exit; queue {} {} for client: {}; size before: {}, after: {}", // qName, destroyed ? "destroyed" : "skipped", clientId, sizeBefore, sizeAfter); } @Override public void entryAdded(EntryEvent<String, Properties> event) { // TODO Auto-generated method stub } @Override public void entryUpdated(EntryEvent<String, Properties> event) { // TODO Auto-generated method stub } @Override public void entryRemoved(EntryEvent<String, Properties> event) { // TODO Auto-generated method stub } @Override public void entryEvicted(EntryEvent<String, Properties> event) { // TODO Auto-generated method stub } @Override public void mapCleared(MapEvent event) { // TODO Auto-generated method stub } @Override public void mapEvicted(MapEvent event) { // TODO Auto-generated method stub } }