package com.datascience.utils.transformations.thrift; import com.datascience.core.base.AssignedLabel; import com.datascience.core.base.Worker; import com.datascience.utils.ITransformation; import com.datascience.utils.transformations.CollectionElementsTransform; import com.datascience.utils.transformations.thrift.generated.*; import com.google.common.base.Throwables; import org.apache.log4j.Logger; import org.apache.thrift.TBase; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TIOStreamTransport; import java.io.*; import java.util.Collection; import java.util.List; /** * @Author: konrad */ public class ThriftCoreTransforms { static Logger logger = Logger.getLogger(ThriftCoreTransforms.class); static public class ThriftBaseTransform<T extends TBase> implements ITransformation<T, InputStream> { protected T tBase; public ThriftBaseTransform(T element){ tBase = element; tBase.clear(); } protected void hadnleError(String errMsg, Throwable t){ logger.error(errMsg, t); Throwables.propagate(t); } @Override public InputStream transform(T object) { try { PipedOutputStream pipedOutputStream = new PipedOutputStream(); PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream); object.write(new TBinaryProtocol(new TIOStreamTransport(pipedOutputStream))); // Alternative ^^^ could be TMemoryBuffer pipedOutputStream.flush(); return pipedInputStream; } catch (IOException e) { hadnleError("When transforming with PipedXStream", e); } catch (TException e) { hadnleError("When transforming with PipedXStream", e); } return null; } @Override public T inverse(InputStream object) { try { T newOne = (T) tBase.deepCopy(); newOne.read(new TBinaryProtocol(new TIOStreamTransport(object))); return newOne; } catch (TException e) { hadnleError("When transforming from stream", e); } return null; } } static public class LabelTransform<T> implements ITransformation<T, TLabel>{ @Override public TLabel transform(T object) { return null; //To change body of implemented methods use File | Settings | File Templates. } @Override public T inverse(TLabel object) { return null; //To change body of implemented methods use File | Settings | File Templates. } } static public class AssignsTransform<T> implements ITransformation<Collection<AssignedLabel<T>>, TAssigns> { @Override public TAssigns transform(Collection<AssignedLabel<T>> object) { return null; //To change body of implemented methods use File | Settings | File Templates. } @Override public Collection<AssignedLabel<T>> inverse(TAssigns object) { return null; //To change body of implemented methods use File | Settings | File Templates. } } static public class WorkerTransform implements ITransformation<Worker, TWorker>{ @Override public TWorker transform(Worker object) { return new TWorker(object.getName()); } @Override public Worker inverse(TWorker object) { return new Worker(object.getWorker()); } } static public class WorkersTransform implements ITransformation<Collection<Worker>, TWorkers>{ ITransformation<Collection<Worker>, Collection<TWorker>> helperTransform = new CollectionElementsTransform<Worker, TWorker>(new WorkerTransform()); @Override public TWorkers transform(Collection<Worker> object) { return new TWorkers((List) helperTransform.transform(object)); } @Override public Collection<Worker> inverse(TWorkers object) { return helperTransform.inverse(object.getWorkers()); } } }