
/*
 * 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.*;
import org.codehaus.plexus.util.*;

boolean result = true;

try
{
    File target = new File( basedir, "target" );
    if ( !target.exists() || !target.isDirectory() )
    {
        System.err.println( "target file is missing or not a directory." );
        return false;
    }
    
    File siteDirectory = new File ( target, "site" );
    if ( !siteDirectory.exists() || !siteDirectory.isDirectory() )
    {
        System.err.println( "site file is missing or not a directory." );
        return false;
    }    
    
    File releaseDirectory = new File ( siteDirectory, "releases" );
    if ( !releaseDirectory.exists() || !releaseDirectory.isDirectory() )
    {
        System.err.println( "releaseDirectory file is missing or not a directory." );
        return false;
    }
    File release163 = new File ( releaseDirectory, "release1.6.3.html" );
    if ( !release163.exists() || release163.isDirectory() )
    {
        System.err.println( "release163 file is missing or a directory." );
        return false;
    }
    File release16 = new File ( releaseDirectory, "release1.6.html" );
    if ( !release16.exists() || release16.isDirectory() )
    {
        System.err.println( "release16 file is missing or a directory." );
        return false;
    }      
    
    File download = new File ( siteDirectory, "download.html" );
    if ( !download.exists() || download.isDirectory() )
    {
        System.err.println( "download.html file is missing or a directory." );
        return false;
    }    
    FileInputStream fis = new FileInputStream ( download );
    String downloadContent = IOUtil.toString ( fis );
    int indexOf = downloadContent.indexOf( "Download Maven 2.0.7" );
    if ( indexOf < 0)
    {
    	System.err.println( "download.html doesn't contains Download Maven 2.0.7" );
    }
           
}
catch( IOException e )
{
    e.printStackTrace();
    result = false;
}

return result;
