/*****************************************************************************
* Limpet - the Lightweight InforMation ProcEssing Toolkit
* http://limpet.info
*
* (C) 2015-2016, Deep Blue C Technologies Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html)
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*****************************************************************************/
package info.limpet.data.persistence.xml;
import info.limpet.IStore;
import info.limpet.data.commands.AbstractCommand;
import info.limpet.data.impl.ObjectCollection;
import info.limpet.data.impl.QuantityCollection;
import info.limpet.data.impl.TemporalObjectCollection;
import info.limpet.data.impl.TemporalQuantityCollection;
import info.limpet.data.operations.arithmetic.AddQuantityOperation.AddQuantityValues;
import info.limpet.data.operations.arithmetic.MultiplyQuantityOperation.MultiplyQuantityValues;
import info.limpet.data.store.StoreGroup;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import javax.measure.converter.MultiplyConverter;
import javax.measure.unit.AlternateUnit;
import javax.measure.unit.BaseUnit;
import javax.measure.unit.ProductUnit;
import javax.measure.unit.TransformedUnit;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import com.thoughtworks.xstream.XStream;
public class XStreamHandler
{
private static final XStream XSTREAM;
static
{
XSTREAM = new XStream();
XSTREAM.alias("store", StoreGroup.class);
XSTREAM.alias("TransformedUnit", TransformedUnit.class);
XSTREAM.alias("ProductUnit", ProductUnit.class);
XSTREAM.alias("AlternateUnit", AlternateUnit.class);
XSTREAM.alias("MultiplyConverter", MultiplyConverter.class);
XSTREAM.alias("BaseUnit", BaseUnit.class);
XSTREAM.alias("Temporal.Speed_MSec",
info.limpet.data.impl.samples.StockTypes.Temporal.SpeedMSec.class);
XSTREAM.alias("Temporal.Angle_Degs",
info.limpet.data.impl.samples.StockTypes.Temporal.AngleDegrees.class);
XSTREAM.alias("Temporal.Angle_Rads",
info.limpet.data.impl.samples.StockTypes.Temporal.AngleRadians.class);
XSTREAM.alias("Temporal.Elapsed_Time",
info.limpet.data.impl.samples.StockTypes.Temporal.ElapsedTimeSec.class);
XSTREAM.alias("Temporal.Location",
info.limpet.data.impl.samples.TemporalLocation.class);
XSTREAM.alias("NonTemporal.Length_m",
info.limpet.data.impl.samples.StockTypes.NonTemporal.LengthM.class);
XSTREAM.alias("NonTemporal.Speed_msec",
info.limpet.data.impl.samples.StockTypes.NonTemporal.SpeedMSec.class);
XSTREAM.alias("ObjectCollection", ObjectCollection.class);
XSTREAM.alias("TemporalObjectCollection", TemporalObjectCollection.class);
XSTREAM.alias("QuantityCollection", QuantityCollection.class);
XSTREAM.alias("TemporalQuantityCollection",
TemporalQuantityCollection.class);
XSTREAM.alias("Folder", StoreGroup.class);
// tidier names for operations
XSTREAM.alias("AddQuantityValues", AddQuantityValues.class);
XSTREAM.alias("MultiplyQuantityValues", MultiplyQuantityValues.class);
// TODO: KUMAR: create equivalent alias operations (as above) for other defined operations
// and force some objects to be represnted as attributes, rather than child objects
XSTREAM.useAttributeFor(ObjectCollection.class, "name");
XSTREAM.useAttributeFor(AbstractCommand.class, "title");
XSTREAM.useAttributeFor(AbstractCommand.class, "canUndo");
XSTREAM.useAttributeFor(AbstractCommand.class, "canRedo");
XSTREAM.useAttributeFor(AbstractCommand.class, "dynamic");
// setup converter
XSTREAM.registerConverter(
new LimpetCollectionConverter(XSTREAM.getMapper()),
XStream.PRIORITY_NORMAL);
XSTREAM.registerConverter(
new TimesCollectionConverter(XSTREAM.getMapper()),
XStream.PRIORITY_NORMAL);
XSTREAM.registerConverter(new PointConverter(), XStream.PRIORITY_NORMAL);
XSTREAM.setMode(XStream.ID_REFERENCES);
}
public IStore load(String fileName)
{
IStore store = (IStore) XSTREAM.fromXML(new File(fileName));
return store;
}
public void save(IStore store, String fileName) throws FileNotFoundException,
IOException
{
save(store, new File(fileName));
}
private void save(IStore store, File file) throws FileNotFoundException,
IOException
{
try (OutputStream out = new FileOutputStream(file))
{
XSTREAM.toXML(store, out);
}
}
public IStore load(IFile iFile) throws CoreException
{
File file = getFile(iFile);
IStore store = (IStore) XSTREAM.fromXML(file);
return store;
}
private File getFile(IFile iFile) throws CoreException
{
URI uri = iFile.getLocationURI();
if (iFile.isLinked())
{
uri = iFile.getRawLocationURI();
}
File file = EFS.getStore(uri).toLocalFile(0, new NullProgressMonitor());
return file;
}
public void save(IStore store, IFile iFile) throws CoreException,
FileNotFoundException, IOException
{
File file = getFile(iFile);
save(store, file);
}
public IStore fromXML(String xml)
{
return (IStore) XSTREAM.fromXML(xml);
}
public String toXML(IStore store)
{
return XSTREAM.toXML(store);
}
}