Author: tullyvey
Date: 2007-06-18 16:57:35 +0000 (Mon, 18 Jun 2007)
New Revision: 13650
Added:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
Removed:
trunk/apps/jfcp/FreenetClient/
Modified:
trunk/apps/jfcp/nbproject/
trunk/apps/jfcp/nbproject/genfiles.properties
trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
Log:
improved io, implemented simple put
Property changes on: trunk/apps/jfcp/nbproject
___________________________________________________________________
Name: svn:ignore
+ private
Modified: trunk/apps/jfcp/nbproject/genfiles.properties
===================================================================
--- trunk/apps/jfcp/nbproject/genfiles.properties 2007-06-18 16:07:26 UTC
(rev 13649)
+++ trunk/apps/jfcp/nbproject/genfiles.properties 2007-06-18 16:57:35 UTC
(rev 13650)
@@ -5,4 +5,4 @@
# Do not edit this file. You may delete it but then the IDE will never
regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=24c41492
nbproject/build-impl.xml.script.CRC32=b040e50e
-nbproject/build-impl.xml.stylesheet.CRC32=20b9345e
+nbproject/build-impl.xml.stylesheet.CRC32=65d7ca21
Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FcpConnection.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -13,6 +13,7 @@
import java.util.logging.Logger;
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
import org.freenet.contrib.fcp.message.FcpMessageInputStream;
+import org.freenet.contrib.fcp.message.FcpMessageOutputStream;
import org.freenet.contrib.fcp.message.MessageBuilderException;
import org.freenet.contrib.fcp.message.client.ClientHello;
import org.freenet.contrib.fcp.message.client.ClientMessage;
@@ -31,14 +32,14 @@
private String _fcpVersion = "2.0";
private String _clientName = "FreenetClient";
- private Socket _socket;
- private PrintStream _out;
- private FcpMessageInputStream _mis;
- private NodeAddress _nodeAddress;
- private ExecutorService _messageSender;
- private boolean _socketOpen;
- private MessageReaderThread _messageReaderThread;
- private FcpEventSupportRepository _eventSupport;
+ private Socket _socket;
+ private FcpMessageOutputStream _mos;
+ private FcpMessageInputStream _mis;
+ private NodeAddress _nodeAddress;
+ private ExecutorService _messageSender;
+ private MessageReaderThread _messageReaderThread;
+ private FcpEventSupportRepository _eventSupport;
+ private boolean _socketOpen;
/** Creates a new instance of FcpConnection */
FcpConnection(NodeAddress na, FcpEventSupportRepository eventSupport) {
@@ -63,7 +64,7 @@
logger.fine("opening socket to " + _nodeAddress.getHostName() + ":" +
_nodeAddress.getPort());
_socket = new Socket(_nodeAddress.getHostName(),
_nodeAddress.getPort());
_mis = new FcpMessageInputStream(_socket.getInputStream());
- _out = new PrintStream(_socket.getOutputStream());
+ _mos = new FcpMessageOutputStream(_socket.getOutputStream());
_messageSender = Executors.newSingleThreadExecutor();
_messageReaderThread = new MessageReaderThread();
_socketOpen = true;
@@ -97,13 +98,13 @@
}
_mis = null;
}
- if(_out != null){
+ if(_mos != null){
try {
- _out.close();
+ _mos.close();
} catch (Exception ex) {
logger.warning("error closing output stream: " +
ex.getMessage());
}
- _out = null;
+ _mos = null;
}
_eventSupport.getConnectionEventSupport().fireFcpDisconnected();
}
@@ -126,14 +127,17 @@
}
public void run() {
- if(_out == null)
+ if(_mos == null)
return;
- _message.writeMessage(_out);
- if(_out.checkError()){
- logger.warning("error sending message:\n\n" +
_message.getMessageString());
- close();
- }else{
+ try {
+ _mos.writeMessage(_message);
+ _mos.flush();
_message.fireEvents(_eventSupport);
+ } catch (IOException ex) {
+ logger.warning("IO error sending message: " +
_message.getHeaderString());
+ close();
+ } catch (MessageBuilderException ex) {
+ logger.warning("invalid message:\n\n" +
_message.getMessageString() + "\n\n");
}
}
}
@@ -165,38 +169,25 @@
}
- private class MessageReaderThread extends Thread{
- private boolean _running;
-
+ private class MessageReaderThread extends Thread{
public void run(){
- _running = true;
- String line;
try {
-
while(_socketOpen){
try {
NodeMessage message = _mis.readMessage();
message.fireEvents(_eventSupport);
} catch (MessageBuilderException ex) {
- if(_socketOpen)
logger.warning("error building node message: " +
ex.getMessage());
}
}
-
} catch (IOException ex) {
if(_socketOpen)
logger.warning("error reading stream: " + ex.getMessage());
}
-
- _running = false;
if(_socketOpen)
close();
}
- public boolean isRunning() {
- return _running;
- }
-
}
}
Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/FreenetClient.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -10,6 +10,7 @@
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
import org.freenet.contrib.fcp.message.client.ClientGet;
import org.freenet.contrib.fcp.message.client.ClientMessage;
+import org.freenet.contrib.fcp.message.client.ClientPut;
import org.freenet.contrib.fcp.message.client.GenerateSSK;
import org.freenet.contrib.fcp.message.client.ListPeers;
@@ -82,13 +83,27 @@
* @param id an identifier for use in your app
*/
public void get(String uri, String id){
- ClientGet message = new ClientGet(uri, id);
- message.setVerbosity(1);
- message.setPriority(2);
- _conn.sendMessage(message);
+ ClientGet cg = new ClientGet(uri, id);
+ cg.setVerbosity(1);
+ cg.setPriority(2);
+ _conn.sendMessage(cg);
}
+
/**
+ * Inserts data to node.
+ * @param uri
+ * @param id
+ * @param data
+ */
+ public void put(String uri, String id, byte[] data){
+ ClientPut cp = new ClientPut(uri, id, data);
+ cp.setVerbosity(1);
+ cp.setPriority(2);
+ _conn.sendMessage(cp);
+ }
+
+ /**
* Will probably change
* @param id an id for your convenience
*/
Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/SSKKeypairEvent.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,7 @@
/**
*
- * @author res
+ * @author Ralph Smithen
*/
public class SSKKeypairEvent extends FcpEvent<SSKKeypair>{
Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/URIGeneratedEvent.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,21 @@
+/* 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 org.freenet.contrib.fcp.event;
+
+import org.freenet.contrib.fcp.message.node.SSKKeypair;
+import org.freenet.contrib.fcp.message.node.URIGenerated;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public class URIGeneratedEvent extends FcpEvent<URIGenerated>{
+
+ /** Creates a new instance of URIGeneratedEvent */
+ public URIGeneratedEvent(URIGenerated ug) {
+ super(ug);
+ }
+
+}
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
===================================================================
---
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
2007-06-18 16:07:26 UTC (rev 13649)
+++
trunk/apps/jfcp/src/org/freenet/contrib/fcp/event/support/FcpSSKKeypairEventSupport.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -6,9 +6,11 @@
import java.util.logging.Logger;
import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;
import
org.freenet.contrib.fcp.event.support.AbstractFcpEventSupport.NotifyHelper;
import org.freenet.contrib.fcp.listener.FcpSSKKeypairListener;
import org.freenet.contrib.fcp.message.node.SSKKeypair;
+import org.freenet.contrib.fcp.message.node.URIGenerated;
/**
*
@@ -19,12 +21,20 @@
NotifyHelper _keypairReceivedNotifier = new
NotifyHelper<SSKKeypairEvent>() {
void notifyListener(FcpSSKKeypairListener l, SSKKeypairEvent e)
{l.keypairReceived(e);}
- };
+ };
+ NotifyHelper _uriGeneratedNotifier = new NotifyHelper<URIGeneratedEvent>()
{
+ void notifyListener(FcpSSKKeypairListener l, URIGeneratedEvent e)
{l.uriGenerated(e);}
+ };
+
public void fireKeypairReceived(SSKKeypair kp){
_keypairReceivedNotifier.notifyListeners(new SSKKeypairEvent(kp));
}
+ public void fireURIGenerated(URIGenerated ug){
+ _uriGeneratedNotifier.notifyListeners(new URIGeneratedEvent(ug));
+ }
+
}
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
===================================================================
---
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
2007-06-18 16:07:26 UTC (rev 13649)
+++
trunk/apps/jfcp/src/org/freenet/contrib/fcp/listener/FcpSSKKeypairListener.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -5,6 +5,7 @@
package org.freenet.contrib.fcp.listener;
import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;
/**
*
@@ -12,4 +13,5 @@
*/
public interface FcpSSKKeypairListener {
public void keypairReceived(SSKKeypairEvent kpe);
+ public void uriGenerated(URIGeneratedEvent uge);
}
Modified: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessage.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -53,7 +53,7 @@
* @param eventSupport the object to be notified of message events
*/
public abstract void fireEvents(FcpEventSupportRepository eventSupport);
-
+
/**
* Get the fields that must be non-null in a valid message.
* @return an array of <code>String</code>s, the names of the mandatory
fields
@@ -63,6 +63,18 @@
}
/**
+ * Checks mandatory fields.
+ * @throws org.freenet.contrib.fcp.message.MessageBuilderException if
required field absent
+ */
+ public void validate() throws MessageBuilderException{
+
+ for(String field : getMandatoryFields()){
+ if(_fields.get(field) == null)
+ throw new MessageBuilderException("mandatory field " + field +
" not found in message " + _headerString);
+ }
+ }
+
+ /**
* Stream the message.
* @param out the stream to be written to
*/
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
===================================================================
---
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
2007-06-18 16:07:26 UTC (rev 13649)
+++
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageInputStream.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,6 @@
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
-import org.freenet.contrib.fcp.message.DataHoldingMessage;
import org.freenet.contrib.fcp.message.node.NodeMessage;
/**
@@ -43,8 +42,8 @@
}
sb.append((char) b);
}
- String line = sb.toString();
- return line.trim().length() == 0 ? readLine() : line;
+ String line = sb.toString();
+ return line.trim().length() == 0 ? readLine() : line; // blank lines
allowed for debugging - if so, read on
}
/**
@@ -65,16 +64,8 @@
while(readField(m))
; // read all message fields
- String[] mandatoryFields = m.getMandatoryFields();
+ m.validate();
- for(String field : mandatoryFields){
-
- if(m.getFields().get(field) == null)
- throw new MessageBuilderException(
- "mandatory field " + field + " not found in message "
+
- m.getHeaderString());
- }
-
return m;
}
@@ -99,12 +90,15 @@
DataHoldingMessage dhm = (DataHoldingMessage) m;
byte[] data = new byte[dhm.getDataLength()];
- _dis.read(data, 0, data.length);
-
+ int toRead = data.length, read;
+ while(toRead > 0){
+ read = _dis.read(data, data.length - toRead, toRead > 4096 ? 4096
: toRead);
+ toRead -= read;
+ }
dhm.setData(data);
return false;
}
-
+
/**
* Closes the delegate stream.
* @throws java.io.IOException if thrown on underlying stream
Added:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
===================================================================
---
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
(rev 0)
+++
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/FcpMessageOutputStream.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,64 @@
+/*
+ * FcpMessageOutputStream.java
+ *
+/* 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 org.freenet.contrib.fcp.message;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+import org.freenet.contrib.fcp.message.client.ClientMessage;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public class FcpMessageOutputStream {
+ private DataOutputStream _dos;
+ /** Creates a new instance of FcpMessageOutputStream */
+ public FcpMessageOutputStream(OutputStream out) {
+ _dos = new DataOutputStream(new BufferedOutputStream(out));
+ }
+
+ public void writeMessage(ClientMessage m) throws MessageBuilderException,
IOException{
+ m.validate();
+
+ writeLine(m.getHeaderString());
+
+ for(Map.Entry<String, String> field : m.getFields().entrySet()){
+ writeField(field.getKey(), field.getValue());
+ }
+ if(m instanceof DataHoldingMessage){
+ writeLine("Data");
+ _dos.write(((DataHoldingMessage) m).getData());
+ }else{
+ writeLine("EndMessage");
+ }
+
+ }
+
+ void writeField(String name, String value) throws IOException{
+ _dos.writeBytes(name);
+ _dos.writeByte('=');
+ _dos.writeBytes(value);
+ _dos.writeByte('\n');
+ }
+
+ void writeLine(String line) throws IOException{
+ _dos.writeBytes(line);
+ _dos.writeByte('\n');
+ }
+
+ public void flush() throws IOException{
+ _dos.flush();
+ }
+
+ public void close() throws IOException{
+ _dos.close();
+ }
+}
Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/Persistence.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum Persistence{
+ connection,
+ reboot,
+ forever
+}
Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/ReturnType.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum ReturnType{
+ direct,
+ disk,
+ none
+}
Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/UploadFrom.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,15 @@
+/* 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 org.freenet.contrib.fcp.message;
+
+/**
+ *
+ * @author Ralph Smithen
+ */
+public enum UploadFrom{
+ direct,
+ disk,
+ redirect
+}
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientGet.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -4,28 +4,17 @@
package org.freenet.contrib.fcp.message.client;
-import java.io.PrintStream;
-import java.net.FileNameMap;
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.Persistence;
+import org.freenet.contrib.fcp.message.ReturnType;
/**
+ *This is sent from a client program to the Freenet node and is used to
specify a file to download from Freenet.
*
- * @author res
+ * @author Ralph Smithen
*/
public class ClientGet extends ClientMessage{
- public enum ReturnType{
- direct,
- disk,
- none
- }
- public enum Persistence{
- connection,
- reboot,
- forever
- }
-
-
public ClientGet(String uri, String identifier){
setUri(uri);
setId(identifier);
@@ -136,6 +125,14 @@
_fields.put("Global", String.valueOf(global));
}
+ public boolean isBlob() {
+ return Boolean.parseBoolean(_fields.get("BinaryBlob"));
+ }
+
+ public void setBlob(boolean blob) {
+ _fields.put("BinaryBlob", String.valueOf(blob));
+ }
+
public ReturnType getReturnType() {
return ReturnType.valueOf(_fields.get("ReturnType"));
}
@@ -144,6 +141,7 @@
_fields.put("ReturnType", returnType.toString());
}
+ // Only valid if ReturnType is disk
public String getFileName() {
return _fields.get("FileName");
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientHello.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,8 +8,10 @@
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
/**
+ *This must be the first message from the client on any given connection.
+ * The node will respond with a {@link
org.freenet.contrib.fcp.message.node.NodeHello NodeHello} message.
*
- * @author res
+ * @author Ralph Smithen
*/
public class ClientHello extends ClientMessage{
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
===================================================================
---
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
2007-06-18 16:07:26 UTC (rev 13649)
+++
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientMessage.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
import org.freenet.contrib.fcp.message.FcpMessage;
/**
+ *All client messages inherit from this.
*
- * @author res
+ * @author Ralph Smithen
*/
public abstract class ClientMessage extends FcpMessage{
Added: trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ClientPut.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,267 @@
+/* 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 org.freenet.contrib.fcp.message.client;
+
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.DataHoldingMessage;
+import org.freenet.contrib.fcp.message.Persistence;
+import org.freenet.contrib.fcp.message.UploadFrom;
+
+/**
+ * <p>This is used to specify an insert into Freenet of a single file.
+ * The insert may be provided by referring to a file on disk, including the
data directly,
+ * or redirecting to another key.</p>
+ * <p>A filename may be specified using the TargetFilename option. This is
mostly useful
+ * with CHKs. The effect is to create a single file manifest which contains
only the filename
+ * given, and points to the data just inserted. Thus the provided filename
becomes the last
+ * part of the URI, and must be provided when fetching the data.</p>
+ *
+ * @author Ralph Smithen
+ */
+public class ClientPut extends ClientMessage implements DataHoldingMessage{
+ private byte[] _data;
+ private static String[] _mandatoryFields;
+
+
+ /**
+ * Creates a ClientPut for direct data sending.
+ * @param uri
+ * @param id
+ * @param data
+ */
+ public ClientPut(String uri, String id, byte[] data){
+ setUri(uri);
+ setId(id);
+ setData(data);
+ setUploadFrom(UploadFrom.direct);
+ }
+
+ /**
+ *
+ * @inheritDoc
+ */
+ public String[] getMandatoryFields() {
+ return _mandatoryFields;
+ }
+
+ public void fireEvents(FcpEventSupportRepository eventSupport) {
+ }
+
+
+ public String getUri() {
+ return _fields.get("URI");
+ }
+
+ /**
+ * The type of key to insert. When inserting an SSK key, you explicitly
specifiy the version
+ * number. For a USK key, use a zero and it should automatically use the
correct version number.
+ * @param uri
+ */
+ public void setUri(String uri) {
+ _fields.put("URI", uri);
+ }
+
+ public String getId() {
+ return _fields.get("Identifier");
+ }
+
+ /**
+ * This is just for client to be able to identify files that have been
inserted.
+ * @param id
+ */
+ public void setId(String id) {
+ _fields.put("Identifier", id);
+ }
+
+ public String getContentType() {
+ return _fields.get("Metadata.ContentType");
+ }
+
+ /**
+ * The MIME type of the data being inserted. For text, if charset is not
specified, node should
+ * auto-detect it and force the auto-detected version
+ * @param contentType
+ */
+ public void setContentType(String contentType) {
+ _fields.put("Metadata.ContentType", contentType);
+ }
+
+ public int getVerbosity() {
+ return Integer.parseInt(_fields.get("Verbosity"));
+ }
+
+ /**
+ * <pre>
+ * 0: report when complete,
+ * 1: SimpleProgress messages,
+ * 512: send StartedCompression and FinishedCompression messages
+ * </pre>
+ * @param verbosity
+ */
+ public void setVerbosity(int verbosity) {
+ _fields.put("Verbosity", String.valueOf(verbosity));
+ }
+
+ public int getMaxRetries() {
+ return Integer.parseInt(_fields.get("MaxRetries"));
+ }
+
+ /**
+ * Number of times to retry if the first time doesn't work. -1 means retry
forever.
+ * @param maxRetries
+ */
+ public void setMaxRetries(int maxRetries) {
+ _fields.put("MaxRetries", String.valueOf(maxRetries));
+ }
+
+ public int getPriority() {
+ return Integer.parseInt(_fields.get("PriorityClass"));
+ }
+
+ public void setPriority(int priority) {
+ _fields.put("PriorityClass", String.valueOf(priority));
+ }
+
+ public boolean isCHKOnly() {
+ return Boolean.parseBoolean(_fields.get("GetCHKOnly"));
+ }
+
+ /**
+ * <p>
+ * If set to true, it won't actually insert the data,
+ * just return the key it would generate.
+ * </p>
+ *
+ * <p>
+ * If the key is USK, you may want to transform it into a SSK, to
prevent the node
+ * spending time searching for an unused index.
+ * </p>
+ * @param chk
+ */
+ public void setCHKOnly(boolean chk) {
+ _fields.put("GetCHKOnly", String.valueOf(chk));
+ }
+
+ public Persistence getPersistence() {
+ return Persistence.valueOf(_fields.get("Persistence"));
+ }
+
+ public void setPersistence(Persistence persistence) {
+ _fields.put("Persistence", persistence.toString());
+ }
+
+ public String getClientToken() {
+ return _fields.get("ClientToken");
+ }
+
+ /**
+ * Sent back to client on the PersistentPut if this is a persistent request
+ * @param clientToken
+ */
+ public void setClientToken(String clientToken) {
+ _fields.put("ClientToken", clientToken);
+ }
+
+ public boolean isGlobal() {
+ return Boolean.parseBoolean(_fields.get("Global"));
+ }
+
+ /**
+ * Whether the insert is visible on the global queue or not.
+ * @param global
+ */
+ public void setGlobal(boolean global) {
+ _fields.put("Global", String.valueOf(global));
+ }
+
+ public boolean isDontCompress() {
+ return Boolean.parseBoolean(_fields.get("DontCompress"));
+ }
+
+ /**
+ * Hint to node: don't try to compress the data, it's already compressed
+ * @param dontCompress
+ */
+ public void setDontCompress(boolean dontCompress) {
+ _fields.put("DontCompress", String.valueOf(dontCompress));
+ }
+
+ public boolean isBlob() {
+ return Boolean.parseBoolean(_fields.get("BinaryBlob"));
+ }
+
+ public void setBlob(boolean blob) {
+ _fields.put("BinaryBlob", String.valueOf(blob));
+ }
+
+ public boolean isEarlyEncode() {
+ return Boolean.parseBoolean(_fields.get("EarlyEncode"));
+ }
+
+ public void setEarlyEncode(boolean earlyEncode) {
+ _fields.put("EarlyEncode", String.valueOf(earlyEncode));
+ }
+
+ public UploadFrom getUploadFrom() {
+ return UploadFrom.valueOf(_fields.get("UploadFrom"));
+ }
+
+ public void setUploadFrom(UploadFrom uploadFrom) {
+ _fields.put("UploadFrom", uploadFrom.toString());
+ switch(uploadFrom){
+ case direct:
+ _mandatoryFields = new String[] {"URI", "Identifier",
"DataLength"};
+ break;
+
+ case disk:
+ _mandatoryFields = new String[] {"URI", "Identifier",
"Filename"};
+ break;
+
+ case redirect:
+ _mandatoryFields = new String[] {"URI", "Identifier",
"TargetURI"};
+ }
+ }
+
+ public String getFileName() {
+ return _fields.get("FileName");
+ }
+
+ public void setFileName(String fileName) {
+ _fields.put("FileName", fileName);
+ }
+
+ public String getTargetFilename() {
+ return _fields.get("TargetFilename");
+ }
+
+ public void setTargetFilename(String targetFilename) {
+ _fields.put("TargetFilename", targetFilename);
+ }
+
+ public String getTargetURI() {
+ return _fields.get("TargetURI");
+ }
+
+ public void setTargetURI(String targetURI) {
+ _fields.put("TargetURI", targetURI);
+ }
+
+ public byte[] getData() {
+ return _data;
+ }
+
+ public void setData(byte[] data) {
+ _data = data;
+ setDataLength(data.length);
+ }
+
+ public int getDataLength() {
+ return Integer.parseInt(_fields.get("DataLength"));
+ }
+
+ public void setDataLength(int dataLength) {
+ _fields.put("DataLength", String.valueOf(dataLength));
+ }
+}
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/GenerateSSK.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,10 @@
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
/**
+ * This asks the node to generate us an SSK keypair.
+ * The response will come back in a {@link
org.freenet.contrib.fcp.message.node.SSKKeypair SSKKeypair} message.
*
- * @author res
+ * @author Ralph Smithen
*/
public class GenerateSSK extends ClientMessage{
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ListPeers.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
/**
+ *This message asks the Freenet node for a list of other Freenet nodes
connected directly to you (peers).
*
- * @author res
+ * @author Ralph Smithen
*/
public class ListPeers extends ClientMessage{
Modified:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/client/ShutDown.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -7,8 +7,9 @@
import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
/**
- *
- * @author res
+ * This command allows an client program to remotely shut down a Freenet node.
+ * A confirmation message will be sent (ProtocolError code 18: Shutting down)
+ * @author Ralph Smithen
*/
public class ShutDown extends ClientMessage{
Added:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/PersistentPut.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,63 @@
+/* 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 org.freenet.contrib.fcp.message.node;
+
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.UploadFrom;
+
+/**
+ *This is the node replying to a {@link
org.freenet.contrib.fcp.message.client.ClientPut ClientPut}
+ * and confirming the details or the request
+ * (possibly for clients other than the one that issued the ClientPut, if it
is on the global queue)
+ *
+ * @author Ralph Smithen
+ */
+public class PersistentPut extends NodeMessage{
+
+ public void fireEvents(FcpEventSupportRepository eventSupport) {
+
+ }
+
+ public String getId() {
+ return _fields.get("Identifier");
+ }
+
+ public String getUri() {
+ return _fields.get("URI");
+ }
+
+ public int getVerbosity() {
+ return Integer.parseInt(_fields.get("Verbosity"));
+ }
+
+ public UploadFrom getUploadFrom() {
+ return UploadFrom.valueOf(_fields.get("UploadFrom"));
+ }
+
+ public String getFileName() {
+ return _fields.get("FileName");
+ }
+
+ public String getTargetFilename() {
+ return _fields.get("TargetFilename");
+ }
+
+ public String getContentType() {
+ return _fields.get("Metadata.ContentType");
+ }
+
+ public boolean isGlobal() {
+ return Boolean.parseBoolean(_fields.get("Global"));
+ }
+
+ public int getDataLength() {
+ return Integer.parseInt(_fields.get("DataLength"));
+ }
+
+ public int getMaxRetries() {
+ return Integer.parseInt(_fields.get("MaxRetries"));
+ }
+
+}
Added:
trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
===================================================================
--- trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
(rev 0)
+++ trunk/apps/jfcp/src/org/freenet/contrib/fcp/message/node/URIGenerated.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -0,0 +1,51 @@
+/* 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 org.freenet.contrib.fcp.message.node;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+
+/**
+ *This indicates the final URI of the data inserted; this may not be the same
as the original URI,
+ * which could have been CHK@ ("insert this as a CHK and tell me what its CHK
is"),
+ * or an Signed Subspace Key (SSK) using a private key.
+ *
+ * @author Ralph Smithen
+ */
+public class URIGenerated extends NodeMessage{
+ private String _uri;
+ private byte[] _data;
+
+ /**
+ * Creates a new instance of URIGenerated
+ */
+ public URIGenerated() {
+ }
+
+ /**
+ *
+ * @inheritDoc
+ */
+ public void fireEvents(FcpEventSupportRepository eventSupport) {
+ eventSupport.getSSKKeypairEventSupport().fireURIGenerated(this);
+ }
+
+ public String getId() {
+ return _fields.get("Identifier");
+ }
+
+ public void setId(String id) {
+ _fields.put("Identifier", id);
+ }
+
+ public String getUri() {
+ return _fields.get("URI");
+ }
+
+ public void setUri(String uri) {
+ _fields.put("URI", uri);
+ }
+ }
Modified: trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
===================================================================
--- trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
2007-06-18 16:07:26 UTC (rev 13649)
+++ trunk/apps/jfcp/test/org/freenet/contrib/fcp/FreenetClientTest.java
2007-06-18 16:57:35 UTC (rev 13650)
@@ -8,7 +8,6 @@
package org.freenet.contrib.fcp;
import java.util.Map;
-import java.util.logging.Logger;
import junit.framework.*;
import org.freenet.contrib.fcp.event.AllDataEvent;
import org.freenet.contrib.fcp.event.DataFoundEvent;
@@ -19,12 +18,21 @@
import org.freenet.contrib.fcp.event.FcpSimpleProgressEvent;
import org.freenet.contrib.fcp.event.GetFailedEvent;
import org.freenet.contrib.fcp.event.SSKKeypairEvent;
+import org.freenet.contrib.fcp.event.URIGeneratedEvent;
import org.freenet.contrib.fcp.event.support.FcpEventSource;
import org.freenet.contrib.fcp.listener.FcpConnectionListener;
import org.freenet.contrib.fcp.listener.FcpPeerListListener;
import org.freenet.contrib.fcp.listener.FcpQueueListener;
import org.freenet.contrib.fcp.listener.FcpSSKKeypairListener;
import org.freenet.contrib.fcp.message.node.Peer;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import org.freenet.contrib.fcp.event.support.FcpEventSupportRepository;
+import org.freenet.contrib.fcp.message.client.ClientGet;
+import org.freenet.contrib.fcp.message.client.ClientMessage;
+import org.freenet.contrib.fcp.message.client.ClientPut;
+import org.freenet.contrib.fcp.message.client.GenerateSSK;
+import org.freenet.contrib.fcp.message.client.ListPeers;
/**
*
@@ -118,6 +126,21 @@
}
+ /**
+ * Test of put method, of class org.freenet.contrib.fcp.FreenetClient.
+ */
+ public void testPut() {
+ System.out.println("put");
+
+ String uri = "CHK@";
+ String id = "mytestput";
+ byte[] data = "I'm but a wee snippet.".getBytes();
+
+ instance.put(uri, id, data);
+
+ myWait();
+ }
+
public void peerListUpdated(FcpPeerListUpdatedEvent e) {
System.out.println("peerListUpdated, peer list:");
for(Map.Entry<String, Peer> entry : e.getPeers().entrySet()){
@@ -138,6 +161,7 @@
public void simpleProgressUpdate(FcpSimpleProgressEvent e) {
System.out.println("simpleProgressUpdate");
+ System.out.println(" id=" + e.getMessage().getId());
}
public void keyRequested(FcpKeyRequestedEvent e) {
@@ -150,7 +174,8 @@
public void allData(AllDataEvent e) {
System.out.println("allData");
- System.out.println(new String(e.getMessage().getData()));
+ //System.out.println(new String(e.getMessage().getData()));
+ System.out.println(" bytes=" + e.getMessage().getDataLength());
synchronized(this){
notify();
}
@@ -175,5 +200,16 @@
notify();
}
}
+
+
+ public void uriGenerated(URIGeneratedEvent uge) {
+ System.out.println("uriGenerated");
+ System.out.println(" id=" + uge.getMessage().getId());
+ System.out.println(" uri=" + uge.getMessage().getUri());
+
+ synchronized(this){
+ notify();
+ }
+ }
}