/* XMLUtils.java created 2007-09-14
*
*/
package org.signalml.app.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.signalml.app.config.preset.PredefinedFiltersConfiguration;
import org.signalml.app.config.preset.managers.BookFilterPresetManager;
import org.signalml.app.config.preset.managers.FFTSampleFilterPresetManager;
import org.signalml.app.config.preset.managers.PredefinedTimeDomainFiltersPresetManager;
import org.signalml.app.config.preset.managers.SignalExportPresetManager;
import org.signalml.app.config.preset.managers.TimeDomainSampleFilterPresetManager;
import org.signalml.app.model.montage.MontagePresetManager;
import org.signalml.app.model.signal.SignalExportDescriptor;
import org.signalml.domain.book.filter.AbstractAtomFilter;
import org.signalml.domain.book.filter.AtomFilterChain;
import org.signalml.domain.book.filter.DelegatingAtomFilter;
import org.signalml.domain.book.filter.ParameterRangeAtomFilter;
import org.signalml.domain.book.filter.TagBasedAtomFilter;
import org.signalml.domain.montage.Montage;
import org.signalml.domain.montage.MontageChannel;
import org.signalml.domain.montage.MontageSampleFilter;
import org.signalml.domain.montage.SourceChannel;
import org.signalml.domain.montage.SourceMontage;
import org.signalml.domain.montage.filter.FFTSampleFilter;
import org.signalml.domain.montage.filter.SampleFilterDefinition;
import org.signalml.domain.montage.filter.TimeDomainSampleFilter;
import org.signalml.domain.montage.generators.RawMontageGenerator;
import org.signalml.domain.montage.system.ChannelFunction;
import org.signalml.util.Util;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.converters.reflection.FieldDictionary;
import com.thoughtworks.xstream.converters.reflection.NativeFieldKeySorter;
import com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
import com.thoughtworks.xstream.io.xml.DomDriver;
/** XMLUtils
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public abstract class XMLUtils {
public static XStream getDefaultStreamer() {
return new XStream(new PureJavaReflectionProvider(new FieldDictionary(new NativeFieldKeySorter())), new DomDriver("UTF-8"));
}
public static void configureStreamerForMontage(XStream streamer) {
Annotations.configureAliases(
streamer,
ChannelFunction.class,
MontagePresetManager.class,
SourceChannel.class,
MontageChannel.class,
SourceMontage.class,
Montage.class,
RawMontageGenerator.class,
MontageSampleFilter.class,
SampleFilterDefinition.class,
FFTSampleFilter.class,
TimeDomainSampleFilter.class
);
}
public static void configureStreamerForBookFilter(XStream streamer) {
Annotations.configureAliases(
streamer,
BookFilterPresetManager.class,
AtomFilterChain.class,
AbstractAtomFilter.class,
ParameterRangeAtomFilter.class,
TagBasedAtomFilter.class,
DelegatingAtomFilter.class
);
}
public static void configureStreamerForSignalExport(XStream streamer) {
Annotations.configureAliases(
streamer,
SignalExportPresetManager.class,
SignalExportDescriptor.class
);
}
public static void configureStreamerForFFTSampleFilter(XStream streamer) {
Annotations.configureAliases(
streamer,
FFTSampleFilterPresetManager.class,
FFTSampleFilter.class
);
}
/**
* Configures the given {@link XStream XStreamer} for {@link TimeDomainSampleFilter}
* streaming.
* @param streamer a streamer to be configured
*/
public static void configureStreamerForTimeDomainSampleFilter(XStream streamer) {
Annotations.configureAliases(
streamer,
TimeDomainSampleFilterPresetManager.class,
TimeDomainSampleFilter.class
);
}
/**
* Configures the given {@link XStream XStreamer} for
* {@link PredefinedTimeDomainFiltersPresetManager}.
* @param streamer a streamer to be configured
*/
public static void configureStreamerForPredefinedTimeDomainSampleFilter(XStream streamer) {
Annotations.configureAliases(
streamer,
PredefinedTimeDomainFiltersPresetManager.class,
PredefinedFiltersConfiguration.class,
TimeDomainSampleFilter.class
);
}
public static OutputStream getInitializedXMLOutputStream(File f) throws IOException {
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(f));
try {
writeXMLHeader(outputStream);
} catch (IOException ex) {
outputStream.close();
throw ex;
}
return outputStream;
}
public static InputStream getInitializedXMLInputStream(File f) throws IOException {
return new BufferedInputStream(new FileInputStream(f));
}
public static void objectToFile(Object o, File f, XStream streamer) throws IOException {
OutputStream outputStream = XMLUtils.getInitializedXMLOutputStream(f);
try {
streamer.toXML(o,outputStream);
} finally {
outputStream.close();
}
}
public static void objectFromFile(Object o, File f, XStream streamer) throws IOException {
InputStream inputStream = XMLUtils.getInitializedXMLInputStream(f);
try {
streamer.fromXML(inputStream,o);
} finally {
inputStream.close();
}
}
/**
* Reads an object from an input stream.
* @param o the read object (after calling this method, this object
* should be equal to the one read from the input stream)
* @param inputStream an input stream from which the object should be read.
* It is closed after all data is read.
* @param streamer the streamer which should be used to read the object
* @throws IOException if an I/O error occurs while closing the input stream
*/
public static void objectFromInputStream(Object o, InputStream inputStream, XStream streamer) throws IOException {
try {
streamer.fromXML(inputStream, o);
} finally {
inputStream.close();
}
}
public static Object newObjectFromFile(File f, XStream streamer) throws IOException {
InputStream inputStream = XMLUtils.getInitializedXMLInputStream(f);
try {
return streamer.fromXML(inputStream);
} finally {
inputStream.close();
}
}
/**
* Writes a standard XML header to the given output stream.
* @param outputStream the stream to which the XML header will be written
* @throws IOException thrown if an IO error occurs
*/
public static void writeXMLHeader(OutputStream outputStream) throws IOException {
outputStream.write(("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+Util.LINE_SEP).getBytes());
}
}