/*
 * 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.net.*;
import java.util.zip.*;



boolean result = true;

try
{
    File zipFile = new File( basedir, "bundle/target/project-bundle-0.0.1-SNAPSHOT-bin.zip" );
    
    if ( !zipFile.exists() || zipFile.isDirectory() )
    {
        System.err.println( "zip-file is missing or a directory." );
        result = false;
    }
    
    ZipFile zf = new ZipFile( zipFile );

    zes = zf.entries();
    while(zes.hasMoreElements())
    {
        ZipEntry ze = zes.nextElement();
        if (ze.getName().contains("maven-assembly-plugin"))
        {
        System.err.println( "filename is incorrect" );
        result = false;
        }
    }

    zf.close();
}
catch( IOException e )
{
    e.printStackTrace();
    result = false;
}

return result;
