
/*
 * 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 java.util.*;
import java.util.jar.*;
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 deployedDir = new File( target, "repo/org/apache/maven/its/deploy/test/1.0-SNAPSHOT/" );
    if ( !deployedDir.isDirectory() )
    {
        System.err.println( "deployedDir is missing or is not a directory." );
        return false;
    }

    boolean sourcesExists = false;
    boolean javadocsExists = false;

    String [] fileList = deployedDir.list();
    for ( int i=0; i<fileList.length; ++i )
    {
        if ( fileList[i].endsWith( "-1-sources.jar" ) )
        {
            sourcesExists = true;
        }
        if ( fileList[i].endsWith( "-1-javadoc.jar" ) )
        {
            javadocsExists = true;
        }
    }

    if ( !sourcesExists )
    {
        System.err.println( "Unable to find deployed sources jar" );
        return false;
    }

    if ( !javadocsExists )
    {
        System.err.println( "Unable to find deployed javadocs jar" );
        return false;
    }

}
catch( Throwable e )
{
    e.printStackTrace();
    result = false;
}

return result;
