You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by lt...@apache.org on 2007/08/25 23:14:29 UTC
svn commit: r569735 [1/4] - in /maven/sandbox/trunk/doxia/doxia-linkcheck:
./ src/ src/main/ src/main/java/ src/main/java/org/
src/main/java/org/apache/ src/main/java/org/apache/maven/
src/main/java/org/apache/maven/doxia/ src/main/java/org/apache/mave...
Author: ltheussl
Date: Sat Aug 25 14:14:27 2007
New Revision: 569735
URL: http://svn.apache.org/viewvc?rev=569735&view=rev
Log:
Adding a linkchecking tool. For now it's just a simple adaptation of the m1 linkcheck plugin (r535801) to make it usable stand-alone, adjusted code conventions, added javadocs. Needs some clean up and testing.
Added:
maven/sandbox/trunk/doxia/doxia-linkcheck/
maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/site/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/site/site.xml (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/site/xdoc/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/site/xdoc/index.xml (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/site/xdoc/usage.xml (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/doxia/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/doxia/linkcheck/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/doxia/linkcheck/LinkCheckTest.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/doxia/linkcheck/validation/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidatorTest.java (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/index-all.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/nolink.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test-resources/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test-resources/nolink.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test-resources/test1/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test-resources/test1/test1.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test-resources/test1/test2.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test1/
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/test1/test1.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/testA.html (with props)
maven/sandbox/trunk/doxia/doxia-linkcheck/src/test/resources/testExcludes.html (with props)
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml Sat Aug 25 14:14:27 2007
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>doxia-sandbox</artifactId>
+ <groupId>org.apache.maven.doxia</groupId>
+ <version>1.0-alpha-9-SNAPSHOT</version>
+ </parent>
+ <artifactId>doxia-linkcheck</artifactId>
+ <name>Doxia Linkcheck</name>
+ <version>1.0-alpha-9-SNAPSHOT</version>
+ <dependencies>
+ <!-- compile dependencies -->
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.0.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <!-- runtime dependencies -->
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.2</version>
+ <scope>runtime</scope>
+ </dependency>
+ <!-- test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/pom.xml
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,329 @@
+package org.apache.maven.doxia.linkcheck;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.maven.doxia.linkcheck.validation.LinkValidationItem;
+import org.apache.maven.doxia.linkcheck.validation.LinkValidationResult;
+import org.apache.maven.doxia.linkcheck.validation.LinkValidatorManager;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A file to be checked.
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class FileToCheck
+{
+ /** Log for debug output. */
+ private static final Log LOG = LogFactory.getLog( FileToCheck.class );
+
+ /** Unknown validation status. Initialized as null. */
+ public static final String STATUS_UNKNOWN = null;
+
+ /** Validation status ok. */
+ public static final String STATUS_OK = "OK";
+
+ /** The base of this FileToCheck. */
+ private String base;
+
+ /** The File object of this FileToCheck. */
+ private File fileToCheck;
+
+ /** A list of links found in this FileToCheck. */
+ private List links = new LinkedList();
+
+ /** A message. */
+ private String message = "";
+
+ /** The status. */
+ private String status = STATUS_OK;
+
+ /** successful. */
+ private int successful;
+
+ /** unsuccessful. */
+ private int unsuccessful;
+
+ /**
+ * Returns the message.
+ *
+ * @return String
+ */
+ public String getMessage()
+ {
+ return this.message;
+ }
+
+ /**
+ * Returns the fileName.
+ *
+ * @return String
+ */
+ public String getName()
+ {
+ String fileName = this.fileToCheck.getAbsolutePath();
+ if ( fileName.startsWith( this.base ) )
+ {
+ fileName = fileName.substring( this.base.length() + 1 );
+ }
+
+ fileName = fileName.replace( '\\', '/' );
+ return fileName;
+ }
+
+ /**
+ * Returns the list of results.
+ *
+ * @return List
+ */
+ public List getResults()
+ {
+ return this.links;
+ }
+
+ /**
+ * Returns the status.
+ *
+ * @return int
+ */
+ // TODO: replace by LinkValidationResult status.
+ public String getStatus()
+ {
+ return this.status;
+ }
+
+ /**
+ * Returns the successful.
+ *
+ * @return int
+ */
+ public int getSuccessful()
+ {
+ return this.successful;
+ }
+
+ /**
+ * Returns the unsuccessful.
+ *
+ * @return int
+ */
+ public int getUnsuccessful()
+ {
+ return this.unsuccessful;
+ }
+
+ /**
+ * Constructor: initializes the basedir and fileToCheck.
+ *
+ * @param baseFile The base file.
+ * @param file The file to check.
+ */
+ public FileToCheck( File baseFile, File file )
+ {
+ this.base = baseFile.getAbsolutePath();
+ this.fileToCheck = file;
+ }
+
+ /**
+ * Validates this fileToCheck.
+ *
+ * @param lvm The LinkValidatorManager to use.
+ * @throws Exception if something goes wrong.
+ */
+ public void check( LinkValidatorManager lvm ) throws Exception
+ {
+ this.successful = 0;
+
+ this.unsuccessful = 0;
+
+ this.status = STATUS_OK;
+
+ this.message = "";
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Validating " + getName() );
+ }
+
+ try
+ {
+ final Set hrefs;
+
+ try
+ {
+ hrefs = LinkMatcher.match( this.fileToCheck );
+ }
+ catch ( Throwable t )
+ {
+ // We catch Throwable, because there is a chance that the domReader will throw
+ // a stack overflow exception for some files
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.error( "Received: [" + t + "] in page [" + getName() + "]", t );
+ }
+ else
+ {
+ LOG.error( "Received: [" + t + "] in page [" + getName() + "]" );
+ }
+
+ LinkCheckResult lcr = new LinkCheckResult();
+
+ lcr.setStatus( "PARSE FAILURE" );
+
+ lcr.setTarget( "N/A" );
+
+ addResult( lcr );
+
+ return;
+ }
+
+ String href;
+
+ LinkCheckResult lcr;
+
+ LinkValidationItem lvi;
+
+ LinkValidationResult result;
+
+ for ( Iterator iter = hrefs.iterator(); iter.hasNext(); )
+ {
+ href = (String) iter.next();
+
+ lcr = new LinkCheckResult();
+
+ lvi = new LinkValidationItem( this.fileToCheck, href );
+
+ result = lvm.validateLink( lvi );
+
+ lcr.setTarget( href );
+
+ lcr.setErrorMessage( result.getErrorMessage() );
+
+ switch ( result.getStatus() )
+ {
+ case LinkValidationResult.VALID:
+ this.successful++;
+
+ lcr.setStatus( "valid" );
+
+ addResult( lcr ); // At some point we won't want to store valid links. The tests require that
+ // we do at present
+
+ break;
+ case LinkValidationResult.ERROR:
+ this.unsuccessful++;
+
+ lcr.setStatus( "error" );
+
+ addResult( lcr );
+
+ break;
+ case LinkValidationResult.WARNING:
+ this.unsuccessful++;
+
+ lcr.setStatus( "warning" );
+
+ addResult( lcr );
+
+ break;
+ case LinkValidationResult.UNKNOWN:
+ default:
+ this.unsuccessful++;
+
+ lcr.setStatus( "unknown" );
+
+ addResult( lcr );
+
+ break;
+ }
+ }
+
+ href = null;
+
+ lcr = null;
+
+ lvi = null;
+
+ result = null;
+
+ }
+ catch ( Exception e )
+ {
+ LOG.error( this.message );
+
+ throw e;
+ }
+ }
+
+ /**
+ * Returns an XML representation of the current linkcheck result.
+ * This is only available after {@link #check(LinkValidatorManager)} has been called.
+ *
+ * @return the XML linkcheck result as a string.
+ */
+ public String toXML()
+ {
+ StringBuffer buf = new StringBuffer();
+
+ buf.append( " <file>" + LinkCheck.EOL );
+
+ buf.append( " <name><![CDATA[" + getName() + "]]></name>" + LinkCheck.EOL );
+
+ buf.append( " <successful>" + getSuccessful() + "</successful>" + LinkCheck.EOL );
+
+ buf.append( " <unsuccessful>" + getUnsuccessful() + "</unsuccessful>" + LinkCheck.EOL );
+
+ Iterator iter = getResults().iterator();
+
+ LinkCheckResult result;
+
+ while ( iter.hasNext() )
+ {
+ result = (LinkCheckResult) iter.next();
+
+ buf.append( result.toXML() );
+ }
+
+ buf.append( " </file>" + LinkCheck.EOL );
+
+ return buf.toString();
+ }
+
+ /**
+ * Adds the given LinkCheckResult to the list of results.
+ *
+ * @param lcr the LinkCheckResult to add.
+ */
+ private void addResult( LinkCheckResult lcr )
+ {
+ this.links.add( lcr );
+ }
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/FileToCheck.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,513 @@
+package org.apache.maven.doxia.linkcheck;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.maven.doxia.linkcheck.validation.FileLinkValidator;
+import org.apache.maven.doxia.linkcheck.validation.LinkValidatorManager;
+import org.apache.maven.doxia.linkcheck.validation.MailtoLinkValidator;
+import org.apache.maven.doxia.linkcheck.validation.OfflineHTTPLinkValidator;
+import org.apache.maven.doxia.linkcheck.validation.OnlineHTTPLinkValidator;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * The main bean to be called whenever a set of documents should have their links checked.
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class LinkCheck
+{
+ /** Log. */
+ private static final Log LOG = LogFactory.getLog( LinkCheck.class );
+
+ /** The vm line separator. */
+ public static final String EOL = System.getProperty( "line.separator" );
+
+ /** FilenameFilter. */
+ private static final FilenameFilter CUSTOM_FF = new LinkCheck.CustomFilenameFilter();
+
+ /** One MegaByte. */
+ private static final long MEG = 1024 * 1024;
+
+ /** basedir. */
+ private File basedir;
+
+ /** cache. */
+ private String cache;
+
+ /** excludes. */
+ private String[] excludes = null;
+
+ /** method. */
+ private String method;
+
+ /** filesToCheck. */
+ private List filesToCheck = null;
+
+ /** LinkValidatorManager. */
+ private LinkValidatorManager lvm = null;
+
+ /** online mode. */
+ private boolean online;
+
+ /** Output file for xml document. */
+ private File output;
+
+ /** Output encoding for the xml document. */
+ private String outputEncoding;
+
+ /**
+ * Whether links are checked in online mode.
+ *
+ * @return online
+ */
+ public boolean isOnline()
+ {
+ return this.online;
+ }
+
+ /**
+ * Set the online mode.
+ *
+ * @param onLine online mode.
+ */
+ public void setOnline( boolean onLine )
+ {
+ this.online = onLine;
+ }
+
+
+ /**
+ * Get the base directory for the change log generator.
+ *
+ * @return the base directory
+ */
+ public File getBasedir()
+ {
+ return this.basedir;
+ }
+
+ /**
+ * Set the base directory for the change log generator.
+ *
+ * @param base the base directory
+ */
+ public void setBasedir( File base )
+ {
+ this.basedir = base;
+ }
+
+ /**
+ * Returns the cacheFile.
+ *
+ * @return String
+ */
+ public String getCache()
+ {
+ return this.cache;
+ }
+
+ /**
+ * Sets the cacheFile.
+ *
+ * @param cacheFile The cacheFile to set
+ */
+ public void setCache( String cacheFile )
+ {
+ this.cache = cacheFile;
+ }
+
+ /**
+ * Returns the excludes.
+ *
+ * @return String[]
+ */
+ public String[] getExcludes()
+ {
+ return this.excludes;
+ }
+
+ /**
+ * Sets the excludes, a String[] with exclude locations.
+ *
+ * @param excl The excludes to set
+ */
+ public void setExcludes( String[] excl )
+ {
+ this.excludes = excl;
+ }
+
+ /**
+ * The http method to use.
+ *
+ * @return the method
+ */
+ public String getMethod()
+ {
+ return this.method;
+ }
+
+ /**
+ * The http method to use. Currently supported are "get" and "head".
+ *
+ * @param meth the method to set.
+ */
+ public void setMethod( String meth )
+ {
+ this.method = meth;
+ }
+
+
+ /**
+ * Returns a list of {@link org.apache.maven.doxia.linkcheck.FileToCheck files} that have been checked.
+ * This is only available after {@link #doExecute()} has been called.
+ *
+ * @return the list of files.
+ */
+ public List getFiles()
+ {
+ return this.filesToCheck;
+ }
+
+ /**
+ * Sets the LinkValidatorManager.
+ *
+ * @param validator the LinkValidatorManager to set
+ */
+ public void setLinkValidatorManager( LinkValidatorManager validator )
+ {
+ this.lvm = validator;
+ }
+
+
+ /**
+ * Returns the LinkValidatorManager.
+ * If this hasn't been set before with {@link #setLinkValidatorManager(LinkValidatorManager)}
+ * a default LinkValidatorManager will be returned.
+ *
+ * @return the LinkValidatorManager
+ */
+ public LinkValidatorManager getLinkValidatorManager()
+ {
+ if ( this.lvm == null )
+ {
+ initDefaultLinkValidatorManager();
+ }
+
+ return this.lvm;
+ }
+
+ /**
+ * Intializes the current LinkValidatorManager to a default value.
+ */
+ private void initDefaultLinkValidatorManager()
+ {
+ this.lvm = new LinkValidatorManager();
+
+ if ( this.excludes != null )
+ {
+ this.lvm.setExcludes( excludes );
+ }
+
+ this.lvm.addLinkValidator( new FileLinkValidator() );
+
+ if ( isOnline() )
+ {
+ this.lvm.addLinkValidator( new OnlineHTTPLinkValidator() );
+ }
+ else
+ {
+ this.lvm.addLinkValidator( new OfflineHTTPLinkValidator() );
+ }
+
+ this.lvm.addLinkValidator( new MailtoLinkValidator() );
+ }
+
+ /**
+ * Set the output file for the log.
+ *
+ * @param file the output file.
+ */
+ public void setOutput( File file )
+ {
+ this.output = file;
+ }
+
+ /**
+ * Returns the outputEncoding.
+ *
+ * @return String
+ */
+ public String getOutputEncoding()
+ {
+ return this.outputEncoding;
+ }
+
+ /**
+ * Sets the outputEncoding.
+ *
+ * @param encoding The outputEncoding to set.
+ */
+ public void setOutputEncoding( String encoding )
+ {
+ this.outputEncoding = encoding;
+ }
+
+ /**
+ * Recurses through the given base directory and adds
+ * files to the given list that pass through the current filter.
+ *
+ * @param allFiles the list to fill
+ * @param base the base directory to traverse.
+ */
+ public void findFiles( List allFiles, File base )
+ {
+ File[] f = base.listFiles( CUSTOM_FF );
+
+ if ( f != null )
+ {
+ File file;
+ for ( int i = 0; i < f.length; i++ )
+ {
+ file = f[i];
+
+ if ( file.isDirectory() )
+ {
+ findFiles( allFiles, file );
+ }
+ else
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( " File - " + file );
+ }
+
+ allFiles.add( new FileToCheck( this.basedir, file ) );
+
+ if ( allFiles.size() % 100 == 0 )
+ {
+ LOG.info( "Found " + allFiles.size() + " files so far." );
+ }
+ }
+ }
+
+ file = null;
+ }
+
+ f = null;
+ }
+
+ /**
+ * Execute task.
+ *
+ * @throws IOException if there are problems
+ */
+ public void doExecute() throws IOException
+ {
+ if ( this.output == null )
+ {
+ throw new NullPointerException( "output must be set" );
+ }
+
+ if ( LOG.isDebugEnabled() )
+ {
+ displayMemoryConsumption();
+ }
+
+ LinkValidatorManager validator = getLinkValidatorManager();
+
+ this.filesToCheck = new LinkedList();
+
+ validator.loadCache( this.cache );
+
+ List files = new LinkedList();
+
+ LOG.debug( "Locating all files to be checked..." );
+
+ findFiles( files, this.basedir );
+
+ LOG.debug( "Located all files to be checked." );
+
+ LOG.info( "Found " + files.size() + " files to check." );
+
+ displayMemoryConsumption();
+
+ LOG.info( "Begin to check links in files..." );
+
+ Iterator fileIter = files.iterator();
+
+ FileToCheck flc;
+
+ while ( fileIter.hasNext() )
+ {
+ flc = (FileToCheck) fileIter.next();
+
+ try
+ {
+ this.filesToCheck.add( flc );
+ flc.check( validator );
+ }
+ catch ( Exception e )
+ {
+ LOG.error( "Error while checking : " + flc.getName(), e );
+ }
+ }
+
+ flc = null;
+
+ LOG.info( "Links checked." );
+
+ displayMemoryConsumption();
+
+ createDocument();
+
+ validator.saveCache( this.cache );
+
+ displayMemoryConsumption();
+ }
+
+ /**
+ * Returns an XML representation of the current linkcheck result.
+ *
+ * @return the XML linkcheck result as a string.
+ */
+ public String toXML()
+ {
+ StringBuffer buf = new StringBuffer();
+
+ buf.append( "<linkcheck>" + EOL );
+
+ FileToCheck ftc;
+
+ for ( Iterator iter = getFiles().iterator(); iter.hasNext(); )
+ {
+ ftc = (FileToCheck) iter.next();
+ buf.append( ftc.toXML() );
+ }
+
+ ftc = null;
+
+ buf.append( "</linkcheck>" + EOL );
+
+ return buf.toString();
+ }
+
+ /**
+ * Writes some memory data to the log (if debug enabled).
+ */
+ private void displayMemoryConsumption()
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ Runtime r = Runtime.getRuntime();
+ LOG.debug( "Memory: " + ( r.totalMemory() - r.freeMemory() ) / MEG + "M/" + r.totalMemory() / MEG
+ + "M" );
+ }
+ }
+
+ /**
+ * Create the XML document from the currently available details.
+ *
+ * @throws FileNotFoundException
+ * when the output file previously provided does not exist.
+ * @throws UnsupportedEncodingException
+ * when the platform doesn't support the current encoding.
+ */
+ private void createDocument() throws FileNotFoundException, UnsupportedEncodingException
+
+ {
+ File dir = this.output.getParentFile();
+
+ if ( dir != null )
+ {
+ dir.mkdirs();
+ }
+
+ PrintWriter out;
+
+ String encoding = getOutputEncoding();
+
+ if ( encoding == null )
+ {
+ OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream( this.output ) );
+ out = new PrintWriter( osw );
+ encoding = osw.getEncoding();
+ }
+ else
+ {
+ out = new PrintWriter( new OutputStreamWriter( new FileOutputStream( this.output ), encoding ) );
+ }
+
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append( "<?xml version=\"1.0\" encoding=\"" ).append( encoding ).append( "\" ?>" + EOL );
+
+ out.write( buffer.toString() );
+
+ out.write( toXML() );
+
+ out.close();
+
+ out = null;
+
+ buffer = null;
+
+ dir = null;
+ }
+
+ /** Custom FilenameFilter used to search html files */
+ static class CustomFilenameFilter implements FilenameFilter
+ {
+ /** {@inheritDoc} */
+ public boolean accept( File dir, String name )
+ {
+ File n = new File( dir, name );
+
+ if ( n.isDirectory() )
+ {
+ return true;
+ }
+
+ if ( name.endsWith( ".html" ) || name.endsWith( ".htm" ) )
+ {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheck.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,123 @@
+package org.apache.maven.doxia.linkcheck;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+/**
+ * An class containing the results of a single check of a link.
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class LinkCheckResult
+{
+ /** status. */
+ private String status;
+
+ /** target. */
+ private String target;
+
+ /** errorMessage. */
+ private String errorMessage;
+
+ /**
+ * Returns the status.
+ *
+ * @return String
+ */
+ public String getStatus()
+ {
+ return this.status;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param stat The status to set
+ */
+ public void setStatus( String stat )
+ {
+ this.status = stat;
+ }
+
+ /**
+ * Returns the target.
+ *
+ * @return String
+ */
+ public String getTarget()
+ {
+ return this.target;
+ }
+
+ /**
+ * Sets the target.
+ *
+ * @param targ The target to set
+ */
+ public void setTarget( String targ )
+ {
+ this.target = targ;
+ }
+
+ /**
+ * Returns the errorMessage.
+ *
+ * @return the errorMessage.
+ */
+ public String getErrorMessage()
+ {
+ return this.errorMessage;
+ }
+
+ /**
+
+ * @param message The errorMessage to set.
+ */
+ public void setErrorMessage( String message )
+ {
+ this.errorMessage = message;
+ }
+
+ /**
+ * Creates an XML representation of this link check result
+ *
+ * @return xml fragment representation of this result
+ */
+ public String toXML()
+ {
+ StringBuffer buf = new StringBuffer();
+
+ buf.append( " <result>" + LinkCheck.EOL );
+
+ buf.append( " <target>" + StringEscapeUtils.escapeXml( getTarget() ) + "</target>" + LinkCheck.EOL );
+
+ buf.append( " <status>" + getStatus() + "</status>" + LinkCheck.EOL );
+
+ buf.append( " <errorMessage>" + StringEscapeUtils.escapeXml( getErrorMessage() ) + "</errorMessage>" + LinkCheck.EOL );
+
+ buf.append( " </result>" + LinkCheck.EOL );
+
+ return buf.toString();
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkCheckResult.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,126 @@
+package org.apache.maven.doxia.linkcheck;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Link matcher. Reads the contents of a file and tries to match the following: <code>
+ * <a href=""....
+ * <link href=""....
+ * <img src=""....
+ * <script src=""....
+ * </code>
+ *
+ * @author <a href="mailto:mac@apache.org">Ignacio G. Mac Dowell </a>
+ * @version $Id$
+ */
+class LinkMatcher
+{
+
+ /** Regexp for link matching. */
+ private static final Pattern MATCH_PATTERN =
+ Pattern.compile( "<(?>link|a|img|script)[^>]*?(?>href|src)\\s*?=\\s*?[\\\"'](.*?)[\\\"'][^>]*?",
+ Pattern.CASE_INSENSITIVE );
+
+ /** No need to create a new object each time a file is processed. Just clear it. */
+ private static final Set LINK_LIST = new TreeSet();
+
+ /**
+ * Reads a file and returns a StringBuffer with its contents.
+ *
+ * TODO: Check for encoding issues
+ *
+ * TODO: Better exception handling?
+ *
+ * @param file the file we are reading
+ * @return a StringBuffer with file's contents.
+ * @throws IOException if something goes wrong.
+ */
+ private static StringBuffer fileToStringBuffer( File file ) throws IOException
+ {
+ BufferedReader reader = null;
+
+ final StringBuffer pageBuffer = new StringBuffer();
+
+ try
+ {
+ reader = new BufferedReader( new FileReader( file ) );
+
+ String line;
+
+ while ( ( line = reader.readLine() ) != null )
+ {
+ pageBuffer.append( line );
+ }
+ }
+ finally
+ {
+ reader.close();
+ }
+
+ return pageBuffer;
+ }
+
+ /**
+ * Performs the actual matching.
+ *
+ * @param file the file to check
+ * @return a set with all links to check
+ * @throws IOException if something goes wrong
+ */
+ static Set match( File file ) throws IOException
+ {
+ LINK_LIST.clear();
+
+ final Matcher m = MATCH_PATTERN.matcher( fileToStringBuffer( file ) );
+
+ String link;
+
+ while ( m.find() )
+ {
+ link = m.group( 1 ).trim();
+
+ if ( link.length() < 1 )
+ {
+ continue;
+ }
+ else if ( link.toLowerCase().indexOf( "javascript" ) != -1 )
+ {
+ continue;
+ }
+ // else if (link.toLowerCase().indexOf("mailto:") != -1) {
+ // continue;
+ // }
+
+ LINK_LIST.add( link );
+ }
+
+ return LINK_LIST;
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/LinkMatcher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,98 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+/**
+ * A link validator solely for files on the local filesystem.
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class FileLinkValidator implements LinkValidator
+{
+ /** {@inheritDoc} */
+ public LinkValidationResult validateLink( LinkValidationItem lvi )
+ {
+ File f = getFile( lvi );
+
+ if ( f.exists() )
+ {
+ return new LinkValidationResult( LinkValidationResult.VALID, false, "" );
+ }
+ else
+ {
+ return new LinkValidationResult( LinkValidationResult.ERROR, false, "doesn't exist." );
+ }
+ }
+
+ /** {@inheritDoc} */
+ public Object getResourceKey( LinkValidationItem lvi )
+ {
+ String link = lvi.getLink();
+
+ // If we find an http(s) link or a mail link, it's not good
+ if ( link.startsWith( "http://" ) || link.startsWith( "https://" ) || link.indexOf( '@' ) != -1 )
+ {
+ return null;
+ }
+
+ return getFile( lvi ).getAbsolutePath();
+ }
+
+ /**
+ * Returns the link of the given LinkValidationItem as a File.
+ *
+ * @param lvi The LinkValidationItem.
+ * @return File the link as a File.
+ */
+ protected File getFile( LinkValidationItem lvi )
+ {
+ String link = lvi.getLink();
+
+ if ( link.indexOf( '#' ) != -1 )
+ {
+ link = link.substring( 0, link.indexOf( '#' ) );
+
+ // If the link was just #fred or similar, then the file is the file it came from
+ // XXX: Theoretically we could even validate the anchor tag?
+ if ( link.trim().length() == 0 )
+ {
+ return lvi.getSource();
+ }
+ }
+ if ( link.indexOf( '?' ) != -1 )
+ {
+ link = link.substring( 0, link.indexOf( '?' ) );
+
+ // If the link was just ?param=something or similar, then the file is the file it came from
+ // XXX: Theoretically we could even validate the anchor tag?
+ if ( link.trim().length() == 0 )
+ {
+ return lvi.getSource();
+ }
+ }
+
+ return new File( lvi.getSource().getParentFile(), link );
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/FileLinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,51 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Checks links which are normal URLs
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public abstract class HTTPLinkValidator implements LinkValidator
+{
+ /** {@inheritDoc} */
+ public Object getResourceKey( LinkValidationItem lvi )
+ {
+ String link = lvi.getLink();
+
+ if ( !link.startsWith( "http://" ) && !link.startsWith( "https://" ) )
+ {
+ return null;
+ }
+
+ int hashPos = link.indexOf( "#" );
+
+ if ( hashPos != -1 )
+ {
+ link = link.substring( 0, hashPos );
+ }
+
+ return link;
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/HTTPLinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,103 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public class LinkValidationItem
+{
+ /** The source. */
+ private final File source;
+
+ /** The link. */
+ private final String link;
+
+ /**
+ * Constructor: initializes the source and link.
+ *
+ * @param src The source, cannot be null.
+ * @param lnk The link, cannot be null.
+ */
+ public LinkValidationItem( File src, String lnk )
+ {
+ if ( src == null )
+ {
+ throw new NullPointerException( "source can't be null" );
+ }
+
+ if ( lnk == null )
+ {
+ throw new NullPointerException( "link can't be null" );
+ }
+
+ this.source = src;
+ this.link = lnk;
+ }
+
+ /**
+ * Returns the link.
+ *
+ * @return String
+ */
+ public String getLink()
+ {
+ return this.link;
+ }
+
+ /**
+ * Returns the source.
+ *
+ * @return File
+ */
+ public File getSource()
+ {
+ return this.source;
+ }
+
+ /** {@inheritDoc} */
+ public boolean equals( Object obj )
+ {
+ LinkValidationItem lvi = (LinkValidationItem) obj;
+
+ if ( !lvi.link.equals( this.link ) )
+ {
+ return false;
+ }
+
+ if ( !lvi.source.equals( this.source ) )
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ public int hashCode()
+ {
+ return this.source.hashCode() ^ this.link.hashCode();
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationItem.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,115 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * This class is used to return status responses from the validation handlers. A persistent result means that it can be
+ * stored in the persistent cache and used across runs.
+ * </p>
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public class LinkValidationResult implements Serializable
+{
+ /** serialVersionUID. */
+ private static final long serialVersionUID = -8346824125135406813L;
+
+ /** Validation result: not mine. */
+ public static final int NOTMINE = 0;
+
+ /** Validation result: error. */
+ public static final int ERROR = 1;
+
+ /** Validation result: valid. */
+ public static final int VALID = 2;
+
+ /** Validation result: unknown. */
+ public static final int UNKNOWN = 3;
+
+ /** Validation result: warning. */
+ public static final int WARNING = 4;
+
+ /** The persistent property. */
+ private final boolean persistent;
+
+ /** The status. */
+ private final int status;
+
+ /** The error message. */
+ private final String errorMessage;
+
+ /**
+ * Returns the persistent property.
+ *
+ * @return boolean
+ */
+ public boolean isPersistent()
+ {
+ return this.persistent;
+ }
+
+ /**
+ * Returns the status.
+ *
+ * @return int
+ */
+ public int getStatus()
+ {
+ return this.status;
+ }
+
+ /**
+ * Returns the errorMessage.
+ *
+ * @return the errorMessage.
+ */
+ public String getErrorMessage()
+ {
+ return this.errorMessage;
+ }
+
+ /**
+ * Constructor: initializes status, persistent and errorMessage.
+ *
+ * @param stat The status.
+ * @param pers The persistent.
+ * @param message The errorMessage.
+ */
+ public LinkValidationResult( int stat, boolean pers, String message )
+ {
+ this.status = stat;
+
+ this.persistent = pers;
+
+ this.errorMessage = message;
+ }
+
+ /** {@inheritDoc} */
+ public String toString()
+ {
+ return this.persistent + "/" + this.status + "/" + this.errorMessage;
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidationResult.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,46 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public interface LinkValidator
+{
+ /**
+ * If getResourceKey(lvi) returned null, this will NOT be called.
+ *
+ * @param lvi The LinkValidationItem to validate.
+ * @return The LinkValidationResult.
+ * @throws Exception if something goes wrong.
+ */
+ LinkValidationResult validateLink( LinkValidationItem lvi ) throws Exception;
+
+ /**
+ * The resource key is used by the cache to determine if it really needs to validate the link. No actual validation
+ * should be done at this point.
+ *
+ * @param lvi The LinkValidationItem to validate.
+ * @return Object null if this validator should not be doing this work.
+ */
+ Object getResourceKey( LinkValidationItem lvi );
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,323 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InvalidClassException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+
+public class LinkValidatorManager implements Serializable
+{
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 2467928182206500945L;
+
+ /** Log for debug output. */
+ private static final Log LOG = LogFactory.getLog( LinkValidatorManager.class );
+
+ /** validators. */
+ private List validators = new LinkedList();
+
+ /** excludes. */
+ private String[] excludes = new String[0];
+
+ /** cache. */
+ private Map cache = new HashMap();
+
+ /**
+ * Returns the list of validators.
+ *
+ * @return List
+ */
+ public List getValidators()
+ {
+ return this.validators;
+ }
+
+ /**
+ * Returns the excludes.
+ *
+ * @return String[]
+ */
+ public String[] getExcludes()
+ {
+ return this.excludes;
+ }
+
+ /**
+ * Sets the excludes.
+ *
+ * @param excl The excludes to set.
+ */
+ public void setExcludes( String[] excl )
+ {
+ this.excludes = excl;
+ }
+
+ /**
+ * Adds a LinkValidator to this manager.
+ *
+ * @param lv The LinkValidator to add.
+ */
+ public void addLinkValidator( LinkValidator lv )
+ {
+ this.validators.add( lv );
+ }
+
+ /**
+ * Validates the links of the given LinkValidationItem.
+ *
+ * @param lvi The LinkValidationItem to validate.
+ * @return A LinkValidationResult.
+ * @throws Exception if something goes wrong.
+ */
+ public LinkValidationResult validateLink( LinkValidationItem lvi ) throws Exception
+ {
+ {
+ LinkValidationResult status = getCachedResult( lvi );
+
+ if ( status != null )
+ {
+ return status;
+ }
+ }
+
+ for ( int i = 0; i < this.excludes.length; i++ )
+ {
+ if ( this.excludes[i] != null && lvi.getLink().startsWith( this.excludes[i] ) )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Excluded " + lvi.getLink() );
+ }
+
+ return new LinkValidationResult( LinkValidationResult.VALID, false, "" );
+ }
+ }
+
+ Iterator iter = this.validators.iterator();
+
+ LinkValidator lv;
+
+ Object resourceKey;
+
+ LinkValidationResult lvr;
+
+ while ( iter.hasNext() )
+ {
+ lv = (LinkValidator) iter.next();
+
+ resourceKey = lv.getResourceKey( lvi );
+
+ if ( resourceKey != null )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( lv.getClass().getName() + " - Checking link " + lvi.getLink() );
+ }
+
+ lvr = lv.validateLink( lvi );
+
+ if ( lvr.getStatus() == LinkValidationResult.NOTMINE )
+ {
+ continue;
+ }
+
+ setCachedResult( resourceKey, lvr );
+
+ return lvr;
+ }
+ }
+
+ lv = null;
+
+ resourceKey = null;
+
+ lvr = null;
+
+ LOG.error( "Unable to validate link : " + lvi.getLink() );
+
+ return new LinkValidationResult( LinkValidationResult.UNKNOWN, false, "No validator found for this link" );
+ }
+
+ /**
+ * Loads a cache file.
+ *
+ * @param cacheFilename The name of the cache file.
+ */
+ public void loadCache( String cacheFilename )
+ {
+ try
+ {
+ File f = new File( cacheFilename );
+
+ if ( f.exists() )
+ {
+ ObjectInputStream is = new ObjectInputStream( new FileInputStream( cacheFilename ) );
+
+ this.cache = (Map) is.readObject();
+
+ is.close();
+ }
+ }
+ catch ( InvalidClassException e )
+ {
+ LOG.warn( "Your cache is incompatible with this new release of linkcheck. It will be recreated." );
+ }
+ catch ( Throwable t )
+ {
+ LOG.error( "Unable to load the cache: " + cacheFilename, t );
+ }
+ }
+
+ /**
+ * Saves a cache file.
+ *
+ * @param cacheFilename The name of the cache file.
+ */
+ public void saveCache( String cacheFilename )
+ {
+ try
+ {
+ // Remove non-persistent items from cache
+ Map persistentCache = new HashMap();
+
+ Iterator iter = this.cache.keySet().iterator();
+
+ Object resourceKey;
+
+ while ( iter.hasNext() )
+ {
+ resourceKey = iter.next();
+
+ if ( ( (LinkValidationResult) this.cache.get( resourceKey ) ).isPersistent() )
+ {
+ persistentCache.put( resourceKey, this.cache.get( resourceKey ) );
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "[" + resourceKey + "] with result [" + this.cache.get( resourceKey )
+ + "] is stored in the cache." );
+ }
+ }
+ }
+
+ File cacheFile = new File( cacheFilename );
+
+ File dir = cacheFile.getParentFile();
+
+ if ( dir != null )
+ {
+ dir.mkdirs();
+ }
+
+ ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream( cacheFilename ) );
+
+ os.writeObject( persistentCache );
+
+ os.close();
+
+ persistentCache = null;
+
+ iter = null;
+
+ resourceKey = null;
+
+ cacheFile = null;
+
+ dir = null;
+
+ os = null;
+ }
+ catch ( Throwable t )
+ {
+ LOG.error( "Unable to save the cache: " + cacheFilename, t );
+ }
+ }
+
+ /**
+ * Returns a LinkValidationResult for the given LinkValidationItem
+ * if it has been cached from a previous run, returns null otherwise.
+ *
+ * @param lvi The LinkValidationItem.
+ * @return LinkValidationResult
+ */
+ public LinkValidationResult getCachedResult( LinkValidationItem lvi )
+ {
+ Iterator iter = getValidators().iterator();
+
+ LinkValidator lv;
+
+ Object resourceKey;
+
+ while ( iter.hasNext() )
+ {
+ lv = (LinkValidator) iter.next();
+
+ resourceKey = lv.getResourceKey( lvi );
+
+ if ( resourceKey != null && this.cache.containsKey( resourceKey ) )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "The cache returns for [" + resourceKey + "] the result ["
+ + this.cache.get( resourceKey ) + "]." );
+ }
+
+ return (LinkValidationResult) this.cache.get( resourceKey );
+ }
+ }
+
+ lv = null;
+
+ resourceKey = null;
+
+ return null;
+ }
+
+ /**
+ * Puts the given LinkValidationResult into the cache.
+ *
+ * @param resourceKey The key to retrieve the result.
+ * @param lvr the LinkValidationResult to cache.
+ */
+ public void setCachedResult( Object resourceKey, LinkValidationResult lvr )
+ {
+ this.cache.put( resourceKey, lvr );
+ }
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/LinkValidatorManager.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,53 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Validates mailto links
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class MailtoLinkValidator implements LinkValidator
+{
+ /** The (unique) LinkValidationResult to be returned by this LinkValidator. */
+ private static final LinkValidationResult LVR = new LinkValidationResult( LinkValidationResult.VALID, false, "" );
+
+ /** {@inheritDoc} */
+ public LinkValidationResult validateLink( LinkValidationItem lvi ) throws Exception
+ {
+ return LVR;
+ }
+
+ /** {@inheritDoc} */
+ public Object getResourceKey( LinkValidationItem lvi )
+ {
+ if ( lvi.getLink().indexOf( '@' ) != -1 )
+ {
+ return lvi.getLink();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/MailtoLinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,37 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Fake links check when maven is offline
+ *
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class OfflineHTTPLinkValidator extends HTTPLinkValidator
+{
+
+ /** {@inheritDoc} */
+ public LinkValidationResult validateLink( LinkValidationItem lvi )
+ {
+ return new LinkValidationResult( LinkValidationResult.WARNING, false, "Maven is offline. Link not checked." );
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OfflineHTTPLinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java?rev=569735&view=auto
==============================================================================
--- maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java (added)
+++ maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java Sat Aug 25 14:14:27 2007
@@ -0,0 +1,416 @@
+package org.apache.maven.doxia.linkcheck.validation;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+
+import java.net.URL;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.NTCredentials;
+import org.apache.commons.httpclient.StatusLine;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * Checks links which are normal URLs
+ *
+ * @author <a href="mailto:bwalding@apache.org">Ben Walding</a>
+ * @author <a href="mailto:aheritier@apache.org">Arnaud Heritier</a>
+ * @version $Id$
+ */
+public final class OnlineHTTPLinkValidator extends HTTPLinkValidator
+{
+ /** Log for debug output. */
+ private static final Log LOG = LogFactory.getLog( OnlineHTTPLinkValidator.class );
+
+ /** The maximum number of redirections for a link. */
+ private static final int MAX_NB_REDIRECT = 10;
+
+ /** Use the get method to test pages. */
+ private static final String GET_METHOD = "get";
+
+ /** Use the head method to test pages. */
+ private static final String HEAD_METHOD = "head";
+
+ /** The proxy host. */
+ private String proxyHost;
+
+ /** The proxy port. */
+ private int proxyPort;
+
+ /** The proxy user. */
+ private String proxyUser;
+
+ /** The proxy pass. */
+ private String proxyPass;
+
+ /** The proxy NtlmHost. */
+ private String proxyNtlmHost;
+
+ /** The proxy NtlmDomain. */
+ private String proxyNtlmDomain;
+
+ /** The http method to use. */
+ private String method = HEAD_METHOD;
+
+ /** The HttpClient. */
+ private transient HttpClient cl;
+
+ /**
+ * Constructor: initialize settings, use "head" method.
+ */
+ public OnlineHTTPLinkValidator()
+ {
+ this( HEAD_METHOD );
+ }
+
+ /**
+ * Constructor: initialize settings.
+ *
+ * @param meth The http method to use. Should be one of "head" or "get".
+ */
+ public OnlineHTTPLinkValidator( String meth )
+ {
+ this( meth, null, null, null, null, null, null );
+ }
+
+ /**
+ * Constructor: initialize settings.
+ *
+ * @param meth The http method to use. Should be one of "head" or "get".
+ * @param pHost The proxy host.
+ * @param pPort The proxy port.
+ * @param pUser The proxy user.
+ * @param pPass The proxy pass.
+ * @param pNtlmHost The proxy NtlmHost.
+ * @param pNtlmDomain The proxy NtlmDomain.
+ */
+ public OnlineHTTPLinkValidator( String meth, String pHost, String pPort, String pUser,
+ String pPass, String pNtlmHost, String pNtlmDomain )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Will use method : [" + meth + "]" );
+ }
+
+ this.method = meth;
+
+ if ( pHost == null || pHost.trim().equals( "" ) )
+ {
+ this.proxyHost = null;
+ }
+ else
+ {
+ this.proxyHost = pHost;
+
+ if ( pPort != null )
+ {
+ try
+ {
+ this.proxyPort = Integer.parseInt( pPort );
+ }
+ catch ( NumberFormatException e )
+ {
+ LOG.warn( "Invalid number for Proxy Port:" + pPort );
+ LOG.warn( "Proxy Port won't be used." );
+ this.proxyPort = -1;
+ }
+ }
+
+ this.proxyUser = pUser;
+
+ this.proxyPass = pPass;
+
+ if ( pNtlmHost != null && !pNtlmHost.trim().equals( "" ) )
+ {
+ this.proxyNtlmHost = pNtlmHost;
+ this.proxyNtlmDomain = pNtlmDomain;
+ }
+
+ }
+
+ initHttpClient();
+ }
+
+ /** {@inheritDoc} */
+ public LinkValidationResult validateLink( LinkValidationItem lvi )
+ {
+ if ( this.cl == null )
+ {
+ initHttpClient();
+ }
+
+ try
+ {
+ String link = lvi.getLink();
+
+ HttpMethod hm = null;
+
+ try
+ {
+ hm = checkLink( link, 0 );
+ }
+ catch ( Throwable t )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.error( "Received: [" + t + "] for [" + lvi.getLink() + "] in page [" + lvi.getSource() + "]", t );
+ }
+ else
+ {
+ LOG.error( "Received: [" + t + "] for [" + lvi.getLink() + "] in page [" + lvi.getSource() + "]" );
+ }
+
+ return new LinkValidationResult( LinkValidationResult.ERROR, false, t.getClass().getName() + " : "
+ + t.getMessage() );
+ }
+
+ if ( hm == null )
+ {
+ return new LinkValidationResult( LinkValidationResult.ERROR, false, "Cannot retreive HTTP Status" );
+ }
+
+ if ( hm.getStatusCode() == HttpStatus.SC_OK )
+ {
+ return new LinkValidationResult( LinkValidationResult.VALID, true, hm.getStatusCode() + " "
+ + hm.getStatusText() );
+ }
+ else
+ {
+ // 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 [" + lvi.getLink() + "] in page ["
+ + lvi.getSource() + "]" );
+
+ return new LinkValidationResult( LinkValidationResult.WARNING, true, hm.getStatusCode() + " "
+ + hm.getStatusText() );
+ }
+ else
+ {
+ LOG.error( "Received: [" + hm.getStatusCode() + "] for [" + lvi.getLink() + "] in page ["
+ + lvi.getSource() + "]" );
+
+ return new LinkValidationResult( LinkValidationResult.ERROR, false, hm.getStatusCode() + " "
+ + hm.getStatusText() );
+ }
+ }
+
+ }
+ catch ( Throwable t )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.error( "Received: [" + t + "] for [" + lvi.getLink() + "] in page [" + lvi.getSource() + "]", t );
+ }
+ else
+ {
+ LOG.error( "Received: [" + t + "] for [" + lvi.getLink() + "] in page [" + lvi.getSource() + "]" );
+ }
+
+ return new LinkValidationResult( LinkValidationResult.ERROR, false, t.getMessage() );
+ }
+ }
+
+ /** Initialize the HttpClient. */
+ private void initHttpClient()
+ {
+ 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)" );
+
+ this.cl = new HttpClient( new MultiThreadedHttpConnectionManager() );
+
+ HostConfiguration hc = new HostConfiguration();
+
+ HttpState state = new HttpState();
+
+ if ( this.proxyHost != null )
+ {
+ hc.setProxy( this.proxyHost, this.proxyPort );
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Proxy Host:" + this.proxyHost );
+ LOG.debug( "Proxy Port:" + this.proxyPort );
+ }
+
+ if ( this.proxyUser != null && this.proxyPass != null )
+ {
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Proxy User:" + this.proxyUser );
+ }
+
+ Credentials credentials;
+
+ if ( this.proxyNtlmHost != null )
+ {
+ credentials =
+ new NTCredentials( this.proxyUser, this.proxyPass, this.proxyNtlmHost, this.proxyNtlmDomain );
+ }
+ else
+ {
+ credentials = new UsernamePasswordCredentials( this.proxyUser, this.proxyPass );
+ }
+
+ state.setProxyCredentials( null, null, credentials );
+ }
+
+ }
+ else
+ {
+ LOG.debug( "Not using a proxy" );
+ }
+
+ this.cl.setHostConfiguration( hc );
+
+ this.cl.setState( state );
+
+ LOG.debug( "New HttpClient instance created." );
+ }
+
+ /**
+ * Checks the given link.
+ *
+ * @param link the link to check.
+ * @param nbRedirect the number of current redirects.
+ * @return HttpMethod
+ * @throws IOException if something goes wrong.
+ */
+ private HttpMethod checkLink( String link, int nbRedirect )
+ throws IOException
+ {
+ if ( nbRedirect > MAX_NB_REDIRECT )
+ {
+ throw new HttpException( "Maximum number of redirections (" + MAX_NB_REDIRECT + ") exceeded" );
+ }
+
+ HttpMethod hm;
+
+ if ( HEAD_METHOD.equals( this.method ) )
+ {
+ hm = new HeadMethod( link );
+ }
+ else if ( GET_METHOD.equals( this.method ) )
+ {
+ hm = new GetMethod( link );
+ }
+ else
+ {
+ LOG.error( "Unsupported method: " + method + ", using 'get'." );
+ hm = new GetMethod( link );
+ }
+
+ try
+ {
+ // We want to do it manually
+ hm.setFollowRedirects( false );
+
+ URL url = new URL( link );
+
+ cl.getHostConfiguration().setHost( url.getHost(), url.getPort(), url.getProtocol() );
+
+ cl.executeMethod( hm );
+
+ StatusLine sl = hm.getStatusLine();
+
+ if ( sl == null )
+ {
+ 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 )
+ {
+ Header locationHeader = hm.getResponseHeader( "location" );
+
+ if ( locationHeader == null )
+ {
+ LOG.error( "Site sent redirect, but did not set Location header" );
+ return hm;
+ }
+ else
+ {
+ String newLink = locationHeader.getValue();
+
+ // Be careful to absolute/relative links
+ if ( !newLink.startsWith( "http://" ) && !newLink.startsWith( "https://" ) )
+ {
+ if ( newLink.startsWith( "/" ) )
+ {
+ URL oldUrl = new URL( link );
+
+ newLink =
+ oldUrl.getProtocol() + "://" + oldUrl.getHost()
+ + ( oldUrl.getPort() > 0 ? ":" + oldUrl.getPort() : "" ) + newLink;
+ }
+ else
+ {
+ newLink = link + newLink;
+ }
+ }
+
+ HttpMethod oldHm = hm;
+
+ LOG.info( "[" + link + "] is redirected to [" + newLink + "]" );
+
+ oldHm.releaseConnection();
+
+ hm = checkLink( newLink, nbRedirect + 1 );
+
+ // Restore the hm to "Moved permanently" | "Moved temporarily" | "Temporary redirect"
+ // if the new location is found to allow us to report it
+ if ( hm.getStatusCode() == HttpStatus.SC_OK && nbRedirect == 0 )
+ {
+ return oldHm;
+ }
+ }
+ }
+
+ }
+ finally
+ {
+ hm.releaseConnection();
+ }
+
+ return hm;
+ }
+
+}
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/sandbox/trunk/doxia/doxia-linkcheck/src/main/java/org/apache/maven/doxia/linkcheck/validation/OnlineHTTPLinkValidator.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"