/* * Copyright (c) 2017 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.magma.datasource.fs; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Writer; import javax.validation.constraints.NotNull; import org.obiba.magma.Value; import org.obiba.magma.ValueTableWriter; import org.obiba.magma.Variable; import org.obiba.magma.VariableEntity; import org.obiba.magma.xstream.XStreamValueSet; import com.thoughtworks.xstream.XStream; class FsValueTableWriter implements ValueTableWriter { private final FsValueTable valueTable; private final XStream xstream; FsValueTableWriter(FsValueTable valueTable, XStream xstream) { this.valueTable = valueTable; this.xstream = xstream; } @NotNull @Override public ValueSetWriter writeValueSet(@NotNull VariableEntity entity) { String entry = valueTable.getVariableEntityProvider().addEntity(entity); try { return new XStreamValueSetWriter(valueTable.createWriter(entry), new XStreamValueSet(valueTable.getName(), entity)); } catch(IOException e) { throw new RuntimeException(e); } } @Override public VariableWriter writeVariables() { try { return new XStreamVariableWriter(valueTable.createWriter("variables.xml")); } catch(IOException e) { throw new RuntimeException(e); } } @Override public void close() { } private class XStreamVariableWriter implements VariableWriter { ObjectOutputStream oos; XStreamVariableWriter(Writer os) throws IOException { oos = xstream.createObjectOutputStream(os, "variables"); } @Override public void close() { try { oos.close(); } catch(IOException e) { throw new RuntimeException(e); } } @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "DMI_NONSERIALIZABLE_OBJECT_WRITTEN", justification = "XStream implementation of ObjectOutputStream does not expect or require objects to implement the Serializable marker interface. http://xstream.codehaus.org/faq.html#Serialization") @Override public void writeVariable(@NotNull Variable variable) { try { oos.writeObject(variable); } catch(IOException e) { throw new RuntimeException(e); } } @Override public void removeVariable(@NotNull Variable variable) { throw new UnsupportedOperationException("Variable cannot be removed from a XML file"); } } private class XStreamValueSetWriter implements ValueSetWriter { private final Writer os; private final XStreamValueSet valueSet; private XStreamValueSetWriter(Writer os, XStreamValueSet valueSet) throws IOException { this.os = os; this.valueSet = valueSet; } @Override public void close() { try { xstream.toXML(valueSet, os); } finally { try { os.close(); } catch(IOException ignored) { } } } @Override public void writeValue(@NotNull Variable variable, Value value) { valueSet.setValue(variable, value); } @Override public void remove() { throw new UnsupportedOperationException(); } } }