@Override
	public State transit(byte[] data, List<byte[]> reply) {
		reply.clear();
		if (data == null || data.length != this.size) {
			this.onError(new StreamCorruptedException("No enough data"));
			return new ErrorState(this.handler, service, username);
		}
		try {
			Command cmd = marshaler.unmarshalCommand(data);
			return processCommand(cmd, reply);
		} catch (StreamCorruptedException e) {
			this.onError(e);
			return new ErrorState(this.handler, service, username);
		} catch (ShortBufferException e) {
			this.onError(e);
			return new ErrorState(this.handler, service, username);
		} catch (IllegalBlockSizeException e) {
			this.onError(e);
			return new ErrorState(this.handler, service, username);
		} catch (BadPaddingException e) {
			this.onError(e);
			return new ErrorState(this.handler, service, username);
		} catch (IOException e) {
			this.onError(e);
			return new ErrorState(this.handler, service, username);
		}
	}