You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by adeshpande <am...@viasat.com> on 2010/12/13 20:32:59 UTC

CXF client NTLM Authentication Issue

Hi,

I have generated a cxf client using wsdl2java tool. This client is built to
consume the sharepoint webservice which requires NTLM authentication.

I was initially
On the link :
http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html
, under the NTLM authentication section, it is stated that - "On Java 6,
NTLM authentication is built into the Java runtime and you don't need to do
anything special" .

As such I just turned off chunking and try to connect to the webservice,
However I get a Server redirected too many times issue.
The code and the error are as given below:

************************************************************************************************************************************************************
Code
*************************************************************************************************************************************************************
SiteData ss = new SiteData(wsdlURL, SERVICE_NAME);
SiteDataSoap port = ss.getSiteDataSoap();

//Turn off chunking so that NTLM can occur
Client client = org.apache.cxf.frontend.ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);

System.out.println("Invoking getSite...");
javax.xml.ws.Holder<java.lang.Long> _getSite_getSiteResult = new
javax.xml.ws.Holder<java.lang.Long>();
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.SSiteMetadata>
_getSite_sSiteMetadata = new
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.SSiteMetadata>();
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfSWebWithTime>
_getSite_vWebs = new
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfSWebWithTime>();
javax.xml.ws.Holder<java.lang.String> _getSite_strUsers = new
javax.xml.ws.Holder<java.lang.String>();
javax.xml.ws.Holder<java.lang.String> _getSite_strGroups = new
javax.xml.ws.Holder<java.lang.String>();
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfString>
_getSite_vGroups = new
javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfString>();
//Webservice call
port.getSite(_getSite_getSiteResult, _getSite_sSiteMetadata, _getSite_vWebs,
_getSite_strUsers, _getSite_strGroups, _getSite_vGroups);
**********************************************************************************************************************************************************************
Error Message
***********************************************************************************************************************************************************************
The error I get is as follows :
Dec 13, 2010 1:30:05 PM org.apache.cxf.phase.PhaseInterceptorChain
doDefaultLogging
WARNING: Interceptor for
{http://schemas.microsoft.com/sharepoint/soap/}SiteData#{http://schemas.microsoft.com/sharepoint/soap/}GetSite
has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:244)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
at $Proxy39.getSite(Unknown Source)
at
com.microsoft.schemas.sharepoint.soap.SiteDataSoap_SiteDataSoap_Client.main(SiteDataSoap_SiteDataSoap_Client.java:190)
Caused by: java.net.ProtocolException: ProtocolException invoking
http://corp.abc.com/_vti_bin/SiteData.asmx: Server redirected too many times
(20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:2058)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2043)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639)
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
... 8 more
Caused by: java.net.ProtocolException: Server redirected too many times (20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown
Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2250)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2134)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1988)
... 11 more
Caused by: java.net.ProtocolException: Server redirected too many times (20)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at
org.apache.cxf.transport.http.HTTPConduit.processRetransmit(HTTPConduit.java:1457)
at
org.apache.cxf.transport.http.HTTPConduit.access$600(HTTPConduit.java:146)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRetransmits(HTTPConduit.java:2102)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2129)
... 12 more
Exception in thread "main" javax.xml.ws.WebServiceException: Could not send
Message.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
at $Proxy39.getSite(Unknown Source)
at
com.microsoft.schemas.sharepoint.soap.SiteDataSoap_SiteDataSoap_Client.main(SiteDataSoap_SiteDataSoap_Client.java:190)
Caused by: java.net.ProtocolException: ProtocolException invoking
http://corp.abc.com/_vti_bin/SiteData.asmx: Server redirected too many times
(20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:2058)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2043)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639)
at
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:244)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
... 2 more
Caused by: java.net.ProtocolException: Server redirected too many times (20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown
Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
Source)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2250)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2134)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1988)
... 11 more
Caused by: java.net.ProtocolException: Server redirected too many times (20)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at
org.apache.cxf.transport.http.HTTPConduit.processRetransmit(HTTPConduit.java:1457)
at
org.apache.cxf.transport.http.HTTPConduit.access$600(HTTPConduit.java:146)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRetransmits(HTTPConduit.java:2102)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2129)
... 12 more

Can you please help me with this? 
-- 
View this message in context: http://cxf.547215.n5.nabble.com/CXF-client-NTLM-Authentication-Issue-tp3303631p3303631.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: CXF client NTLM Authentication Issue

Posted by cxfuser71 <ku...@hotmail.com>.
Hi Daniel,
Did you get the resolution? 
I have similar requirement but did not face such error like you.
But I will like to know how did you solve it.


Thanks,
- Kuntal
-- 
View this message in context: http://cxf.547215.n5.nabble.com/CXF-client-NTLM-Authentication-Issue-tp3303631p3352352.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: CXF client NTLM Authentication Issue

Posted by adeshpande <am...@viasat.com>.
Hi Dan,

Thanks for the reply. 

I had added the user name and password as below:
http.getAuthorization().setAuthorizationType("Negotiate");  // line 1
http.getAuthorization().setUserName("adeshpande");  //line 2
http.getAuthorization().setPassword("mypassword");  //line 3
I got the same error.
********************************************************************************
Caused by: java.net.ProtocolException: Server redirected too many  times
(20)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
Source)
	at java.net.HttpURLConnection.getResponseCode(Unknown Source)
	at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2165)
	... 13 more
**************************************************************************

I have tried with removing the line 1 above and just setting the username
and password and i still get the same error.






-- 
View this message in context: http://cxf.547215.n5.nabble.com/CXF-client-NTLM-Authentication-Issue-tp3303631p3303741.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: CXF client NTLM Authentication Issue

Posted by Daniel Kulp <dk...@apache.org>.

In your code, I don't see you setting the USERNAME_PROPERTY or the 
PASSWORD_PROPERTY.   Thus, there may not be the information that the  
authentication stuff requires to actually authenticate.

Dan



On Monday 13 December 2010 2:32:59 pm adeshpande wrote:
> Hi,
> 
> I have generated a cxf client using wsdl2java tool. This client is built to
> consume the sharepoint webservice which requires NTLM authentication.
> 
> I was initially
> On the link :
> http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html
> , under the NTLM authentication section, it is stated that - "On Java 6,
> NTLM authentication is built into the Java runtime and you don't need to do
> anything special" .
> 
> As such I just turned off chunking and try to connect to the webservice,
> However I get a Server redirected too many times issue.
> The code and the error are as given below:
> 
> ***************************************************************************
> ***************************************************************************
> ****** Code
> ***************************************************************************
> ***************************************************************************
> ******* SiteData ss = new SiteData(wsdlURL, SERVICE_NAME);
> SiteDataSoap port = ss.getSiteDataSoap();
> 
> //Turn off chunking so that NTLM can occur
> Client client = org.apache.cxf.frontend.ClientProxy.getClient(port);
> HTTPConduit http = (HTTPConduit) client.getConduit();
> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> httpClientPolicy.setConnectionTimeout(36000);
> httpClientPolicy.setAllowChunking(false);
> http.setClient(httpClientPolicy);
> 
> System.out.println("Invoking getSite...");
> javax.xml.ws.Holder<java.lang.Long> _getSite_getSiteResult = new
> javax.xml.ws.Holder<java.lang.Long>();
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.SSiteMetadata>
> _getSite_sSiteMetadata = new
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.SSiteMetadata>();
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfSWebWithTi
> me> _getSite_vWebs = new
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfSWebWithTi
> me>(); javax.xml.ws.Holder<java.lang.String> _getSite_strUsers = new
> javax.xml.ws.Holder<java.lang.String>();
> javax.xml.ws.Holder<java.lang.String> _getSite_strGroups = new
> javax.xml.ws.Holder<java.lang.String>();
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfString>
> _getSite_vGroups = new
> javax.xml.ws.Holder<com.microsoft.schemas.sharepoint.soap.ArrayOfString>();
> //Webservice call
> port.getSite(_getSite_getSiteResult, _getSite_sSiteMetadata,
> _getSite_vWebs, _getSite_strUsers, _getSite_strGroups, _getSite_vGroups);
> ***************************************************************************
> ***************************************************************************
> **************** Error Message
> ***************************************************************************
> ***************************************************************************
> ***************** The error I get is as follows :
> Dec 13, 2010 1:30:05 PM org.apache.cxf.phase.PhaseInterceptorChain
> doDefaultLogging
> WARNING: Interceptor for
> {http://schemas.microsoft.com/sharepoint/soap/}SiteData#{http://schemas.mic
> rosoft.com/sharepoint/soap/}GetSite has thrown exception, unwinding now
> org.apache.cxf.interceptor.Fault: Could not send Message.
> at
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInte
> rceptor.handleMessage(MessageSenderInterceptor.java:64) at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:244) at
> org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
> at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
> at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
> at $Proxy39.getSite(Unknown Source)
> at
> com.microsoft.schemas.sharepoint.soap.SiteDataSoap_SiteDataSoap_Client.main
> (SiteDataSoap_SiteDataSoap_Client.java:190) Caused by:
> java.net.ProtocolException: ProtocolException invoking
> http://corp.abc.com/_vti_bin/SiteData.asmx: Server redirected too many
> times (20)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
> Source) at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(
> HTTPConduit.java:2058) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon
> duit.java:2043) at
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) at
> org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639) at
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInte
> rceptor.handleMessage(MessageSenderInterceptor.java:62) ... 8 more
> Caused by: java.net.ProtocolException: Server redirected too many times
> (20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
> Source) at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown
> Source)
> at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
> Source)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> eInternal(HTTPConduit.java:2250) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> e(HTTPConduit.java:2134) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon
> duit.java:1988) ... 11 more
> Caused by: java.net.ProtocolException: Server redirected too many times
> (20) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
> Source)
> at java.net.HttpURLConnection.getResponseCode(Unknown Source)
> at
> org.apache.cxf.transport.http.HTTPConduit.processRetransmit(HTTPConduit.jav
> a:1457) at
> org.apache.cxf.transport.http.HTTPConduit.access$600(HTTPConduit.java:146)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRetrans
> mits(HTTPConduit.java:2102) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> e(HTTPConduit.java:2129) ... 12 more
> Exception in thread "main" javax.xml.ws.WebServiceException: Could not send
> Message.
> at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
> at $Proxy39.getSite(Unknown Source)
> at
> com.microsoft.schemas.sharepoint.soap.SiteDataSoap_SiteDataSoap_Client.main
> (SiteDataSoap_SiteDataSoap_Client.java:190) Caused by:
> java.net.ProtocolException: ProtocolException invoking
> http://corp.abc.com/_vti_bin/SiteData.asmx: Server redirected too many
> times (20)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
> at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
> Source) at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(
> HTTPConduit.java:2058) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon
> duit.java:2043) at
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66) at
> org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639) at
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInte
> rceptor.handleMessage(MessageSenderInterceptor.java:62) at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:244) at
> org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
> at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
> at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
> ... 2 more
> Caused by: java.net.ProtocolException: Server redirected too many times
> (20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
> Source) at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown
> Source)
> at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
> Source)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> eInternal(HTTPConduit.java:2250) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> e(HTTPConduit.java:2134) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPCon
> duit.java:1988) ... 11 more
> Caused by: java.net.ProtocolException: Server redirected too many times
> (20) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown
> Source)
> at java.net.HttpURLConnection.getResponseCode(Unknown Source)
> at
> org.apache.cxf.transport.http.HTTPConduit.processRetransmit(HTTPConduit.jav
> a:1457) at
> org.apache.cxf.transport.http.HTTPConduit.access$600(HTTPConduit.java:146)
> at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRetrans
> mits(HTTPConduit.java:2102) at
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleRespons
> e(HTTPConduit.java:2129) ... 12 more
> 
> Can you please help me with this?

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog