/*
* 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.xstream.converter;
import java.util.ArrayList;
import java.util.List;
import org.obiba.magma.ValueTable;
import org.obiba.magma.support.ValueTableReference;
import org.obiba.magma.views.JoinTable;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class JoinTableConverter implements Converter {
public static final JoinTableConverter INSTANCE = new JoinTableConverter();
@Override
public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
return JoinTable.class.isAssignableFrom(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
JoinTable joinTable = (JoinTable) source;
writer.startNode("list");
for(ValueTable vt : joinTable.getTables()) {
if(vt instanceof ValueTableReference) {
writer.startNode("table");
writer.addAttribute("inner", "" + joinTable.getInnerTableReferences().contains(vt.getTableReference()));
writer.addAttribute("class", ValueTableReference.class.getName());
context.convertAnother(vt);
writer.endNode();
} else {
throw new RuntimeException("Unexpected table type in JoinTable tables list: " + vt.getClass().getSimpleName());
}
}
writer.endNode();
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
reader.moveDown();
List<ValueTable> tables = new ArrayList<>();
List<String> innerTableReferences = new ArrayList<>();
while(reader.hasMoreChildren()) {
reader.moveDown();
String inner = reader.getAttribute("inner");
ValueTable vt = (ValueTable) context.convertAnother(context.currentObject(), ValueTableReference.class);
tables.add(vt);
if (inner != null && "true".equals(inner)) {
innerTableReferences.add(((ValueTableReference)vt).getReference());
}
reader.moveUp();
}
reader.moveUp();
return new JoinTable(tables, innerTableReferences,false);
}
}