/*
 * 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 org.codehaus.plexus.util.FileUtils;

import java.io.*;
import java.util.*;

String[] modules = { "mod-1", "mod-2", "mod-3" };
String[] paths =
{
    "target/site/pmd.html",
    "target/site/cpd.html",
    "target/pmd.xml",
    "target/cpd.xml",
};

// files must exist in every module
for ( String module : modules )
{
    // PMD and CPD reports
    for ( String path : paths )
    {
        File file = new File( basedir, module + '/' + path );
        System.out.println( "Checking for existence of " + file );
        if ( !file.isFile() )
        {
            throw new FileNotFoundException( "Missing: " + file.getAbsolutePath() );
        }
    }
}

// files must not exist in parent
for ( String path : paths )
{
    File file = new File( basedir, path );
    System.out.println( "Checking for absence of " + file );
    if ( file.exists() )
    {
        throw new IOException( "Banned: " + file.getAbsolutePath() );
    }
}


// check PMD rulesets target copy
File rule = new File( basedir, "mod-1/target/pmd/rulesets/latin-1.xml" );
String nonascii = "-CHARS: \u00C4\u00D6\u00DC\u00E4\u00F6\u00FC\u00DF\u00BC\u00BD\u00BE\u00A4";
String content = FileUtils.fileRead( rule, "ISO-8859-1" );
if ( content.indexOf( nonascii ) < 0 )
{
    throw new IOException( "non-ascii content corrupted in Latin1." );
}
rule = new File( basedir, "mod-1/target/pmd/rulesets/utf-8.xml" );
content = FileUtils.fileRead( rule, "UTF-8" );
if ( content.indexOf( nonascii ) < 0 )
{
    throw new IOException( "non-ascii content corrupted in UTF-8." );
}

// check xml files encoding
void checkEncoding( String module, String encoding )
{
    for ( String path : paths )
    {
        if ( !path.endsWith( ".xml" ) )
        {
            continue;
        }
        File file = new File( basedir, module + '/' + path );
        content = FileUtils.fileRead( file, encoding );
        if ( !content.startsWith( "<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>" ) )
        {
            throw new IOException( "wrong XML encoding declaration for " + file );
        }
    }
}
checkEncoding( "mod-1", "ISO-8859-1" );
checkEncoding( "mod-2", "UTF-8" );
checkEncoding( "mod-3", "UTF-8" );

return true;
