package gdsc.smlm.results.filter;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.XStreamException;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.io.xml.DomDriver;
/*-----------------------------------------------------------------------------
* GDSC SMLM Software
*
* Copyright (C) 2013 Alex Herbert
* Genome Damage and Stability Centre
* University of Sussex, UK
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*---------------------------------------------------------------------------*/
/**
* Wraps the XStream functionality for reading/writing package members as XML. Initialises XStream for tidy XML.
*/
public abstract class XStreamWrapper
{
@XStreamOmitField
private static XStream xs = null;
static
{
xs = new XStream(new DomDriver());
if (xs != null)
{
try
{
xs.autodetectAnnotations(true);
addAlias(FilterSet.class);
// Add aliases for all Filter classes
addAlias(AndFilter.class);
addAlias(ANRFilter.class);
addAlias(ANRFilter2.class);
addAlias(CombinedFilter.class);
addAlias(CoordinateFilter.class);
addAlias(DirectFilter.class);
addAlias(EShiftFilter.class);
addAlias(Filter.class);
addAlias(HysteresisFilter.class);
addAlias(MultiFilter.class);
addAlias(MultiFilter2.class);
addAlias(MultiHysteresisFilter.class);
addAlias(MultiHysteresisFilter2.class);
addAlias(MultiPathFilter.class);
addAlias(OrFilter.class);
addAlias(PrecisionFilter.class);
addAlias(PrecisionFilter2.class);
addAlias(PrecisionHysteresisFilter.class);
addAlias(PrecisionHysteresisFilter2.class);
addAlias(SBRFilter.class);
addAlias(ShiftFilter.class);
addAlias(SignalFilter.class);
addAlias(SNRFilter.class);
addAlias(SNRFilter2.class);
addAlias(SNRHysteresisFilter.class);
addAlias(TraceFilter.class);
addAlias(WidthFilter.class);
addAlias(WidthFilter2.class);
// Removed dependency on reflections since this has other jar dependencies
//Reflections reflections = new Reflections("gdsc.smlm.results.filter");
//Set<Class<? extends DirectFilter>> subTypes = reflections.getSubTypesOf(Filter.class);
//for (Class<? extends DirectFilter> type : subTypes)
// addAlias(type);
}
catch (XStreamException ex)
{
ex.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
/**
* Add a class name alias to the global XStream object used for serialisation.
* <p>
* Should be called to produce neater XML output for new sub-class types prior to using {@link #toXML(Object)} or
* {@link #fromXML(String)}.
*
* @param type
* The class
*/
public static void addAlias(Class<?> type)
{
if (xs != null)
xs.alias(type.getSimpleName(), type);
}
/**
* @return An XML representation of this object
*/
public static String toXML(Object object)
{
if (xs != null)
{
try
{
return xs.toXML(object);
}
catch (XStreamException ex)
{
ex.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
return "";
}
/**
* Create the filter from the XML representation
*
* @param xml
* @return the filter
*/
public static Object fromXML(String xml)
{
if (xs != null)
{
try
{
return xs.fromXML(xml);
}
catch (XStreamException ex)
{
ex.printStackTrace();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
return null;
}
/**
* @return An XStream object for reading/writing package members
*/
public static XStream getInstance()
{
return xs;
}
}