You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by avonm <ma...@insiel.it> on 2011/03/03 14:32:29 UTC

http proxy and mtom attachments

I managed to set up a simple proxy between a cxf web service and its client.
The proxy is made with jetty and has two classes

public class HttpServer {

    private static String url = "http://localhost:8765/jtrouter";

    public static void main(String[] args) throws Exception {
        HttpServer server = new HttpServer();
        System.out.println("Starting HttpServer... press ctrl + c to stop
it");
        server.server();
        System.out.println("... started and listening on: " + url);
        Thread.sleep(999999999);
    }

    public void server() throws Exception {
        CamelContext camel = new DefaultCamelContext();
        camel.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
            	            	
                from("jetty:" + url)
                .bean(RecipientListJetty.class);
            }
        });
        camel.start();
        

    }
}

public class RecipientListJetty {
	
	@RecipientList
	public String[] route(Exchange exchange) throws
ParserConfigurationException, SAXException, IOException
	{
		int size = exchange.getIn().getAttachments().size();
		
		System.out.println("size attachments ==> " + size);
		
		String rec =
"http://localhost:8080/cxf-ws-order/services/OrderService?bridgeEndpoint=true";
				
		return new String[] {rec};
		
	}

}

The problem is this doesn't work when the ws has an MTOM attachment. The
server responds with the following stack trace

[                qtp19297865-14] DefaultErrorHandler            ERROR Failed
delivery for exchangeId: ID-AVON-DELL-2237-1299157873703-0-3. Exhausted
after delivery attempt: 1 caught:
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
statusCode: 500
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
statusCode: 500
	at
org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:166)[camel-http-2.5.0.jar:2.5.0]
	at
org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:108)[camel-http-2.5.0.jar:2.5.0]
	at
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)[camel-core-2.5.0.jar:2.5.0]
	at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)[camel-core-2.5.0.jar:2.5.0]
	at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:299)[camel-core-2.5.0.jar:2.5.0]
	at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:208)[camel-core-2.5.0.jar:2.5.0]
	at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:99)[camel-core-2.5.0.jar:2.5.0]
	at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)[camel-core-2.5.0.jar:2.5.0]
...

Is this my mistake or an expected behaviour? What to do to workaround this? 
I think i need a pure http proxy (jetty or servlet), a cxf one should not be
suitable to my needs.

Thanks.




--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3407911.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: R: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
the client is as follows (and this kind of invocation works for calling other
non MTOM services through the proxy)


public final class RaggiPortType_RaggiPort_Client {

	private static final QName SERVICE_NAME = new QName(
			"http://it.insiel.raggi/", "raggiService");

	private RaggiPortType_RaggiPort_Client() {
	}

	public static void main(String args[]) throws Exception {

		RaggiService ss = new RaggiService();
		RaggiPortType port = ss.getRaggiPort();

		BindingProvider bp = (BindingProvider) port;
		SOAPBinding binding = (SOAPBinding) bp.getBinding();
		binding.setMTOMEnabled(true);

		String address = bp.getRequestContext()
				.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY).toString();

		address = "http://localhost:8765/jtrouter/";

		bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
				address);

		{
			System.out.println("Invoking inviaRadiografia...");
			java.lang.String _inviaRadiografia_codPaziente =
"_inviaRadiografia_codPaziente1400875";

			DataSource source = new FileDataSource(new File(
					"D:/dati_mauro/personale/sfondi/queensland-heaven.jpg"));
			DataHandler _inviaRadiografia_radiografia = new DataHandler(source);

			boolean _inviaRadiografia__return = port.inviaRadiografia(
					_inviaRadiografia_codPaziente,
					_inviaRadiografia_radiografia);
			System.out.println("inviaRadiografia.result="
					+ _inviaRadiografia__return);

		}

		System.exit(0);
	}

}


--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412261.html
Sent from the Camel - Users mailing list archive at Nabble.com.

R: http proxy and mtom attachments

Posted by Avon Mauro <ma...@insiel.it>.
 yes MTOM is enabled

        <jaxws:endpoint xmlns:tns="http://it.insiel.raggi/" id="raggiporttype"
                implementor="raggi.insiel.it.RaggiPortTypeImpl" wsdlLocation="wsdl/raggi.wsdl"
                endpointName="tns:raggiPort" serviceName="tns:raggiService" address="/raggiPort">
                <jaxws:properties>
                        <entry key="mtom-enabled" value="true" />
                </jaxws:properties>

                <jaxws:features>
                        <bean class="org.apache.cxf.feature.LoggingFeature" />
                </jaxws:features>
        </jaxws:endpoint>

and the service works when called directly, it doesn't when called through the proxy


-----Messaggio originale-----
Da: Willem Jiang [mailto:willem.jiang@gmail.com]
Inviato: lunedì 7 marzo 2011 12.00
A: users@camel.apache.org
Oggetto: Re: http proxy and mtom attachments

Did your server enable the MTOM[1] on the server side?
[1]https://cwiki.apache.org/confluence/display/CXF20DOC/MTOM


On 3/7/11 6:33 PM, avonm wrote:
> I printed the message i'm trying to route, it's the following
>
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611
> Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
> Content-Transfer-Encoding: binary
> Content-ID:
>
> _inviaRadiografia_codPaziente1400875
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611
> Content-Type: image/jpeg
> Content-Transfer-Encoding: binary
> Content-ID:<2a...@cxf.apache.org>
>
> ...
>
> (binary data)
>
> ...
>
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611--
>
> It seems to understand the XMLStreamReader complains because it finds a '-'
> at row 2, column 1 instead of finding a '<'. How to get around this
> (it could be a beginner-level question, sorry for this).
>
>
>
>
>
>
> --
> View this message in context:
> http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp34
> 07911p3412204.html Sent from the Camel - Users mailing list archive at
> Nabble.com.
>


--
Willem
----------------------------------
FuseSource
Web: http://www.fusesource.com
Blog:    http://willemjiang.blogspot.com (English)
          http://jnn.javaeye.com (Chinese)
Twitter: willemjiang

AVVISO DI RISERVATEZZA
Informazioni riservate possono essere contenute nel messaggio o nei suoi allegati. Se non siete i destinatari indicati nel messaggio, o responsabili per la sua consegna alla persona, o se avete ricevuto il messaggio per errore, siete pregati di non trascriverlo, copiarlo o inviarlo a nessuno. In tal caso vi invitiamo a cancellare il messaggio ed i suoi allegati. Grazie.

CONFIDENTIALITY NOTICE
Confidential information may be contained in this message or in its attachments. If you are not the addressee indicated in this message, or responsible for message delivering to that person, or if you have received this message in error, you may not transcribe, copy or deliver this message to anyone. In that case, you should delete this message and its attachments. Thank you.

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
yes MTOM is enabled

	
		
			
		

		
			
		
	

and the service works when called directly, it doesn't when called through
the proxy

--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412240.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by Willem Jiang <wi...@gmail.com>.
Did your server enable the MTOM[1] on the server side?
[1]https://cwiki.apache.org/confluence/display/CXF20DOC/MTOM


On 3/7/11 6:33 PM, avonm wrote:
> I printed the message i'm trying to route, it's the following
>
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611
> Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
> Content-Transfer-Encoding: binary
> Content-ID:
>
> _inviaRadiografia_codPaziente1400875
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611
> Content-Type: image/jpeg
> Content-Transfer-Encoding: binary
> Content-ID:<2a...@cxf.apache.org>
>
> ...
>
> (binary data)
>
> ...
>
> --uuid:f35eefc8-51d9-45d4-9a97-677536580611--
>
> It seems to understand the XMLStreamReader complains because it finds a '-'
> at row 2, column 1 instead of finding a '<'. How to get around this (it
> could be a beginner-level question, sorry for this).
>
>
>
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412204.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>


-- 
Willem
----------------------------------
FuseSource
Web: http://www.fusesource.com
Blog:    http://willemjiang.blogspot.com (English)
          http://jnn.javaeye.com (Chinese)
Twitter: willemjiang

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
I printed the message i'm trying to route, it's the following

--uuid:f35eefc8-51d9-45d4-9a97-677536580611
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: 

_inviaRadiografia_codPaziente1400875
--uuid:f35eefc8-51d9-45d4-9a97-677536580611
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <2a...@cxf.apache.org>

...

(binary data)

...

--uuid:f35eefc8-51d9-45d4-9a97-677536580611--

It seems to understand the XMLStreamReader complains because it finds a '-'
at row 2, column 1 instead of finding a '<'. How to get around this (it
could be a beginner-level question, sorry for this).






--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412204.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
please see the message on the site, in the email it isn't rendered correclty

--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412227.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
I printed the message i'm trying to route, more or less it's the following
(except for line breaks which aren't correctly rendered here)



--uuid:f35eefc8-51d9-45d4-9a97-677536580611
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: 

_inviaRadiografia_codPaziente1400875
--uuid:f35eefc8-51d9-45d4-9a97-677536580611
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <2a...@cxf.apache.org>

...

(binary data)

...

--uuid:f35eefc8-51d9-45d4-9a97-677536580611--



It seems to understand the XMLStreamReader complains because it finds a '-'
at row 2, column 1 instead of finding a '<'. How to get around this (it
could be a beginner-level question, sorry for this).





--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3412216.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
the ws is deployed on tomcat, and in the tomcat log, after seeing the binary
data, i see what follows

...
+l~À?>~Tßä!Í?åÑr]Q      >?¸?]ÛËÃ$?6m( ?ú?7ÉO£äK?E×b?´²÷¼&Y¤Ô@É
càw§CY?Ã2ÏA8îâ'¸²
¸ge­à3Íõ?M?Ç??ü?¦©OÑ?xà·i?Â???@?Kà ?eî??ñ?©ËÈc??>?ü?íø/e¯?2Üq?+??¶
?*t\¹Be??ä
--------------------------------------
4-Mar-2011 12.27.17 org.apache.cxf.phase.PhaseInterceptorChain
doDefaultLogging
ATTENZIONE: Interceptor for {http://it.insiel.raggi/}raggiService has thrown
exc
eption, unwinding now
org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
        at
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handle
Message(ReadHeadersInterceptor.java:222)
        at
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handle
Message(ReadHeadersInterceptor.java:60)
        at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
orChain.java:255)
        at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti
ationObserver.java:113)
        at
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDes
tination.java:97)
        at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(
ServletController.java:461)
        at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletCont
roller.java:188)
        at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCX
FServlet.java:148)
        at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(Ab
stractHTTPServlet.java:179)
        at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractH
TTPServlet.java:103)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(Abstract
HTTPServlet.java:159)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:290)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:233)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:191)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:127)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:298)
        at
org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcesso
r.java:859)
        at
org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.pr
ocess(Http11AprProtocol.java:579)
        at
org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:15
55)
        at java.lang.Thread.run(Thread.java:811)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected
character '-
' (code 45) in prolog; expected '<'
 at [row,col {unknown-source}]: [2,1]
        at
com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:
644)
        at
com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.ja
va:2003)
        at
com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1100)
        at
com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1123
)
        at
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handle
Message(ReadHeadersInterceptor.java:122)
        ... 23 more
4-Mar-2011 12.27.17 org.apache.cxf.interceptor.AbstractLoggingInterceptor
log
INFORMAZIONI: Outbound Message
---------------------------
ID: 1
Response-Code: 500
Encoding: ISO-8859-1
Content-Type: text/xml
Headers: {}
Payload: <
soap:Body>soap:ClientError readi
ng XMLStreamReader.
--------------------------------------

--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3409322.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by avonm <ma...@insiel.it>.
Hi,

in the former message the stack trace has a different url because that is
the url of the mtom service, while in the RecipientListJetty class the url
is the one of the (correctly working) non-mtom service.

I tried your suggestion but the HttpServer class returns the same error:

[                qtp26255574-10] DefaultErrorHandler            ERROR Failed
delivery for exchangeId: ID-AVON-DELL-1343-1299233005012-0-2. Exhausted
after delivery attempt: 1 caught:
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
statusCode: 500
org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
statusCode: 500
	at
org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:166)[camel-http-2.5.0.jar:2.5.0]
	at
org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:108)[camel-http-2.5.0.jar:2.5.0]

Now i have dropped the recipient list which is not nedded for the purpose of
this test and the HttpServer class looks like this

public class HttpServer {

    private static String url =
"http://localhost:8765/jtrouter/?enableMultipartFilter=false";

    public static void main(String[] args) throws Exception {
        HttpServer server = new HttpServer();
        System.out.println("Starting HttpServer... press ctrl + c to stop
it");
        server.server();
        System.out.println("... started and listening on: " + url);
        Thread.sleep(999999999);
    }

    public void server() throws Exception {
        CamelContext camel = new DefaultCamelContext();
        camel.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
            	            	
               
from("jetty:http://localhost:8765/jtrouter/?enableMultipartFilter=false")
               
.to("http://localhost:8080/cxf-ws-raggi/services/raggiPort?bridgeEndpoint=true");
                //.bean(RecipientListJetty.class);
            }
        });
        camel.start();
        

    }
}

Thanks, Mauro


--
View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3409213.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: http proxy and mtom attachments

Posted by Willem Jiang <wi...@gmail.com>.
Hi,

I just checked the URL of the stack trace, not sure why it turns 
http://localhost:8080/cxf-ws-order/services/OrderService to 
http://localhost:8080/cxf-ws-raggi/services/raggiPort.

camel-jetty consumer will handle the multi-part message by default, you 
should disable it when you use it as a part of proxy.
Please add this option into your jetty endpoint.

enableMultipartFilter=false

Willem

On 3/3/11 9:32 PM, avonm wrote:
> I managed to set up a simple proxy between a cxf web service and its client.
> The proxy is made with jetty and has two classes
>
> public class HttpServer {
>
>      private static String url = "http://localhost:8765/jtrouter";
>
>      public static void main(String[] args) throws Exception {
>          HttpServer server = new HttpServer();
>          System.out.println("Starting HttpServer... press ctrl + c to stop
> it");
>          server.server();
>          System.out.println("... started and listening on: " + url);
>          Thread.sleep(999999999);
>      }
>
>      public void server() throws Exception {
>          CamelContext camel = new DefaultCamelContext();
>          camel.addRoutes(new RouteBuilder() {
>              @Override
>              public void configure() throws Exception {
>              	            	
>                  from("jetty:" + url)
>                  .bean(RecipientListJetty.class);
>              }
>          });
>          camel.start();
>
>
>      }
> }
>
> public class RecipientListJetty {
> 	
> 	@RecipientList
> 	public String[] route(Exchange exchange) throws
> ParserConfigurationException, SAXException, IOException
> 	{
> 		int size = exchange.getIn().getAttachments().size();
> 		
> 		System.out.println("size attachments ==>  " + size);
> 		
> 		String rec =
> "http://localhost:8080/cxf-ws-order/services/OrderService?bridgeEndpoint=true";
> 				
> 		return new String[] {rec};
> 		
> 	}
>
> }
>
> The problem is this doesn't work when the ws has an MTOM attachment. The
> server responds with the following stack trace
>
> [                qtp19297865-14] DefaultErrorHandler            ERROR Failed
> delivery for exchangeId: ID-AVON-DELL-2237-1299157873703-0-3. Exhausted
> after delivery attempt: 1 caught:
> org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
> failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
> statusCode: 500
> org.apache.camel.component.http.HttpOperationFailedException: HTTP operation
> failed invoking http://localhost:8080/cxf-ws-raggi/services/raggiPort with
> statusCode: 500
> 	at
> org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:166)[camel-http-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:108)[camel-http-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)[camel-core-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)[camel-core-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:299)[camel-core-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:208)[camel-core-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:99)[camel-core-2.5.0.jar:2.5.0]
> 	at
> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70)[camel-core-2.5.0.jar:2.5.0]
> ...
>
> Is this my mistake or an expected behaviour? What to do to workaround this?
> I think i need a pure http proxy (jetty or servlet), a cxf one should not be
> suitable to my needs.
>
> Thanks.
>
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/http-proxy-and-mtom-attachments-tp3407911p3407911.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>


-- 
Willem
----------------------------------
FuseSource
Web: http://www.fusesource.com
Blog:    http://willemjiang.blogspot.com (English)
          http://jnn.javaeye.com (Chinese)
Twitter: willemjiang