XCodeDefaultConfigurationMojo.java
/*
 * #%L
 * xcode-maven-plugin
 * %%
 * Copyright (C) 2012 SAP AG
 * %%
 * Licensed 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.
 * #L%
 */
package com.sap.prd.mobile.ios.mios;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.LogManager;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
/**
 * Sets default values needed during Xcode build.
 * 
 * @goal set-default-configuration
 */
public class XCodeDefaultConfigurationMojo extends AbstractMojo
{
  private static final String DEFAULT_MAVEN_SOURCE_DIRECTORY = "src/main/java";
  static final String DEFAULT_XCODE_SOURCE_DIRECTORY = "src/xcode";
  private static final String DEFAULT_FOLDER_NAME_CHECKOUT_DIRECTORY = "checkout";
  private static final String XCODE_CHECKOUT_DIR = "xcode.checkoutDirectory";
  private static final String XCODE_COMPILE_DIR = "xcode.compileDirectory";
  static final String XCODE_SOURCE_DIRECTORY = "xcode.sourceDirectory";
  /**
   * @parameter expression="${project}"
   * @required
   */
  protected MavenProject project;
  private static XCodePluginLogger logger = new XCodePluginLogger();
  static {
     if(null == LogManager.getLogManager().getLogger(XCodePluginLogger.getLoggerName())) {
       LogManager.getLogManager().addLogger(logger);
     }
   }
  @Override
  public void execute() throws MojoExecutionException, MojoFailureException
  {
    final Properties projectProperties = project.getProperties();
    if (!projectProperties.containsKey(XCODE_SOURCE_DIRECTORY)) {
      projectProperties.setProperty(XCODE_SOURCE_DIRECTORY, DEFAULT_XCODE_SOURCE_DIRECTORY);
      getLog().info(
            "Property ${" + XCODE_SOURCE_DIRECTORY + "} was not set. ${" + XCODE_SOURCE_DIRECTORY + "} set to '"
                  + projectProperties.getProperty(XCODE_SOURCE_DIRECTORY) + "'.");
    }
    else {
      getLog().info(
            "Property ${" + XCODE_SOURCE_DIRECTORY + "} found with value '"
                  + projectProperties.getProperty(XCODE_SOURCE_DIRECTORY) + "' This value will no be modified");
      project.getBuild().setSourceDirectory(
            FileUtils.getCanonicalPath(new File(project.getBasedir(), projectProperties.getProperty(XCODE_SOURCE_DIRECTORY))));
    }
    if (project.getBuild().getSourceDirectory().contains("${" + XCODE_SOURCE_DIRECTORY + "}")) {
      project.getBuild().setSourceDirectory(
            project.getBuild().getSourceDirectory()
              .replace("${" + XCODE_SOURCE_DIRECTORY + "}", projectProperties.getProperty(XCODE_SOURCE_DIRECTORY)));
      getLog().info(
            "Project Build directory detected with unresolved property ${" + XCODE_SOURCE_DIRECTORY
                  + "}. This property is resolved to '"
                  + projectProperties.getProperty(XCODE_SOURCE_DIRECTORY) + "'.");
    }
    String sourceDirectory = getCurrentSourceDirectory(FileUtils.getCanonicalFile(project.getBasedir()),
          FileUtils.getCanonicalFile(new File(project.getBuild().getSourceDirectory())));
    if (sourceDirectory.equals(DEFAULT_MAVEN_SOURCE_DIRECTORY)) {
      project.getBuild().setSourceDirectory(
            FileUtils.getCanonicalPath(new File(project.getBasedir(), DEFAULT_XCODE_SOURCE_DIRECTORY)));
      getLog().info(
            "Build source directory was found to bet '" + DEFAULT_MAVEN_SOURCE_DIRECTORY
                  + "' which is the maven default. Set to xcode default '" + DEFAULT_XCODE_SOURCE_DIRECTORY + "'.");
      sourceDirectory = DEFAULT_XCODE_SOURCE_DIRECTORY;
    }
    else {
      getLog().info(
            "Build source directory was found to be '" + sourceDirectory
                  + "' which is not the default value in maven. This value is not modified.");
    }
    File checkoutDirectory = FileUtils.getCanonicalFile(new File(new File(project.getBuild().getDirectory()),
          DEFAULT_FOLDER_NAME_CHECKOUT_DIRECTORY));
    if (!projectProperties.containsKey(XCODE_CHECKOUT_DIR)) {
      projectProperties.setProperty(XCODE_CHECKOUT_DIR, FileUtils.getCanonicalPath(checkoutDirectory));
      getLog().info(
            "Property ${" + XCODE_CHECKOUT_DIR + "} was not set. ${" + XCODE_CHECKOUT_DIR + "} set to '"
                  + FileUtils.getCanonicalPath(checkoutDirectory) + "'.");
    }
    else {
      getLog().info(
            "Property ${" + XCODE_CHECKOUT_DIR + "} found with value '"
                  + projectProperties.getProperty(XCODE_CHECKOUT_DIR) + "'. This value will not be modified.");
      checkoutDirectory = FileUtils.getCanonicalFile(new File(new File(project.getBuild().getDirectory()),
            projectProperties.getProperty(XCODE_CHECKOUT_DIR)));
      projectProperties.setProperty(XCODE_CHECKOUT_DIR, FileUtils.getCanonicalPath(checkoutDirectory));
    }
    final File compileDirectory = FileUtils.getCanonicalFile(new File(checkoutDirectory, sourceDirectory));
    if (!projectProperties.containsKey(XCODE_COMPILE_DIR)) {
      projectProperties.setProperty(XCODE_COMPILE_DIR, FileUtils.getCanonicalPath(compileDirectory));
      getLog().info(
            "Property ${" + XCODE_COMPILE_DIR + "} was not set. ${" + XCODE_COMPILE_DIR + "} set to "
                  + FileUtils.getCanonicalPath(compileDirectory));
    }
    else if (!compileDirectory.equals(FileUtils.getCanonicalFile(new File(projectProperties.getProperty(XCODE_COMPILE_DIR))))) {
      getLog()
        .warn("Property ${"
              + XCODE_COMPILE_DIR
              + "} was found to be '"
              + projectProperties.getProperty(XCODE_COMPILE_DIR)
              + "' but should be '"
              + compileDirectory
              + "'. That property will be updated accordingly. Fix this issue in your pom file e.g by removing property ${"
              + XCODE_COMPILE_DIR + "}.");
      projectProperties.setProperty(XCODE_COMPILE_DIR, FileUtils.getCanonicalPath(compileDirectory));
    }
    else {
      getLog().info(
            "Property ${" + XCODE_COMPILE_DIR + "} was found with value '" + compileDirectory
                  + "' which is the expended value. This value is not modified.");
    }
    getLog().info("Summary:");
    getLog().info("${project.build.sourceDirectory}: " + project.getBuild().getSourceDirectory());
    getLog().info("${" + XCODE_CHECKOUT_DIR + "} : " + project.getProperties().getProperty(XCODE_CHECKOUT_DIR));
    getLog().info("${" + XCODE_COMPILE_DIR + "} : " + project.getProperties().getProperty(XCODE_COMPILE_DIR));
    getLog().info("${" + XCODE_SOURCE_DIRECTORY + "}: " + project.getProperties().getProperty(XCODE_SOURCE_DIRECTORY));
  }
  /**
   * 
   * @return The part of the path that is under $project.basedir that represents the
   *         sourceDirectory. Assumption is: sourceDirectory is located under the project base
   *         directory.
   */
  private String getCurrentSourceDirectory(final File baseDir, final File sourceDir)
  {
    return FileUtils.getDelta(baseDir, sourceDir);
  }
}