/*
 * 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 com.adobe.ac.pmd.metrics.ant;

import java.io.File;
import java.io.IOException;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.dom4j.DocumentException;

import com.adobe.ac.pmd.LoggerUtils;
import com.adobe.ac.pmd.metrics.engine.FlexMetrics;

public class FlexMetricsAntTask extends Task
{
   private double mxmlFactor;

   private File   outputFile;

   private File   sourceDirectory;

   @Override
   public final void execute()
   {
      new LoggerUtils().loadConfiguration();
      validateFields();

      try
      {
         new FlexMetrics( sourceDirectory, mxmlFactor ).execute( outputFile );
      }
      catch ( final DocumentException e )
      {
         throw new BuildException( e );
      }
      catch ( final IOException e )
      {
         throw new BuildException( e );
      }
   }

   public void setMxmlFactor( final double mxmlFactorToBeSet )
   {
      this.mxmlFactor = mxmlFactorToBeSet;
   }

   public final void setOutputFile( final File outputFileToBeSet )
   {
      outputFile = outputFileToBeSet;
   }

   public final void setSourceDirectory( final File sourceDirectoryToBeSet )
   {
      sourceDirectory = sourceDirectoryToBeSet;
   }

   private void validateFields()
   {
      if ( outputFile == null )
      {
         throw new BuildException( "outputFile is required" );
      }
      else if ( sourceDirectory == null )
      {
         throw new BuildException( "sourceDirectory is required" );
      }
   }
}