Skip to content

Commit

Permalink
View models, terminated string, prefixed string, database packet defi…
Browse files Browse the repository at this point in the history
…nition loader, transient modifier on fields that get encoded in JSON
  • Loading branch information
acrois committed Jul 6, 2018
1 parent 703839b commit 508c778
Show file tree
Hide file tree
Showing 11 changed files with 326 additions and 22 deletions.
33 changes: 21 additions & 12 deletions src/one/slope/slip/io/DataType.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,46 @@
package one.slope.slip.io;

public enum DataType {
BYTE(1),
SHORT(2),
TRIPLE(3),
INTEGER(4),
LONG(8),
LB_STRING(DataType.BYTE), // byte length prefixed string
LS_STRING(DataType.SHORT), // short length prefixed string
NT_STRING(DataTerminator.NULL), // null terminated string
LT_STRING(DataTerminator.LINE_FEED) // line feed terminated string
BYTE(1, Integer.class),
SHORT(2, Integer.class),
TRIPLE(3, Integer.class),
INTEGER(4, Integer.class),
LONG(8, Long.class),
LB_STRING(DataType.BYTE, String.class), // byte length prefixed string
LS_STRING(DataType.SHORT, String.class), // short length prefixed string
NT_STRING(DataTerminator.NULL, String.class), // null terminated string
LT_STRING(DataTerminator.LINE_FEED, String.class), // line feed terminated string
BOOLEAN(1, Boolean.class)
;

private final DataType length;
private final DataTerminator terminator;
private final int width;
private final Class<?> clazz;

private DataType(int width) {
private DataType(int width, Class<?> clazz) {
this.width = width;
this.terminator = null;
this.length = null;
this.clazz = clazz;
}

private DataType(DataTerminator terminator) {
private DataType(DataTerminator terminator, Class<?> clazz) {
this.width = 0;
this.terminator = terminator;
this.length = null;
this.clazz = clazz;
}

private DataType(DataType lengthType) {
private DataType(DataType lengthType, Class<?> clazz) {
this.width = 0;
this.terminator = null;
this.length = lengthType;
this.clazz = clazz;
}

public Class<?> clazz() {
return this.clazz;
}

public boolean hasLength() {
Expand Down
8 changes: 8 additions & 0 deletions src/one/slope/slip/io/SuperBuffer.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,14 @@ public SuperBuffer put(long value, DataType size, DataEndian order, DataTransfor
return this;
}

public SuperBuffer put(long value, DataType size, DataEndian order) {
return this.put(value, size, order, DataTransformation.NONE);
}

public SuperBuffer put(long value, DataType size) {
return this.put(value, size, DataEndian.BIG);
}

public String getString() {
return getString(DataTerminator.LINE_FEED);
}
Expand Down
4 changes: 2 additions & 2 deletions src/one/slope/slip/io/packet/Packet.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import one.slope.slip.io.packet.field.PacketField;

public class Packet {
public static final int DEFAULT_ALLOCATION_SIZE = 4096;
public transient static final int DEFAULT_ALLOCATION_SIZE = 4096;

private final Map<String, Object> values = new HashMap<String, Object>();
private final PacketDefinition definition;
private final SuperBuffer buffer; // TODO maybe move out of this class?
private transient final SuperBuffer buffer; // TODO maybe move out of this class?

public Packet(PacketDefinition definition) {
this(definition, new SuperBuffer(definition.length() >= 0 ? definition.length() : DEFAULT_ALLOCATION_SIZE));
Expand Down
4 changes: 0 additions & 4 deletions src/one/slope/slip/io/packet/PacketDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ public class PacketDefinition {
protected final int length;
protected final int id;

public PacketDefinition(int id, String name, PacketField<?>[] fields, int length) {
this(PacketType.SERVICE, id, name, fields, length);
}

public PacketDefinition(PacketType type, int id, String name, PacketField<?>[] fields, int length) {
this.id = id;
this.type = type;
Expand Down
2 changes: 1 addition & 1 deletion src/one/slope/slip/io/packet/PacketType.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

public enum PacketType {
NEGOTIATION,
SERVICE
GAME
}
2 changes: 1 addition & 1 deletion src/one/slope/slip/io/packet/field/PacketField.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
public class PacketField<T> extends FieldCodec<T> {
protected final int index;
protected final String name;
protected final FieldCodec<T> codec;
protected transient final FieldCodec<T> codec;

public PacketField(String name, int index, FieldCodec<T> codec) {
this.index = index;
Expand Down
25 changes: 25 additions & 0 deletions src/one/slope/slip/io/packet/field/PrefixedStringPacketField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package one.slope.slip.io.packet.field;

import one.slope.slip.io.SuperBuffer;
import one.slope.slip.io.DataType;

public class PrefixedStringPacketField extends FieldCodec<String> {
private DataType prefix;

public PrefixedStringPacketField(DataType prefix) {
this.prefix = prefix;
}

@Override
public String read(SuperBuffer buffer) {
byte[] bytes = buffer.get(prefix.width());
return new String(bytes);
}

@Override
public void write(SuperBuffer buffer, String value) {
byte[] bytes = value.getBytes();
buffer.put(bytes.length, this.prefix);
buffer.put(bytes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import one.slope.slip.io.SuperBuffer;
import one.slope.slip.io.DataTerminator;

public class StringPacketField extends FieldCodec<String> {
public class TerminatedStringPacketField extends FieldCodec<String> {
private DataTerminator terminator;

public StringPacketField(DataTerminator terminator) {
public TerminatedStringPacketField(DataTerminator terminator) {
this.terminator = terminator;
}

Expand Down
79 changes: 79 additions & 0 deletions src/one/slope/slip/service/DatabasePacketDefinitionProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package one.slope.slip.service;

import java.util.ArrayList;
import java.util.List;

import com.dieselpoint.norm.Database;

import one.slope.slip.io.DataType;
import one.slope.slip.io.packet.PacketDefinition;
import one.slope.slip.io.packet.PacketDefinitionProvider;
import one.slope.slip.io.packet.field.BooleanFieldCodec;
import one.slope.slip.io.packet.field.FieldCodec;
import one.slope.slip.io.packet.field.NumericFieldCodec;
import one.slope.slip.io.packet.field.PacketField;
import one.slope.slip.io.packet.field.PrefixedStringPacketField;
import one.slope.slip.io.packet.field.TerminatedStringPacketField;

public class DatabasePacketDefinitionProvider implements PacketDefinitionProvider {
private final Database database;

private PacketDefinition[] definitions;

public DatabasePacketDefinitionProvider(Database database) {
this.database = database;
}

public boolean load(String revision) {
List<RevisionPacketRead> packets = database.where("revision = ?", revision).results(RevisionPacketRead.class);
List<PacketDefinition> temp = new ArrayList<>();

packets.forEach((packet) -> {
List<RevisionPacketFieldRead> fields = database.where("revision_id = ? AND event_id = ?", packet.revision_id, packet.event_id).results(RevisionPacketFieldRead.class);
List<PacketField<?>> tempFields = new ArrayList<>();

fields.forEach((field) -> {
FieldCodec<?> codec = null;

switch(field.revision_field_type) {
case BOOLEAN:
codec = new BooleanFieldCodec();
break;
case BYTE:
case SHORT:
case TRIPLE:
case INTEGER:
case LONG:
codec = new NumericFieldCodec<Long>(field.revision_field_type, field.endian, field.transformation, field.range);
break;
case LB_STRING:
case LS_STRING:
codec = new PrefixedStringPacketField(field.revision_field_type.length());
break;
case LT_STRING:
case NT_STRING:
codec = new TerminatedStringPacketField(field.revision_field_type.terminator());
break;
}

PacketField<?> pfield = new PacketField(field.field_name, field.revision_field_rank, codec);
tempFields.add(pfield);
});

PacketDefinition def = new PacketDefinition(packet.event_type_name, packet.opcode, packet.event_name, tempFields.toArray(new PacketField[0]), (int)packet.length);
temp.add(def);
});

this.definitions = temp.toArray(new PacketDefinition[0]);
return this.definitions != null && this.definitions.length > 0;
}

@Override
public PacketDefinition[] get() {
return this.definitions;
}

public Database database() {
return this.database;
}
}
126 changes: 126 additions & 0 deletions src/one/slope/slip/service/RevisionPacketFieldRead.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package one.slope.slip.service;

import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;

import com.dieselpoint.norm.Database;

import one.slope.slip.io.DataEndian;
import one.slope.slip.io.DataRange;
import one.slope.slip.io.DataTransformation;
import one.slope.slip.io.DataType;
import one.slope.slip.io.packet.PacketType;

@Table(name = "revision_packet_field_read")
public class RevisionPacketFieldRead {
@Column(name = "event_id", insertable = false, updatable = false)
public int event_id;

@Column(name = "packet_id", insertable = false, updatable = false)
public int packet_id;

@Column(name = "revision_id", insertable = false, updatable = false)
public int revision_id;

@Column(name = "field_id", insertable = false, updatable = false)
public int field_id;

@Column(name = "revision_packet_id", insertable = false, updatable = false)
public int revision_packet_id;

@Column(name = "revision_field_id", insertable = false, updatable = false)
public int revision_field_id;

@Column(name = "event_type_id", insertable = false, updatable = false)
public int event_type_id;

@Column(name = "field_type_id", insertable = false, updatable = false)
public int field_type_id;

@Column(name = "revision_field_type_id", insertable = false, updatable = false)
public int revision_field_type_id;

@Column(name = "opcode", insertable = false, updatable = false)
public int opcode;

@Column(name = "length", insertable = false, updatable = false)
public long length;

@Column(name = "event_name", insertable = false, updatable = false)
public String event_name;

@Enumerated(EnumType.STRING)
@Column(name = "event_type_name", insertable = false, updatable = false)
public PacketType event_type_name;

@Column(name = "revision", insertable = false, updatable = false)
public String revision;

@Column(name = "field_name", insertable = false, updatable = false)
public String field_name;

@Column(name = "revision_field_rank", insertable = false, updatable = false)
public int revision_field_rank;

@Enumerated(EnumType.STRING)
@Column(name = "field_type", insertable = false, updatable = false)
public DataType field_type;

@Enumerated(EnumType.STRING)
@Column(name = "revision_field_type", insertable = false, updatable = false)
public DataType revision_field_type;

@Enumerated(EnumType.STRING)
@Column(name = "ranged", insertable = false, updatable = false)
public DataRange range;

@Enumerated(EnumType.STRING)
@Column(name = "endian", insertable = false, updatable = false)
public DataEndian endian;

@Enumerated(EnumType.STRING)
@Column(name = "transformation", insertable = false, updatable = false)
public DataTransformation transformation;

public RevisionPacketFieldRead() {

}

public Event event(Database db) {
return db.where("id = ?", this.event_id).results(Event.class).get(0);
}

public FieldType fieldType(Database db) {
return db.where("id = ?", this.field_type_id).results(FieldType.class).get(0);
}

public RevisionField revisionField(Database db) {
return db.where("id = ?", this.revision_field_id).results(RevisionField.class).get(0);
}

public FieldType revisionFieldType(Database db) {
return db.where("id = ?", this.revision_field_type_id).results(FieldType.class).get(0);
}

public Packet packet(Database db) {
return db.where("id = ?", this.packet_id).results(Packet.class).get(0);
}

public Field field(Database db) {
return db.where("id = ?", this.field_id).results(Field.class).get(0);
}

public Revision revision(Database db) {
return db.where("id = ?", this.revision_id).results(Revision.class).get(0);
}

public RevisionPacket revisionPacket(Database db) {
return db.where("id = ?", this.revision_packet_id).results(RevisionPacket.class).get(0);
}

public EventType type(Database db) {
return db.where("id = ?", this.event_type_id).results(EventType.class).get(0);
}
}
Loading

0 comments on commit 508c778

Please sign in to comment.