Skip to content

Commit

Permalink
workaround for #3334
Browse files Browse the repository at this point in the history
  • Loading branch information
hqnghi88 committed Apr 5, 2022
1 parent bd4f9aa commit 5463c67
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 26 deletions.
Expand Up @@ -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);
Expand Down
Expand Up @@ -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;
Expand All @@ -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<Class<?>, XStream> xStreamMap = Collections.synchronizedMap(new HashMap<Class<?>, 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);
}

/**
Expand All @@ -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;
}
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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;
}

Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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);
}

/**
Expand All @@ -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
Expand Down
Expand Up @@ -59,7 +59,7 @@ public boolean createFrom(final IScope scope, final List<Map<String, Object>> 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);
Expand Down
Expand Up @@ -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();
Expand Down

0 comments on commit 5463c67

Please sign in to comment.