
/*
 * 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.*;

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, "scope-depdency-same-artifact-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;
    }

    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, "scope-depdency-same-artifact-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.7.jar" );
    if ( !plexusUtilsDependency.exists() || plexusUtilsDependency.isDirectory() )
    {
        System.err.println( "plexus-utils-1.4.7.jar is missing or a directory." );
        return false;
    }
    File plexusUtilsSourceDependency = new File( libDir, "plexus-utils-1.4.7-sources.jar" );
    if ( !plexusUtilsSourceDependency.exists() || plexusUtilsSourceDependency.isDirectory() )
    {
        System.err.println( "plexus-utils-1.4.7-sources.jar is missing or a directory." );
        return false;
    }
}
catch( IOException e )
{
    e.printStackTrace();
    result = false;
}

return result;
