Add serilaize()/deserialize() support to ScriptingEngine to allow engines

to take care of serialization of scriptable objects.
This commit is contained in:
hns 2005-03-16 17:28:27 +00:00
parent 301d589fae
commit e51725aba0
2 changed files with 66 additions and 3 deletions

View file

@ -19,7 +19,10 @@ package helma.scripting;
import helma.framework.IPathElement; import helma.framework.IPathElement;
import helma.framework.core.Application; import helma.framework.core.Application;
import helma.framework.core.RequestEvaluator; import helma.framework.core.RequestEvaluator;
import java.util.*; import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
/** /**
* This is the interface that must be implemented to make a scripting environment * This is the interface that must be implemented to make a scripting environment
@ -116,4 +119,26 @@ public interface ScriptingEngine {
* class should be compatible with helma.doc.DocApplication. * class should be compatible with helma.doc.DocApplication.
*/ */
public IPathElement getIntrospector(); public IPathElement getIntrospector();
/**
* Provide object serialization for this engine's scripted objects. If no special
* provisions are required, this method should just wrap the stream with an
* ObjectOutputStream and write the object.
*
* @param obj the object to serialize
* @param out the stream to write to
* @throws IOException
*/
public void serialize(Object obj, OutputStream out) throws IOException;
/**
* Provide object deserialization for this engine's scripted objects. If no special
* provisions are required, this method should just wrap the stream with an
* ObjectIntputStream and read the object.
*
* @param in the stream to read from
* @return the deserialized object
* @throws IOException
*/
public Object deserialize(InputStream in) throws IOException, ClassNotFoundException;
} }

View file

@ -28,10 +28,11 @@ import helma.objectmodel.db.Relation;
import helma.scripting.*; import helma.scripting.*;
import helma.scripting.rhino.debug.Tracer; import helma.scripting.rhino.debug.Tracer;
import org.mozilla.javascript.*; import org.mozilla.javascript.*;
import org.mozilla.javascript.serialize.ScriptableOutputStream;
import org.mozilla.javascript.serialize.ScriptableInputStream;
import java.util.*; import java.util.*;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
@ -450,6 +451,43 @@ public class RhinoEngine implements ScriptingEngine {
return doc; return doc;
} }
/**
* Provide object serialization for this engine's scripted objects. If no special
* provisions are required, this method should just wrap the stream with an
* ObjectOutputStream and write the object.
*
* @param obj the object to serialize
* @param out the stream to write to
* @throws java.io.IOException
*/
public void serialize(Object obj, OutputStream out) throws IOException {
// use a special ScriptableOutputStream that unwraps Wrappers
ScriptableOutputStream sout = new ScriptableOutputStream(out, core.global) {
protected Object replaceObject(Object obj) throws IOException {
if (obj instanceof Wrapper)
obj = ((Wrapper) obj).unwrap();
return super.replaceObject(obj);
}
};
sout.writeObject(obj);
sout.flush();
}
/**
* Provide object deserialization for this engine's scripted objects. If no special
* provisions are required, this method should just wrap the stream with an
* ObjectIntputStream and read the object.
*
* @param in the stream to read from
* @return the deserialized object
* @throws java.io.IOException
*/
public Object deserialize(InputStream in) throws IOException, ClassNotFoundException {
ObjectInputStream sin = new ScriptableInputStream(in, core.global);
Object deserialized = sin.readObject();
return Context.toObject(deserialized, core.global);
}
/** /**
* Return the application we're running in * Return the application we're running in
*/ */