
/*
 * 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 a directory." );
        return false;
    }

    File webappDirectory = new File( target, "simple-war-project-1.0-SNAPSHOT" );
    if ( !webappDirectory.exists() || !webappDirectory.isDirectory() )
    {
        System.err.println( "webappDirectory is missing or not a directory." );
        return false;
    }

    File webInfFile = new File( webappDirectory, "WEB-INF/web.xml" );
    if ( !webInfFile.exists() || webInfFile.isDirectory() )
    {
        System.err.println( "webInfFile is missing or a directory." );
        return false;
    }



    String paramContent = FileUtils.fileRead( webInfFile, "UTF-8" );


    int indexOf = paramContent.indexOf( "<display-name>maven test it</display-name>" );
    if ( indexOf < 0 )
    {
      System.err.println( "web.xml not contains <display-name>maven test it</display-name>" );
      return false;
    }

    File indexJsp = new File( webappDirectory, "index.jsp" );
    if ( !indexJsp.exists() || indexJsp.isDirectory() )
    {
        System.err.println( "indexJsp is missing or a directory." );
        return false;
    }

    File warFile = new File( target, "simple-war-project-1.0-SNAPSHOT.war" );
    if ( !warFile.exists() || warFile.isDirectory() )
    {
        System.err.println( "warFile is missing or a directory." );
        return false;
    }

    File libDir = new File( webappDirectory, "WEB-INF/lib" );
    if ( !libDir.exists() || !libDir.isDirectory() )
    {
        System.err.println( "WEB-INF/lib is missing or not a directory." );
        return false;
    }

    File plexusUtilsDependency = new File( libDir, "plexus-utils-1.4.6.jar" );
    if ( !plexusUtilsDependency.exists() || plexusUtilsDependency.isDirectory() )
    {
        System.err.println( "plexus-utils-1.4.6.jar is missing or a directory." );
        return false;
    }
}
catch( IOException e )
{
    e.printStackTrace();
    result = false;
}

return result;
