/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.apache.commons.io.IOUtils;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.wire.FudgeDataInputStreamReader;
import org.fudgemsg.wire.FudgeDataOutputStreamWriter;
import org.fudgemsg.wire.FudgeMsgReader;
import org.fudgemsg.wire.FudgeMsgWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
/**
* This class allows you to test serializers from other platforms by using any {@link AbstractFudgeBuilderTestCase}s you have.
*/
public class BuilderTestProxyFactory {
interface BuilderTestProxy {
FudgeMsg proxy(final Class<?> clazz, FudgeMsg orig);
}
public BuilderTestProxy getProxy() {
String execPath = System.getProperty("com.opengamma.util.test.BuilderTestProxyFactory.ExecBuilderTestProxy.execPath");
if (execPath != null) {
return new ExecBuilderTestProxy(execPath);
}
return new NullBuilderTestProxy();
}
private static class NullBuilderTestProxy implements BuilderTestProxy {
@Override
public FudgeMsg proxy(final Class<?> clazz, FudgeMsg orig) {
return orig;
}
}
private static class ExecBuilderTestProxy implements BuilderTestProxy {
private static final Logger s_logger = LoggerFactory.getLogger(ExecBuilderTestProxy.class);
private final String _execPath;
public ExecBuilderTestProxy(String execPath) {
_execPath = execPath;
}
@Override
public FudgeMsg proxy(final Class<?> clazz, FudgeMsg orig) {
FudgeContext context = OpenGammaFudgeContext.getInstance();
LinkedList<String> command = new LinkedList<String>();
command.add(_execPath);
command.add(clazz.getName());
final ProcessBuilder processBuilder = new ProcessBuilder(command);
try {
final Process proc = processBuilder.start();
try {
try (FudgeMsgWriter fudgeMsgWriter = new FudgeMsgWriter(
new FudgeDataOutputStreamWriter(context, proc.getOutputStream()))) {
fudgeMsgWriter.writeMessage(orig);
fudgeMsgWriter.flush();
try (FudgeMsgReader fudgeMsgReader = new FudgeMsgReader(
new FudgeDataInputStreamReader(context, proc.getInputStream()))) {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(3);
Future<FudgeMsg> retMsgFuture = scheduledThreadPoolExecutor.submit(new Callable<FudgeMsg>() {
@Override
public FudgeMsg call() throws Exception {
return fudgeMsgReader.nextMessage();
}
});
Future<List<String>> errFuture = scheduledThreadPoolExecutor.submit(new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
InputStream errorStream = proc.getErrorStream();
try {
return IOUtils.readLines(errorStream);
} finally {
errorStream.close();
}
}
});
for (String err : errFuture.get()) {
s_logger.warn(err);
}
int ret = proc.waitFor();
if (ret != 0) {
throw new IOException("Exit code not expected: " + ret);
}
return retMsgFuture.get();
}
}
} finally {
proc.destroy();
}
} catch (Exception ex) {
throw new AssertionError(ex);
}
}
}
}