diff --git a/ummisco.gama.serialize/src/ummisco/gama/serializer/experiment/ExperimentBackwardAgent.java b/ummisco.gama.serialize/src/ummisco/gama/serializer/experiment/ExperimentBackwardAgent.java index 03368f0a10..e13a69ad56 100644 --- a/ummisco.gama.serialize/src/ummisco/gama/serializer/experiment/ExperimentBackwardAgent.java +++ b/ummisco.gama.serialize/src/ummisco/gama/serializer/experiment/ExperimentBackwardAgent.java @@ -99,7 +99,7 @@ public boolean backward(final IScope scope) { if (previousState != null) { final ConverterScope cScope = new ConverterScope(scope); - final XStream xstream = StreamConverter.loadAndBuild(cScope); + final XStream xstream = StreamConverter.loadAndBuild(cScope,cScope.getClass()); // get the previous state final SavedAgent agt = (SavedAgent) xstream.fromXML(previousState); diff --git a/ummisco.gama.serialize/src/ummisco/gama/serializer/factory/StreamConverter.java b/ummisco.gama.serialize/src/ummisco/gama/serializer/factory/StreamConverter.java index 06f207236c..4a157053ab 100644 --- a/ummisco.gama.serialize/src/ummisco/gama/serializer/factory/StreamConverter.java +++ b/ummisco.gama.serialize/src/ummisco/gama/serializer/factory/StreamConverter.java @@ -10,6 +10,10 @@ ********************************************************************************************************/ package ummisco.gama.serializer.factory; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.io.xml.DomDriver; @@ -25,24 +29,51 @@ public abstract class StreamConverter { /** The streamer. */ - static XStream streamer; +// static XStream streamer; +// +// static { +// streamer = new XStream(new DomDriver()); +// streamer.addPermission(AnyTypePermission.ANY); +// streamer.setClassLoader(GamaClassLoader.getInstance()); +// } + private static Map, XStream> xStreamMap = Collections.synchronizedMap(new HashMap, XStream>()); + + private static XStream getXStreamInstance(Class clazz) { + if (xStreamMap.containsKey(clazz)) { + return xStreamMap.get(clazz); + } + synchronized (clazz) { + if (xStreamMap.containsKey(clazz)) { + return xStreamMap.get(clazz); + } + XStream xStream = new XStream(new DomDriver()); + xStream.ignoreUnknownElements(); + xStream.processAnnotations(clazz); + xStream.addPermission(AnyTypePermission.ANY); + xStream.setClassLoader(GamaClassLoader.getInstance()); + xStreamMap.put(clazz, xStream); + return xStream; + } + } + + public static Object fromXML(String xml, final Class type) { + return getXStreamInstance(type).fromXML(xml); + + } + + public static String toXml(Object obj) { + return getXStreamInstance(obj.getClass()).toXML(obj); - static { - streamer = new XStream(new DomDriver()); - streamer.addPermission(AnyTypePermission.ANY); - streamer.setClassLoader(GamaClassLoader.getInstance()); } /** * Register converter. * - * @param dataStreamer - * the data streamer - * @param c - * the c + * @param dataStreamer the data streamer + * @param c the c */ - public static void registerConverter(final Converter c) { - streamer.registerConverter(c); + public static void registerConverter(final XStream st,final Converter c) { + st.registerConverter(c); } /** @@ -52,10 +83,11 @@ public static void registerConverter(final Converter c) { * the cs * @return the x stream */ - public static XStream loadAndBuild(final ConverterScope cs) { + public static XStream loadAndBuild(final ConverterScope cs, final Object o) { final Converter[] cnv = Converters.converterFactory(cs); - for (final Converter c : cnv) { StreamConverter.registerConverter(c); } + XStream streamer=getXStreamInstance(o.getClass()); + for (final Converter c : cnv) { StreamConverter.registerConverter(streamer,c); } // dataStreamer.setMode(XStream.ID_REFERENCES); return streamer; } @@ -70,7 +102,7 @@ public static XStream loadAndBuild(final ConverterScope cs) { * @return the string */ public static synchronized String convertObjectToStream(final IScope scope, final Object o) { - return loadAndBuild(new ConverterScope(scope)).toXML(o); + return loadAndBuild(new ConverterScope(scope),o).toXML(o); } /** @@ -83,7 +115,7 @@ public static synchronized String convertObjectToStream(final IScope scope, fina * @return the string */ public static synchronized String convertObjectToStream(final ConverterScope scope, final Object o) { - return loadAndBuild(scope).toXML(o); + return loadAndBuild(scope,o).toXML(o); } /** @@ -96,7 +128,7 @@ public static synchronized String convertObjectToStream(final ConverterScope sco * @return the object */ public static Object convertStreamToObject(final IScope scope, final String data) { - return loadAndBuild(new ConverterScope(scope)).fromXML(data); + return loadAndBuild(new ConverterScope(scope),String.class).fromXML(data); } /** @@ -109,7 +141,7 @@ public static Object convertStreamToObject(final IScope scope, final String data * @return the object */ public static Object convertStreamToObject(final ConverterScope scope, final String data) { - return loadAndBuild(scope).fromXML(data); + return loadAndBuild(scope,String.class).fromXML(data); } /** @@ -120,10 +152,11 @@ public static Object convertStreamToObject(final ConverterScope scope, final Str * @return the x stream */ // TODO To remove when possible - public static XStream loadAndBuildNetwork(final ConverterScope cs) { + public static XStream loadAndBuildNetwork(final ConverterScope cs, final Object o) { + XStream streamer=getXStreamInstance(o.getClass()); final Converter[] cnv = Converters.converterNetworkFactory(cs); - for (final Converter c : cnv) { StreamConverter.registerConverter(c); } + for (final Converter c : cnv) { StreamConverter.registerConverter(streamer,c); } return streamer; } @@ -137,7 +170,7 @@ public static XStream loadAndBuildNetwork(final ConverterScope cs) { * @return the string */ public static synchronized String convertNetworkObjectToStream(final ConverterScope scope, final Object o) { - return loadAndBuildNetwork(scope).toXML(o); + return loadAndBuildNetwork(scope,o).toXML(o); } /** @@ -150,7 +183,7 @@ public static synchronized String convertNetworkObjectToStream(final ConverterSc * @return the string */ public static synchronized String convertNetworkObjectToStream(final IScope scope, final Object o) { - return loadAndBuildNetwork(new ConverterScope(scope)).toXML(o); + return loadAndBuildNetwork(new ConverterScope(scope),o).toXML(o); } /** @@ -163,7 +196,7 @@ public static synchronized String convertNetworkObjectToStream(final IScope scop * @return the object */ public static Object convertNetworkStreamToObject(final ConverterScope scope, final String data) { - return loadAndBuildNetwork(scope).fromXML(data); + return loadAndBuildNetwork(scope,String.class).fromXML(data); } /** @@ -176,7 +209,7 @@ public static Object convertNetworkStreamToObject(final ConverterScope scope, fi * @return the object */ public static Object convertNetworkStreamToObject(final IScope scope, final String data) { - return loadAndBuildNetwork(new ConverterScope(scope)).fromXML(data); + return loadAndBuildNetwork(new ConverterScope(scope),String.class).fromXML(data); } // END TODO diff --git a/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/CreateFromSavedSimulationDelegate.java b/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/CreateFromSavedSimulationDelegate.java index 99951dad37..5ad359eefd 100644 --- a/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/CreateFromSavedSimulationDelegate.java +++ b/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/CreateFromSavedSimulationDelegate.java @@ -59,7 +59,7 @@ public boolean createFrom(final IScope scope, final List> in final GamaSavedSimulationFile file = (GamaSavedSimulationFile) source; final ConverterScope cScope = new ConverterScope(scope); - final XStream xstream = StreamConverter.loadAndBuild(cScope); + final XStream xstream = StreamConverter.loadAndBuild(cScope,cScope.getClass()); String stringFile = file.getBuffer().get(0); final SavedAgent saveAgt = (SavedAgent) xstream.fromXML(stringFile); diff --git a/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/ReverseOperators.java b/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/ReverseOperators.java index c59a0d5631..3e1ba6f01a 100644 --- a/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/ReverseOperators.java +++ b/ummisco.gama.serialize/src/ummisco/gama/serializer/gaml/ReverseOperators.java @@ -126,7 +126,7 @@ public static int unSerializeSimulationFromFile(final IScope scope, final GamaSa @no_test public static int unSerializeSimulationFromXML(final IScope scope, final String simul) { final ConverterScope cScope = new ConverterScope(scope); - final XStream xstream = StreamConverter.loadAndBuild(cScope); + final XStream xstream = StreamConverter.loadAndBuild(cScope,cScope.getClass()); final SavedAgent saveAgt = (SavedAgent) xstream.fromXML(simul); final ExperimentAgent expAgt = (ExperimentAgent) scope.getExperiment();