/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.regression; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import javax.xml.stream.XMLStreamWriter; import net.sf.saxon.s9api.Processor; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.fudgemsg.wire.FudgeMsgReader; import org.fudgemsg.wire.FudgeMsgWriter; import org.fudgemsg.wire.xml.FudgeXMLStreamReader; import org.fudgemsg.wire.xml.FudgeXMLStreamWriter; import com.google.common.base.Throwables; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.xml.FormattingXmlStreamWriter; /** * */ public class GoldenCopyPersistenceHelper { /** * Relative path to golden copy dir */ private static final FudgeContext FUDGE_CONTEXT = OpenGammaFudgeContext.getInstance(); private static final String GOLDEN_COPY_SUBDIR = "golden_copy"; private final File _goldenCopyDir; /** * Create a persistence helper, specifying the root of the regression dir. * @param regressionDir the root of the regression directory. (i.e. the one * holding the dbdump and golden_copy directories). */ public GoldenCopyPersistenceHelper(File regressionDir) { _goldenCopyDir = new File(regressionDir, GOLDEN_COPY_SUBDIR); } public GoldenCopy load(String viewName, String snapshotName) { String name = buildFilename(viewName, snapshotName); try (FileReader reader = new FileReader(new File(_goldenCopyDir, name)); FudgeMsgReader fudgeMessageReader = new FudgeMsgReader(new FudgeXMLStreamReader(FUDGE_CONTEXT, reader));) { FudgeMsg nextMessage = fudgeMessageReader.nextMessage(); FudgeDeserializer deser = new FudgeDeserializer(FUDGE_CONTEXT); return deser.fudgeMsgToObject(GoldenCopy.class, nextMessage); } catch (Exception ex) { throw Throwables.propagate(ex); } } public void save(GoldenCopy goldenCopy) { FudgeSerializer serializer = new FudgeSerializer(FUDGE_CONTEXT); String viewName = goldenCopy.getViewName(); String snapshotName = goldenCopy.getSnapshotName(); String name = buildFilename(viewName, snapshotName); Processor p = new Processor(false); if (!_goldenCopyDir.exists()) { boolean createdDirOk = _goldenCopyDir.mkdirs(); if (!createdDirOk) { throw new IllegalStateException("Unable to create dir: " + _goldenCopyDir); } } try (FileWriter writer = new FileWriter(new File(_goldenCopyDir, name)); FudgeMsgWriter fudgeMsgWriter = createMsgWriter(p, writer); ) { MutableFudgeMsg msg = serializer.objectToFudgeMsg(goldenCopy); fudgeMsgWriter.writeMessage(msg); writer.append("\n"); fudgeMsgWriter.flush(); } catch (Exception ex) { throw Throwables.propagate(ex); } } private FudgeMsgWriter createMsgWriter(Processor p, FileWriter writer) { XMLStreamWriter xmlStreamWriter = FormattingXmlStreamWriter.builder(writer) .indent(true) .build(); FudgeXMLStreamWriter streamWriter = new FudgeXMLStreamWriter(FUDGE_CONTEXT, xmlStreamWriter); FudgeMsgWriter fudgeMsgWriter = new FudgeMsgWriter(streamWriter); return fudgeMsgWriter; } private String buildFilename(String viewName, String snapshotName) { String name = viewName + "." + snapshotName + ".xml"; return name; } }