com.sap.prd.mobile.ios.mios.XCodeCopySourcesMojo.java Source code

Java tutorial

Introduction

Here is the source code for com.sap.prd.mobile.ios.mios.XCodeCopySourcesMojo.java

Source

/*
 * #%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 static com.sap.prd.mobile.ios.mios.FileUtils.getCanonicalFile;

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

import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;

/**
 * Copies sources to the checkout directory below the target directory.
 * 
 * @goal copy-sources
 */
public class XCodeCopySourcesMojo extends AbstractXCodeMojo {

    /**
     * @parameter expression="${xcode.useSymbolicLinks}" default-value="false"
     */
    private boolean useSymbolicLinks;

    private boolean useSymbolicLinks() {
        return useSymbolicLinks;
    }

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        final File baseDirectory = getCanonicalFile(project.getBasedir());
        final File checkoutDirectory = getCanonicalFile(getCheckoutDirectory());
        final String buildDirPath = getProjectBuildDirectory();

        getLog().info("Base directory: " + baseDirectory);
        getLog().info("Checkout directory: " + checkoutDirectory);
        getLog().info("BuildDirPath: " + buildDirPath);

        final File originalLibDir = getCanonicalFile(
                new File(project.getBuild().getDirectory(), FolderLayout.LIBS_DIR_NAME));
        final File copyOfLibDir = getCanonicalFile(
                new File(checkoutDirectory, buildDirPath + "/" + FolderLayout.LIBS_DIR_NAME));

        final File originalHeadersDir = getCanonicalFile(
                new File(project.getBuild().getDirectory(), FolderLayout.HEADERS_DIR_NAME));
        final File copyOfHeadersDir = getCanonicalFile(
                new File(checkoutDirectory, buildDirPath + "/" + FolderLayout.HEADERS_DIR_NAME));

        final File originalXcodeDepsDir = getCanonicalFile(
                new File(project.getBuild().getDirectory(), FolderLayout.XCODE_DEPS_TARGET_FOLDER));
        final File copyOfXcodeDepsDir = getCanonicalFile(
                new File(checkoutDirectory, buildDirPath + "/" + FolderLayout.XCODE_DEPS_TARGET_FOLDER));

        try {

            if (checkoutDirectory.exists())
                com.sap.prd.mobile.ios.mios.FileUtils.deleteDirectory(checkoutDirectory);

            copy(baseDirectory, checkoutDirectory, new FileFilter() {

                @Override
                public boolean accept(final File pathname) {
                    final File canonicalPathName = getCanonicalFile(pathname);

                    return !(checkoutDirectory.equals(canonicalPathName) || originalLibDir.equals(canonicalPathName)
                            || originalHeadersDir.equals(canonicalPathName)
                            || originalXcodeDepsDir.equals(canonicalPathName));
                }

            });

            if (originalLibDir.exists()) {
                if (useSymbolicLinks()) {
                    com.sap.prd.mobile.ios.mios.FileUtils.createSymbolicLink(originalLibDir, copyOfLibDir);
                } else {
                    FileUtils.copyDirectory(originalLibDir, copyOfLibDir);
                }
            }

            if (originalHeadersDir.exists()) {
                if (useSymbolicLinks) {
                    com.sap.prd.mobile.ios.mios.FileUtils.createSymbolicLink(originalHeadersDir, copyOfHeadersDir);
                } else {
                    FileUtils.copyDirectory(originalHeadersDir, copyOfHeadersDir);
                }
            }

            if (originalXcodeDepsDir.exists()) {
                if (useSymbolicLinks) {
                    com.sap.prd.mobile.ios.mios.FileUtils.createSymbolicLink(originalXcodeDepsDir,
                            copyOfXcodeDepsDir);
                } else {
                    FileUtils.copyDirectory(originalXcodeDepsDir, copyOfXcodeDepsDir);
                }
            }

        } catch (IOException e) {
            throw new MojoExecutionException(e.getMessage(), e);
        }
    }

    /**
     * // Return the part of the path between project base directory and project build directory. //
     * Assumption is: project build directory is located below project base directory.
     **/
    private String getProjectBuildDirectory() {
        return com.sap.prd.mobile.ios.mios.FileUtils.getDelta(project.getBasedir(),
                new File(project.getBuild().getDirectory()));
    }

    private void copy(final File source, final File targetDirectory, final FileFilter excludes) throws IOException {

        for (final File sourceFile : source.listFiles()) {
            final File destFile = new File(targetDirectory, sourceFile.getName());
            if (sourceFile.isDirectory()) {

                if (excludes.accept(sourceFile)) {
                    copy(sourceFile, destFile, excludes);
                } else {
                    getLog().info("File '" + sourceFile + "' ommited.");
                }
            } else {
                FileUtils.copyFile(sourceFile, destFile);
                if (sourceFile.canExecute()) {
                    destFile.setExecutable(true);
                }
                getLog().debug((destFile.canExecute() ? "Executable" : "File '") + sourceFile + "' copied to '"
                        + destFile + "'.");
            }
        }
    }
}