You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2013/02/09 15:24:20 UTC

git commit: [WAGON-388] retain jsoup HtmlFileListParser implementation

Updated Branches:
  refs/heads/master 24a54ebe7 -> 5fcc6315d


[WAGON-388] retain jsoup HtmlFileListParser implementation

Project: http://git-wip-us.apache.org/repos/asf/maven-wagon/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-wagon/commit/5fcc6315
Tree: http://git-wip-us.apache.org/repos/asf/maven-wagon/tree/5fcc6315
Diff: http://git-wip-us.apache.org/repos/asf/maven-wagon/diff/5fcc6315

Branch: refs/heads/master
Commit: 5fcc6315da6ea3e48bd1da9e03c0ca706d236e16
Parents: 24a54eb
Author: Hervé Boutemy <hb...@apache.org>
Authored: Sat Feb 9 15:24:16 2013 +0100
Committer: Hervé Boutemy <hb...@apache.org>
Committed: Sat Feb 9 15:24:16 2013 +0100

----------------------------------------------------------------------
 wagon-providers/pom.xml                            |    1 -
 wagon-providers/wagon-http-lightweight/pom.xml     |    2 +-
 .../wagon/providers/http/LightweightHttpWagon.java |    2 +-
 wagon-providers/wagon-http-shared4/pom.xml         |    4 +-
 .../wagon/shared/http/HtmlFileListParser.java      |  164 ++++
 .../wagon/shared/http4/HtmlFileListParser.java     |  164 ----
 .../wagon/shared/http/HtmlFileListParserTest.java  |  729 +++++++++++++++
 .../wagon/shared/http4/HtmlFileListParserTest.java |  728 --------------
 wagon-providers/wagon-http/pom.xml                 |    2 +-
 .../maven/wagon/providers/http/HttpWagon.java      |    2 +-
 wagon-providers/wagon-webdav-jackrabbit/pom.xml    |    5 -
 11 files changed, 899 insertions(+), 904 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/pom.xml
----------------------------------------------------------------------
diff --git a/wagon-providers/pom.xml b/wagon-providers/pom.xml
index 1d38b16..7b25726 100644
--- a/wagon-providers/pom.xml
+++ b/wagon-providers/pom.xml
@@ -34,7 +34,6 @@ under the License.
   <modules>
     <module>wagon-file</module>
     <module>wagon-ftp</module>
-    <module>wagon-http-shared4</module>
     <module>wagon-http</module>
     <module>wagon-http-shared</module>
     <module>wagon-http-lightweight</module>

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-lightweight/pom.xml
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-lightweight/pom.xml b/wagon-providers/wagon-http-lightweight/pom.xml
index 9b7c691..5c2df12 100644
--- a/wagon-providers/wagon-http-lightweight/pom.xml
+++ b/wagon-providers/wagon-http-lightweight/pom.xml
@@ -36,7 +36,7 @@ under the License.
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>wagon-http-shared4</artifactId>
+      <artifactId>wagon-http-shared</artifactId>
       <version>${project.version}</version>
     </dependency>
 

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java b/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
index b15d059..ff1a25d 100644
--- a/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
+++ b/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
@@ -31,7 +31,7 @@ import org.apache.maven.wagon.authorization.AuthorizationException;
 import org.apache.maven.wagon.events.TransferEvent;
 import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.resource.Resource;
-import org.apache.maven.wagon.shared.http4.HtmlFileListParser;
+import org.apache.maven.wagon.shared.http.HtmlFileListParser;
 import org.codehaus.plexus.util.Base64;
 
 import java.io.FileNotFoundException;

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-shared4/pom.xml
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-shared4/pom.xml b/wagon-providers/wagon-http-shared4/pom.xml
index dc1009a..d48f5ba 100644
--- a/wagon-providers/wagon-http-shared4/pom.xml
+++ b/wagon-providers/wagon-http-shared4/pom.xml
@@ -27,8 +27,8 @@ under the License.
     <relativePath>../pom.xml</relativePath>
   </parent>
 
-  <artifactId>wagon-http-shared4</artifactId>
-  <name>Apache Maven Wagon :: Providers :: HTTP Shared Library 4</name>
+  <artifactId>wagon-http-shared</artifactId>
+  <name>Apache Maven Wagon :: Providers :: HTTP Shared Library</name>
   <description>
     Shared Library for wagon providers supporting HTTP.
   </description>

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java b/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java
new file mode 100644
index 0000000..9f571f9
--- /dev/null
+++ b/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java
@@ -0,0 +1,164 @@
+package org.apache.maven.wagon.shared.http;
+
+/*
+ * 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.io.IOUtils;
+import org.apache.maven.wagon.TransferFailedException;
+import org.codehaus.plexus.util.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * Html File List Parser.
+ */
+public class HtmlFileListParser
+{
+    // Apache Fancy Index Sort Headers
+    private static final Pattern APACHE_INDEX_SKIP = Pattern.compile( "\\?[CDMNS]=.*" );
+
+    // URLs with excessive paths.
+    private static final Pattern URLS_WITH_PATHS = Pattern.compile( "/[^/]*/" );
+
+    // URLs that to a parent directory.
+    private static final Pattern URLS_TO_PARENT = Pattern.compile( "\\.\\./" );
+
+    // mailto urls
+    private static final Pattern MAILTO_URLS = Pattern.compile( "mailto:.*" );
+
+    private static final Pattern[] SKIPS =
+        new Pattern[]{ APACHE_INDEX_SKIP, URLS_WITH_PATHS, URLS_TO_PARENT, MAILTO_URLS };
+
+    /**
+     * Fetches a raw HTML from a provided InputStream, parses it, and returns the file list.
+     *
+     * @param stream the input stream.
+     * @return the file list.
+     * @throws TransferFailedException if there was a problem fetching the raw html.
+     */
+    public static List<String> parseFileList( String baseurl, InputStream stream )
+        throws TransferFailedException
+    {
+        try
+        {
+            URI baseURI = new URI( baseurl );
+            // to make debugging easier, start with a string. This is assuming UTF-8, which might not be a safe
+            // assumption.
+            String content = IOUtils.toString( stream, "utf-8" );
+            Document doc = Jsoup.parse( content, baseurl );
+            Elements links = doc.select("a[href]");
+            Set<String> results = new HashSet<String>();
+            for ( int lx = 0; lx < links.size(); lx++ )
+            {
+                Element link = links.get( lx );
+                /*
+                 * The abs:href loses directories, so we deal with absolute paths ourselves below in cleanLink
+                 */
+                String target = link.attr( "href" );
+                if ( target != null )
+                {
+                    String clean = cleanLink( baseURI, target );
+                    if ( isAcceptableLink( clean ) )
+                    {
+                        results.add( clean );
+                    }
+                }
+
+            }
+
+            return new ArrayList<String>( results );
+        }
+        catch ( URISyntaxException e )
+        {
+            throw new TransferFailedException( "Unable to parse as base URI: " + baseurl, e );
+        }
+        catch ( IOException e )
+        {
+            throw new TransferFailedException( "I/O error reading HTML listing of artifacts: " + e.getMessage(), e );
+        }
+    }
+
+    private static String cleanLink( URI baseURI, String link )
+    {
+        if ( StringUtils.isEmpty( link ) )
+        {
+            return "";
+        }
+
+        String ret = link;
+
+        try
+        {
+            URI linkuri = new URI( ret );
+            if ( link.startsWith( "/" ) )
+            {
+                linkuri = baseURI.resolve( linkuri );
+            }
+            URI relativeURI = baseURI.relativize( linkuri ).normalize();
+            ret = relativeURI.toASCIIString();
+            if ( ret.startsWith( baseURI.getPath() ) )
+            {
+                ret = ret.substring( baseURI.getPath().length() );
+            }
+
+            ret = URLDecoder.decode( ret, "UTF-8" );
+        }
+        catch ( URISyntaxException e )
+        {
+        }
+        catch ( UnsupportedEncodingException e )
+        {
+        }
+
+        return ret;
+    }
+
+    private static boolean isAcceptableLink( String link )
+    {
+        if ( StringUtils.isEmpty( link ) )
+        {
+            return false;
+        }
+
+        for ( int i = 0; i < SKIPS.length; i++ )
+        {
+            if ( SKIPS[i].matcher( link ).find() )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http4/HtmlFileListParser.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http4/HtmlFileListParser.java b/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http4/HtmlFileListParser.java
deleted file mode 100644
index 01303f5..0000000
--- a/wagon-providers/wagon-http-shared4/src/main/java/org/apache/maven/wagon/shared/http4/HtmlFileListParser.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package org.apache.maven.wagon.shared.http4;
-
-/*
- * 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.io.IOUtils;
-import org.apache.maven.wagon.TransferFailedException;
-import org.codehaus.plexus.util.StringUtils;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Html File List Parser.
- */
-public class HtmlFileListParser
-{
-    // Apache Fancy Index Sort Headers
-    private static final Pattern APACHE_INDEX_SKIP = Pattern.compile( "\\?[CDMNS]=.*" );
-
-    // URLs with excessive paths.
-    private static final Pattern URLS_WITH_PATHS = Pattern.compile( "/[^/]*/" );
-
-    // URLs that to a parent directory.
-    private static final Pattern URLS_TO_PARENT = Pattern.compile( "\\.\\./" );
-
-    // mailto urls
-    private static final Pattern MAILTO_URLS = Pattern.compile( "mailto:.*" );
-
-    private static final Pattern[] SKIPS =
-        new Pattern[]{ APACHE_INDEX_SKIP, URLS_WITH_PATHS, URLS_TO_PARENT, MAILTO_URLS };
-
-    /**
-     * Fetches a raw HTML from a provided InputStream, parses it, and returns the file list.
-     *
-     * @param stream the input stream.
-     * @return the file list.
-     * @throws TransferFailedException if there was a problem fetching the raw html.
-     */
-    public static List<String> parseFileList( String baseurl, InputStream stream )
-        throws TransferFailedException
-    {
-        try
-        {
-            URI baseURI = new URI( baseurl );
-            // to make debugging easier, start with a string. This is assuming UTF-8, which might not be a safe
-            // assumption.
-            String content = IOUtils.toString( stream, "utf-8" );
-            Document doc = Jsoup.parse( content, baseurl );
-            Elements links = doc.select("a[href]");
-            Set<String> results = new HashSet<String>();
-            for ( int lx = 0; lx < links.size(); lx++ )
-            {
-                Element link = links.get( lx );
-                /*
-                 * The abs:href loses directories, so we deal with absolute paths ourselves below in cleanLink
-                 */
-                String target = link.attr( "href" );
-                if ( target != null )
-                {
-                    String clean = cleanLink( baseURI, target );
-                    if ( isAcceptableLink( clean ) )
-                    {
-                        results.add( clean );
-                    }
-                }
-
-            }
-
-            return new ArrayList<String>( results );
-        }
-        catch ( URISyntaxException e )
-        {
-            throw new TransferFailedException( "Unable to parse as base URI: " + baseurl, e );
-        }
-        catch ( IOException e )
-        {
-            throw new TransferFailedException( "I/O error reading HTML listing of artifacts: " + e.getMessage(), e );
-        }
-    }
-
-    private static String cleanLink( URI baseURI, String link )
-    {
-        if ( StringUtils.isEmpty( link ) )
-        {
-            return "";
-        }
-
-        String ret = link;
-
-        try
-        {
-            URI linkuri = new URI( ret );
-            if ( link.startsWith( "/" ) )
-            {
-                linkuri = baseURI.resolve( linkuri );
-            }
-            URI relativeURI = baseURI.relativize( linkuri ).normalize();
-            ret = relativeURI.toASCIIString();
-            if ( ret.startsWith( baseURI.getPath() ) )
-            {
-                ret = ret.substring( baseURI.getPath().length() );
-            }
-
-            ret = URLDecoder.decode( ret, "UTF-8" );
-        }
-        catch ( URISyntaxException e )
-        {
-        }
-        catch ( UnsupportedEncodingException e )
-        {
-        }
-
-        return ret;
-    }
-
-    private static boolean isAcceptableLink( String link )
-    {
-        if ( StringUtils.isEmpty( link ) )
-        {
-            return false;
-        }
-
-        for ( int i = 0; i < SKIPS.length; i++ )
-        {
-            if ( SKIPS[i].matcher( link ).find() )
-            {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http/HtmlFileListParserTest.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http/HtmlFileListParserTest.java b/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http/HtmlFileListParserTest.java
new file mode 100644
index 0000000..3df6d9a
--- /dev/null
+++ b/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http/HtmlFileListParserTest.java
@@ -0,0 +1,729 @@
+package org.apache.maven.wagon.shared.http;
+
+/*
+ * 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.InputStream;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+import org.apache.log4j.Logger;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.shared.http.HtmlFileListParser;
+
+/**
+ * Unit Tests for the HtmlFileListParser
+ */
+public class HtmlFileListParserTest
+    extends TestCase
+{
+    private static Logger logger = Logger.getLogger( HtmlFileListParserTest.class );
+
+    private void assertContainsExpected( List<String>links, String[] expected )
+    {
+        if ( expected.length != links.size() )
+        {
+            Collections.sort( links );
+            for ( Iterator<String> iterator = links.iterator(); iterator.hasNext(); )
+            {
+                String link = iterator.next();
+                logger.info( "   \"" + link + "\", " );
+            }
+            assertEquals( "Links to Expected size", expected.length, links.size() );
+        }
+
+        for ( int i = 0; i < expected.length; i++ )
+        {
+            assertTrue( "Should find [" + expected[i] + "] in link list", links.contains( expected[i] ) );
+        }
+    }
+
+    private void assertNotContainingAvoided( List<String> links, String[] avoided )
+    {
+        for ( int i = 0; i < avoided.length; i++ )
+        {
+            assertFalse( "Should not find [" + avoided[i] + "] in link list", links.contains( avoided[i] ) );
+        }
+    }
+
+    private List<String> parseLinks( String url, String filename )
+        throws TransferFailedException
+    {
+        InputStream is = this.getClass().getResourceAsStream( "/filelistings/" + filename );
+        List<String> files = HtmlFileListParser.parseFileList( url, is );
+
+        assertNotNull( "file list should not be null.", files );
+        assertFalse( "file list should not be empty.", files.isEmpty() );
+
+        /* Debug */
+        if ( false )
+        {
+            Iterator it = files.iterator();
+            while ( it.hasNext() )
+            {
+                logger.info( "File: '" + it.next() + "'" );
+            }
+        }
+
+        return files;
+    }
+
+    /**
+     * Example showing jetty directory browsing of commons-lang
+     *
+     * @throws TransferFailedException
+     */
+    public void testParseCommonsLang()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks( "http://localhost/repository/commons-lang/commons-lang/2.3",
+                                             "commons-lang.html" );
+
+        String[] expected = new String[] {
+            "commons-lang-2.3-javadoc.jar",
+            "commons-lang-2.3-javadoc.jar.asc",
+            "commons-lang-2.3-javadoc.jar.md5",
+            "commons-lang-2.3-javadoc.jar.sha1",
+            "commons-lang-2.3-sources.jar",
+            "commons-lang-2.3-sources.jar.asc",
+            "commons-lang-2.3-sources.jar.md5",
+            "commons-lang-2.3-sources.jar.sha1",
+            "commons-lang-2.3.jar",
+            "commons-lang-2.3.jar.asc",
+            "commons-lang-2.3.jar.md5",
+            "commons-lang-2.3.jar.sha1",
+            "commons-lang-2.3.pom",
+            "commons-lang-2.3.pom.md5",
+            "commons-lang-2.3.pom.sha1",
+            "maven-metadata.xml",
+            "maven-metadata.xml.md5",
+            "maven-metadata.xml.sha1" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "../" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    public void testParseIbiblio()
+        throws Exception
+    {
+        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
+                                             "ibiblio-wagon.html" );
+
+        String[] expected = new String[] {
+            "wagon-1.0-alpha-2.pom",
+            "wagon-1.0-alpha-2.pom.asc",
+            "wagon-1.0-alpha-2.pom.md5",
+            "wagon-1.0-alpha-2.pom.sha1",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
+            "wagon-file/",
+            "wagon-ftp/",
+            "wagon-http-lightweight/",
+            "wagon-http/",
+            "wagon-lightweight-http/",
+            "wagon-provider-api/",
+            "wagon-provider-test/",
+            "wagon-provider/",
+            "wagon-providers-1.0-alpha-2.pom",
+            "wagon-providers-1.0-alpha-2.pom.asc",
+            "wagon-providers-1.0-alpha-2.pom.md5",
+            "wagon-providers-1.0-alpha-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
+            "wagon-providers/",
+            "wagon-scm/",
+            "wagon-ssh-external/",
+            "wagon-ssh/",
+            "wagon-webdav/",
+            "wagon/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A", "?D=A", "?M=A", "?N=D", "?S=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Test of an html which is improperly formatted, and contains full host-specific paths to the resources.
+     * @throws Exception
+     */
+    public void testParseJetty()
+        throws Exception
+    {
+        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
+                                             "jetty-wagon.html" );
+
+        String[] expected = new String[] {
+            "wagon-1.0-alpha-2.pom",
+            "wagon-1.0-alpha-2.pom.asc",
+            "wagon-1.0-alpha-2.pom.md5",
+            "wagon-1.0-alpha-2.pom.sha1",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
+            "wagon-file/",
+            "wagon-ftp/",
+            "wagon-http-lightweight/",
+            "wagon-http/",
+            "wagon-lightweight-http/",
+            "wagon-provider-api/",
+            "wagon-provider-test/",
+            "wagon-provider/",
+            "wagon-providers-1.0-alpha-2.pom",
+            "wagon-providers-1.0-alpha-2.pom.asc",
+            "wagon-providers-1.0-alpha-2.pom.md5",
+            "wagon-providers-1.0-alpha-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
+            "wagon-providers/",
+            "wagon-scm/",
+            "wagon-ssh-external/",
+            "wagon-ssh/",
+            "wagon-webdav/",
+            "wagon/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Test of an html which is improperly formatted, contains full host-specific paths to the resources and uses non-normalized base URI
+     * @throws Exception
+     */
+    public void testParseJettyWithNonNormalizedBaseURI()
+        throws Exception
+    {
+        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon//",
+                                             "jetty-wagon.html" );
+
+        String[] expected = new String[] {
+            "wagon-1.0-alpha-2.pom",
+            "wagon-1.0-alpha-2.pom.asc",
+            "wagon-1.0-alpha-2.pom.md5",
+            "wagon-1.0-alpha-2.pom.sha1",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
+            "wagon-file/",
+            "wagon-ftp/",
+            "wagon-http-lightweight/",
+            "wagon-http/",
+            "wagon-lightweight-http/",
+            "wagon-provider-api/",
+            "wagon-provider-test/",
+            "wagon-provider/",
+            "wagon-providers-1.0-alpha-2.pom",
+            "wagon-providers-1.0-alpha-2.pom.asc",
+            "wagon-providers-1.0-alpha-2.pom.md5",
+            "wagon-providers-1.0-alpha-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
+            "wagon-providers/",
+            "wagon-scm/",
+            "wagon-ssh-external/",
+            "wagon-ssh/",
+            "wagon-webdav/",
+            "wagon/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Using repository.codehaus.org output as an example.
+     * This is an example of an older RHEL installation of apache httpd with old fancy indexing output
+     * This example tests how to detect directories properly.
+     *
+     * @throws TransferFailedException
+     */
+    public void testParseMevenIde()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus/mevenide/", "mevenide.html" );
+
+        String[] expected = new String[] {
+            "apisupport/",
+            "autoupdate/",
+            "continuum-rpc/",
+            "continuum/",
+            "debugger-bridge/",
+            "deployment-bridge/",
+            "feature/",
+            "grammar/",
+            "ide-mojos/",
+            "indexer/",
+            "j2ee/",
+            "junit/",
+            "maven-metadata.xml",
+            "maven-metadata.xml.md5",
+            "maven-metadata.xml.sha1",
+            "mevenide2-parent/",
+            "nb-mvn-embedder/",
+            "nb-project/",
+            "nb-repo-browser/",
+            "netbeans-debugger-plugin/",
+            "netbeans-deploy-plugin/",
+            "netbeans-libs/",
+            "netbeans-nbmreload-plugin/",
+            "netbeans-repository/",
+            "netbeans-run-plugin/",
+            "netbeans/",
+            "persistence/",
+            "plugin-bridges/",
+            "plugins/",
+            "reload-nbm-bridge/",
+            "run-jar-bridge/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/org/codehaus/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    public void testParseMirror()
+        throws Exception
+    {
+        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
+                                             "mirror-wagon.html" );
+
+        String[] expected = new String[] {
+            "wagon-1.0-alpha-2.pom",
+            "wagon-1.0-alpha-2.pom.asc",
+            "wagon-1.0-alpha-2.pom.md5",
+            "wagon-1.0-alpha-2.pom.sha1",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
+            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
+            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
+            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
+            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
+            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
+            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
+            "wagon-file/",
+            "wagon-ftp/",
+            "wagon-http-lightweight/",
+            "wagon-http/",
+            "wagon-lightweight-http/",
+            "wagon-provider-api/",
+            "wagon-provider-test/",
+            "wagon-provider/",
+            "wagon-providers-1.0-alpha-2.pom",
+            "wagon-providers-1.0-alpha-2.pom.asc",
+            "wagon-providers-1.0-alpha-2.pom.md5",
+            "wagon-providers-1.0-alpha-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
+            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
+            "wagon-providers/",
+            "wagon-scm/",
+            "wagon-ssh-external/",
+            "wagon-ssh/",
+            "wagon-webdav/",
+            "wagon/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] {
+            "/org/codehaus/",
+            "?C=S;O=A",
+            "?C=D;O=A",
+            "?C=M;O=A",
+            "mailto:mirror.admin@mirror.com" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Example of output from repo1.maven.org
+     * This example is of nekohtml specifically.
+     *
+     * @throws TransferFailedException
+     */
+    public void testParseNekoHtml()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks( "http://repo1.maven.org//maven2/nekohtml/nekohtml/1.9.6/", "nekohtml.html" );
+
+        String[] expected = new String[] {
+            "nekohtml-1.9.6-javadoc.jar",
+            "nekohtml-1.9.6-javadoc.jar.md5",
+            "nekohtml-1.9.6-javadoc.jar.sha1",
+            "nekohtml-1.9.6-sources.jar",
+            "nekohtml-1.9.6-sources.jar.md5",
+            "nekohtml-1.9.6-sources.jar.sha1",
+            "nekohtml-1.9.6.jar",
+            "nekohtml-1.9.6.jar.md5",
+            "nekohtml-1.9.6.jar.sha1",
+            "nekohtml-1.9.6.pom",
+            "nekohtml-1.9.6.pom.md5",
+            "nekohtml-1.9.6.pom.sha1" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/maven2/nekohtml/nekohtml/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Example of detecting directories on repo1.maven.org
+     *
+     * @throws TransferFailedException
+     */
+    public void testParseNetSourceforge()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks( "http://repo1.maven.org/maven2/net/sf/", "net_sf.html" );
+
+        String[] expected = new String[] {
+            "a2j/",
+            "aislib/",
+            "alchim/",
+            "antenna/",
+            "apt-jelly/",
+            "beanlib/",
+            "bluecove/",
+            "buildbox/",
+            "click/",
+            "clirr/",
+            "datavision/",
+            "dozer/",
+            "dtddoc/",
+            "dynpageplus/",
+            "ehcache/",
+            "ezmorph/",
+            "falcon/",
+            "grester/",
+            "gwt-widget/",
+            "hermesftp/",
+            "hibernate/",
+            "jcharts/",
+            "jdatabaseimport/",
+            "jeceira/",
+            "jfcunit/",
+            "jfig/",
+            "jguard/",
+            "jipcam/",
+            "jlynx/",
+            "jour/",
+            "jpf/",
+            "json-lib/",
+            "jsptest/",
+            "jsr107cache/",
+            "jt400/",
+            "jxls/",
+            "kxml/",
+            "ldaptemplate/",
+            "locale4j/",
+            "mapasuta/",
+            "maven-har/",
+            "maven-sar/",
+            "opencsv/",
+            "oval/",
+            "proguard/",
+            "qdwizard/",
+            "resultsetmapper/",
+            "retrotranslator/",
+            "saxon/",
+            "shadesdb/",
+            "smc/",
+            "speculoos/",
+            "springlayout/",
+            "stat-scm/",
+            "statsvn/",
+            "stax/",
+            "struts/",
+            "tacos/",
+            "testextensions/",
+            "webdav-servlet/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/maven2/net/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Another larger example of the directory link detection on repository.codehaus.org
+     *
+     * @throws TransferFailedException
+     */
+    public void testParseOrgCodehaus()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus", "org.codehaus.html" );
+
+        String[] expected = new String[] {
+            "agilifier/",
+            "benji/",
+            "bruce/",
+            "btm/",
+            "cargo/",
+            "castor-spring/",
+            "castor/",
+            "cozmos/",
+            "dataforge/",
+            "dimple/",
+            "droolsdotnet/",
+            "enunciate/",
+            "fabric3/",
+            "gant/",
+            "grails-plugins/",
+            "groovy/",
+            "gsoc/",
+            "guessencoding/",
+            "gumtree/",
+            "gwt-openlayers/",
+            "haus/",
+            "izpack/",
+            "javasim/",
+            "jedi/",
+            "jequel/",
+            "jet/",
+            "jettison/",
+            "jfdi/",
+            "jikesrvm/",
+            "jra/",
+            "jremoting/",
+            "jtestme/",
+            "jtestr/",
+            "labs-ng/",
+            "logicabyss/",
+            "marionette/",
+            "mevenide/",
+            "modello/",
+            "mojo/",
+            "mvel/",
+            "mvflex/",
+            "native-mojo/",
+            "openim/",
+            "plexus/",
+            "polymap/",
+            "prometheus/",
+            "prophit/",
+            "quaere/",
+            "redback/",
+            "rulessandpit/",
+            "rvm/",
+            "savana/",
+            "scala-ide/",
+            "senro/",
+            "sonar/",
+            "staxmate/",
+            "stomp/",
+            "svn4j/",
+            "swiby/",
+            "swizzle/",
+            "sxc/",
+            "testdox/",
+            "wadi/",
+            "waffle/",
+            "woodstox/",
+            "xdoclet/",
+            "xfire/",
+            "xharness/",
+            "xsite/",
+            "xstream/",
+            "xwire/" };
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+
+    /**
+     * Test the output found from apache httpd with fancy indexing and dav module.
+     * Using people.apache.org output as source material.
+     *
+     * @throws TransferFailedException
+     */
+    public void testParsePeopleApacheOrg()
+        throws TransferFailedException
+    {
+        List<String> links = parseLinks(
+                                             "http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/1.0.1/",
+                                             "org.apache.maven.html" );
+
+        String[] expected = new String[] {
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz",
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc",
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.md5",
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.sha1",
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz.md5",
+            "archiva-plexus-runtime-1.0.1-bin.tar.gz.sha1",
+            "archiva-plexus-runtime-1.0.1-bin.zip",
+            "archiva-plexus-runtime-1.0.1-bin.zip.asc",
+            "archiva-plexus-runtime-1.0.1-bin.zip.asc.md5",
+            "archiva-plexus-runtime-1.0.1-bin.zip.asc.sha1",
+            "archiva-plexus-runtime-1.0.1-bin.zip.md5",
+            "archiva-plexus-runtime-1.0.1-bin.zip.sha1",
+            "archiva-plexus-runtime-1.0.1-sources.jar",
+            "archiva-plexus-runtime-1.0.1-sources.jar.asc",
+            "archiva-plexus-runtime-1.0.1-sources.jar.asc.md5",
+            "archiva-plexus-runtime-1.0.1-sources.jar.asc.sha1",
+            "archiva-plexus-runtime-1.0.1-sources.jar.md5",
+            "archiva-plexus-runtime-1.0.1-sources.jar.sha1",
+            "archiva-plexus-runtime-1.0.1.jar",
+            "archiva-plexus-runtime-1.0.1.jar.asc",
+            "archiva-plexus-runtime-1.0.1.jar.asc.md5",
+            "archiva-plexus-runtime-1.0.1.jar.asc.sha1",
+            "archiva-plexus-runtime-1.0.1.jar.md5",
+            "archiva-plexus-runtime-1.0.1.jar.sha1",
+            "archiva-plexus-runtime-1.0.1.pom",
+            "archiva-plexus-runtime-1.0.1.pom.asc",
+            "archiva-plexus-runtime-1.0.1.pom.asc.md5",
+            "archiva-plexus-runtime-1.0.1.pom.asc.sha1",
+            "archiva-plexus-runtime-1.0.1.pom.md5",
+            "archiva-plexus-runtime-1.0.1.pom.sha1",
+            "readme artifacts.txt"};
+
+        assertContainsExpected( links, expected );
+
+        String[] avoided = new String[] {
+            "/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/",
+            "?C=S;O=A",
+            "?C=D;O=A",
+            "?C=M;O=A" };
+
+        assertNotContainingAvoided( links, avoided );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http4/HtmlFileListParserTest.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http4/HtmlFileListParserTest.java b/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http4/HtmlFileListParserTest.java
deleted file mode 100644
index 48ff006..0000000
--- a/wagon-providers/wagon-http-shared4/src/test/java/org/apache/maven/wagon/shared/http4/HtmlFileListParserTest.java
+++ /dev/null
@@ -1,728 +0,0 @@
-package org.apache.maven.wagon.shared.http4;
-
-/*
- * 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.InputStream;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-import org.apache.log4j.Logger;
-import org.apache.maven.wagon.TransferFailedException;
-
-/**
- * Unit Tests for the HtmlFileListParser
- */
-public class HtmlFileListParserTest
-    extends TestCase
-{
-    private static Logger logger = Logger.getLogger( HtmlFileListParserTest.class );
-
-    private void assertContainsExpected( List<String>links, String[] expected )
-    {
-        if ( expected.length != links.size() )
-        {
-            Collections.sort( links );
-            for ( Iterator<String> iterator = links.iterator(); iterator.hasNext(); )
-            {
-                String link = iterator.next();
-                logger.info( "   \"" + link + "\", " );
-            }
-            assertEquals( "Links to Expected size", expected.length, links.size() );
-        }
-
-        for ( int i = 0; i < expected.length; i++ )
-        {
-            assertTrue( "Should find [" + expected[i] + "] in link list", links.contains( expected[i] ) );
-        }
-    }
-
-    private void assertNotContainingAvoided( List<String> links, String[] avoided )
-    {
-        for ( int i = 0; i < avoided.length; i++ )
-        {
-            assertFalse( "Should not find [" + avoided[i] + "] in link list", links.contains( avoided[i] ) );
-        }
-    }
-
-    private List<String> parseLinks( String url, String filename )
-        throws TransferFailedException
-    {
-        InputStream is = this.getClass().getResourceAsStream( "/filelistings/" + filename );
-        List<String> files = HtmlFileListParser.parseFileList( url, is );
-
-        assertNotNull( "file list should not be null.", files );
-        assertFalse( "file list should not be empty.", files.isEmpty() );
-
-        /* Debug */
-        if ( false )
-        {
-            Iterator it = files.iterator();
-            while ( it.hasNext() )
-            {
-                logger.info( "File: '" + it.next() + "'" );
-            }
-        }
-
-        return files;
-    }
-
-    /**
-     * Example showing jetty directory browsing of commons-lang
-     *
-     * @throws TransferFailedException
-     */
-    public void testParseCommonsLang()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks( "http://localhost/repository/commons-lang/commons-lang/2.3",
-                                             "commons-lang.html" );
-
-        String[] expected = new String[] {
-            "commons-lang-2.3-javadoc.jar",
-            "commons-lang-2.3-javadoc.jar.asc",
-            "commons-lang-2.3-javadoc.jar.md5",
-            "commons-lang-2.3-javadoc.jar.sha1",
-            "commons-lang-2.3-sources.jar",
-            "commons-lang-2.3-sources.jar.asc",
-            "commons-lang-2.3-sources.jar.md5",
-            "commons-lang-2.3-sources.jar.sha1",
-            "commons-lang-2.3.jar",
-            "commons-lang-2.3.jar.asc",
-            "commons-lang-2.3.jar.md5",
-            "commons-lang-2.3.jar.sha1",
-            "commons-lang-2.3.pom",
-            "commons-lang-2.3.pom.md5",
-            "commons-lang-2.3.pom.sha1",
-            "maven-metadata.xml",
-            "maven-metadata.xml.md5",
-            "maven-metadata.xml.sha1" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "../" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    public void testParseIbiblio()
-        throws Exception
-    {
-        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
-                                             "ibiblio-wagon.html" );
-
-        String[] expected = new String[] {
-            "wagon-1.0-alpha-2.pom",
-            "wagon-1.0-alpha-2.pom.asc",
-            "wagon-1.0-alpha-2.pom.md5",
-            "wagon-1.0-alpha-2.pom.sha1",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
-            "wagon-file/",
-            "wagon-ftp/",
-            "wagon-http-lightweight/",
-            "wagon-http/",
-            "wagon-lightweight-http/",
-            "wagon-provider-api/",
-            "wagon-provider-test/",
-            "wagon-provider/",
-            "wagon-providers-1.0-alpha-2.pom",
-            "wagon-providers-1.0-alpha-2.pom.asc",
-            "wagon-providers-1.0-alpha-2.pom.md5",
-            "wagon-providers-1.0-alpha-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
-            "wagon-providers/",
-            "wagon-scm/",
-            "wagon-ssh-external/",
-            "wagon-ssh/",
-            "wagon-webdav/",
-            "wagon/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A", "?D=A", "?M=A", "?N=D", "?S=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Test of an html which is improperly formatted, and contains full host-specific paths to the resources.
-     * @throws Exception
-     */
-    public void testParseJetty()
-        throws Exception
-    {
-        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
-                                             "jetty-wagon.html" );
-
-        String[] expected = new String[] {
-            "wagon-1.0-alpha-2.pom",
-            "wagon-1.0-alpha-2.pom.asc",
-            "wagon-1.0-alpha-2.pom.md5",
-            "wagon-1.0-alpha-2.pom.sha1",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
-            "wagon-file/",
-            "wagon-ftp/",
-            "wagon-http-lightweight/",
-            "wagon-http/",
-            "wagon-lightweight-http/",
-            "wagon-provider-api/",
-            "wagon-provider-test/",
-            "wagon-provider/",
-            "wagon-providers-1.0-alpha-2.pom",
-            "wagon-providers-1.0-alpha-2.pom.asc",
-            "wagon-providers-1.0-alpha-2.pom.md5",
-            "wagon-providers-1.0-alpha-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
-            "wagon-providers/",
-            "wagon-scm/",
-            "wagon-ssh-external/",
-            "wagon-ssh/",
-            "wagon-webdav/",
-            "wagon/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Test of an html which is improperly formatted, contains full host-specific paths to the resources and uses non-normalized base URI
-     * @throws Exception
-     */
-    public void testParseJettyWithNonNormalizedBaseURI()
-        throws Exception
-    {
-        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon//",
-                                             "jetty-wagon.html" );
-
-        String[] expected = new String[] {
-            "wagon-1.0-alpha-2.pom",
-            "wagon-1.0-alpha-2.pom.asc",
-            "wagon-1.0-alpha-2.pom.md5",
-            "wagon-1.0-alpha-2.pom.sha1",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
-            "wagon-file/",
-            "wagon-ftp/",
-            "wagon-http-lightweight/",
-            "wagon-http/",
-            "wagon-lightweight-http/",
-            "wagon-provider-api/",
-            "wagon-provider-test/",
-            "wagon-provider/",
-            "wagon-providers-1.0-alpha-2.pom",
-            "wagon-providers-1.0-alpha-2.pom.asc",
-            "wagon-providers-1.0-alpha-2.pom.md5",
-            "wagon-providers-1.0-alpha-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
-            "wagon-providers/",
-            "wagon-scm/",
-            "wagon-ssh-external/",
-            "wagon-ssh/",
-            "wagon-webdav/",
-            "wagon/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Using repository.codehaus.org output as an example.
-     * This is an example of an older RHEL installation of apache httpd with old fancy indexing output
-     * This example tests how to detect directories properly.
-     *
-     * @throws TransferFailedException
-     */
-    public void testParseMevenIde()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus/mevenide/", "mevenide.html" );
-
-        String[] expected = new String[] {
-            "apisupport/",
-            "autoupdate/",
-            "continuum-rpc/",
-            "continuum/",
-            "debugger-bridge/",
-            "deployment-bridge/",
-            "feature/",
-            "grammar/",
-            "ide-mojos/",
-            "indexer/",
-            "j2ee/",
-            "junit/",
-            "maven-metadata.xml",
-            "maven-metadata.xml.md5",
-            "maven-metadata.xml.sha1",
-            "mevenide2-parent/",
-            "nb-mvn-embedder/",
-            "nb-project/",
-            "nb-repo-browser/",
-            "netbeans-debugger-plugin/",
-            "netbeans-deploy-plugin/",
-            "netbeans-libs/",
-            "netbeans-nbmreload-plugin/",
-            "netbeans-repository/",
-            "netbeans-run-plugin/",
-            "netbeans/",
-            "persistence/",
-            "plugin-bridges/",
-            "plugins/",
-            "reload-nbm-bridge/",
-            "run-jar-bridge/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/org/codehaus/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    public void testParseMirror()
-        throws Exception
-    {
-        List<String> links = parseLinks( "http://www.ibiblio.org/maven2/org/apache/maven/wagon/",
-                                             "mirror-wagon.html" );
-
-        String[] expected = new String[] {
-            "wagon-1.0-alpha-2.pom",
-            "wagon-1.0-alpha-2.pom.asc",
-            "wagon-1.0-alpha-2.pom.md5",
-            "wagon-1.0-alpha-2.pom.sha1",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.md5",
-            "wagon-1.0-alpha-3-20050413.021234-4.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.md5",
-            "wagon-1.0-alpha-3-20050419.043745-5.pom.sha1",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.md5",
-            "wagon-1.0-alpha-3-20050419.044035-6.pom.sha1",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.md5",
-            "wagon-1.0-alpha-3-20050421.162738-7.pom.sha1",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.md5",
-            "wagon-1.0-alpha-3-20050422.075233-8.pom.sha1",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.md5",
-            "wagon-1.0-alpha-3-20050429.051847-9.pom.sha1",
-            "wagon-file/",
-            "wagon-ftp/",
-            "wagon-http-lightweight/",
-            "wagon-http/",
-            "wagon-lightweight-http/",
-            "wagon-provider-api/",
-            "wagon-provider-test/",
-            "wagon-provider/",
-            "wagon-providers-1.0-alpha-2.pom",
-            "wagon-providers-1.0-alpha-2.pom.asc",
-            "wagon-providers-1.0-alpha-2.pom.md5",
-            "wagon-providers-1.0-alpha-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050407.202848-1.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050419.044035-2.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050421.162738-3.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050422.075233-4.pom.sha1",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.md5",
-            "wagon-providers-1.0-alpha-3-20050429.051847-5.pom.sha1",
-            "wagon-providers/",
-            "wagon-scm/",
-            "wagon-ssh-external/",
-            "wagon-ssh/",
-            "wagon-webdav/",
-            "wagon/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] {
-            "/org/codehaus/",
-            "?C=S;O=A",
-            "?C=D;O=A",
-            "?C=M;O=A",
-            "mailto:mirror.admin@mirror.com" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Example of output from repo1.maven.org
-     * This example is of nekohtml specifically.
-     *
-     * @throws TransferFailedException
-     */
-    public void testParseNekoHtml()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks( "http://repo1.maven.org//maven2/nekohtml/nekohtml/1.9.6/", "nekohtml.html" );
-
-        String[] expected = new String[] {
-            "nekohtml-1.9.6-javadoc.jar",
-            "nekohtml-1.9.6-javadoc.jar.md5",
-            "nekohtml-1.9.6-javadoc.jar.sha1",
-            "nekohtml-1.9.6-sources.jar",
-            "nekohtml-1.9.6-sources.jar.md5",
-            "nekohtml-1.9.6-sources.jar.sha1",
-            "nekohtml-1.9.6.jar",
-            "nekohtml-1.9.6.jar.md5",
-            "nekohtml-1.9.6.jar.sha1",
-            "nekohtml-1.9.6.pom",
-            "nekohtml-1.9.6.pom.md5",
-            "nekohtml-1.9.6.pom.sha1" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/maven2/nekohtml/nekohtml/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Example of detecting directories on repo1.maven.org
-     *
-     * @throws TransferFailedException
-     */
-    public void testParseNetSourceforge()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks( "http://repo1.maven.org/maven2/net/sf/", "net_sf.html" );
-
-        String[] expected = new String[] {
-            "a2j/",
-            "aislib/",
-            "alchim/",
-            "antenna/",
-            "apt-jelly/",
-            "beanlib/",
-            "bluecove/",
-            "buildbox/",
-            "click/",
-            "clirr/",
-            "datavision/",
-            "dozer/",
-            "dtddoc/",
-            "dynpageplus/",
-            "ehcache/",
-            "ezmorph/",
-            "falcon/",
-            "grester/",
-            "gwt-widget/",
-            "hermesftp/",
-            "hibernate/",
-            "jcharts/",
-            "jdatabaseimport/",
-            "jeceira/",
-            "jfcunit/",
-            "jfig/",
-            "jguard/",
-            "jipcam/",
-            "jlynx/",
-            "jour/",
-            "jpf/",
-            "json-lib/",
-            "jsptest/",
-            "jsr107cache/",
-            "jt400/",
-            "jxls/",
-            "kxml/",
-            "ldaptemplate/",
-            "locale4j/",
-            "mapasuta/",
-            "maven-har/",
-            "maven-sar/",
-            "opencsv/",
-            "oval/",
-            "proguard/",
-            "qdwizard/",
-            "resultsetmapper/",
-            "retrotranslator/",
-            "saxon/",
-            "shadesdb/",
-            "smc/",
-            "speculoos/",
-            "springlayout/",
-            "stat-scm/",
-            "statsvn/",
-            "stax/",
-            "struts/",
-            "tacos/",
-            "testextensions/",
-            "webdav-servlet/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/maven2/net/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Another larger example of the directory link detection on repository.codehaus.org
-     *
-     * @throws TransferFailedException
-     */
-    public void testParseOrgCodehaus()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks( "http://repository.codehaus.org/org/codehaus", "org.codehaus.html" );
-
-        String[] expected = new String[] {
-            "agilifier/",
-            "benji/",
-            "bruce/",
-            "btm/",
-            "cargo/",
-            "castor-spring/",
-            "castor/",
-            "cozmos/",
-            "dataforge/",
-            "dimple/",
-            "droolsdotnet/",
-            "enunciate/",
-            "fabric3/",
-            "gant/",
-            "grails-plugins/",
-            "groovy/",
-            "gsoc/",
-            "guessencoding/",
-            "gumtree/",
-            "gwt-openlayers/",
-            "haus/",
-            "izpack/",
-            "javasim/",
-            "jedi/",
-            "jequel/",
-            "jet/",
-            "jettison/",
-            "jfdi/",
-            "jikesrvm/",
-            "jra/",
-            "jremoting/",
-            "jtestme/",
-            "jtestr/",
-            "labs-ng/",
-            "logicabyss/",
-            "marionette/",
-            "mevenide/",
-            "modello/",
-            "mojo/",
-            "mvel/",
-            "mvflex/",
-            "native-mojo/",
-            "openim/",
-            "plexus/",
-            "polymap/",
-            "prometheus/",
-            "prophit/",
-            "quaere/",
-            "redback/",
-            "rulessandpit/",
-            "rvm/",
-            "savana/",
-            "scala-ide/",
-            "senro/",
-            "sonar/",
-            "staxmate/",
-            "stomp/",
-            "svn4j/",
-            "swiby/",
-            "swizzle/",
-            "sxc/",
-            "testdox/",
-            "wadi/",
-            "waffle/",
-            "woodstox/",
-            "xdoclet/",
-            "xfire/",
-            "xharness/",
-            "xsite/",
-            "xstream/",
-            "xwire/" };
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] { "/org/", "?C=S;O=A", "?C=D;O=A", "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-
-    /**
-     * Test the output found from apache httpd with fancy indexing and dav module.
-     * Using people.apache.org output as source material.
-     *
-     * @throws TransferFailedException
-     */
-    public void testParsePeopleApacheOrg()
-        throws TransferFailedException
-    {
-        List<String> links = parseLinks(
-                                             "http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/1.0.1/",
-                                             "org.apache.maven.html" );
-
-        String[] expected = new String[] {
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz",
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc",
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.md5",
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz.asc.sha1",
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz.md5",
-            "archiva-plexus-runtime-1.0.1-bin.tar.gz.sha1",
-            "archiva-plexus-runtime-1.0.1-bin.zip",
-            "archiva-plexus-runtime-1.0.1-bin.zip.asc",
-            "archiva-plexus-runtime-1.0.1-bin.zip.asc.md5",
-            "archiva-plexus-runtime-1.0.1-bin.zip.asc.sha1",
-            "archiva-plexus-runtime-1.0.1-bin.zip.md5",
-            "archiva-plexus-runtime-1.0.1-bin.zip.sha1",
-            "archiva-plexus-runtime-1.0.1-sources.jar",
-            "archiva-plexus-runtime-1.0.1-sources.jar.asc",
-            "archiva-plexus-runtime-1.0.1-sources.jar.asc.md5",
-            "archiva-plexus-runtime-1.0.1-sources.jar.asc.sha1",
-            "archiva-plexus-runtime-1.0.1-sources.jar.md5",
-            "archiva-plexus-runtime-1.0.1-sources.jar.sha1",
-            "archiva-plexus-runtime-1.0.1.jar",
-            "archiva-plexus-runtime-1.0.1.jar.asc",
-            "archiva-plexus-runtime-1.0.1.jar.asc.md5",
-            "archiva-plexus-runtime-1.0.1.jar.asc.sha1",
-            "archiva-plexus-runtime-1.0.1.jar.md5",
-            "archiva-plexus-runtime-1.0.1.jar.sha1",
-            "archiva-plexus-runtime-1.0.1.pom",
-            "archiva-plexus-runtime-1.0.1.pom.asc",
-            "archiva-plexus-runtime-1.0.1.pom.asc.md5",
-            "archiva-plexus-runtime-1.0.1.pom.asc.sha1",
-            "archiva-plexus-runtime-1.0.1.pom.md5",
-            "archiva-plexus-runtime-1.0.1.pom.sha1",
-            "readme artifacts.txt"};
-
-        assertContainsExpected( links, expected );
-
-        String[] avoided = new String[] {
-            "/repo/m2-ibiblio-rsync-repository/org/apache/maven/archiva/archiva-plexus-runtime/",
-            "?C=S;O=A",
-            "?C=D;O=A",
-            "?C=M;O=A" };
-
-        assertNotContainingAvoided( links, avoided );
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http/pom.xml
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http/pom.xml b/wagon-providers/wagon-http/pom.xml
index cea7d9a..4746736 100644
--- a/wagon-providers/wagon-http/pom.xml
+++ b/wagon-providers/wagon-http/pom.xml
@@ -37,7 +37,7 @@ under the License.
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>wagon-http-shared4</artifactId>
+      <artifactId>wagon-http-shared</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java
index e888de3..acc8533 100644
--- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java
+++ b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java
@@ -26,7 +26,7 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.TransferFailedException;
 import org.apache.maven.wagon.authorization.AuthorizationException;
-import org.apache.maven.wagon.shared.http4.HtmlFileListParser;
+import org.apache.maven.wagon.shared.http.HtmlFileListParser;
 
 import java.io.IOException;
 import java.io.InputStream;

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/5fcc6315/wagon-providers/wagon-webdav-jackrabbit/pom.xml
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-webdav-jackrabbit/pom.xml b/wagon-providers/wagon-webdav-jackrabbit/pom.xml
index fa25db5..4a58b3b 100644
--- a/wagon-providers/wagon-webdav-jackrabbit/pom.xml
+++ b/wagon-providers/wagon-webdav-jackrabbit/pom.xml
@@ -46,11 +46,6 @@ under the License.
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>wagon-http-shared</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.jackrabbit</groupId>
       <artifactId>jackrabbit-webdav</artifactId>
       <version>2.5.2</version>