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

System.out.println( "Checking for presence of purged dependency directories" );

File depJar = new File( localRepositoryPath, "org/apache/maven/its/dependency/purge-local-repository/1.0/purge-local-repository-1.0.jar" );

if ( !depJar.exists() )
{
    throw new Exception( "Direct dependency jar was not re-resolved: " + depJar );
}

File depPom = new File( localRepositoryPath, "org/apache/maven/its/dependency/purge-local-repository/1.0/purge-local-repository-1.0.pom" );

if ( !depPom.exists() )
{
    throw new Exception( "Direct dependency pom was not re-resolved: " + depPom );
}

File transitiveDepJar = new File( localRepositoryPath, "org/apache/maven/its/dependency/purge-local-repository-2/1.0/purge-local-repository-2-1.0.jar" );

if ( !transitiveDepJar.exists() )
{
    throw new Exception( "Transitive dep jar was not re-resolved: " + transitiveDepJar );
}

File transitiveDepPom = new File( localRepositoryPath, "org/apache/maven/its/dependency/purge-local-repository-2/1.0/purge-local-repository-2-1.0.pom" );

if ( !transitiveDepPom.exists() )
{
    throw new Exception( "Transitive dep pom was not re-resolved: " + transitiveDepPom );
}

return true;
