/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
 
package com.nokia.ant.taskdefs;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.FileResource;

/**
 * Can load ant configuration file both in .xml and .txt format.
 * In .txt file configuration could be defined like -
 * text.a = text.value.A
 * text.b : text.value.B
 * text.c : ${text.a}
 * In .xml file configuration could be defined like -
 * <config>
 *   <foo>bar</foo>
 *   <interpolated>foo value = ${foo}</interpolated>
 *    <xml>
 *        <c>C</c>
 *        <d>D</d>
 *    </xml>
 *    <array>
 *        <value>one</value>
 *        <value>two</value>
 *    </array>
 *</config> 
 * @ant.task name="configuration"
*/
public class AntConfigurationTask extends Task
{
    private File filepath;

    private ArrayList<ResourceCollection> rcs = new ArrayList<ResourceCollection>();

    public final void setFile(final File file)
    {
        this.filepath = file;
    }

    public final void addFileset(final FileSet set)
    {
        add(set);
    }

    public final void add( final ResourceCollection res)
    {
        rcs.add(res);
    }

    public final void execute() 
    {
        if (filepath != null)
        {
            importFile(filepath);
        }
        else
        {
            Iterator resourceCollectionIter = rcs.iterator();

            while (resourceCollectionIter.hasNext())
            {
                ResourceCollection resourceCollection = (ResourceCollection) resourceCollectionIter
                        .next();
                Iterator resourceIter = resourceCollection.iterator();
                while (resourceIter.hasNext())
                {
                    FileResource filepath = (FileResource) resourceIter.next();
                    importFile(filepath.getFile());
                }
            }
        }
    }

    private void importFile(final File file)
    {
        try
        {
            String filename = file.getName();
            Configuration config = null;
            if (filename.endsWith(".txt"))
            {
                config = new PropertiesConfiguration(file);
            }
            else if (filename.endsWith(".xml"))
            {
                config = new XMLConfiguration(file);
            }
            Iterator keysIter = config.getKeys();
            while (keysIter.hasNext())
            {
                String key = (String) keysIter.next();
                getProject().setProperty(key, config.getString(key));
            }
        }
        catch (ConfigurationException e)
        {
            throw new BuildException("Not able to import the ANT file " + e.getMessage());
        }
    }
}
