moved forge.net.protocol to .net project

This commit is contained in:
Maxmtg
2014-02-02 13:31:55 +00:00
parent 1af6d101e8
commit 5c195f3cea
25 changed files with 31 additions and 29 deletions

View File

@@ -0,0 +1,9 @@
package forge.net.protocol;
/** The protocol is in charge of serialization of internal classes into whatever remote client understands.
* Descendants may use different techniques to serialize data, be it Gson, ProtoBuf or common Java serialization */
public interface ClientProtocol<TIncoming, TOutComing> {
TIncoming decodePacket(String data);
String encodePacket(TOutComing packet);
}

View File

@@ -0,0 +1,82 @@
package forge.net.protocol;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
import forge.net.protocol.toclient.AuthResultPacketClt;
import forge.net.protocol.toclient.ChatPacketClt;
import forge.net.protocol.toclient.EchoPacketClt;
import forge.net.protocol.toclient.ErrorIncorrectPacketClt;
import forge.net.protocol.toclient.ErrorNoStateForPacketClt;
import forge.net.protocol.toclient.IPacketClt;
import forge.net.protocol.toclient.WelcomePacketClt;
import forge.net.protocol.toserver.AuthorizePacketSrv;
import forge.net.protocol.toserver.ChatPacketSrv;
import forge.net.protocol.toserver.EchoPacketSrv;
import forge.net.protocol.toserver.IPacketSrv;
import forge.net.protocol.toserver.IncorrectPacketSrv;
import forge.util.TextUtil;
/**
* The expected incoming message format is: /{opcode} {json-object}, where opcode is a string among keys of headerToClassInbound
* If string starts with a non-slash character, the whole line is considered a chat packet
*
*/
public class ClientProtocolJson implements ClientProtocol<IPacketSrv, IPacketClt> {
private final static Map<String, Class<? extends IPacketSrv>> headerToClassInbound = new HashMap<String, Class<? extends IPacketSrv>>();
private final static Map<Class<? extends IPacketClt>, String> classToHeaderOutbound = new HashMap<Class<? extends IPacketClt>, String>();
// Static ctor to fill maps
static {
// The what remote part sends us
headerToClassInbound.put("echo", EchoPacketSrv.class);
headerToClassInbound.put("s", ChatPacketSrv.class);
headerToClassInbound.put("auth", AuthorizePacketSrv.class);
// The what we reply there
classToHeaderOutbound.put(WelcomePacketClt.class, "welcome");
classToHeaderOutbound.put(AuthResultPacketClt.class, "auth");
classToHeaderOutbound.put(ChatPacketClt.class, "s");
classToHeaderOutbound.put(EchoPacketClt.class, "echo");
classToHeaderOutbound.put(ErrorNoStateForPacketClt.class, "err:packet-state");
classToHeaderOutbound.put(ErrorIncorrectPacketClt.class, "err:packet");
}
private final Gson gson = new Gson(); // looks like a single instance per class is enough
@Override
public IPacketSrv decodePacket(String data) {
if ( '/' != data.charAt(0) )
return new ChatPacketSrv(data);
data = data.substring(1);
String[] parts = TextUtil.split(data, ' ', 2);
Class<? extends IPacketSrv> packetClass = headerToClassInbound.get(parts[0]);
if( null == packetClass )
return new IncorrectPacketSrv("Unknown header: " + parts[0]);
String args = parts.length > 1 ? parts[1] : null;
if ( StringUtils.isBlank(args) )
args = "{}"; // assume default empty object
try {
return gson.fromJson(args, packetClass);
} catch( JsonParseException ex ) {
return new IncorrectPacketSrv("Invalid json: " + args);
}
}
@Override
public String encodePacket(IPacketClt packet) {
Class<? extends IPacketClt> packetClass = packet.getClass();
String prefix = classToHeaderOutbound.get(packetClass);
return String.format("/%s %s", prefix != null ? prefix : "/!unserialized!: " + packetClass.getName(), gson.toJson(packet));
}
}

View File

@@ -0,0 +1,3 @@
/** Model (as in model-view-controller) for Forge. */
package forge.net.protocol;

View File

@@ -0,0 +1,23 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthResultPacketClt implements IPacketClt {
private final boolean successful;
private final String username;
public AuthResultPacketClt(String user, boolean success) {
username = user;
successful = success;
}
public boolean isSuccessful() {
return successful;
}
public String getUsername() {
return username;
}
}

View File

@@ -0,0 +1,25 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatPacketClt implements IPacketClt {
private final String actor;
private final String message;
public ChatPacketClt(String playerName, String message) {
// TODO Auto-generated constructor stub
this.message = message;
this.actor = playerName;
}
public String getActor() {
return actor;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,24 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoPacketClt implements IPacketClt {
private final String message;
/**
* TODO: Write javadoc for Constructor.
* @param message2
*/
public EchoPacketClt(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,17 @@
package forge.net.protocol.toclient;
/**
* A response packet to an Incorrect packet client had sent to server
*/
public class ErrorIncorrectPacketClt implements IPacketClt {
private final String message;
public ErrorIncorrectPacketClt(String msg) {
message = msg;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,19 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public class ErrorNoStateForPacketClt implements IPacketClt {
private final String message;
public ErrorNoStateForPacketClt(String simpleName) {
message = simpleName;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,8 @@
package forge.net.protocol.toclient;
/**
* TODO: Write javadoc for this type.
*
*/
public interface IPacketClt {
}

View File

@@ -0,0 +1,17 @@
package forge.net.protocol.toclient;
import forge.util.BuildInfo;
/**
* TODO: Write javadoc for this type.
*
*/
public class WelcomePacketClt implements IPacketClt {
public final String message;
public final String version;
public WelcomePacketClt(String welcome) {
message = welcome;
version = BuildInfo.getVersionString();
}
}

View File

@@ -0,0 +1,3 @@
/** Model (as in model-view-controller) for Forge. */
package forge.net.protocol.toclient;

View File

@@ -0,0 +1,24 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class AuthorizePacketSrv implements IPacketSrv {
private final String username;
private final String password;
private AuthorizePacketSrv(String name, String pass) {
username = name;
password = pass;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}

View File

@@ -0,0 +1,16 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class ChatPacketSrv implements IPacketSrv {
private final String message;
public ChatPacketSrv(String data) {
message = data;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,22 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class EchoPacketSrv implements IPacketSrv {
private final String message;
private EchoPacketSrv(String data) {
message = data;
}
public static EchoPacketSrv parse(String data) {
return new EchoPacketSrv(data);
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,5 @@
package forge.net.protocol.toserver;
/** A common ancestor for all packets directed to server */
public interface IPacketSrv {}

View File

@@ -0,0 +1,18 @@
package forge.net.protocol.toserver;
/**
* TODO: Write javadoc for this type.
*
*/
public class IncorrectPacketSrv implements IPacketSrv {
private final String message;
public IncorrectPacketSrv(String errorMessage) {
message = errorMessage;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,3 @@
/** Model (as in model-view-controller) for Forge. */
package forge.net.protocol.toserver;