package colloid.http;
import net.jxta.document.AdvertisementFactory;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.impl.id.UUID.PeerGroupID;
import net.jxta.peergroup.PeerGroup;
import net.jxta.pipe.PipeID;
import net.jxta.pipe.PipeService;
import net.jxta.platform.NetworkManager;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.socket.JxtaServerSocket;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.text.MessageFormat;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import colloid.App;
import colloid.http.User.UnloggedUserError;
public class PeerServer {
private transient PeerGroup netPeerGroup = null;
public final static String SOCKETIDSTR = "urn:jxta:cbid-59616261646162614E504720503250336578130B8AD24518835DCF215ED3EDC604";
private boolean isRunning = false;
private transient NetworkManager manager;
public PeerServer() throws IOException, PeerGroupException {
manager = new NetworkManager(NetworkManager.ConfigMode.ADHOC, "SocketServer",
new File(new File(".cache"), "SocketServer").toURI());
manager.startNetwork();
netPeerGroup = manager.getNetPeerGroup();
}
public static PipeAdvertisement createSocketAdvertisement() {
return createSocketAdvertisement(null);
}
public static PipeAdvertisement createSocketAdvertisement(String ID) {
PipeID socketID = null;
String peerID;
try {
peerID = String.format("ColloidPeer%s", User.getInstance().me().getName());
} catch (UnloggedUserError e) {
peerID = String.format("ColloidPeer");
}
if (ID != null) {
peerID = "ColloidPeer" + ID;
}
// try {
// socketID = (PipeID) IDFactory.fromURI(new URI(SOCKETIDSTR));
// } catch (URISyntaxException use) {
// use.printStackTrace();
// }
Peer.log(PeerServer.class.getName(), String.format("createSocketAdvertisement(): set peerID %s", peerID), Level.INFO);
socketID = IDFactory.newPipeID(PeerGroupID.defaultNetPeerGroupID, peerID.getBytes());
PipeAdvertisement advertisement = (PipeAdvertisement)
AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());
advertisement.setPipeID(socketID);
advertisement.setType(PipeService.UnicastType);
advertisement.setName(peerID);
return advertisement;
}
/**
* Wait for connections
*/
public void run() {
isRunning = true;
JxtaServerSocket serverSocket = null;
try {
serverSocket = new JxtaServerSocket(netPeerGroup, createSocketAdvertisement(), 10);
serverSocket.setSoTimeout(0);
} catch (IOException e) {
App.getLogger().severe(e.toString());
System.out.println("failed to create a server socket");
e.printStackTrace();
}
while (isRunning) {
try {
System.out.println("Waiting for connections");
Socket socket = serverSocket.accept();
if (socket != null) {
System.out.println("New socket connection accepted");
Thread thread = new Thread(new ConnectionHandler(socket), "Connection Handler Thread");
thread.start();
}
} catch (Exception e) {
App.getLogger().log(Level.SEVERE, e.toString());
e.printStackTrace();
}
}
}
private class ConnectionHandler implements Runnable {
Socket socket = null;
ConnectionHandler(Socket socket) {
this.socket = socket;
}
private void handle(Socket socket) {
try {
// get the socket output stream
OutputStream out = socket.getOutputStream();
// get the socket input stream
InputStream in = socket.getInputStream();
DataInput dis = new DataInputStream(in);
System.out.println(MessageFormat.format("Sending/Receiving {0} bytes.", 0));
String data;
data = dis.readUTF();
out.write("ok".getBytes());
System.out.println(data);
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
handle(socket);
}
}
public static void main(String args[]) {
System.setProperty("net.jxta.logging.Logging", "FINEST");
System.setProperty("net.jxta.level", "FINEST");
System.setProperty("java.util.logging.config.file", "logging.properties");
try {
//Thread.currentThread().setName(PeerServer.class.getName() + ".main()");
PeerServer socEx = new PeerServer();
socEx.run();
} catch (Throwable e) {
Logger.getLogger("err").log(Level.SEVERE, e.toString());
System.err.println("Failed : " + e);
e.printStackTrace(System.err);
System.exit(-1);
}
}
public boolean isRunning() {
return isRunning;
}
public static PeerServer init() {
// System.setProperty("net.jxta.logging.Logging", "FINEST");
// System.setProperty("net.jxta.level", "FINEST");
// System.setProperty("java.util.logging.config.file", "logging.properties");
PeerServer socEx = null;
try {
//Thread.currentThread().setName(PeerServer.class.getName() + ".main()");
socEx = new PeerServer();
return socEx;
} catch (Throwable e) {
App.getLogger().log(Level.SEVERE, e.toString());
System.err.println("Failed : " + e);
e.printStackTrace(System.err);
}
return socEx;
}
public void start() {
run();
}
public void stop() {
isRunning = false;
manager.stopNetwork();
}
}