Author: vsiveton
Date: Sat Aug 1 11:17:23 2009
New Revision: 799837
URL: http://svn.apache.org/viewvc?rev=799837&view=rev
Log:
o added timeout and httpClientsParameters
o improved log call
Modified:
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
Modified:
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java?rev=799837&r1=799836&r2=799837&view=diff
==============================================================================
---
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
(original)
+++
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
Sat Aug 1 11:17:23 2009
@@ -34,6 +34,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.net.URI;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@@ -404,6 +405,17 @@
return link.indexOf( pattern ) != -1;
}
+ URI uri = URI.create( link );
+
+ if ( uri.getScheme() != null && !pattern.startsWith( uri.getScheme() )
)
+ {
+ return true;
+ }
+
+ if ( pattern.matches( "\\*+/?.*" ) && !link.startsWith( "/" ) &&
!link.startsWith( "./" ) )
+ {
+ link = "./" + link;
+ }
String diff = StringUtils.difference( link, pattern );
if ( diff.startsWith( "/" ) )
{
Modified:
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java?rev=799837&r1=799836&r2=799837&view=diff
==============================================================================
---
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
(original)
+++
maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
Sat Aug 1 11:17:23 2009
@@ -22,6 +22,8 @@
import java.io.IOException;
import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
@@ -38,6 +40,8 @@
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.params.HttpClientParams;
+import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -45,7 +49,6 @@
import org.apache.maven.doxia.linkcheck.model.LinkcheckFileResult;
import org.codehaus.plexus.util.StringUtils;
-
/**
* Checks links which are normal URLs
*
@@ -54,7 +57,8 @@
* @author <a href="mailto:[email protected]">Vincent Siveton</a>
* @version $Id$
*/
-public final class OnlineHTTPLinkValidator extends HTTPLinkValidator
+public final class OnlineHTTPLinkValidator
+ extends HTTPLinkValidator
{
/** Log for debug output. */
private static final Log LOG = LogFactory.getLog(
OnlineHTTPLinkValidator.class );
@@ -97,10 +101,7 @@
bean = new HttpBean();
}
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Will use method : [" + bean.getMethod() + "]" );
- }
+ LOG.debug( "Will use method : [" + bean.getMethod() + "]" );
this.http = bean;
@@ -135,42 +136,50 @@
initHttpClient();
}
- String link = lvi.getLink();
+ if ( this.http.getHttpClientParameters() != null )
+ {
+ for ( Iterator it =
this.http.getHttpClientParameters().entrySet().iterator(); it.hasNext(); )
+ {
+ Map.Entry entry = (Map.Entry) it.next();
+
+ if ( entry.getValue() != null )
+ {
+ System.setProperty( entry.getKey().toString(),
entry.getValue().toString() );
+ }
+ }
+ }
+ // Some web servers don't allow the default user-agent sent by
httpClient
+ System.setProperty( HttpMethodParams.USER_AGENT, "Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.0)" );
+
+ String link = lvi.getLink();
try
{
if ( link.startsWith( "/" ) )
{
if ( getBaseURL() == null )
{
- if ( LOG.isWarnEnabled() )
- {
+ LOG.warn( "Cannot check link [" + link + "] in page [" +
lvi.getSource()
+ + "], as no base URL has been set!" );
- LOG.warn( "Cannot check link [" + link + "] in page ["
+ lvi.getSource()
- + "], as no base URL has been set!" );
- }
return new LinkValidationResult(
LinkcheckFileResult.WARNING_LEVEL, false,
- "No base URL specified" );
+ "No base URL specified" );
}
link = getBaseURL() + link;
}
HttpMethod hm = null;
-
try
{
hm = checkLink( link, 0 );
}
catch ( Throwable t )
{
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Received: [" + t + "] for [" + link + "] in
page [" + lvi.getSource() + "]", t );
- }
+ LOG.debug( "Received: [" + t + "] for [" + link + "] in page
[" + lvi.getSource() + "]", t );
- return new LinkValidationResult(
LinkcheckFileResult.ERROR_LEVEL, false, t.getClass().getName() + " : "
- + t.getMessage() );
+ return new LinkValidationResult(
LinkcheckFileResult.ERROR_LEVEL, false, t.getClass().getName()
+ + " : " + t.getMessage() );
}
if ( hm == null )
@@ -182,116 +191,114 @@
if ( hm.getStatusCode() == HttpStatus.SC_OK )
{
return new HTTPLinkValidationResult(
LinkcheckFileResult.VALID_LEVEL, true, hm.getStatusCode(),
- hm.getStatusText() );
- }
+ hm.getStatusText() );
+ }
- // If there's a redirection ... add a warning
- if ( hm.getStatusCode() == HttpStatus.SC_MOVED_PERMANENTLY
- || hm.getStatusCode() ==
HttpStatus.SC_MOVED_TEMPORARILY
- || hm.getStatusCode() ==
HttpStatus.SC_TEMPORARY_REDIRECT )
- {
- if ( LOG.isWarnEnabled() )
+ String msg =
+ "Received: [" + hm.getStatusCode() + "] for [" + link + "] in
page [" + lvi.getSource() + "]";
+ // If there's a redirection ... add a warning
+ if ( hm.getStatusCode() == HttpStatus.SC_MOVED_PERMANENTLY
+ || hm.getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY
+ || hm.getStatusCode() == HttpStatus.SC_TEMPORARY_REDIRECT )
{
- LOG.warn( "Received: [" + hm.getStatusCode() + "] for [" +
link + "] in page [" + lvi.getSource()
- + "]" );
- }
+ LOG.warn( msg );
return new HTTPLinkValidationResult(
LinkcheckFileResult.WARNING_LEVEL, true, hm.getStatusCode(),
hm.getStatusText() );
}
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Received: [" + hm.getStatusCode() + "] for [" +
link + "] in page [" + lvi.getSource()
- + "]" );
- }
+ LOG.debug( msg );
return new HTTPLinkValidationResult(
LinkcheckFileResult.ERROR_LEVEL, false, hm.getStatusCode(),
hm.getStatusText() );
-
}
catch ( Throwable t )
{
+ String msg = "Received: [" + t + "] for [" + link + "] in page ["
+ lvi.getSource() + "]";
if ( LOG.isDebugEnabled() )
{
- LOG.debug( "Received: [" + t + "] for [" + link + "] in page
[" + lvi.getSource() + "]", t );
+ LOG.debug( msg, t );
}
else
{
- LOG.error( "Received: [" + t + "] for [" + link + "] in page
[" + lvi.getSource() + "]" );
+ LOG.error( msg );
}
return new LinkValidationResult( LinkcheckFileResult.ERROR_LEVEL,
false, t.getMessage() );
}
+ finally
+ {
+ System.getProperties().remove( HttpMethodParams.USER_AGENT );
+
+ if ( this.http.getHttpClientParameters() != null )
+ {
+ for ( Iterator it =
this.http.getHttpClientParameters().entrySet().iterator(); it.hasNext(); )
+ {
+ Map.Entry entry = (Map.Entry) it.next();
+
+ if ( entry.getValue() != null )
+ {
+ System.getProperties().remove(
entry.getKey().toString() );
+ }
+ }
+ }
+ }
}
/** Initialize the HttpClient. */
private void initHttpClient()
{
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "A new HttpClient instance is needed ..." );
- }
-
- // Some web servers don't allow the default user-agent sent by
httpClient
- System.setProperty( "httpclient.useragent", "Mozilla/4.0 (compatible;
MSIE 6.0; Windows NT 5.0)" );
+ LOG.debug( "A new HttpClient instance is needed ..." );
this.cl = new HttpClient( new MultiThreadedHttpConnectionManager() );
+ // Default params
+ if ( this.http.getTimeout() != 0 )
+ {
+
this.cl.getHttpConnectionManager().getParams().setConnectionTimeout(
this.http.getTimeout() );
+ this.cl.getHttpConnectionManager().getParams().setSoTimeout(
this.http.getTimeout() );
+ }
+ this.cl.getParams().setBooleanParameter(
HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true );
+
HostConfiguration hc = new HostConfiguration();
HttpState state = new HttpState();
-
if ( StringUtils.isNotEmpty( this.http.getProxyHost() ) )
{
hc.setProxy( this.http.getProxyHost(), this.http.getProxyPort() );
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Proxy Host:" + this.http.getProxyHost() );
- LOG.debug( "Proxy Port:" + this.http.getProxyPort() );
- }
+ LOG.debug( "Proxy Host:" + this.http.getProxyHost() );
+ LOG.debug( "Proxy Port:" + this.http.getProxyPort() );
if ( StringUtils.isNotEmpty( this.http.getProxyUser() ) &&
this.http.getProxyPassword() != null )
{
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Proxy User:" + this.http.getProxyUser() );
- }
+ LOG.debug( "Proxy User:" + this.http.getProxyUser() );
Credentials credentials;
-
if ( StringUtils.isNotEmpty( this.http.getProxyNtlmHost() ) )
{
- credentials = new NTCredentials( this.http.getProxyUser(),
this.http.getProxyPassword(), this.http
- .getProxyNtlmHost(), this.http.getProxyNtlmDomain() );
+ credentials =
+ new NTCredentials( this.http.getProxyUser(),
this.http.getProxyPassword(),
+ this.http.getProxyNtlmHost(),
this.http.getProxyNtlmDomain() );
}
else
{
- credentials = new UsernamePasswordCredentials(
this.http.getProxyUser(), this.http
- .getProxyPassword() );
+ credentials =
+ new UsernamePasswordCredentials(
this.http.getProxyUser(), this.http.getProxyPassword() );
}
state.setProxyCredentials( AuthScope.ANY, credentials );
}
-
}
else
{
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "Not using a proxy" );
- }
+ LOG.debug( "Not using a proxy" );
}
this.cl.setHostConfiguration( hc );
-
this.cl.setState( state );
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "New HttpClient instance created." );
- }
+ LOG.debug( "New HttpClient instance created." );
}
/**
@@ -305,13 +312,29 @@
private HttpMethod checkLink( String link, int nbRedirect )
throws IOException
{
- if ( nbRedirect > MAX_NB_REDIRECT )
+ int max = MAX_NB_REDIRECT;
+ if ( this.http.getHttpClientParameters() != null
+ && this.http.getHttpClientParameters().get(
HttpClientParams.MAX_REDIRECTS ) != null )
{
- throw new HttpException( "Maximum number of redirections (" +
MAX_NB_REDIRECT + ") exceeded" );
+ try
+ {
+ max =
+ Integer.valueOf(
+ this.http.getHttpClientParameters().get(
HttpClientParams.MAX_REDIRECTS )
+ .toString() ).intValue();
+ }
+ catch ( NumberFormatException e )
+ {
+ LOG.warn( "HttpClient parameter '" +
HttpClientParams.MAX_REDIRECTS
+ + "' is not a number. Ignoring" );
+ }
+ }
+ if ( nbRedirect > max )
+ {
+ throw new HttpException( "Maximum number of redirections (" + max
+ ") exceeded" );
}
HttpMethod hm;
-
if ( HEAD_METHOD.equalsIgnoreCase( this.http.getMethod() ) )
{
hm = new HeadMethod( link );
@@ -322,17 +345,15 @@
}
else
{
- if ( LOG.isErrorEnabled() )
- {
- LOG.error( "Unsupported method: " + this.http.getMethod() + ",
using 'get'." );
- }
+ LOG.error( "Unsupported method: " + this.http.getMethod() + ",
using 'get'." );
hm = new GetMethod( link );
}
+ // Default
+ hm.setFollowRedirects( this.http.isFollowRedirects() );
+
try
{
- hm.setFollowRedirects( this.http.isFollowRedirects() );
-
URL url = new URL( link );
cl.getHostConfiguration().setHost( url.getHost(), url.getPort(),
url.getProtocol() );
@@ -340,28 +361,23 @@
cl.executeMethod( hm );
StatusLine sl = hm.getStatusLine();
-
if ( sl == null )
{
- if ( LOG.isErrorEnabled() )
- {
- LOG.error( "Unknown error validating link : " + link );
- }
+ LOG.error( "Unknown error validating link : " + link );
+
return null;
}
if ( hm.getStatusCode() == HttpStatus.SC_MOVED_PERMANENTLY
- || hm.getStatusCode() ==
HttpStatus.SC_MOVED_TEMPORARILY
- || hm.getStatusCode() ==
HttpStatus.SC_TEMPORARY_REDIRECT )
+ || hm.getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY
+ || hm.getStatusCode() == HttpStatus.SC_TEMPORARY_REDIRECT )
{
Header locationHeader = hm.getResponseHeader( "location" );
if ( locationHeader == null )
{
- if ( LOG.isErrorEnabled() )
- {
- LOG.error( "Site sent redirect, but did not set
Location header" );
- }
+ LOG.error( "Site sent redirect, but did not set Location
header" );
+
return hm;
}
@@ -376,7 +392,7 @@
newLink =
oldUrl.getProtocol() + "://" + oldUrl.getHost()
- + ( oldUrl.getPort() > 0 ? ":" +
oldUrl.getPort() : "" ) + newLink;
+ + ( oldUrl.getPort() > 0 ? ":" +
oldUrl.getPort() : "" ) + newLink;
}
else
{
@@ -386,10 +402,7 @@
HttpMethod oldHm = hm;
- if ( LOG.isDebugEnabled() )
- {
- LOG.debug( "[" + link + "] is redirected to [" + newLink +
"]" );
- }
+ LOG.debug( "[" + link + "] is redirected to [" + newLink + "]"
);
oldHm.releaseConnection();