/* * 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; import java.util.List; import javax.annotation.Nullable; import org.obiba.magma.ValueType; import org.obiba.magma.xstream.converter.AttributeConverter; import org.obiba.magma.xstream.converter.CategoryConverter; import org.obiba.magma.xstream.converter.JoinTableConverter; import org.obiba.magma.xstream.converter.ValueConverter; import org.obiba.magma.xstream.converter.ValueSequenceConverter; import org.obiba.magma.xstream.converter.ValueTableConverter; import org.obiba.magma.xstream.converter.VariableConverter; import org.obiba.magma.xstream.mapper.MagmaMapper; import com.google.common.collect.Lists; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.reflection.ReflectionProvider; import com.thoughtworks.xstream.mapper.MapperWrapper; public class DefaultXStreamFactory implements XStreamFactory { private final transient List<Converter> converters = Lists.newArrayList(); @Override public XStream createXStream() { return createXStream(null); } @Override @SuppressWarnings("PMD.NcssMethodCount") public XStream createXStream(@Nullable ReflectionProvider reflectionProvider) { XStream xstream = null; //noinspection IfMayBeConditional if(reflectionProvider == null) { xstream = new XStream() { @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MagmaMapper(next); } }; } else { xstream = new XStream(reflectionProvider) { @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MagmaMapper(next); } }; } xstream.registerConverter(new VariableConverter(xstream.getMapper())); xstream.registerConverter(new CategoryConverter(xstream.getMapper())); xstream.registerConverter(new AttributeConverter()); xstream.registerConverter(new ValueConverter()); xstream.registerConverter(new ValueSequenceConverter()); xstream.registerConverter(new ValueTableConverter()); xstream.registerConverter(new JoinTableConverter()); // Converters are prioritized in reverse order of their addition for(Converter converter : converters) { xstream.registerConverter(converter); } xstream.useAttributeFor(ValueType.class); xstream.setMode(XStream.NO_REFERENCES); xstream.processAnnotations(XStreamValueSet.class); xstream.processAnnotations(XStreamValueSetValue.class); return xstream; } @Override public void registerConverter(Converter converter) { converters.add(converter); } }