/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.jena.hadoop.rdf.types.converters;
import java.io.ByteArrayOutputStream;
import org.apache.jena.riot.thrift.wire.RDF_Quad;
import org.apache.jena.riot.thrift.wire.RDF_Term;
import org.apache.jena.riot.thrift.wire.RDF_Triple;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TIOStreamTransport;
import org.apache.thrift.transport.TMemoryInputTransport;
import org.apache.thrift.transport.TTransport;
/**
* Helper for converting between the binary representation of Nodes, Triples and
* Quads and their Jena API equivalents
*
*/
public class ThriftConverter {
private static ThreadLocal<TMemoryInputTransport> inputTransports = new ThreadLocal<>();
private static ThreadLocal<TProtocol> inputProtocols = new ThreadLocal<>();
private static ThreadLocal<ByteArrayOutputStream> outputStreams = new ThreadLocal<>();
private static ThreadLocal<TTransport> outputTransports = new ThreadLocal<>();
private static ThreadLocal<TProtocol> outputProtocols = new ThreadLocal<>();
private static TMemoryInputTransport getInputTransport() {
TMemoryInputTransport transport = inputTransports.get();
if (transport != null)
return transport;
transport = new TMemoryInputTransport();
inputTransports.set(transport);
return transport;
}
private static TProtocol getInputProtocol() {
TProtocol protocol = inputProtocols.get();
if (protocol != null)
return protocol;
protocol = new TCompactProtocol(getInputTransport());
inputProtocols.set(protocol);
return protocol;
}
private static ByteArrayOutputStream getOutputStream() {
ByteArrayOutputStream output = outputStreams.get();
if (output != null)
return output;
output = new ByteArrayOutputStream();
outputStreams.set(output);
return output;
}
private static TTransport getOutputTransport() {
TTransport transport = outputTransports.get();
if (transport != null)
return transport;
transport = new TIOStreamTransport(getOutputStream());
outputTransports.set(transport);
return transport;
}
private static TProtocol getOutputProtocol() {
TProtocol protocol = outputProtocols.get();
if (protocol != null)
return protocol;
protocol = new TCompactProtocol(getOutputTransport());
outputProtocols.set(protocol);
return protocol;
}
public static byte[] toBytes(RDF_Term term) throws TException {
ByteArrayOutputStream output = getOutputStream();
output.reset();
TProtocol protocol = getOutputProtocol();
term.write(protocol);
return output.toByteArray();
}
public static void fromBytes(byte[] bs, RDF_Term term) throws TException {
TMemoryInputTransport transport = getInputTransport();
transport.reset(bs);
TProtocol protocol = getInputProtocol();
term.read(protocol);
}
public static void fromBytes(byte[] buffer, RDF_Triple triple) throws TException {
TMemoryInputTransport transport = getInputTransport();
transport.reset(buffer);
TProtocol protocol = getInputProtocol();
triple.read(protocol);
}
public static byte[] toBytes(RDF_Triple triple) throws TException {
ByteArrayOutputStream output = getOutputStream();
output.reset();
TProtocol protocol = getOutputProtocol();
triple.write(protocol);
return output.toByteArray();
}
public static void fromBytes(byte[] buffer, RDF_Quad quad) throws TException {
TMemoryInputTransport transport = getInputTransport();
transport.reset(buffer);
TProtocol protocol = getInputProtocol();
quad.read(protocol);
}
public static byte[] toBytes(RDF_Quad quad) throws TException {
ByteArrayOutputStream output = getOutputStream();
output.reset();
TProtocol protocol = getOutputProtocol();
quad.write(protocol);
return output.toByteArray();
}
}