package org.smartly.commons.network.socket.server.handlers.pool; import org.smartly.commons.network.socket.server.handlers.ISocketFilter; import org.smartly.commons.network.socket.server.handlers.ISocketHandler; import org.smartly.commons.util.CollectionUtils; import java.util.*; /** * Pool of Socket handlers */ public class SocketHandlerPool { private final List<Class<? extends ISocketFilter>> _filters; private final Map<String, Class<? extends ISocketHandler>> _handlers; // -------------------------------------------------------------------- // c o n s t r u c t o r s // -------------------------------------------------------------------- public SocketHandlerPool() { _filters = Collections.synchronizedList(new LinkedList<Class<? extends ISocketFilter>>()); _handlers = Collections.synchronizedMap(new HashMap<String, Class<? extends ISocketHandler>>()); } public SocketHandlerPool(final Class<? extends ISocketFilter>[] handlers) { this(); CollectionUtils.addAllNoDuplicates(_filters, handlers); } // -------------------------------------------------------------------- // p u b l i c // -------------------------------------------------------------------- public void clear() { synchronized (_filters) { _filters.clear(); } synchronized (_handlers) { _handlers.clear(); } } // -------------------------------------------------------------------- // FILTERS // -------------------------------------------------------------------- public int sizeFilters() { return _filters.size(); } public boolean hasFilters() { return !_filters.isEmpty(); } public boolean hasFiler(final Class<ISocketFilter> o) { return _filters.contains(o); } public SocketFilterPoolIterator getFiltersIterator() { return new SocketFilterPoolIterator(this.getFilters()); } public boolean addFilter(final Class<? extends ISocketFilter> o) { if (null != o) { synchronized (_filters) { return _filters.add(o); } } return false; } public void addFilters(final Class<? extends ISocketFilter>[] array) { if (null != array) { synchronized (_filters) { CollectionUtils.addAllNoDuplicates(_filters, array); } } } public boolean removeFilter(final Class<? extends ISocketFilter> o) { if (null != o) { synchronized (_filters) { return _filters.remove(o); } } return false; } // -------------------------------------------------------------------- // HANDLERS // -------------------------------------------------------------------- public int sizeHandlers() { return _handlers.size(); } public boolean hasHandlers() { return !_handlers.isEmpty(); } public boolean hasHandler(final String key) { return _handlers.containsKey(key); } public void addHandler(final String key, final Class<? extends ISocketHandler> o) { if (null != o) { synchronized (_handlers) { _handlers.put(key, o); } } } public Class<? extends ISocketHandler> removeHandler(final String key) { if (null != key) { synchronized (_handlers) { return _handlers.remove(key); } } return null; } public ISocketHandler getHandler(final String key) { synchronized (_handlers) { return this.getHandlerInstance(_handlers.get(key)); } } // -------------------------------------------------------------------- // p r i v a t e // -------------------------------------------------------------------- private Class<? extends ISocketFilter>[] getFilters() { synchronized (_filters) { return _filters.toArray(new Class[_filters.size()]); } } private ISocketHandler getHandlerInstance(Class<? extends ISocketHandler> aclass) { try { if (null != aclass) { return aclass.newInstance(); } } catch (Throwable ignored) { } return null; } }