I'd like to add a section to the documentation which captures this info, for
developers
who want to maintain or improve the RPC implementation. Is there a chapter
in our
existing docs that would be appropriate for this?

---------- Forwarded message ----------
From: Sebastian Wagner <[email protected]>
Date: Sat, Sep 5, 2009 at 1:53 PM
Subject: For Review: Change 20090905-sebastianwagner-d Summary: Migrate to
Gson as JSON Marshaller, Fix Circular Reference Exception more accurate
To: Henry Q Minsky <[email protected]>
Cc: [email protected]


Change 20090905-sebastianwagner-d by
[email protected] on 2009-09-05 19:32:56
CEST
    in
/Users/sebastianwagner/Documents/work/openlaszlo/branches/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: This Fixes: LPP-8437, LPP-8029
Extends Output of RPC with Gson as marshaller. This changeset adds a new
Factory Class to set a custom Json Marshaller
LZJsonFactory => to overwrite the default Json Handling you can call the
Method: LZJsonFactory.setJsonBuilderInstance(LZBaseJsonMarshallAdapter
instance)

There are two implementations of Json:
1) The existing, that I slightly refactored to fit into the Factory +
Adapter/Interface Pattern (LZJsonMarshaller)
2) The Gson Handling which is now the default one (LZGsonMarshaller)

To write your own Marshaller you have to use the pattern
public MyMarshaller extends LZBaseJsonMarshallAdapter implements
ILZJsonMarshaller {
    public synchronized byte[] createObject(Object object, String
objectReturnType) {}
}
and then set an instance of that Object with
LZJsonFactory.setJsonBuilderInstance(myMarshallerInstanceObject)

The LZGsonMarshaller has some default settings to make the JSon Output 100%
equal to the existing one.
To disable that you should call:
LZGsonMarshaller.applyLzDefaultGsonProperties = false;

To get the Gson Factory to set your custom marshalling options you have to:
GsonBuilder gsonBuilder = LZGsonMarshaller.getGsonBuilderInstance()
=> using the gsonBuilder you then can set any property that is documented
at:
http://sites.google.com/site/gson/gson-user-guide

By using Gson you can then also use annotations or other manipulations to
modify the JSon output.
See their user guide for full documentation of features.

If Gson detects a Circular Reference it will throw for example:
ava.lang.IllegalStateException: Circular reference found:
org.i4change.app.hibernate.beans.user.us...@2855f16e

        at
com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:108)

        at
com.google.gson.JsonSerializationVisitor.getJsonElementForChild(JsonSerializationVisitor.java:117)

        at
com.google.gson.JsonSerializationVisitor.addAsChildOfObject(JsonSerializationVisitor.java:95)

....

New Features:

Bugs Fixed: LPP-8437, Lpp-8029

Technical Reviewer: hqm
QA Reviewer: (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:


Tests:

Files:
A       WEB-INF/lib/gson-1.3.jar
A
WEB-INF/lps/server/src/org/openlaszlo/remote/json/LZBaseJsonMarshallAdapter.java
A
WEB-INF/lps/server/src/org/openlaszlo/remote/json/ILZJsonMarshaller.java
A
WEB-INF/lps/server/src/org/openlaszlo/remote/json/LZGsonMarshaller.java
A       WEB-INF/lps/server/src/org/openlaszlo/remote/json/LZJsonFactory.java
A
WEB-INF/lps/server/src/org/openlaszlo/remote/json/LZJsonMarshaller.java
M
WEB-INF/lps/server/src/org/openlaszlo/remote/json/LZReturnObject.java
M       WEB-INF/lps/server/src/org/openlaszlo/data/JavaDataSource.java

Changeset:
http://svn.openlaszlo.org/openlaszlo/patches/20090905-sebastianwagner-d.tar

-- 
Sebastian Wagner
http://www.webbase-design.de
http://openmeetings.googlecode.com
http://www.laszlo-forum.de
[email protected]



-- 
Henry Minsky
Software Architect
[email protected]

Reply via email to