/* * 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 com.facebook.presto.spi.type; import io.airlift.slice.SliceInput; import io.airlift.slice.SliceOutput; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static java.nio.charset.StandardCharsets.UTF_8; public final class TypeSerde { private TypeSerde() { } public static void writeType(SliceOutput sliceOutput, Type type) { if (sliceOutput == null) { throw new NullPointerException("sliceOutput is null"); } if (type == null) { throw new NullPointerException("type is null"); } writeLengthPrefixedString(sliceOutput, type.getTypeSignature().toString()); } public static Type readType(TypeManager typeManager, SliceInput sliceInput) { if (sliceInput == null) { throw new NullPointerException("sliceInput is null"); } String name = readLengthPrefixedString(sliceInput); Type type = typeManager.getType(parseTypeSignature(name)); if (type == null) { throw new IllegalArgumentException("Unknown type " + name); } return type; } private static String readLengthPrefixedString(SliceInput input) { int length = input.readInt(); byte[] bytes = new byte[length]; input.readBytes(bytes); return new String(bytes, UTF_8); } private static void writeLengthPrefixedString(SliceOutput output, String string) { byte[] bytes = string.getBytes(UTF_8); output.writeInt(bytes.length); output.writeBytes(bytes); } }