All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.datakernel.csp.binary.ByteBufSerializer Maven / Gradle / Ivy

Go to download

Communicating sequential process via channels, similar to Golang's channels. A channel could be imagine as a pipe which connects some processes.

The newest version!
/*
 * Copyright (C) 2015-2018 SoftIndex LLC.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.datakernel.csp.binary;

import io.datakernel.bytebuf.ByteBuf;
import io.datakernel.bytebuf.ByteBufQueue;
import io.datakernel.bytebuf.util.ByteBufWriter;
import io.datakernel.codec.StructuredCodec;
import io.datakernel.codec.binary.BinaryUtils;
import io.datakernel.codec.json.JsonUtils;
import io.datakernel.common.parse.ParseException;
import org.jetbrains.annotations.Nullable;

import static java.nio.charset.StandardCharsets.UTF_8;

public interface ByteBufSerializer extends ByteBufsParser {
	ByteBuf serialize(O item);

	static  ByteBufSerializer ofBinaryCodec(StructuredCodec responseCodec, StructuredCodec requestCodec) {
		ByteBufsParser parser = ByteBufsParser.ofDecoder(responseCodec);
		return new ByteBufSerializer() {
			@Override
			public ByteBuf serialize(O item) {
				return BinaryUtils.encode(requestCodec, item);
			}

			@Nullable
			@Override
			public I tryParse(ByteBufQueue bufs) throws ParseException {
				return parser.tryParse(bufs);
			}
		};
	}

	static  ByteBufSerializer ofBinaryCodec(StructuredCodec codec) {
		return ofBinaryCodec(codec, codec);
	}

	static  ByteBufSerializer ofJsonCodec(StructuredCodec in, StructuredCodec out) {
		ByteBufsParser parser = ByteBufsParser.ofNullTerminatedBytes()
				.andThen(buf -> JsonUtils.fromJson(in, buf.asString(UTF_8)));
		return new ByteBufSerializer() {
			@Override
			public ByteBuf serialize(O item) {
				ByteBufWriter writer = new ByteBufWriter();
				JsonUtils.toJson(out, item, writer);
				writer.append("\0");
				return writer.getBuf();
			}

			@Nullable
			@Override
			public I tryParse(ByteBufQueue bufs) throws ParseException {
				return parser.tryParse(bufs);
			}
		};
	}
}