wiki:MapGuideRfc25

MapGuide RFC 25 - Support for JSON response format

This page contains a change request (RFC) for the MapGuide Open Source project. More MapGuide RFCs can be found on the RFCs page.

Status

RFC Template Version(1.0)
Submission DateJuly 3, 2007
Last ModifiedRex Szeto Timestamp?
AuthorJason Chen
RFC Statusadopted
Implementation StatusCompleted
Proposed Milestone2.0
Assigned PSC guide(s)(when determined)
Voting HistoryJuly 3, 2007
+1Jason, Paul, Andy, Bruce, Tom, Haris
+0
-0
-1

Overview

JSON (http://www.json.org) will be used to provide a lightweight data-interchange format between the web tier and any clients for requests that can currently return XML responses.

Motivation

The Fusion framework uses JSON in order to keep client side code simple (it much easier to work with than XML) and JSON is a more compact format so communication over the wire is more efficient.

Currently Fusion uses a web tier PHP script to convert the XML responses to JSON, but this is inefficient so we will move the generation of JSON into the server. This should further speed up the generation of the JSON, and where required we can eliminate the intermediate XML form.

Proposed Solution

The solution involves adding an extra "format" parameter to the selected API invocations from the Web-tier to the Server. The "format" can be either "text/xml" or "application/json". If no parameter is specified at the Web-tier, the "format" will default to "text/xml". Due to performance considerations, two additional APIs (i.e. DescribeSchemaAsJson and GetFdoCacheInfoAsJson?) have been added to handle the special cases.


An additional OEM component has been added to the source -- jsoncpp. Jsoncpp is a C++ implementation of the JSON specification (http://sourceforge.net/projects/jsoncpp/).


Two additional classes have been added to assist the JSON implementation in MapGuide:

1) The MgJsonDoc Class

  • MgJsonDoc is a wrapper over the jsoncpp implementation. MgJsonDoc provides many easy-to-use interfaces, such as Begin* and End*, for creating JSON documents from an XML perspective. For example, to create a JSON document for the corresponding XML content, <Node>Text</Node>, one would call BeginObject("Node"), SetValue("Text"), and EndObject() subsequently.

2) The MgXmlJsonConvert Class

  • MgXmlJsonConvert converts an XML document into a JSON formatted document.

The following Web-tier to Server APIs are affected:

Coordinate System

# EnumerateCategories (1)
# EnumerateCoordinateSystems (1)

Resource

# EnumerateResourceReferences (3)
# EnumerateResources (3)
# GetResourceContent (3)
# GetResourceHeader (3)
# EnumerateResourceData (3)
# GetResourceData (3)
# EnumerateUnmanagedData (3)

Feature

# GetFeatureProviders (3)
# GetCapabilities (3)
# GetConnectPropertyValues (1)
# DescribeSchema (4)
# SelectFeatures (2)
# SelectAggregates (1)
# GetSpatialContexts (1)
# GetLongTransactions (1)
# EnumerateDataStores (3)
# GetSchemaMapping (3)
# GetSchemas (1)
# GetClasses (1)
# GetClassDefinition (2)
# GetIdentityProperties (1)
# ExecuteSqlQuery (1)
# GetFdoCacheInfo (4)

Rendering

# GetVisibleMapExtent (1)

where the appended labeling indicates the different implementation schemes:

(1) Web-tier changes -- ToJson functions are introduced to compose the JSON document in place; that is, most of the ToXml implementation is matched with a ToJson implementation.

(2) Web-tier changes -- utilizes the MgXmlJsonConvert class to convert XML documents to JSON documents.

(3) Server changes -- an extra parameter "CREFSTRING format" has been added to the respective API calls; the MgXmlJsonConvert class is used if format is equaled to the JSON MIME type (i.e. "application/json").

(4) Server changes -- extra APIs have been added to handle JSON requests (e.g. DescribeSchemaAsXml has DescribeSchemaAsJson as the JSON version, and GetFDOCacheInfo has GetFDOCacheInfoAsJson as its JSON implementation). This is because the original APIs return "STRING" and could not be efficiently adapted by the conversion process within the MgXmlJsonConvert class implementation. For the affected APIs, the MgByteReader* is returned instead.

Implications

The major changes involve differing API signatures (i.e. some functions take an extra parameter "format"). Any API invocation made to the Server will be affected. However, API calls made to the Web-tier will behave the same if the format parameter is not specified (i.e. it defaults to the "text/xml" format). Documentation should be updated to indicate that the above APIs now take an extra parameter, "format".

Test Plan

The following tests should be performed:

  • Coordinate System unit tests
  • Resource Service unit tests
  • Feature Service unit tests
  • Rendering Service unit tests
  • Other unit tests
  • Affected APIs on the HTML test pages

The following APIs have not been tested:

Resource

# GetResourceData

Feature

# GetLongTransactions
# EnumerateDataStores
# GetSchemaMapping
# ExecuteSqlQuery

Rendering

# GetVisibleMapExtent

Funding/Resources?

Supplied by Autodesk.

Last modified 10 years ago Last modified on Sep 18, 2007 12:58:03 PM