Search in sources :

Example 1 with ClusterSerializable

use of io.vertx.core.shareddata.impl.ClusterSerializable in project vertx-web by vert-x3.

the class SessionImpl method readDataFromBuffer.

private int readDataFromBuffer(int pos, Buffer buffer) {
    try {
        int entries = buffer.getInt(pos);
        pos += 4;
        if (entries != 0) {
            data = new ConcurrentHashMap<>(entries);
            for (int i = 0; i < entries; i++) {
                int keylen = buffer.getInt(pos);
                pos += 4;
                byte[] keyBytes = buffer.getBytes(pos, pos + keylen);
                pos += keylen;
                String key = new String(keyBytes, UTF8);
                byte type = buffer.getByte(pos++);
                Object val;
                switch(type) {
                    case TYPE_LONG:
                        val = buffer.getLong(pos);
                        pos += 8;
                        break;
                    case TYPE_INT:
                        val = buffer.getInt(pos);
                        pos += 4;
                        break;
                    case TYPE_SHORT:
                        val = buffer.getShort(pos);
                        pos += 2;
                        break;
                    case TYPE_BYTE:
                        val = buffer.getByte(pos);
                        pos++;
                        break;
                    case TYPE_FLOAT:
                        val = buffer.getFloat(pos);
                        pos += 4;
                        break;
                    case TYPE_DOUBLE:
                        val = buffer.getDouble(pos);
                        pos += 8;
                        break;
                    case TYPE_CHAR:
                        short s = buffer.getShort(pos);
                        pos += 2;
                        val = (char) s;
                        break;
                    case TYPE_BOOLEAN:
                        byte b = buffer.getByte(pos);
                        pos++;
                        val = b == 1;
                        break;
                    case TYPE_STRING:
                        int len = buffer.getInt(pos);
                        pos += 4;
                        byte[] bytes = buffer.getBytes(pos, pos + len);
                        val = new String(bytes, UTF8);
                        pos += len;
                        break;
                    case TYPE_BUFFER:
                        len = buffer.getInt(pos);
                        pos += 4;
                        bytes = buffer.getBytes(pos, pos + len);
                        val = Buffer.buffer(bytes);
                        pos += len;
                        break;
                    case TYPE_BYTES:
                        len = buffer.getInt(pos);
                        pos += 4;
                        val = buffer.getBytes(pos, pos + len);
                        pos += len;
                        break;
                    case TYPE_SERIALIZABLE:
                        len = buffer.getInt(pos);
                        pos += 4;
                        bytes = buffer.getBytes(pos, pos + len);
                        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
                        ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais));
                        val = ois.readObject();
                        pos += len;
                        break;
                    case TYPE_CLUSTER_SERIALIZABLE:
                        int classNameLen = buffer.getInt(pos);
                        pos += 4;
                        byte[] classNameBytes = buffer.getBytes(pos, pos + classNameLen);
                        pos += classNameLen;
                        String className = new String(classNameBytes, UTF8);
                        Class clazz = Utils.getClassLoader().loadClass(className);
                        ClusterSerializable obj = (ClusterSerializable) clazz.newInstance();
                        pos = obj.readFromBuffer(pos, buffer);
                        val = obj;
                        break;
                    default:
                        throw new IllegalStateException("Invalid serialized type: " + type);
                }
                data.put(key, val);
            }
        }
        return pos;
    } catch (Exception e) {
        throw new VertxException(e);
    }
}
Also used : VertxException(io.vertx.core.VertxException) ClusterSerializable(io.vertx.core.shareddata.impl.ClusterSerializable) VertxException(io.vertx.core.VertxException)

Example 2 with ClusterSerializable

use of io.vertx.core.shareddata.impl.ClusterSerializable in project vertx-web by vert-x3.

the class UserHolder method readFromBuffer.

@Override
public int readFromBuffer(int pos, Buffer buffer) {
    byte b = buffer.getByte(pos++);
    if (b == (byte) 1) {
        int len = buffer.getInt(pos);
        pos += 4;
        byte[] bytes = buffer.getBytes(pos, pos + len);
        pos += len;
        String className = new String(bytes, StandardCharsets.UTF_8);
        try {
            Class clazz = Utils.getClassLoader().loadClass(className);
            ClusterSerializable obj = (ClusterSerializable) clazz.newInstance();
            pos = obj.readFromBuffer(pos, buffer);
            user = (User) obj;
        } catch (Exception e) {
            throw new VertxException(e);
        }
    } else {
        user = null;
    }
    return pos;
}
Also used : ClusterSerializable(io.vertx.core.shareddata.impl.ClusterSerializable) VertxException(io.vertx.core.VertxException) VertxException(io.vertx.core.VertxException)

Example 3 with ClusterSerializable

use of io.vertx.core.shareddata.impl.ClusterSerializable in project vertx-web by vert-x3.

the class UserHolder method writeToBuffer.

@Override
public void writeToBuffer(Buffer buffer) {
    // try to get the user from the context otherwise fall back to any cached version
    User user = context != null ? context.user() : this.user;
    if (user != null && user instanceof ClusterSerializable) {
        buffer.appendByte((byte) 1);
        String className = user.getClass().getCanonicalName();
        if (className == null) {
            throw new IllegalStateException("Cannot serialize " + user.getClass().getName());
        }
        byte[] bytes = className.getBytes(StandardCharsets.UTF_8);
        buffer.appendInt(bytes.length);
        buffer.appendBytes(bytes);
        ClusterSerializable cs = (ClusterSerializable) user;
        cs.writeToBuffer(buffer);
    } else {
        buffer.appendByte((byte) 0);
    }
}
Also used : User(io.vertx.ext.auth.User) ClusterSerializable(io.vertx.core.shareddata.impl.ClusterSerializable)

Example 4 with ClusterSerializable

use of io.vertx.core.shareddata.impl.ClusterSerializable in project vertx-web by vert-x3.

the class SessionImpl method writeDataToBuffer.

private Buffer writeDataToBuffer() {
    try {
        Buffer buffer = Buffer.buffer();
        if (data == null || data.size() == 0) {
            buffer.appendInt(0);
        } else {
            buffer.appendInt(data.size());
            for (Map.Entry<String, Object> entry : data.entrySet()) {
                String key = entry.getKey();
                byte[] keyBytes = key.getBytes(UTF8);
                buffer.appendInt(keyBytes.length).appendBytes(keyBytes);
                Object val = entry.getValue();
                if (val instanceof Long) {
                    buffer.appendByte(TYPE_LONG).appendLong((long) val);
                } else if (val instanceof Integer) {
                    buffer.appendByte(TYPE_INT).appendInt((int) val);
                } else if (val instanceof Short) {
                    buffer.appendByte(TYPE_SHORT).appendShort((short) val);
                } else if (val instanceof Byte) {
                    buffer.appendByte(TYPE_BYTE).appendByte((byte) val);
                } else if (val instanceof Double) {
                    buffer.appendByte(TYPE_DOUBLE).appendDouble((double) val);
                } else if (val instanceof Float) {
                    buffer.appendByte(TYPE_FLOAT).appendFloat((float) val);
                } else if (val instanceof Character) {
                    buffer.appendByte(TYPE_CHAR).appendShort((short) ((Character) val).charValue());
                } else if (val instanceof Boolean) {
                    buffer.appendByte(TYPE_BOOLEAN).appendByte((byte) ((boolean) val ? 1 : 0));
                } else if (val instanceof String) {
                    byte[] bytes = ((String) val).getBytes(UTF8);
                    buffer.appendByte(TYPE_STRING).appendInt(bytes.length).appendBytes(bytes);
                } else if (val instanceof Buffer) {
                    Buffer buff = (Buffer) val;
                    buffer.appendByte(TYPE_BUFFER).appendInt(buff.length()).appendBuffer(buff);
                } else if (val instanceof byte[]) {
                    byte[] bytes = (byte[]) val;
                    buffer.appendByte(TYPE_BYTES).appendInt(bytes.length).appendBytes(bytes);
                } else if (val instanceof Serializable) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos));
                    oos.writeObject(val);
                    oos.flush();
                    byte[] bytes = baos.toByteArray();
                    buffer.appendByte(TYPE_SERIALIZABLE).appendInt(bytes.length).appendBytes(bytes);
                } else if (val instanceof ClusterSerializable) {
                    buffer.appendByte(TYPE_CLUSTER_SERIALIZABLE);
                    String className = val.getClass().getName();
                    byte[] classNameBytes = className.getBytes(UTF8);
                    buffer.appendInt(classNameBytes.length).appendBytes(classNameBytes);
                    ((ClusterSerializable) val).writeToBuffer(buffer);
                } else {
                    if (val != null) {
                        throw new IllegalStateException("Invalid type for data in session: " + val.getClass());
                    }
                }
            }
        }
        return buffer;
    } catch (IOException e) {
        throw new VertxException(e);
    }
}
Also used : Buffer(io.vertx.core.buffer.Buffer) ClusterSerializable(io.vertx.core.shareddata.impl.ClusterSerializable) ClusterSerializable(io.vertx.core.shareddata.impl.ClusterSerializable) VertxException(io.vertx.core.VertxException) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Aggregations

ClusterSerializable (io.vertx.core.shareddata.impl.ClusterSerializable)4 VertxException (io.vertx.core.VertxException)3 Buffer (io.vertx.core.buffer.Buffer)1 User (io.vertx.ext.auth.User)1 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1