You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2021/05/31 10:54:21 UTC

[maven-doxia-linkcheck] branch nomdo created (now 6ef64f5)

This is an automated email from the ASF dual-hosted git repository.

elharo pushed a change to branch nomdo
in repository https://gitbox.apache.org/repos/asf/maven-doxia-linkcheck.git.


      at 6ef64f5  remove dependency on Modello

This branch includes the following new commits:

     new 6ef64f5  remove dependency on Modello

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[maven-doxia-linkcheck] 01/01: remove dependency on Modello

Posted by el...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

elharo pushed a commit to branch nomdo
in repository https://gitbox.apache.org/repos/asf/maven-doxia-linkcheck.git

commit 6ef64f51afb1348ef7b137ec2b50c76d776bfd47
Author: Elliotte Rusty Harold <el...@ibiblio.org>
AuthorDate: Mon May 31 06:54:03 2021 -0400

    remove dependency on Modello
---
 pom.xml                                            |  36 -
 .../org/apache/maven/doxia/linkcheck/HttpBean.java | 484 ++++++++++++
 .../maven/doxia/linkcheck/model/LinkcheckFile.java | 340 ++++++++
 .../doxia/linkcheck/model/LinkcheckFileResult.java | 246 ++++++
 .../doxia/linkcheck/model/LinkcheckModel.java      | 173 +++++
 .../model/io/xpp3/LinkcheckModelXpp3Reader.java    | 859 +++++++++++++++++++++
 .../model/io/xpp3/LinkcheckModelXpp3Writer.java    | 200 +++++
 src/main/mdo/httpbean.mdo                          | 173 -----
 src/main/mdo/linkcheck.mdo                         | 274 -------
 9 files changed, 2302 insertions(+), 483 deletions(-)

diff --git a/pom.xml b/pom.xml
index 205bcaf..3942b8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,41 +112,5 @@ under the License.
         </plugin>
       </plugins>
     </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.modello</groupId>
-        <artifactId>modello-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>linkcheck</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>java</goal>
-              <goal>xpp3-reader</goal>
-              <goal>xpp3-writer</goal>
-            </goals>
-            <configuration>
-              <models>
-                <model>src/main/mdo/linkcheck.mdo</model>
-              </models>
-              <version>1.0.0</version>
-            </configuration>
-          </execution>
-          <execution>
-            <id>httpbean</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>java</goal>
-            </goals>
-            <configuration>
-              <models>
-                <model>src/main/mdo/httpbean.mdo</model>
-              </models>
-              <version>1.0.0</version>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
   </build>
 </project>
\ No newline at end of file
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/HttpBean.java b/src/main/java/org/apache/maven/doxia/linkcheck/HttpBean.java
new file mode 100644
index 0000000..21112fc
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/HttpBean.java
@@ -0,0 +1,484 @@
+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.
+ */
+
+/**
+ * Http bean to encapsulate the supported HTTP parameters.
+ *          @see org.apache.commons.httpclient.HttpMethod.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class HttpBean
+    implements java.io.Serializable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *      The HTTP method to use. Currently supported are "GET"
+     * and "HEAD".
+     *      <dl>
+     *      <dt>HTTP GET</dt>
+     *      <dd>
+     *      The HTTP GET method is defined in section 9.3 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The GET method means retrieve whatever information (in
+     * the form of an
+     *      entity) is identified by the Request-URI.
+     *      </blockquote>
+     *      </dd>
+     *      <dt>HTTP HEAD</dt>
+     *      <dd>
+     *      The HTTP HEAD method is defined in section 9.4 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The HEAD method is identical to GET except that the
+     * server MUST NOT
+     *      return a message-body in the response.
+     *      </blockquote>
+     *      </dd>
+     *      </dl>
+     */
+    private String method = "head";
+
+    /**
+     * 
+     *      if the HTTP method should automatically follow HTTP
+     * redirects
+     *      (status code 302, etc.), <tt>false</tt> otherwise.
+     */
+    private boolean followRedirects = false;
+
+    /**
+     * The proxy host.
+     */
+    private String proxyHost;
+
+    /**
+     * The proxy port.
+     */
+    private int proxyPort = 0;
+
+    /**
+     * The proxy user.
+     */
+    private String proxyUser;
+
+    /**
+     * The proxy password.
+     */
+    private String proxyPassword;
+
+    /**
+     * The proxy NTLM (NT Lan Manager) host.
+     */
+    private String proxyNtlmHost;
+
+    /**
+     * The proxy NTLM (NT Lan Manager) domain.
+     */
+    private String proxyNtlmDomain;
+
+    /**
+     * The timeout to be used. A value of zero means the timeout is
+     * not used.
+     *             Default value is 2000.
+     */
+    private int timeout = 2000;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method equals.
+     * 
+     * @param other
+     * @return boolean
+     */
+    public boolean equals( Object other )
+    {
+        if ( this == other )
+        {
+            return true;
+        }
+
+        if ( !( other instanceof HttpBean ) )
+        {
+            return false;
+        }
+
+        HttpBean that = (HttpBean) other;
+        boolean result = true;
+
+        result = result && ( getMethod() == null ? that.getMethod() == null : getMethod().equals( that.getMethod() ) );
+        result = result && followRedirects == that.followRedirects;
+        result = result && ( getProxyHost() == null ? that.getProxyHost() == null : getProxyHost().equals( that.getProxyHost() ) );
+        result = result && proxyPort == that.proxyPort;
+        result = result && ( getProxyUser() == null ? that.getProxyUser() == null : getProxyUser().equals( that.getProxyUser() ) );
+        result = result && ( getProxyPassword() == null ? that.getProxyPassword() == null : getProxyPassword().equals( that.getProxyPassword() ) );
+        result = result && ( getProxyNtlmHost() == null ? that.getProxyNtlmHost() == null : getProxyNtlmHost().equals( that.getProxyNtlmHost() ) );
+        result = result && ( getProxyNtlmDomain() == null ? that.getProxyNtlmDomain() == null : getProxyNtlmDomain().equals( that.getProxyNtlmDomain() ) );
+        result = result && timeout == that.timeout;
+
+        return result;
+    } //-- boolean equals( Object )
+
+    /**
+     * Get the HTTP method to use. Currently supported are "GET"
+     * and "HEAD".
+     *      <dl>
+     *      <dt>HTTP GET</dt>
+     *      <dd>
+     *      The HTTP GET method is defined in section 9.3 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The GET method means retrieve whatever information (in
+     * the form of an
+     *      entity) is identified by the Request-URI.
+     *      </blockquote>
+     *      </dd>
+     *      <dt>HTTP HEAD</dt>
+     *      <dd>
+     *      The HTTP HEAD method is defined in section 9.4 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The HEAD method is identical to GET except that the
+     * server MUST NOT
+     *      return a message-body in the response.
+     *      </blockquote>
+     *      </dd>
+     *      </dl>
+     * 
+     * @return String
+     */
+    public String getMethod()
+    {
+        return this.method;
+    } //-- String getMethod()
+
+    /**
+     * Get the proxy host.
+     * 
+     * @return String
+     */
+    public String getProxyHost()
+    {
+        return this.proxyHost;
+    } //-- String getProxyHost()
+
+    /**
+     * Get the proxy NTLM (NT Lan Manager) domain.
+     * 
+     * @return String
+     */
+    public String getProxyNtlmDomain()
+    {
+        return this.proxyNtlmDomain;
+    } //-- String getProxyNtlmDomain()
+
+    /**
+     * Get the proxy NTLM (NT Lan Manager) host.
+     * 
+     * @return String
+     */
+    public String getProxyNtlmHost()
+    {
+        return this.proxyNtlmHost;
+    } //-- String getProxyNtlmHost()
+
+    /**
+     * Get the proxy password.
+     * 
+     * @return String
+     */
+    public String getProxyPassword()
+    {
+        return this.proxyPassword;
+    } //-- String getProxyPassword()
+
+    /**
+     * Get the proxy port.
+     * 
+     * @return int
+     */
+    public int getProxyPort()
+    {
+        return this.proxyPort;
+    } //-- int getProxyPort()
+
+    /**
+     * Get the proxy user.
+     * 
+     * @return String
+     */
+    public String getProxyUser()
+    {
+        return this.proxyUser;
+    } //-- String getProxyUser()
+
+    /**
+     * Get the timeout to be used. A value of zero means the
+     * timeout is not used.
+     *             Default value is 2000.
+     * 
+     * @return int
+     */
+    public int getTimeout()
+    {
+        return this.timeout;
+    } //-- int getTimeout()
+
+    /**
+     * Method hashCode.
+     * 
+     * @return int
+     */
+    public int hashCode()
+    {
+        int result = 17;
+
+        result = 37 * result + ( method != null ? method.hashCode() : 0 );
+        result = 37 * result + ( followRedirects ? 0 : 1 );
+        result = 37 * result + ( proxyHost != null ? proxyHost.hashCode() : 0 );
+        result = 37 * result + (int) proxyPort;
+        result = 37 * result + ( proxyUser != null ? proxyUser.hashCode() : 0 );
+        result = 37 * result + ( proxyPassword != null ? proxyPassword.hashCode() : 0 );
+        result = 37 * result + ( proxyNtlmHost != null ? proxyNtlmHost.hashCode() : 0 );
+        result = 37 * result + ( proxyNtlmDomain != null ? proxyNtlmDomain.hashCode() : 0 );
+        result = 37 * result + (int) timeout;
+
+        return result;
+    } //-- int hashCode()
+
+    /**
+     * Get if the HTTP method should automatically follow HTTP
+     * redirects
+     *      (status code 302, etc.), <tt>false</tt> otherwise.
+     * 
+     * @return boolean
+     */
+    public boolean isFollowRedirects()
+    {
+        return this.followRedirects;
+    } //-- boolean isFollowRedirects()
+
+    /**
+     * Set if the HTTP method should automatically follow HTTP
+     * redirects
+     *      (status code 302, etc.), <tt>false</tt> otherwise.
+     * 
+     * @param followRedirects
+     */
+    public void setFollowRedirects( boolean followRedirects )
+    {
+        this.followRedirects = followRedirects;
+    } //-- void setFollowRedirects( boolean )
+
+    /**
+     * Set the HTTP method to use. Currently supported are "GET"
+     * and "HEAD".
+     *      <dl>
+     *      <dt>HTTP GET</dt>
+     *      <dd>
+     *      The HTTP GET method is defined in section 9.3 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The GET method means retrieve whatever information (in
+     * the form of an
+     *      entity) is identified by the Request-URI.
+     *      </blockquote>
+     *      </dd>
+     *      <dt>HTTP HEAD</dt>
+     *      <dd>
+     *      The HTTP HEAD method is defined in section 9.4 of
+     *      <a
+     * HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
+     *      <blockquote>
+     *      The HEAD method is identical to GET except that the
+     * server MUST NOT
+     *      return a message-body in the response.
+     *      </blockquote>
+     *      </dd>
+     *      </dl>
+     * 
+     * @param method
+     */
+    public void setMethod( String method )
+    {
+        this.method = method;
+    } //-- void setMethod( String )
+
+    /**
+     * Set the proxy host.
+     * 
+     * @param proxyHost
+     */
+    public void setProxyHost( String proxyHost )
+    {
+        this.proxyHost = proxyHost;
+    } //-- void setProxyHost( String )
+
+    /**
+     * Set the proxy NTLM (NT Lan Manager) domain.
+     * 
+     * @param proxyNtlmDomain
+     */
+    public void setProxyNtlmDomain( String proxyNtlmDomain )
+    {
+        this.proxyNtlmDomain = proxyNtlmDomain;
+    } //-- void setProxyNtlmDomain( String )
+
+    /**
+     * Set the proxy NTLM (NT Lan Manager) host.
+     * 
+     * @param proxyNtlmHost
+     */
+    public void setProxyNtlmHost( String proxyNtlmHost )
+    {
+        this.proxyNtlmHost = proxyNtlmHost;
+    } //-- void setProxyNtlmHost( String )
+
+    /**
+     * Set the proxy password.
+     * 
+     * @param proxyPassword
+     */
+    public void setProxyPassword( String proxyPassword )
+    {
+        this.proxyPassword = proxyPassword;
+    } //-- void setProxyPassword( String )
+
+    /**
+     * Set the proxy port.
+     * 
+     * @param proxyPort
+     */
+    public void setProxyPort( int proxyPort )
+    {
+        this.proxyPort = proxyPort;
+    } //-- void setProxyPort( int )
+
+    /**
+     * Set the proxy user.
+     * 
+     * @param proxyUser
+     */
+    public void setProxyUser( String proxyUser )
+    {
+        this.proxyUser = proxyUser;
+    } //-- void setProxyUser( String )
+
+    /**
+     * Method toString.
+     * 
+     * @return String
+     */
+    public java.lang.String toString()
+    {
+        StringBuilder buf = new StringBuilder( 128 );
+
+        buf.append( "method = '" );
+        buf.append( getMethod() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "followRedirects = '" );
+        buf.append( isFollowRedirects() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyHost = '" );
+        buf.append( getProxyHost() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyPort = '" );
+        buf.append( getProxyPort() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyUser = '" );
+        buf.append( getProxyUser() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyPassword = '" );
+        buf.append( getProxyPassword() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyNtlmHost = '" );
+        buf.append( getProxyNtlmHost() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "proxyNtlmDomain = '" );
+        buf.append( getProxyNtlmDomain() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "timeout = '" );
+        buf.append( getTimeout() );
+        buf.append( "'" );
+
+        return buf.toString();
+    } //-- java.lang.String toString()
+
+    
+          
+    /**
+     * Set the timeout to be used. A value of zero means the timeout is not used.
+     *
+     * @param timeout positive int
+     */
+    public void setTimeout( int timeout )
+    {
+        if ( timeout < 0 )
+        {
+            throw new IllegalArgumentException( timeout + " should be 0 or positive." );
+        }
+        this.timeout = timeout;
+    }
+
+    private java.util.Properties httpClientParameters;
+
+    /**
+     * @return the extra HttpClient parameters
+     * @see http://hc.apache.org/httpclient-3.x/preference-api.html
+     */
+    public java.util.Properties getHttpClientParameters()
+    {
+        return httpClientParameters;
+    }
+
+    /**
+     * @param httpClientParameters the extra HttpClient parameters to set
+     * @see http://hc.apache.org/httpclient-3.x/preference-api.html
+     */
+    public void setHttpClientParameters( java.util.Properties httpClientParameters )
+    {
+        this.httpClientParameters = httpClientParameters;
+    }
+          
+}
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFile.java b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFile.java
new file mode 100644
index 0000000..dba2213
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFile.java
@@ -0,0 +1,340 @@
+package org.apache.maven.doxia.linkcheck.model;
+
+/*
+ * 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.
+ */
+
+/**
+ * 
+ *         The <code>&lt;file&gt;</code> to be checked.
+ *       
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class LinkcheckFile
+    implements java.io.Serializable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             The file to check as String Object.
+     *           
+     */
+    private String absolutePath;
+
+    /**
+     * 
+     *             The relative path of the file.
+     *           
+     */
+    private String relativePath;
+
+    /**
+     * 
+     *             The number of successful links in this file.
+     *           
+     */
+    private int successful = -1;
+
+    /**
+     * 
+     *             The number of unsuccessful links in this file.
+     *           
+     */
+    private int unsuccessful = -1;
+
+    /**
+     * Field results.
+     */
+    private java.util.List<LinkcheckFileResult> results;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addResult.
+     * 
+     * @param linkcheckFileResult
+     */
+    public void addResult( LinkcheckFileResult linkcheckFileResult )
+    {
+        getResults().add( linkcheckFileResult );
+    } //-- void addResult( LinkcheckFileResult )
+
+    /**
+     * Method equals.
+     * 
+     * @param other
+     * @return boolean
+     */
+    public boolean equals( Object other )
+    {
+        if ( this == other )
+        {
+            return true;
+        }
+
+        if ( !( other instanceof LinkcheckFile ) )
+        {
+            return false;
+        }
+
+        LinkcheckFile that = (LinkcheckFile) other;
+        boolean result = true;
+
+        result = result && ( getAbsolutePath() == null ? that.getAbsolutePath() == null : getAbsolutePath().equals( that.getAbsolutePath() ) );
+        result = result && ( getRelativePath() == null ? that.getRelativePath() == null : getRelativePath().equals( that.getRelativePath() ) );
+        result = result && successful == that.successful;
+        result = result && unsuccessful == that.unsuccessful;
+        result = result && ( getResults() == null ? that.getResults() == null : getResults().equals( that.getResults() ) );
+
+        return result;
+    } //-- boolean equals( Object )
+
+    /**
+     * Get the file to check as String Object.
+     * 
+     * @return String
+     */
+    public String getAbsolutePath()
+    {
+        return this.absolutePath;
+    } //-- String getAbsolutePath()
+
+    /**
+     * Get the relative path of the file.
+     * 
+     * @return String
+     */
+    public String getRelativePath()
+    {
+        return this.relativePath;
+    } //-- String getRelativePath()
+
+    /**
+     * Method getResults.
+     * 
+     * @return List
+     */
+    public java.util.List<LinkcheckFileResult> getResults()
+    {
+        if ( this.results == null )
+        {
+            this.results = new java.util.ArrayList<LinkcheckFileResult>();
+        }
+
+        return this.results;
+    } //-- java.util.List<LinkcheckFileResult> getResults()
+
+    /**
+     * Get the number of successful links in this file.
+     * 
+     * @return int
+     */
+    public int getSuccessful()
+    {
+        return this.successful;
+    } //-- int getSuccessful()
+
+    /**
+     * Get the number of unsuccessful links in this file.
+     * 
+     * @return int
+     */
+    public int getUnsuccessful()
+    {
+        return this.unsuccessful;
+    } //-- int getUnsuccessful()
+
+    /**
+     * Method hashCode.
+     * 
+     * @return int
+     */
+    public int hashCode()
+    {
+        int result = 17;
+
+        result = 37 * result + ( absolutePath != null ? absolutePath.hashCode() : 0 );
+        result = 37 * result + ( relativePath != null ? relativePath.hashCode() : 0 );
+        result = 37 * result + (int) successful;
+        result = 37 * result + (int) unsuccessful;
+        result = 37 * result + ( results != null ? results.hashCode() : 0 );
+
+        return result;
+    } //-- int hashCode()
+
+    /**
+     * Method removeResult.
+     * 
+     * @param linkcheckFileResult
+     */
+    public void removeResult( LinkcheckFileResult linkcheckFileResult )
+    {
+        getResults().remove( linkcheckFileResult );
+    } //-- void removeResult( LinkcheckFileResult )
+
+    /**
+     * Set the file to check as String Object.
+     * 
+     * @param absolutePath
+     */
+    public void setAbsolutePath( String absolutePath )
+    {
+        this.absolutePath = absolutePath;
+    } //-- void setAbsolutePath( String )
+
+    /**
+     * Set the relative path of the file.
+     * 
+     * @param relativePath
+     */
+    public void setRelativePath( String relativePath )
+    {
+        this.relativePath = relativePath;
+    } //-- void setRelativePath( String )
+
+    /**
+     * Set all error details in this file.
+     * 
+     * @param results
+     */
+    public void setResults( java.util.List<LinkcheckFileResult> results )
+    {
+        this.results = results;
+    } //-- void setResults( java.util.List )
+
+    /**
+     * Set the number of successful links in this file.
+     * 
+     * @param successful
+     */
+    public void setSuccessful( int successful )
+    {
+        this.successful = successful;
+    } //-- void setSuccessful( int )
+
+    /**
+     * Set the number of unsuccessful links in this file.
+     * 
+     * @param unsuccessful
+     */
+    public void setUnsuccessful( int unsuccessful )
+    {
+        this.unsuccessful = unsuccessful;
+    } //-- void setUnsuccessful( int )
+
+    /**
+     * Method toString.
+     * 
+     * @return String
+     */
+    public java.lang.String toString()
+    {
+        StringBuilder buf = new StringBuilder( 128 );
+
+        buf.append( "absolutePath = '" );
+        buf.append( getAbsolutePath() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "relativePath = '" );
+        buf.append( getRelativePath() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "successful = '" );
+        buf.append( getSuccessful() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "unsuccessful = '" );
+        buf.append( getUnsuccessful() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "results = '" );
+        buf.append( getResults() );
+        buf.append( "'" );
+
+        return buf.toString();
+    } //-- java.lang.String toString()
+
+    
+            
+    /**
+     * Get the number of links for this file depending the level wanted.
+     *
+     * {@link LinkcheckFileResult#ERROR_LEVEL}
+     * {@link LinkcheckFileResult#UNKNOWN_LEVEL}
+     * {@link LinkcheckFileResult#VALID_LEVEL}
+     * {@link LinkcheckFileResult#WARNING_LEVEL}
+     *
+     * @param level the restricted level
+     * @return the number of links for the restrict level, -1 if the level is not a valid one
+     * or no results was found.
+     * @throws UnsupportedOperationException if the level is unsupported.
+     */
+    public int getNumberOfLinks( int level )
+    {
+        if ( results == null )
+        {
+            return -1;
+        }
+
+        if ( !( level == LinkcheckFileResult.ERROR_LEVEL || level == LinkcheckFileResult.WARNING_LEVEL
+            || level == LinkcheckFileResult.VALID_LEVEL || level == LinkcheckFileResult.UNKNOWN_LEVEL ) )
+        {
+            throw new UnsupportedOperationException( "This level [" + level + "] is unsupported." );
+        }
+
+        int number = 0;
+        for ( java.util.Iterator it = results.iterator(); it.hasNext(); )
+        {
+            LinkcheckFileResult linkcheckFileResult = (LinkcheckFileResult) it.next();
+
+            if ( linkcheckFileResult.getStatusLevel() == level )
+            {
+                number++;
+            }
+        }
+
+        return number;
+    }
+
+    /**
+     * Get the number of links for this file.
+     *
+     * @param level
+     * @return
+     */
+    public int getNumberOfLinks()
+    {
+        if ( results == null )
+        {
+            return -1;
+        }
+
+        return results.size();
+    }
+            
+          
+}
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFileResult.java b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFileResult.java
new file mode 100644
index 0000000..f7c1b30
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckFileResult.java
@@ -0,0 +1,246 @@
+package org.apache.maven.doxia.linkcheck.model;
+
+/*
+ * 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.
+ */
+
+/**
+ * 
+ * A class containing the results of a single check of a link.      
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class LinkcheckFileResult
+    implements java.io.Serializable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * 
+     *             The target URL.
+     *           
+     */
+    private String target;
+
+    /**
+     * 
+     *             The status.
+     *           
+     */
+    private String status;
+
+    /**
+     * 
+     *             The error message.
+     *           
+     */
+    private String errorMessage;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method equals.
+     * 
+     * @param other
+     * @return boolean
+     */
+    public boolean equals( Object other )
+    {
+        if ( this == other )
+        {
+            return true;
+        }
+
+        if ( !( other instanceof LinkcheckFileResult ) )
+        {
+            return false;
+        }
+
+        LinkcheckFileResult that = (LinkcheckFileResult) other;
+        boolean result = true;
+
+        result = result && ( getTarget() == null ? that.getTarget() == null : getTarget().equals( that.getTarget() ) );
+        result = result && ( getStatus() == null ? that.getStatus() == null : getStatus().equals( that.getStatus() ) );
+        result = result && ( getErrorMessage() == null ? that.getErrorMessage() == null : getErrorMessage().equals( that.getErrorMessage() ) );
+
+        return result;
+    } //-- boolean equals( Object )
+
+    /**
+     * Get the error message.
+     * 
+     * @return String
+     */
+    public String getErrorMessage()
+    {
+        return this.errorMessage;
+    } //-- String getErrorMessage()
+
+    /**
+     * Get the status.
+     * 
+     * @return String
+     */
+    public String getStatus()
+    {
+        return this.status;
+    } //-- String getStatus()
+
+    /**
+     * Get the target URL.
+     * 
+     * @return String
+     */
+    public String getTarget()
+    {
+        return this.target;
+    } //-- String getTarget()
+
+    /**
+     * Method hashCode.
+     * 
+     * @return int
+     */
+    public int hashCode()
+    {
+        int result = 17;
+
+        result = 37 * result + ( target != null ? target.hashCode() : 0 );
+        result = 37 * result + ( status != null ? status.hashCode() : 0 );
+        result = 37 * result + ( errorMessage != null ? errorMessage.hashCode() : 0 );
+
+        return result;
+    } //-- int hashCode()
+
+    /**
+     * Set the error message.
+     * 
+     * @param errorMessage
+     */
+    public void setErrorMessage( String errorMessage )
+    {
+        this.errorMessage = errorMessage;
+    } //-- void setErrorMessage( String )
+
+    /**
+     * Set the status.
+     * 
+     * @param status
+     */
+    public void setStatus( String status )
+    {
+        this.status = status;
+    } //-- void setStatus( String )
+
+    /**
+     * Set the target URL.
+     * 
+     * @param target
+     */
+    public void setTarget( String target )
+    {
+        this.target = target;
+    } //-- void setTarget( String )
+
+    /**
+     * Method toString.
+     * 
+     * @return String
+     */
+    public java.lang.String toString()
+    {
+        StringBuilder buf = new StringBuilder( 128 );
+
+        buf.append( "target = '" );
+        buf.append( getTarget() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "status = '" );
+        buf.append( getStatus() );
+        buf.append( "'" );
+        buf.append( "\n" ); 
+        buf.append( "errorMessage = '" );
+        buf.append( getErrorMessage() );
+        buf.append( "'" );
+
+        return buf.toString();
+    } //-- java.lang.String toString()
+
+    
+            
+    /** The vm line separator. */
+    private static final String EOL = System.getProperty( "line.separator" );
+
+    /** Validation result level: error. */
+    public static final int ERROR_LEVEL = 1;
+
+    /** Validation result level: warning. */
+    public static final int WARNING_LEVEL = 2;
+
+    /** Validation result level: valid. */
+    public static final int VALID_LEVEL = 3;
+
+    /** Validation result level: unknown. */
+    public static final int UNKNOWN_LEVEL = 4;
+
+    /** Validation result: error. */
+    public static final String ERROR = "error";
+
+    /** Validation result: warning. */
+    public static final String WARNING = "warning";
+
+    /** Validation result: valid. */
+    public static final String VALID = "valid";
+
+    /** Validation result: unknown. */
+    public static final String UNKNOWN = "unknown";
+
+    /**
+     * Returns the status as an integer.
+     *
+     * @return One of ERROR, WARNING, VALID or UNKNOWN.
+     */
+    public int getStatusLevel()
+    {
+        int level = UNKNOWN_LEVEL;
+
+        if ( VALID.equals( getStatus() ) )
+        {
+            level = VALID_LEVEL;
+        }
+        else if ( WARNING.equals( getStatus() ) )
+        {
+            level = WARNING_LEVEL;
+        }
+        else if ( ERROR.equals( getStatus() ) )
+        {
+            level = ERROR_LEVEL;
+        }
+
+        return level;
+    }
+            
+          
+}
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckModel.java b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckModel.java
new file mode 100644
index 0000000..19c9a8b
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/model/LinkcheckModel.java
@@ -0,0 +1,173 @@
+package org.apache.maven.doxia.linkcheck.model;
+
+/*
+ * 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.
+ */
+
+/**
+ * 
+ * The <code>&lt;linkcheck&gt;</code> element is the root of the linkcheck descriptor.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class LinkcheckModel
+    implements java.io.Serializable
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field files.
+     */
+    private java.util.List<LinkcheckFile> files;
+
+    /**
+     * Field modelEncoding.
+     */
+    private String modelEncoding = "UTF-8";
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method addFile.
+     * 
+     * @param linkcheckFile
+     */
+    public void addFile( LinkcheckFile linkcheckFile )
+    {
+        getFiles().add( linkcheckFile );
+    } //-- void addFile( LinkcheckFile )
+
+    /**
+     * Method equals.
+     * 
+     * @param other
+     * @return boolean
+     */
+    public boolean equals( Object other )
+    {
+        if ( this == other )
+        {
+            return true;
+        }
+
+        if ( !( other instanceof LinkcheckModel ) )
+        {
+            return false;
+        }
+
+        LinkcheckModel that = (LinkcheckModel) other;
+        boolean result = true;
+
+        result = result && ( getFiles() == null ? that.getFiles() == null : getFiles().equals( that.getFiles() ) );
+
+        return result;
+    } //-- boolean equals( Object )
+
+    /**
+     * Method getFiles.
+     * 
+     * @return List
+     */
+    public java.util.List<LinkcheckFile> getFiles()
+    {
+        if ( this.files == null )
+        {
+            this.files = new java.util.ArrayList<LinkcheckFile>();
+        }
+
+        return this.files;
+    } //-- java.util.List<LinkcheckFile> getFiles()
+
+    /**
+     * Get the modelEncoding field.
+     * 
+     * @return String
+     */
+    public String getModelEncoding()
+    {
+        return this.modelEncoding;
+    } //-- String getModelEncoding()
+
+    /**
+     * Method hashCode.
+     * 
+     * @return int
+     */
+    public int hashCode()
+    {
+        int result = 17;
+
+        result = 37 * result + ( files != null ? files.hashCode() : 0 );
+
+        return result;
+    } //-- int hashCode()
+
+    /**
+     * Method removeFile.
+     * 
+     * @param linkcheckFile
+     */
+    public void removeFile( LinkcheckFile linkcheckFile )
+    {
+        getFiles().remove( linkcheckFile );
+    } //-- void removeFile( LinkcheckFile )
+
+    /**
+     * Set list of <code>&lt;file&gt;</code> elements.
+     * 
+     * @param files
+     */
+    public void setFiles( java.util.List<LinkcheckFile> files )
+    {
+        this.files = files;
+    } //-- void setFiles( java.util.List )
+
+    /**
+     * Set the modelEncoding field.
+     * 
+     * @param modelEncoding
+     */
+    public void setModelEncoding( String modelEncoding )
+    {
+        this.modelEncoding = modelEncoding;
+    } //-- void setModelEncoding( String )
+
+    /**
+     * Method toString.
+     * 
+     * @return String
+     */
+    public java.lang.String toString()
+    {
+        StringBuilder buf = new StringBuilder( 128 );
+
+        buf.append( "files = '" );
+        buf.append( getFiles() );
+        buf.append( "'" );
+
+        return buf.toString();
+    } //-- java.lang.String toString()
+
+}
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Reader.java b/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Reader.java
new file mode 100644
index 0000000..831c576
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Reader.java
@@ -0,0 +1,859 @@
+package org.apache.maven.doxia.linkcheck.model.io.xpp3;
+
+/*
+ * 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.
+ */
+
+  //---------------------------------/
+ //- Imported classes and packages -/
+//---------------------------------/
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.text.DateFormat;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckFile;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckFileResult;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckModel;
+import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
+import org.codehaus.plexus.util.xml.pull.MXParser;
+import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * Class LinkcheckModelXpp3Reader.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class LinkcheckModelXpp3Reader
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * If set the parser will be loaded with all single characters
+     * from the XHTML specification.
+     * The entities used:
+     * <ul>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent</li>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent</li>
+     * <li>http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent</li>
+     * </ul>
+     */
+    private boolean addDefaultEntities = true;
+
+    /**
+     * Field contentTransformer.
+     */
+    public final ContentTransformer contentTransformer;
+
+
+      //----------------/
+     //- Constructors -/
+    //----------------/
+
+    public LinkcheckModelXpp3Reader()
+    {
+        this( new ContentTransformer()
+        {
+            public String transform( String source, String fieldName )
+            {
+                return source;
+            }
+        } );
+    } //-- org.apache.maven.doxia.linkcheck.model.io.xpp3.LinkcheckModelXpp3Reader()
+
+    public LinkcheckModelXpp3Reader(ContentTransformer contentTransformer)
+    {
+        this.contentTransformer = contentTransformer;
+    } //-- org.apache.maven.doxia.linkcheck.model.io.xpp3.LinkcheckModelXpp3Reader(ContentTransformer)
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method checkFieldWithDuplicate.
+     * 
+     * @param parser
+     * @param parsed
+     * @param alias
+     * @param tagName
+     * @throws XmlPullParserException
+     * @return boolean
+     */
+    private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, java.util.Set parsed )
+        throws XmlPullParserException
+    {
+        if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
+        {
+            return false;
+        }
+        if ( !parsed.add( tagName ) )
+        {
+            throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
+        }
+        return true;
+    } //-- boolean checkFieldWithDuplicate( XmlPullParser, String, String, java.util.Set )
+
+    /**
+     * Method checkUnknownAttribute.
+     * 
+     * @param parser
+     * @param strict
+     * @param tagName
+     * @param attribute
+     * @throws XmlPullParserException
+     * @throws IOException
+     */
+    private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
+        throws XmlPullParserException, IOException
+    {
+        // strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
+        if ( strict )
+        {
+            throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
+        }
+    } //-- void checkUnknownAttribute( XmlPullParser, String, String, boolean )
+
+    /**
+     * Method checkUnknownElement.
+     * 
+     * @param parser
+     * @param strict
+     * @throws XmlPullParserException
+     * @throws IOException
+     */
+    private void checkUnknownElement( XmlPullParser parser, boolean strict )
+        throws XmlPullParserException, IOException
+    {
+        if ( strict )
+        {
+            throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
+        }
+
+        for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
+        {
+            int eventType = parser.next();
+            if ( eventType == XmlPullParser.START_TAG )
+            {
+                unrecognizedTagCount++;
+            }
+            else if ( eventType == XmlPullParser.END_TAG )
+            {
+                unrecognizedTagCount--;
+            }
+        }
+    } //-- void checkUnknownElement( XmlPullParser, boolean )
+
+    /**
+     * Returns the state of the "add default entities" flag.
+     * 
+     * @return boolean
+     */
+    public boolean getAddDefaultEntities()
+    {
+        return addDefaultEntities;
+    } //-- boolean getAddDefaultEntities()
+
+    /**
+     * Method getBooleanValue.
+     * 
+     * @param s
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return boolean
+     */
+    private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
+        throws XmlPullParserException
+    {
+        return getBooleanValue( s, attribute, parser, null );
+    } //-- boolean getBooleanValue( String, String, XmlPullParser )
+
+    /**
+     * Method getBooleanValue.
+     * 
+     * @param s
+     * @param defaultValue
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return boolean
+     */
+    private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
+        throws XmlPullParserException
+    {
+        if ( s != null && s.length() != 0 )
+        {
+            return Boolean.valueOf( s ).booleanValue();
+        }
+        if ( defaultValue != null )
+        {
+            return Boolean.valueOf( defaultValue ).booleanValue();
+        }
+        return false;
+    } //-- boolean getBooleanValue( String, String, XmlPullParser, String )
+
+    /**
+     * Method getByteValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return byte
+     */
+    private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Byte.valueOf( s ).byteValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- byte getByteValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getCharacterValue.
+     * 
+     * @param s
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return char
+     */
+    private char getCharacterValue( String s, String attribute, XmlPullParser parser )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            return s.charAt( 0 );
+        }
+        return 0;
+    } //-- char getCharacterValue( String, String, XmlPullParser )
+
+    /**
+     * Method getDateValue.
+     * 
+     * @param s
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return Date
+     */
+    private java.util.Date getDateValue( String s, String attribute, XmlPullParser parser )
+        throws XmlPullParserException
+    {
+        return getDateValue( s, attribute, null, parser );
+    } //-- java.util.Date getDateValue( String, String, XmlPullParser )
+
+    /**
+     * Method getDateValue.
+     * 
+     * @param s
+     * @param parser
+     * @param dateFormat
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return Date
+     */
+    private java.util.Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            String effectiveDateFormat = dateFormat;
+            if ( dateFormat == null )
+            {
+                effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+            }
+            if ( "long".equals( effectiveDateFormat ) )
+            {
+                try
+                {
+                    return new java.util.Date( Long.parseLong( s ) );
+                }
+                catch ( NumberFormatException e )
+                {
+                    throw new XmlPullParserException( e.getMessage(), parser, e );
+                }
+            }
+            else
+            {
+                try
+                {
+                    DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
+                    return dateParser.parse( s );
+                }
+                catch ( java.text.ParseException e )
+                {
+                    throw new XmlPullParserException( e.getMessage(), parser, e );
+                }
+            }
+        }
+        return null;
+    } //-- java.util.Date getDateValue( String, String, String, XmlPullParser )
+
+    /**
+     * Method getDoubleValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return double
+     */
+    private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Double.valueOf( s ).doubleValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- double getDoubleValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getFloatValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return float
+     */
+    private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Float.valueOf( s ).floatValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- float getFloatValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getIntegerValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return int
+     */
+    private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Integer.valueOf( s ).intValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- int getIntegerValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getLongValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return long
+     */
+    private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Long.valueOf( s ).longValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- long getLongValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getRequiredAttributeValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return String
+     */
+    private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s == null )
+        {
+            if ( strict )
+            {
+                throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
+            }
+        }
+        return s;
+    } //-- String getRequiredAttributeValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getShortValue.
+     * 
+     * @param s
+     * @param strict
+     * @param parser
+     * @param attribute
+     * @throws XmlPullParserException
+     * @return short
+     */
+    private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
+        throws XmlPullParserException
+    {
+        if ( s != null )
+        {
+            try
+            {
+                return Short.valueOf( s ).shortValue();
+            }
+            catch ( NumberFormatException nfe )
+            {
+                if ( strict )
+                {
+                    throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
+                }
+            }
+        }
+        return 0;
+    } //-- short getShortValue( String, String, XmlPullParser, boolean )
+
+    /**
+     * Method getTrimmedValue.
+     * 
+     * @param s
+     * @return String
+     */
+    private String getTrimmedValue( String s )
+    {
+        if ( s != null )
+        {
+            s = s.trim();
+        }
+        return s;
+    } //-- String getTrimmedValue( String )
+
+    /**
+     * Method interpolatedTrimmed.
+     * 
+     * @param value
+     * @param context
+     * @return String
+     */
+    private String interpolatedTrimmed( String value, String context )
+    {
+        return getTrimmedValue( contentTransformer.transform( value, context ) );
+    } //-- String interpolatedTrimmed( String, String )
+
+    /**
+     * Method nextTag.
+     * 
+     * @param parser
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return int
+     */
+    private int nextTag( XmlPullParser parser )
+        throws IOException, XmlPullParserException
+    {
+        int eventType = parser.next();
+        if ( eventType == XmlPullParser.TEXT )
+        {
+            eventType = parser.next();
+        }
+        if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
+        {
+            throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
+        }
+        return eventType;
+    } //-- int nextTag( XmlPullParser )
+
+    /**
+     * @see ReaderFactory#newXmlReader
+     * 
+     * @param reader
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    public LinkcheckModel read( Reader reader, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
+
+        parser.setInput( reader );
+
+
+        return read( parser, strict );
+    } //-- LinkcheckModel read( Reader, boolean )
+
+    /**
+     * @see ReaderFactory#newXmlReader
+     * 
+     * @param reader
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    public LinkcheckModel read( Reader reader )
+        throws IOException, XmlPullParserException
+    {
+        return read( reader, true );
+    } //-- LinkcheckModel read( Reader )
+
+    /**
+     * Method read.
+     * 
+     * @param in
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    public LinkcheckModel read( InputStream in, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        return read( ReaderFactory.newXmlReader( in ), strict );
+    } //-- LinkcheckModel read( InputStream, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param in
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    public LinkcheckModel read( InputStream in )
+        throws IOException, XmlPullParserException
+    {
+        return read( ReaderFactory.newXmlReader( in ) );
+    } //-- LinkcheckModel read( InputStream )
+
+    /**
+     * Method parseLinkcheckFile.
+     * 
+     * @param parser
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckFile
+     */
+    private LinkcheckFile parseLinkcheckFile( XmlPullParser parser, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        String tagName = parser.getName();
+        LinkcheckFile linkcheckFile = new LinkcheckFile();
+        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
+        {
+            String name = parser.getAttributeName( i );
+            String value = parser.getAttributeValue( i );
+
+            if ( name.indexOf( ':' ) >= 0 )
+            {
+                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
+            }
+            else
+            {
+                checkUnknownAttribute( parser, name, tagName, strict );
+            }
+        }
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
+        {
+            if ( checkFieldWithDuplicate( parser, "absolutePath", null, parsed ) )
+            {
+                linkcheckFile.setAbsolutePath( interpolatedTrimmed( parser.nextText(), "absolutePath" ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "relativePath", null, parsed ) )
+            {
+                linkcheckFile.setRelativePath( interpolatedTrimmed( parser.nextText(), "relativePath" ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "successful", null, parsed ) )
+            {
+                linkcheckFile.setSuccessful( getIntegerValue( interpolatedTrimmed( parser.nextText(), "successful" ), "successful", parser, strict ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "unsuccessful", null, parsed ) )
+            {
+                linkcheckFile.setUnsuccessful( getIntegerValue( interpolatedTrimmed( parser.nextText(), "unsuccessful" ), "unsuccessful", parser, strict ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "results", null, parsed ) )
+            {
+                java.util.List<LinkcheckFileResult> results = new java.util.ArrayList<LinkcheckFileResult>();
+                linkcheckFile.setResults( results );
+                while ( parser.nextTag() == XmlPullParser.START_TAG )
+                {
+                    if ( "result".equals( parser.getName() ) )
+                    {
+                        results.add( parseLinkcheckFileResult( parser, strict ) );
+                    }
+                    else
+                    {
+                        checkUnknownElement( parser, strict );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( parser, strict );
+            }
+        }
+        return linkcheckFile;
+    } //-- LinkcheckFile parseLinkcheckFile( XmlPullParser, boolean )
+
+    /**
+     * Method parseLinkcheckFileResult.
+     * 
+     * @param parser
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckFileResult
+     */
+    private LinkcheckFileResult parseLinkcheckFileResult( XmlPullParser parser, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        String tagName = parser.getName();
+        LinkcheckFileResult linkcheckFileResult = new LinkcheckFileResult();
+        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
+        {
+            String name = parser.getAttributeName( i );
+            String value = parser.getAttributeValue( i );
+
+            if ( name.indexOf( ':' ) >= 0 )
+            {
+                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
+            }
+            else
+            {
+                checkUnknownAttribute( parser, name, tagName, strict );
+            }
+        }
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
+        {
+            if ( checkFieldWithDuplicate( parser, "target", null, parsed ) )
+            {
+                linkcheckFileResult.setTarget( interpolatedTrimmed( parser.nextText(), "target" ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "status", null, parsed ) )
+            {
+                linkcheckFileResult.setStatus( interpolatedTrimmed( parser.nextText(), "status" ) );
+            }
+            else if ( checkFieldWithDuplicate( parser, "errorMessage", null, parsed ) )
+            {
+                linkcheckFileResult.setErrorMessage( interpolatedTrimmed( parser.nextText(), "errorMessage" ) );
+            }
+            else
+            {
+                checkUnknownElement( parser, strict );
+            }
+        }
+        return linkcheckFileResult;
+    } //-- LinkcheckFileResult parseLinkcheckFileResult( XmlPullParser, boolean )
+
+    /**
+     * Method parseLinkcheckModel.
+     * 
+     * @param parser
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    private LinkcheckModel parseLinkcheckModel( XmlPullParser parser, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        String tagName = parser.getName();
+        LinkcheckModel linkcheckModel = new LinkcheckModel();
+        for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
+        {
+            String name = parser.getAttributeName( i );
+            String value = parser.getAttributeValue( i );
+
+            if ( name.indexOf( ':' ) >= 0 )
+            {
+                // just ignore attributes with non-default namespace (for example: xmlns:xsi)
+            }
+            else if ( "xmlns".equals( name ) )
+            {
+                // ignore xmlns attribute in root class, which is a reserved attribute name
+            }
+            else
+            {
+                checkUnknownAttribute( parser, name, tagName, strict );
+            }
+        }
+        java.util.Set parsed = new java.util.HashSet();
+        while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
+        {
+            if ( checkFieldWithDuplicate( parser, "files", null, parsed ) )
+            {
+                java.util.List<LinkcheckFile> files = new java.util.ArrayList<LinkcheckFile>();
+                linkcheckModel.setFiles( files );
+                while ( parser.nextTag() == XmlPullParser.START_TAG )
+                {
+                    if ( "file".equals( parser.getName() ) )
+                    {
+                        files.add( parseLinkcheckFile( parser, strict ) );
+                    }
+                    else
+                    {
+                        checkUnknownElement( parser, strict );
+                    }
+                }
+            }
+            else
+            {
+                checkUnknownElement( parser, strict );
+            }
+        }
+        return linkcheckModel;
+    } //-- LinkcheckModel parseLinkcheckModel( XmlPullParser, boolean )
+
+    /**
+     * Method read.
+     * 
+     * @param parser
+     * @param strict
+     * @throws IOException
+     * @throws XmlPullParserException
+     * @return LinkcheckModel
+     */
+    private LinkcheckModel read( XmlPullParser parser, boolean strict )
+        throws IOException, XmlPullParserException
+    {
+        LinkcheckModel linkcheckModel = null;
+        int eventType = parser.getEventType();
+        boolean parsed = false;
+        while ( eventType != XmlPullParser.END_DOCUMENT )
+        {
+            if ( eventType == XmlPullParser.START_TAG )
+            {
+                if ( strict && ! "linkcheckModel".equals( parser.getName() ) )
+                {
+                    throw new XmlPullParserException( "Expected root element 'linkcheckModel' but found '" + parser.getName() + "'", parser, null );
+                }
+                else if ( parsed )
+                {
+                    // fallback, already expected a XmlPullParserException due to invalid XML
+                    throw new XmlPullParserException( "Duplicated tag: 'linkcheckModel'", parser, null );
+                }
+                linkcheckModel = parseLinkcheckModel( parser, strict );
+                linkcheckModel.setModelEncoding( parser.getInputEncoding() );
+                parsed = true;
+            }
+            eventType = parser.next();
+        }
+        if ( parsed )
+        {
+            return linkcheckModel;
+        }
+        throw new XmlPullParserException( "Expected root element 'linkcheckModel' but found no element at all: invalid XML document", parser, null );
+    } //-- LinkcheckModel read( XmlPullParser, boolean )
+
+    /**
+     * Sets the state of the "add default entities" flag.
+     * 
+     * @param addDefaultEntities
+     */
+    public void setAddDefaultEntities( boolean addDefaultEntities )
+    {
+        this.addDefaultEntities = addDefaultEntities;
+    } //-- void setAddDefaultEntities( boolean )
+
+    public static interface ContentTransformer
+{
+    /**
+     * Interpolate the value read from the xpp3 document
+     * @param source The source value
+     * @param fieldName A description of the field being interpolated. The implementation may use this to
+     *                           log stuff.
+     * @return The interpolated value.
+     */
+    String transform( String source, String fieldName );
+}
+
+}
diff --git a/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Writer.java b/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Writer.java
new file mode 100644
index 0000000..b1e92b4
--- /dev/null
+++ b/src/main/java/org/apache/maven/doxia/linkcheck/model/io/xpp3/LinkcheckModelXpp3Writer.java
@@ -0,0 +1,200 @@
+package org.apache.maven.doxia.linkcheck.model.io.xpp3;
+
+/*
+ * 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.OutputStream;
+import java.io.Writer;
+import java.util.Iterator;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckFile;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckFileResult;
+import org.apache.maven.doxia.linkcheck.model.LinkcheckModel;
+import org.codehaus.plexus.util.xml.pull.MXSerializer;
+import org.codehaus.plexus.util.xml.pull.XmlSerializer;
+
+/**
+ * Class LinkcheckModelXpp3Writer.
+ * 
+ * @version $Revision$ $Date$
+ */
+@SuppressWarnings( "all" )
+public class LinkcheckModelXpp3Writer
+{
+
+      //--------------------------/
+     //- Class/Member Variables -/
+    //--------------------------/
+
+    /**
+     * Field NAMESPACE.
+     */
+    private static final String NAMESPACE = null;
+
+    /**
+     * Field fileComment.
+     */
+    private String fileComment = null;
+
+
+      //-----------/
+     //- Methods -/
+    //-----------/
+
+    /**
+     * Method setFileComment.
+     * 
+     * @param fileComment
+     */
+    public void setFileComment( String fileComment )
+    {
+        this.fileComment = fileComment;
+    } //-- void setFileComment( String )
+
+    /**
+     * Method write.
+     * 
+     * @param writer
+     * @param linkcheckModel
+     * @throws java.io.IOException
+     */
+    public void write( Writer writer, LinkcheckModel linkcheckModel )
+        throws java.io.IOException
+    {
+        XmlSerializer serializer = new MXSerializer();
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", "  " );
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
+        serializer.setOutput( writer );
+        serializer.startDocument( linkcheckModel.getModelEncoding(), null );
+        writeLinkcheckModel( linkcheckModel, "linkcheckModel", serializer );
+        serializer.endDocument();
+    } //-- void write( Writer, LinkcheckModel )
+
+    /**
+     * Method write.
+     * 
+     * @param stream
+     * @param linkcheckModel
+     * @throws java.io.IOException
+     */
+    public void write( OutputStream stream, LinkcheckModel linkcheckModel )
+        throws java.io.IOException
+    {
+        XmlSerializer serializer = new MXSerializer();
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", "  " );
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
+        serializer.setOutput( stream, linkcheckModel.getModelEncoding() );
+        serializer.startDocument( linkcheckModel.getModelEncoding(), null );
+        writeLinkcheckModel( linkcheckModel, "linkcheckModel", serializer );
+        serializer.endDocument();
+    } //-- void write( OutputStream, LinkcheckModel )
+
+    /**
+     * Method writeLinkcheckFile.
+     * 
+     * @param linkcheckFile
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     */
+    private void writeLinkcheckFile( LinkcheckFile linkcheckFile, String tagName, XmlSerializer serializer )
+        throws java.io.IOException
+    {
+        serializer.startTag( NAMESPACE, tagName );
+        if ( linkcheckFile.getAbsolutePath() != null )
+        {
+            serializer.startTag( NAMESPACE, "absolutePath" ).text( linkcheckFile.getAbsolutePath() ).endTag( NAMESPACE, "absolutePath" );
+        }
+        if ( linkcheckFile.getRelativePath() != null )
+        {
+            serializer.startTag( NAMESPACE, "relativePath" ).text( linkcheckFile.getRelativePath() ).endTag( NAMESPACE, "relativePath" );
+        }
+        if ( linkcheckFile.getSuccessful() != -1 )
+        {
+            serializer.startTag( NAMESPACE, "successful" ).text( String.valueOf( linkcheckFile.getSuccessful() ) ).endTag( NAMESPACE, "successful" );
+        }
+        if ( linkcheckFile.getUnsuccessful() != -1 )
+        {
+            serializer.startTag( NAMESPACE, "unsuccessful" ).text( String.valueOf( linkcheckFile.getUnsuccessful() ) ).endTag( NAMESPACE, "unsuccessful" );
+        }
+        if ( ( linkcheckFile.getResults() != null ) && ( linkcheckFile.getResults().size() > 0 ) )
+        {
+            serializer.startTag( NAMESPACE, "results" );
+            for ( Iterator iter = linkcheckFile.getResults().iterator(); iter.hasNext(); )
+            {
+                LinkcheckFileResult o = (LinkcheckFileResult) iter.next();
+                writeLinkcheckFileResult( o, "result", serializer );
+            }
+            serializer.endTag( NAMESPACE, "results" );
+        }
+        serializer.endTag( NAMESPACE, tagName );
+    } //-- void writeLinkcheckFile( LinkcheckFile, String, XmlSerializer )
+
+    /**
+     * Method writeLinkcheckFileResult.
+     * 
+     * @param linkcheckFileResult
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     */
+    private void writeLinkcheckFileResult( LinkcheckFileResult linkcheckFileResult, String tagName, XmlSerializer serializer )
+        throws java.io.IOException
+    {
+        serializer.startTag( NAMESPACE, tagName );
+        if ( linkcheckFileResult.getTarget() != null )
+        {
+            serializer.startTag( NAMESPACE, "target" ).text( linkcheckFileResult.getTarget() ).endTag( NAMESPACE, "target" );
+        }
+        if ( linkcheckFileResult.getStatus() != null )
+        {
+            serializer.startTag( NAMESPACE, "status" ).text( linkcheckFileResult.getStatus() ).endTag( NAMESPACE, "status" );
+        }
+        if ( linkcheckFileResult.getErrorMessage() != null )
+        {
+            serializer.startTag( NAMESPACE, "errorMessage" ).text( linkcheckFileResult.getErrorMessage() ).endTag( NAMESPACE, "errorMessage" );
+        }
+        serializer.endTag( NAMESPACE, tagName );
+    } //-- void writeLinkcheckFileResult( LinkcheckFileResult, String, XmlSerializer )
+
+    /**
+     * Method writeLinkcheckModel.
+     * 
+     * @param linkcheckModel
+     * @param serializer
+     * @param tagName
+     * @throws java.io.IOException
+     */
+    private void writeLinkcheckModel( LinkcheckModel linkcheckModel, String tagName, XmlSerializer serializer )
+        throws java.io.IOException
+    {
+        serializer.startTag( NAMESPACE, tagName );
+        if ( ( linkcheckModel.getFiles() != null ) && ( linkcheckModel.getFiles().size() > 0 ) )
+        {
+            serializer.startTag( NAMESPACE, "files" );
+            for ( Iterator iter = linkcheckModel.getFiles().iterator(); iter.hasNext(); )
+            {
+                LinkcheckFile o = (LinkcheckFile) iter.next();
+                writeLinkcheckFile( o, "file", serializer );
+            }
+            serializer.endTag( NAMESPACE, "files" );
+        }
+        serializer.endTag( NAMESPACE, tagName );
+    } //-- void writeLinkcheckModel( LinkcheckModel, String, XmlSerializer )
+
+}
diff --git a/src/main/mdo/httpbean.mdo b/src/main/mdo/httpbean.mdo
deleted file mode 100644
index dc9fcb0..0000000
--- a/src/main/mdo/httpbean.mdo
+++ /dev/null
@@ -1,173 +0,0 @@
-<?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.
--->
-
-<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.0.0 https://codehaus-plexus.github.io/modello/xsd/modello-1.0.0.xsd">
-  <id>http</id>
-  <name>HttpBean</name>
-  <description>Bean for supported HTTP parameters.</description>
-  <defaults>
-    <default>
-      <key>package</key>
-      <value>org.apache.maven.doxia.linkcheck</value>
-    </default>
-  </defaults>
-  <classes>
-    <class>
-      <name>HttpBean</name>
-      <description>Http bean to encapsulate the supported HTTP parameters.
-         @see org.apache.commons.httpclient.HttpMethod</description>
-      <version>1.0.0</version>
-      <fields>
-        <field>
-          <name>method</name>
-          <description><![CDATA[
-     The HTTP method to use. Currently supported are "GET" and "HEAD".
-     <dl>
-     <dt>HTTP GET</dt>
-     <dd>
-     The HTTP GET method is defined in section 9.3 of
-     <a HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
-     <blockquote>
-     The GET method means retrieve whatever information (in the form of an
-     entity) is identified by the Request-URI.
-     </blockquote>
-     </dd>
-     <dt>HTTP HEAD</dt>
-     <dd>
-     The HTTP HEAD method is defined in section 9.4 of
-     <a HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a>:
-     <blockquote>
-     The HEAD method is identical to GET except that the server MUST NOT
-     return a message-body in the response.
-     </blockquote>
-     </dd>
-     </dl>]]></description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-          <defaultValue>head</defaultValue>
-        </field>
-        <field>
-          <name>followRedirects</name>
-          <description><![CDATA[
-     if the HTTP method should automatically follow HTTP redirects
-     (status code 302, etc.), <tt>false</tt> otherwise.]]></description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>boolean</type>
-        </field>
-        <field>
-          <name>proxyHost</name>
-          <description>The proxy host.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-        </field>
-        <field>
-          <name>proxyPort</name>
-          <description>The proxy port.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>int</type>
-          <defaultValue>0</defaultValue>
-        </field>
-        <field>
-          <name>proxyUser</name>
-          <description>The proxy user.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-        </field>
-        <field>
-          <name>proxyPassword</name>
-          <description>The proxy password.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-        </field>
-        <field>
-          <name>proxyNtlmHost</name>
-          <description>The proxy NTLM (NT Lan Manager) host.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-        </field>
-        <field>
-          <name>proxyNtlmDomain</name>
-          <description>The proxy NTLM (NT Lan Manager) domain.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>String</type>
-        </field>
-        <field java.setter="false">
-          <name>timeout</name>
-          <description>The timeout to be used. A value of zero means the timeout is not used.
-            Default value is 2000.</description>
-          <version>1.0.0</version>
-          <identifier>true</identifier>
-          <type>int</type>
-          <defaultValue>2000</defaultValue>
-        </field>
-      </fields>
-      <codeSegments>
-        <codeSegment>
-          <version>1.0.0</version>
-          <code>
-          <![CDATA[
-    /**
-     * Set the timeout to be used. A value of zero means the timeout is not used.
-     *
-     * @param timeout positive int
-     */
-    public void setTimeout( int timeout )
-    {
-        if ( timeout < 0 )
-        {
-            throw new IllegalArgumentException( timeout + " should be 0 or positive." );
-        }
-        this.timeout = timeout;
-    }
-
-    private java.util.Properties httpClientParameters;
-
-    /**
-     * @return the extra HttpClient parameters
-     * @see http://hc.apache.org/httpclient-3.x/preference-api.html
-     */
-    public java.util.Properties getHttpClientParameters()
-    {
-        return httpClientParameters;
-    }
-
-    /**
-     * @param httpClientParameters the extra HttpClient parameters to set
-     * @see http://hc.apache.org/httpclient-3.x/preference-api.html
-     */
-    public void setHttpClientParameters( java.util.Properties httpClientParameters )
-    {
-        this.httpClientParameters = httpClientParameters;
-    }]]>
-          </code>
-        </codeSegment>
-      </codeSegments>
-    </class>
-  </classes>
-</model>
diff --git a/src/main/mdo/linkcheck.mdo b/src/main/mdo/linkcheck.mdo
deleted file mode 100644
index bb6bb2d..0000000
--- a/src/main/mdo/linkcheck.mdo
+++ /dev/null
@@ -1,274 +0,0 @@
-<?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.
--->
-
-<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.0.0 https://codehaus-plexus.github.io/modello/xsd/modello-1.0.0.xsd">
-  <id>linkcheck</id>
-  <name>LinkcheckModel</name>
-  <description>Model for the linkcheck report.</description>
-  <defaults>
-    <default>
-      <key>package</key>
-      <value>org.apache.maven.doxia.linkcheck.model</value>
-    </default>
-  </defaults>
-  <classes>
-    <class rootElement="true">
-      <name>LinkcheckModel</name>
-      <description><![CDATA[
-         The <code>&lt;linkcheck&gt;</code> element is the root of the linkcheck descriptor.
-      ]]></description>
-      <version>1.0.0</version>
-      <fields>
-        <field>
-          <name>files</name>
-          <description><![CDATA[
-            List of <code>&lt;file&gt;</code> elements.
-          ]]></description>
-          <version>1.0.0</version>
-          <association>
-            <type>LinkcheckFile</type>
-            <multiplicity>*</multiplicity>
-          </association>
-          <identifier>true</identifier>
-        </field>
-      </fields>
-    </class>
-    <class>
-      <name>LinkcheckFile</name>
-      <description><![CDATA[
-        The <code>&lt;file&gt;</code> to be checked.
-      ]]></description>
-      <version>1.0.0</version>
-      <fields>
-        <field>
-          <name>absolutePath</name>
-          <version>1.0.0</version>
-          <description><![CDATA[
-            The file to check as String Object.
-          ]]></description>
-          <type>String</type>
-          <identifier>true</identifier>
-        </field>
-        <field>
-          <name>relativePath</name>
-          <version>1.0.0</version>
-          <description><![CDATA[
-            The relative path of the file.
-          ]]></description>
-          <type>String</type>
-          <identifier>true</identifier>
-        </field>
-        <field>
-          <name>successful</name>
-          <version>1.0.0</version>
-          <description><![CDATA[
-            The number of successful links in this file.
-          ]]></description>
-          <type>int</type>
-          <identifier>true</identifier>
-          <defaultValue>-1</defaultValue>
-        </field>
-        <field>
-          <name>unsuccessful</name>
-          <version>1.0.0</version>
-          <description><![CDATA[
-            The number of unsuccessful links in this file.
-          ]]></description>
-          <type>int</type>
-          <identifier>true</identifier>
-          <defaultValue>-1</defaultValue>
-        </field>
-        <field>
-          <name>results</name>
-          <version>1.0.0</version>
-          <description><![CDATA[
-            All error details in this file.
-          ]]></description>
-          <association>
-            <type>LinkcheckFileResult</type>
-            <multiplicity>*</multiplicity>
-          </association>
-          <identifier>true</identifier>
-        </field>
-      </fields>
-      <codeSegments>
-        <codeSegment>
-          <version>1.0.0</version>
-          <code>
-            <![CDATA[
-    /**
-     * Get the number of links for this file depending the level wanted.
-     *
-     * {@link LinkcheckFileResult#ERROR_LEVEL}
-     * {@link LinkcheckFileResult#UNKNOWN_LEVEL}
-     * {@link LinkcheckFileResult#VALID_LEVEL}
-     * {@link LinkcheckFileResult#WARNING_LEVEL}
-     *
-     * @param level the restricted level
-     * @return the number of links for the restrict level, -1 if the level is not a valid one
-     * or no results was found.
-     * @throws UnsupportedOperationException if the level is unsupported.
-     */
-    public int getNumberOfLinks( int level )
-    {
-        if ( results == null )
-        {
-            return -1;
-        }
-
-        if ( !( level == LinkcheckFileResult.ERROR_LEVEL || level == LinkcheckFileResult.WARNING_LEVEL
-            || level == LinkcheckFileResult.VALID_LEVEL || level == LinkcheckFileResult.UNKNOWN_LEVEL ) )
-        {
-            throw new UnsupportedOperationException( "This level [" + level + "] is unsupported." );
-        }
-
-        int number = 0;
-        for ( java.util.Iterator it = results.iterator(); it.hasNext(); )
-        {
-            LinkcheckFileResult linkcheckFileResult = (LinkcheckFileResult) it.next();
-
-            if ( linkcheckFileResult.getStatusLevel() == level )
-            {
-                number++;
-            }
-        }
-
-        return number;
-    }
-
-    /**
-     * Get the number of links for this file.
-     *
-     * @param level
-     * @return
-     */
-    public int getNumberOfLinks()
-    {
-        if ( results == null )
-        {
-            return -1;
-        }
-
-        return results.size();
-    }
-            ]]>
-          </code>
-        </codeSegment>
-      </codeSegments>
-    </class>
-    <class>
-      <name>LinkcheckFileResult</name>
-      <description><![CDATA[
-        An class containing the results of a single check of a link.
-      ]]></description>
-      <version>1.0.0</version>
-      <fields>
-        <field>
-          <name>target</name>
-          <description><![CDATA[
-            The target URL.
-          ]]></description>
-          <version>1.0.0</version>
-          <type>String</type>
-          <identifier>true</identifier>
-        </field>
-        <field>
-          <name>status</name>
-          <description><![CDATA[
-            The status.
-          ]]></description>
-          <version>1.0.0</version>
-          <type>String</type>
-          <identifier>true</identifier>
-        </field>
-        <field>
-          <name>errorMessage</name>
-          <description><![CDATA[
-            The error message.
-          ]]></description>
-          <version>1.0.0</version>
-          <type>String</type>
-          <identifier>true</identifier>
-        </field>
-      </fields>
-      <codeSegments>
-        <codeSegment>
-          <version>1.0.0</version>
-          <code>
-            <![CDATA[
-    /** The vm line separator. */
-    private static final String EOL = System.getProperty( "line.separator" );
-
-    /** Validation result level: error. */
-    public static final int ERROR_LEVEL = 1;
-
-    /** Validation result level: warning. */
-    public static final int WARNING_LEVEL = 2;
-
-    /** Validation result level: valid. */
-    public static final int VALID_LEVEL = 3;
-
-    /** Validation result level: unknown. */
-    public static final int UNKNOWN_LEVEL = 4;
-
-    /** Validation result: error. */
-    public static final String ERROR = "error";
-
-    /** Validation result: warning. */
-    public static final String WARNING = "warning";
-
-    /** Validation result: valid. */
-    public static final String VALID = "valid";
-
-    /** Validation result: unknown. */
-    public static final String UNKNOWN = "unknown";
-
-    /**
-     * Returns the status as an integer.
-     *
-     * @return One of ERROR, WARNING, VALID or UNKNOWN.
-     */
-    public int getStatusLevel()
-    {
-        int level = UNKNOWN_LEVEL;
-
-        if ( VALID.equals( getStatus() ) )
-        {
-            level = VALID_LEVEL;
-        }
-        else if ( WARNING.equals( getStatus() ) )
-        {
-            level = WARNING_LEVEL;
-        }
-        else if ( ERROR.equals( getStatus() ) )
-        {
-            level = ERROR_LEVEL;
-        }
-
-        return level;
-    }
-            ]]>
-          </code>
-        </codeSegment>
-      </codeSegments>
-    </class>
-  </classes>
-</model>