You are viewing a plain text version of this content. The canonical link for it is here.
Posted to doxia-commits@maven.apache.org by vs...@apache.org on 2009/08/01 13:17:23 UTC
svn commit: r799837 - in
/maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation:
LinkValidatorManager.java OnlineHTTPLinkValidator.java
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:vincent.siveton@gmail.com">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();
Re: svn commit: r799837 - in /maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation:
LinkValidatorManager.java OnlineHTTPLinkValidator.java
Posted by Vincent Siveton <vi...@gmail.com>.
Hi Dennis,
2009/8/2 Dennis Lundberg <de...@apache.org>:
> These are logically not necessary, but are put in there for performance
> reasons. Only if the logger is in debug mode (in this case) will the 3
> String objects it uses actually be created by the JVM. Otherwise no
> objects will be created, resulting in slightly enhanced
> performance/memory usage. At least if used in heavy loops.
Definitely agree for the performance, it was why I added them in the
past r709693 :)
In this revision, I added some message objects for logging but agree I
removed some unwanted checks.
Cheers,
Vincent
Re: svn commit: r799837 - in /maven/doxia/doxia-tools/trunk/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation:
LinkValidatorManager.java OnlineHTTPLinkValidator.java
Posted by Dennis Lundberg <de...@apache.org>.
Vincent,
Is there a special reason for removing the level.checking for logging
statements, like the one below? You removed a bunch of these.
if ( LOG.isDebugEnabled() )
{
LOG.debug( "Will use method : [" + bean.getMethod() + "]" );
}
These are logically not necessary, but are put in there for performance
reasons. Only if the logger is in debug mode (in this case) will the 3
String objects it uses actually be created by the JVM. Otherwise no
objects will be created, resulting in slightly enhanced
performance/memory usage. At least if used in heavy loops.
vsiveton@apache.org wrote:
> 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:vincent.siveton@gmail.com">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();
>
>
>
>
--
Dennis Lundberg