package org.limewire.core.impl.mojito; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.limewire.core.api.mojito.MojitoManager; import org.limewire.listener.SwingSafePropertyChangeSupport; import org.limewire.mojito.MojitoDHT; import com.google.inject.Inject; import com.limegroup.gnutella.dht.DHTEvent; import com.limegroup.gnutella.dht.DHTEventListener; import com.limegroup.gnutella.dht.DHTManager; /** * Live implementation of MojitoManager. */ public class MojitoManagerImpl implements MojitoManager { /** DHT manager object. */ private final DHTManager manager; /** Property change support object. */ private final PropertyChangeSupport changeSupport = new SwingSafePropertyChangeSupport(this); /** * Constructs the live implementation of MojitoManager using the specified * DHT manager. */ @Inject public MojitoManagerImpl(DHTManager manager) { this.manager = manager; } /** * Add listener to fire property change on DHT event. */ @Inject public void registerListener() { manager.addEventListener(new DHTEventListener() { @Override public void handleDHTEvent(DHTEvent evt) { changeSupport.firePropertyChange(DHT_STARTED, false, (evt.getType() != DHTEvent.Type.STOPPED)); } }); } /** * Adds the specified listener to the list that is notified when a * property value changes. Listeners added from the Swing UI thread will * always receive notification events on the Swing UI thread. */ @Override public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } /** * Removes the specified listener from the list that is notified when a * property value changes. */ @Override public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } /** * Returns the name of the DHT. */ @Override public String getName() { MojitoDHT dht = manager.getMojitoDHT(); return (dht != null) ? dht.getName() : null; } /** * Returns true if the Mojito DHT is running. */ @Override public boolean isRunning() { return manager.isRunning(); } /** * Invokes the specified command on the Mojito DHT, and forwards output * to the specified PrintWriter. * @return true if command was successfully invoked */ @Override @SuppressWarnings("unchecked") public boolean handle(String command, PrintWriter out) { // Define result. boolean result = false; try { // Get DHT using manager. MojitoDHT dht = manager.getMojitoDHT(); if (dht == null) { out.println("Mojito is not running"); return result; } // Get command handler method. Class cmdHandler = Class.forName("org.limewire.mojito.CommandHandler"); Method handle = cmdHandler.getMethod("handle", new Class[]{MojitoDHT.class, String.class, PrintWriter.class}); // Invoke method to pass command to DHT. result = ((Boolean) handle.invoke(null, new Object[]{dht, command, out})).booleanValue(); } catch (ClassNotFoundException e) { e.printStackTrace(out); } catch (NoSuchMethodException e) { e.printStackTrace(out); } catch (IllegalAccessException e) { e.printStackTrace(out); } catch (InvocationTargetException e) { e.printStackTrace(out); } // Return result. return result; } }