import java.io.*;
import java.net.*;
import java.util.zip.*;

boolean result = true;

String basename = "multimodule-sources-copied-1.0-SNAPSHOT";

try
{
    File zipFile = new File( basedir, "target/" + basename + "-project.zip" );
    
    System.out.println( "Checking for existence and file-ishness of: " + zipFile );
    
    if ( !zipFile.exists() || zipFile.isDirectory() )
    {
        System.err.println( "zip file is missing or a directory." );
        return false;
    }
    
    System.out.println( "Creating zipFile instance." );
    
    ZipFile zf = new ZipFile( zipFile );
    
    String childPath = basename + "/child1";
    
    System.out.println( "Checking child1 project files..." );
    
    System.out.println( "Looking for project source file." );
    
    ZipEntry je = zf.getEntry( childPath + "/src/main/java/test/App.java" ); 

    if ( je == null )
    {
        System.out.println( childPath + " source file missing." );
        result = false;
    }
   
    System.out.println( "Looking for project test-source file." );
    
    je = null;
    je = zf.getEntry( childPath + "/src/test/java/test/AppTest.java" ); 

    if ( je == null )
    {
        System.out.println( childPath + " test-source file missing." );
        result = false;
    }
   
    System.out.println( "Looking for pom.xml file." );
    
    je = null;
    je = zf.getEntry( childPath + "/pom.xml" ); 

    if ( je == null )
    {
        System.out.println( childPath + " POM missing." );
        result = false;
    }
   
    childPath = basename + "/child2";
    
    System.out.println( "Checking child2 project files..." );
    
    System.out.println( "Looking for project source file." );
    
    je = null;
    je = zf.getEntry( childPath + "/src/main/java/test/App.java" ); 

    if ( je == null )
    {
        System.out.println( childPath + " source file missing." );
        result = false;
    }
   
    System.out.println( "Looking for project test-source file." );
    
    je = null;
    je = zf.getEntry( childPath + "/src/test/java/test/AppTest.java" ); 

    if ( je == null )
    {
        System.out.println( childPath + " test-source file missing." );
        result = false;
    }
   
    System.out.println( "Looking for pom.xml file." );
    
    je = null;
    je = zf.getEntry( childPath + "/pom.xml" ); 

    if ( je == null )
    {
        System.out.println( childPath + " POM missing." );
        result = false;
    }
   
    System.out.println( "Looking for main pom.xml file." );
    
    je = null;
    je = zf.getEntry( basename + "/pom.xml" ); 

    if ( je == null )
    {
        System.out.println( "project POM missing." );
        result = false;
    }
}
catch( IOException e )
{
    e.printStackTrace( System.out );
    result = false;
}

return result;
