cocoon-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andre Juffer <ajuf...@cc.oulu.fi>
Subject Re: Cocoon3, JSON, Spring
Date Sun, 11 Sep 2011 13:03:21 GMT
Hi Thorsten,

I did do some work on a TextSerializer and a JsonSerializer. I got it 
all working now.

I looked at the EncodingXHTMLSerializer as a starting point. I should 
note that I basically know nothing about the internal organization of 
cocoon 3, and this makes it really hard for an outsider to contribute, 
as it is rather unclear where to start. Sorry to say but the 
documentation in the various AIPs is really terrible. The organization 
of the classes explained below may be incorrect.

I made a EncodingTextSerializer->TextSerializer->XMLSerializer (the 
arrow means 'extend'). Both TextSerializer and XMLSerializer are in the 
package org.apache.cocoon.components.serializers.util. (Note: The 
XMLSerializer was already available, it is not mine). The 
EncodingTextSerializer is part of 
org.apache.cocoon.optional.servlet.components.sax.serializers
The TextSerializer is based upon one I found in the cocoon 2 base code, 
but had to be augmented to implement the ContentHandler and other 
interfaces.

Similarly, I made EncodingJsonSerializer->JsonSerializer->TextSerializer.

The JsonSerializer checks whether the JSON text is actually valid JSON 
(using org.json.JSONObject, see http://www.json.org/), and throws a 
SAXException if this is not the case.

The EncodingJsonSerializer is in 
org.apache.cocoon.optional.servlet.components.sax.serializers, while the 
JsonSerializer is in org.apache.cocoon.components.serializers.util.

Both encoding classes implement SAXPipelineComponent, Finisher, 
SAXConsumer, CachingPipelineComponent so that both encoding serializers 
can be used in a pipeline.

(NOTE: there appears to be 2-3 different XMLSerializers in use for 
cocoon 3? E.g. The FopSerializer derives from another XMLSerializer. It 
should be quite possible to use the same XMLSerializer for all serializers.)

Using an encoding serializer requires an alternative encoder for the 
TextSerializer, so I made a TextEncoder->XMLEncoder for use by the 
TextSerializer. Both TextEncoder and XMLEncoder are in 
org.apache.cocoon.components.serializers.encoding (the XMLEncoder 
already exists, it is not mine). The TextEncoder does not encode 
anything. It just returns the original character. There is no separate 
JsonEncoder.

Basically, this all works with the simple test files I made. It is easy 
to test this outside of cocoon, by creating an XMLReader and setting the 
ContentHandler as being any of the above serializers and parse some XML 
representing text or JSON (both must be enclosed by a single element).

I also incorporated this into cocoon 3 and made some simple pipelines to 
see if the two encoding serializers work as they should. For this, I 
created two beans defined as serializer:text and serializer:json. 
Basically everything seems to work just fine.

(I use a Java-based RESTClient at http://code.google.com/p/rest-client/ 
to see the response by cocoon 3. Very nice tool.)

I have attached the various classes to this email. Any comment by you 
and others are certainly welcome. If you think that attached code is 
actually useful for cocoon 3, I would be pleased if somebody would 
commit the code.

One final comment, IMHO the packages 
org.apache.cocoon.components.serializers.util and 
org.apache.cocoon.components.serializers.encoding should be transferred 
to cocoon 3 and probably should become part of cocoon-optional. The 
spring configuration in these packages are still based on Spring 2, 
while cocoon 3 uses Spring 3.

Thanks,
André



On 09/02/2011 02:31 PM, Andre Juffer wrote:
> On 02/09/11 13:45, Thorsten Scherler wrote:
>> On Fri, 2011-09-02 at 09:58 +0300, Andre Juffer wrote:
>>> On 09/02/2011 02:46 AM, Thorsten Scherler wrote:
>>>> Hi Andre,
>>>>
>>>> sorry for top posting but I am responding from my mobile device.
>>>>
>>>> Regarding 1) the org.apache.cocoon.serialization.TextSerializer
>>>> migration into c3 is ASAIK not yet done. However that should be
>>>> pretty straight forward to implement.
>>> Yes, I was already thinking that I could do this.
>> Contributions are always welcome. ;)
>>
>> If you or somebody else will do the migration please open an issue in
>> https://issues.apache.org/jira/browse/COCOON3 and attach the diff. We
>> will apply it ASAP.
>
> OK, I do my best to get it done.
>
>
>>
>>>> Actually I did lately work with the RESTController of c3 since the
>>>> JAX-RS integration was not needed for my use cases. If you choose
>>>> the c3 REST way you can use the TextResponse [1] to return your json
>>>> objects to the client. In the same package you will as well find a
>>>> BinaryResponse [2] which you can use to return binary data like
>>>> images from your rest services.
>>> The TextResponse is a good alternative, and I will certainly look into
>>> it. It is apparently not yet part of the current alpha Cocoon
>>> 3.0.0-alpha-3 that I downloaded from the cocoon website.
>> No you would need the HEAD or the latest beta snapshot.
>>
>>>> I just commited an example [3] of an asyncron processing with REST
>>>> you may want to look into. It is based on jquery on the client side
>>>> but you will get the idea. If you look at [4] you will see the basic
>>>> background. The block provides a workig example when starting with
>>>> "mvn install jetty:run" and browse to localhost:8888/,
>>> Great!
>> Actually I am still thinking on implementing comet
>> http://en.wikipedia.org/wiki/Comet_(programming) Actually long polling
>> should not to be too complicate to be implemented with our REST
>> framework (hopefully I will find some play time for implementing
>> that). ;)
>>
>> However html5 will open some new approaches to the comet technique where
>> Server-sent events and websockets come into play, but I think there we
>> need to make some changes to our controller.
>>
>> Somebody had worked with streaming message in cocoon yet?
>>
>>>> Regarding the bean lookup, why not using autowiring in your
>>>> components (more when you use the REST part)? See [5].
>>> Yes, that would do it.
>>>
>>> Thanks for your valuable response.
>> you are welcome. I am glad if it helps you.
>>
>> salu2
>>
>>> André
>>>
>>>> HTH
>>>>
>>>> [1]
>>>> http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/TextResponse.java
>>>>
>>>> [2]
>>>> http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest/src/main/java/org/apache/cocoon/rest/controller/response/BinaryResponse.java
>>>>
>>>> [3]
>>>> http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-rest-optional/
>>>> [4] https://issues.apache.org/jira/browse/COCOON3-75
>>>> [5]
>>>> http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sample/src/main/java/org/apache/cocoon/sample/controller/DemoRESTController.java?view=markup
>>>>
>>>>
>>>> Thorsten Scherler<thorsten.at.apache.org>
>>>> codeBusters S.L. - web based systems<consulting, training and
>>>> solutions>
>>>> http://www.codebusters.es
>>>>
>>>> Andre Juffer<ajuffer@cc.oulu.fi> wrote:
>>>>
>>>>> Hi All,
>>>>>
>>>>> I have two questions:
>>>>>
>>>>> (1)
>>>>> I want to be to be able to return JSON to the client, typically a
>>>>> browser. The client is responsible to properly present the response to
>>>>> the user, typically with the Dojotoolkit. As I would like to move to
>>>>> cocoon3, I was looking for a JsonSerializer or a simple
>>>>> TextSerializer.
>>>>>
>>>>> With cocoon 2.2, one can simply use the TextSerializer to return JSON,
>>>>> by defining
>>>>>
>>>>> <map:serializer name="json" mime-type="application/json;
>>>>> charset=UTF-8"
>>>>> src="org.apache.cocoon.serialization.TextSerializer">
>>>>> <encoding>UTF-8</encoding>
>>>>> </map:serializer>
>>>>>
>>>>> Cocoon 3 apparently is restricted to only return XML/HTML [1], as
>>>>> far as
>>>>> I can see. I did not find in the API any mentioning of other types of
>>>>> serializers, besides XMLSerializer and FopSerializer.
>>>>>
>>>>> If so, this would be a limitation. Especially for designing RIAs [2]
>>>>> (like Twitter), it would be very useful to be able to return JSON.
>>>>>
>>>>> So, is there a particular way to return JSON or Text.
>>>>>
>>>>>
>>>>> (2)
>>>>> With flowscript in cocoon 2.2, it was very easy to instantiate a Java
>>>>> bean defined in some appropriate Spring bean configuration file, like
>>>>>
>>>>> var someFacade = cocoon.getComponent("someFacade");
>>>>> someFacade.doSomething(...);
>>>>>
>>>>> Is there a recommended way in Cocoon 3 to instantiate beans. One
>>>>> could do
>>>>>
>>>>> ApplicationContext context =
>>>>> new ClassPathXmlApplicationContext( new String[]
>>>>> {"beans-spring.cfg.xml");
>>>>> SomeFacade facade = (SomeFacade)context.getBean("someFacade");
>>>>> facade.doSomething(...);
>>>>>
>>>>> within a JAX-RS resource [3].
>>>>>
>>>>> So, is this way to do instantiate beans?
>>>>>
>>>>> Thanks,
>>>>> Andre
>>>>>
>>>>>
>>>>> [1] http://cocoon.apache.org/3.0/features.html
>>>>> [2] http://en.wikipedia.org/wiki/Rich_Internet_application
>>>>> [3]
>>>>> http://cocoon.apache.org/3.0/referenc/html/webapps.html#webapps.rest
>>>>>
>>>>> --
>>>>> Andre H. Juffer | Phone: +358-8-553 1161
>>>>> Biocenter Oulu and | Fax: +358-8-553-1141
>>>>> Department of Biochemistry | Email: andre.juffer@oulu.fi
>>>>> University of Oulu, Finland | WWW: www.biochem.oulu.fi/Biocomputing/
>>>>> StruBioCat | WWW: www.strubiocat.oulu.fi
>>>>> NordProt | WWW: www.nordprot.org
>>>>> Triacle Biocomputing | WWW: www.triacle-bc.com
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org
>>>>> For additional commands, e-mail: users-help@cocoon.apache.org
>>>>>
>>>
>
>


-- 
Andre H. Juffer              | Phone: +358-8-553 1161
Biocenter Oulu and           | Fax: +358-8-553-1141
Department of Biochemistry   | Email: andre.juffer@oulu.fi
University of Oulu, Finland  | WWW: www.biochem.oulu.fi/Biocomputing/
StruBioCat                   | WWW: www.strubiocat.oulu.fi
NordProt                     | WWW: www.nordprot.org
Triacle Biocomputing         | WWW: www.triacle-bc.com

Mime
View raw message