/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.pluginmanager;
import java.lang.ref.WeakReference;
import java.util.UUID;
import freenet.clients.fcp.FCPConnectionHandler;
import freenet.clients.fcp.FCPPluginConnection;
import freenet.node.Node;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.api.Bucket;
/**
* @author saces, xor
*
* @deprecated Use {@link FCPPluginConnection} instead.
*/
@Deprecated
public class PluginTalker {
protected Node node;
protected PluginReplySender replysender;
protected int access;
protected WeakReference<FredPluginFCP> pluginRef;
protected String pluginName;
public PluginTalker(FredPluginTalker fpt, Node node2, String pluginname2, String clientSideIdentifier) throws PluginNotFoundException {
node = node2;
pluginName = pluginname2;
pluginRef = findPlugin(pluginname2);
access = FredPluginFCP.ACCESS_DIRECT;
// Normally, the clientIdentifier passed to the PluginReplySenderDirect() shall be an identifier of the particular network connection to the client.
// But this PluginTalker constructor typically gets called by PluginRespirator.getPluginTalker() which is called directly by client plugins.
// So there is no real FCP network connection, the client plugin runs in the same node as the server plugin.
// As we have no network connection to pull an ID from, we assume a new client for each call of this constructor by computing a random clientIdentifier.
final String clientIdentifier = UUID.randomUUID().toString();
replysender = new PluginReplySenderDirect(node2, fpt, pluginname2, clientIdentifier, clientSideIdentifier);
}
public PluginTalker(Node node2, FCPConnectionHandler handler, String pluginname2, String clientSideIdentifier, boolean access2) throws PluginNotFoundException {
node = node2;
pluginName = pluginname2;
pluginRef = findPlugin(pluginname2);
access = access2 ? FredPluginFCP.ACCESS_FCP_FULL : FredPluginFCP.ACCESS_FCP_RESTRICTED;
// FCPConnectionHandler.connectionIdentifier is unique for each network connection of a client, which is exactly what the PluginReplySenderFCP() wants.
final String clientIdentifier = handler.connectionIdentifier;
replysender = new PluginReplySenderFCP(handler, pluginname2, clientIdentifier, clientSideIdentifier);
}
protected WeakReference<FredPluginFCP> findPlugin(String pluginname2) throws PluginNotFoundException {
Logger.normal(this, "Searching fcp plugin: " + pluginname2);
FredPluginFCP plug = node.pluginManager.getFCPPlugin(pluginname2);
if (plug == null) {
Logger.error(this, "Could not find fcp plugin: " + pluginname2);
throw new PluginNotFoundException();
}
Logger.normal(this, "Found fcp plugin: " + pluginname2);
return new WeakReference<FredPluginFCP>(plug);
}
public void send(final SimpleFieldSet plugparams, final Bucket data2) {
node.executor.execute(new Runnable() {
@Override
public void run() {
sendSyncInternalOnly(plugparams, data2);
}
}, "FCPPlugin talk runner for " + pluginName);
}
public void sendSyncInternalOnly(final SimpleFieldSet plugparams, final Bucket data2) {
try {
FredPluginFCP plug = pluginRef.get();
if (plug==null) {
// FIXME How to get this out to surrounding send(..)?
// throw new PluginNotFoundException(How to get this out to surrounding send(..)?);
Logger.error(this, "Connection to plugin '"+pluginName+"' lost.", new Exception("FIXME"));
return;
}
plug.handle(replysender, plugparams, data2, access);
} catch (ThreadDeath td) {
throw td; // Fatal, thread is stop()'ed
} catch (VirtualMachineError vme) {
throw vme; // OOM is included here
} catch (Throwable t) {
Logger.error(this, "Cought error while execute fcp plugin handler for '"+pluginName+"', report it to the plugin author: " + t.getMessage(), t);
}
}
}