/* ====================================================================
   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.
==================================================================== */

package org.apache.poi.ss.excelant;

import org.apache.poi.ss.excelant.util.ExcelAntWorkbookUtil;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

/**
 * This is the class that backs the <handler> tag in the Ant task.
 * <p>
 * Its purpose is to provide a way to manipulate a workbook in the course
 * of an ExcelAnt task.  The idea being to model a way for test writers to
 * simulate the behaviors of the workbook. 
 * <p>
 * Suppose, for example, you have a workbook that has a worksheet that
 * reacts to values entered or selected by the user.  It's possible in
 * Excel to change other cells based on this but this isn't easily possible
 * in POI.  In ExcelAnt we handle this using the Handler, which is a Java
 * class you write to manipulate the workbook. 
 * <p>
 * In order to use this tag you must write a class that implements the 
 * <code>IExcelAntWorkbookHandler</code> interface.  After writing the
 * class you should package it and it's dependencies into a jar file to 
 * add as library in your Ant build file.
 * 
 * @author Jon Svede ( jon [at] loquatic [dot] com )
 * @author Brian Bush ( brian [dot] bush [at] nrel [dot] gov )
 *
 */
public class ExcelAntHandlerTask extends Task {
    
    private String className ;
    
    private ExcelAntWorkbookUtil wbUtil ;

    public void setClassName( String cName ) {
        className = cName ;
    }
    
    protected void setEAWorkbookUtil( ExcelAntWorkbookUtil wkbkUtil ) {
        wbUtil = wkbkUtil ;
    }
    
    @Override
    public void execute() throws BuildException {
        log( "handling the workbook with class " + className, Project.MSG_INFO ) ;
        try {
            Class<?> clazz = Class.forName( className ) ;
            Object handlerObj = clazz.newInstance() ;
            if( handlerObj instanceof IExcelAntWorkbookHandler ) {
                IExcelAntWorkbookHandler iHandler = (IExcelAntWorkbookHandler)handlerObj ;
                iHandler.setWorkbook( wbUtil.getWorkbook() ) ;
                iHandler.execute() ;
             }
        } catch( Exception e ) {
            throw new BuildException( e.getMessage(), e ) ;
        }
    }
 }
