package org.apache.netbeans.nbm.utils;

/*
 * 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.apache.maven.plugin.AbstractMojo;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Taskdef;

/**
 * Abstract goal intended for nbm-maven-plugin and nb-repository. 
 */
public abstract class AbstractNetbeansMojo
    extends AbstractMojo
{

    /**
     * Creates a project initialized with the same logger.
     * @return project
     */
    protected final Project antProject()
    {
        Project antProject = new Project();
        antProject.init();
        antProject.addBuildListener( new BuildListener()
        {
            @Override
            public void buildStarted( BuildEvent be )
            {
                getLog().debug( "Ant build started" );
            }
            @Override
            public void buildFinished( BuildEvent be )
            {
                if ( be.getException() != null )
                {
                    getLog().error( be.getMessage(), be.getException() );
                }
                else
                {
                    getLog().debug( "Ant build finished" );
                }
            }
            @Override
            public void targetStarted( BuildEvent be )
            {
                getLog().info( be.getTarget().getName() + ":" );
            }
            @Override
            public void targetFinished( BuildEvent be )
            {
                getLog().debug( be.getTarget().getName() + " finished" );
            }
            @Override
            public void taskStarted( BuildEvent be )
            {
                getLog().debug( be.getTask().getTaskName() + " started" );
            }
            @Override
            public void taskFinished( BuildEvent be )
            {
                getLog().debug( be.getTask().getTaskName() + " finished" );
            }
            @Override
            public void messageLogged( BuildEvent be )
            {
                switch ( be.getPriority() )
                {
                    case Project.MSG_ERR:
                        getLog().error( be.getMessage() );
                        break;
                    case Project.MSG_WARN:
                        getLog().warn( be.getMessage() );
                        break;
                    case Project.MSG_INFO:
                        getLog().info( be.getMessage() );
                        break;
                    default:
                        getLog().debug( be.getMessage() );
                }
            }
        } );
        return antProject;
    }

    protected final Project registerNbmAntTasks()
    {
        Project antProject = antProject();

        Taskdef taskdef = (Taskdef) antProject.createTask( "taskdef" );
        taskdef.setClassname( "org.netbeans.nbbuild.MakeListOfNBM" );
        taskdef.setName( "genlist" );
        taskdef.execute();

        taskdef = (Taskdef) antProject.createTask( "taskdef" );
        taskdef.setClassname( "org.netbeans.nbbuild.MakeNBM" );
        taskdef.setName( "makenbm" );
        taskdef.execute();

        taskdef = (Taskdef) antProject.createTask( "taskdef" );
        taskdef.setClassname( "org.netbeans.nbbuild.MakeUpdateDesc" );
        taskdef.setName( "updatedist" );
        taskdef.execute();

        taskdef = (Taskdef) antProject.createTask( "taskdef" );
        taskdef.setClassname( "org.netbeans.nbbuild.CreateModuleXML" );
        taskdef.setName( "createmodulexml" );
        taskdef.execute();

        taskdef = (Taskdef) antProject.createTask( "taskdef" );
        taskdef.setClassname( "org.netbeans.nbbuild.JHIndexer" );
        taskdef.setName( "jhindexer" );
        taskdef.execute();

        return antProject;
    }



}
