package fr.opensagres.mongodb.ide.core.internal; import java.util.ArrayList; import java.util.List; import fr.opensagres.mongodb.ide.core.IServerLifecycleListener; import fr.opensagres.mongodb.ide.core.IServerManager; import fr.opensagres.mongodb.ide.core.internal.settings.ServersSettings; import fr.opensagres.mongodb.ide.core.model.Server; import fr.opensagres.mongodb.ide.core.utils.StringUtils; public class ServerManager extends AbstractManager<Server> implements IServerManager { private static final long serialVersionUID = -8525280179973199825L; private static final byte EVENT_ADDED = 0; private static final byte EVENT_CHANGED = 1; private static final byte EVENT_REMOVED = 2; private final List<IServerLifecycleListener> serverListeners; public ServerManager() { super("servers.xml", ServersSettings.getInstance()); this.serverListeners = new ArrayList<IServerLifecycleListener>(); } public void addServer(Server server) throws Exception { if (server == null) return; if (!super.contains(server)) { super.add(server); fireServerEvent(server, EVENT_ADDED); } else fireServerEvent(server, EVENT_CHANGED); super.save(); } public void removeServer(Server server) throws Exception { super.remove(server); super.save(); fireServerEvent(server, EVENT_REMOVED); server.dispose(); } public List<Server> getServers() { return this; } public void addServerLifecycleListener(IServerLifecycleListener listener) { if (Trace.LISTENERS) { Trace.trace(Trace.STRING_LISTENERS, "Adding server lifecycle listener " + listener + " to " + this); } synchronized (serverListeners) { serverListeners.add(listener); } } /* * */ public void removeServerLifecycleListener(IServerLifecycleListener listener) { if (Trace.LISTENERS) { Trace.trace(Trace.STRING_LISTENERS, "Removing server lifecycle listener " + listener + " from " + this); } synchronized (serverListeners) { serverListeners.remove(listener); } } /** * Fire a server event. */ private void fireServerEvent(final Server server, byte b) { if (Trace.LISTENERS) { Trace.trace(Trace.STRING_LISTENERS, "->- Firing server event: " + server.getName() + " ->-"); } if (serverListeners.isEmpty()) return; List<IServerLifecycleListener> clone = new ArrayList<IServerLifecycleListener>(); clone.addAll(serverListeners); for (IServerLifecycleListener srl : clone) { if (Trace.LISTENERS) { Trace.trace(Trace.STRING_LISTENERS, " Firing server event to " + srl); } try { if (b == EVENT_ADDED) srl.serverAdded(server); else if (b == EVENT_CHANGED) srl.serverChanged(server); else if (b == EVENT_REMOVED) srl.serverRemoved(server); } catch (Exception e) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, " Error firing server event to " + srl, e); } } } if (Trace.LISTENERS) { Trace.trace(Trace.STRING_LISTENERS, "-<- Done firing server event -<-"); } } public void dispose() { for (Server server : this) { try { server.dispose(); } catch (Throwable e) { e.printStackTrace(); } } } public Server findServer(String serverId) { if (StringUtils.isEmpty(serverId)) { return null; } for (Server server : this) { if (serverId.equals(server.getId())) { return server; } } return null; } }