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

Java tutorial

Introduction

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

Source

/**
 * 
 */
package com.sap.prd.mobile.ios.mios;

/*
 * #%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%
 */

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FilenameUtils;

/**
 * 
 *
 */
public class FrameworkStructureValidator {

    private final File fmwkDir;
    private List<String> errorMsgs;

    public FrameworkStructureValidator(File fmwkDir) {
        this.fmwkDir = fmwkDir;
    }

    /**
     * 
     * @return a non <code>null</code> list containing the validation errors. The list is empty if the
     *         framework has a valid structure.
     */
    public List<String> validate() {
        errorMsgs = new ArrayList<String>();
        if (!fmwkDir.isDirectory()) {
            errorMsgs.add("'" + fmwkDir.getAbsolutePath() + "' is not a directory");
        } else {
            validateSubdirExistence("Versions", "Versions/A", "Versions/A/Headers", "Versions/A/Resources");
            String fmwkName = FilenameUtils.removeExtension(fmwkDir.getName());
            validateLib("Versions/A/" + fmwkName);
            validateLink("Headers", "Versions/A/Headers");
            validateLink("Resources", "Versions/A/Resources");
            validateLink(fmwkName, "Versions/A/" + fmwkName);
            validateLink("Versions/Current", "Versions/A");
        }
        return errorMsgs;
    }

    private void validateSubdirExistence(String... subDirNames) {
        for (String subDirName : subDirNames) {
            File dir = new File(fmwkDir, subDirName);
            if (!dir.isDirectory()) {
                errorMsgs.add("Missing the required subdirectory '" + subDirName + "'");
            }
        }
    }

    private void validateLib(String relativeLibPath) {
        File libFile = new File(fmwkDir, relativeLibPath);
        if (!libFile.exists()) {
            errorMsgs.add("Missing the required library file '" + relativeLibPath + "'");
        } else {
            try {
                if (!new FatLibAnalyzer(libFile).containsI386()) {
                    errorMsgs.add("'" + libFile.getAbsolutePath()
                            + "' does not contain i386 architecture. You should configure your project accordingly to build "
                            + "for the simulator architecture, otherwise the applications, which are using this framework will "
                            + "not be able to run in Simulator. For this, set the 'Build Active Architecture Only' to 'NO' for both"
                            + "'Release' and 'Debug' configuration.");
                }
            } catch (IOException e) {
                errorMsgs.add("Error ocurred during validation of the library '" + libFile.getAbsolutePath()
                        + "' for i386");
            }
        }
    }

    private void validateLink(String from, String to) {
        File fromLink = new File(fmwkDir, from);
        File toFile = new File(fmwkDir, to);
        try {
            if (!FileUtils.isSymbolicLink(fromLink)) {
                errorMsgs.add("Expected inside the framework a symbolic link from '" + from + "' to '" + to + "'");
            } else if (!fromLink.getCanonicalPath().equals(toFile.getCanonicalPath())) {
                errorMsgs.add("The link '" + from + "' does not point to '" + to + "'");
            }
        } catch (IOException ioe) {
            errorMsgs.add("Could not validate the symbolic link from '" + from + "' to '" + to + "': "
                    + ioe.getMessage());
        }

    }

}