com.liferay.ide.project.core.util.ProjectImportUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.project.core.util.ProjectImportUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * Contributors:
 *    Kamesh Sampath - initial implementation
 ******************************************************************************/

package com.liferay.ide.project.core.util;

import com.liferay.ide.core.ILiferayConstants;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.ZipUtil;
import com.liferay.ide.project.core.BinaryProjectRecord;
import com.liferay.ide.project.core.IPortletFramework;
import com.liferay.ide.project.core.ProjectCore;
import com.liferay.ide.project.core.ProjectRecord;
import com.liferay.ide.project.core.facet.IPluginFacetConstants;
import com.liferay.ide.project.core.model.NewLiferayPluginProjectOp;
import com.liferay.ide.project.core.model.PluginType;
import com.liferay.ide.sdk.core.ISDKConstants;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKManager;
import com.liferay.ide.sdk.core.SDKUtil;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.eclipse.core.resources.FileInfoMatcherDescription;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
import org.eclipse.wst.common.project.facet.core.runtime.internal.BridgedRuntime;

/**
 * @author <a href="mailto:kamesh.sampath@hotmail.com">Kamesh Sampath</a>
 * @author Terry Jia
 * @author Simon Jiang
 */
@SuppressWarnings("restriction")
public class ProjectImportUtil {

    /**
     * This method was added as part of the IDE-381 fix, this method will collect all the binaries based on the binaries
     * list
     *
     * @return true if the directory has some binaries
     */
    public static boolean collectBinariesFromDirectory(Collection<File> binaryProjectFiles, File directory,
            boolean recurse, IProgressMonitor monitor) {
        if (monitor.isCanceled()) {
            return false;
        }

        monitor.subTask(NLS.bind(Msgs.checking, directory.getPath()));

        List<String> wildCards = Arrays.asList(ISDKConstants.BINARY_PLUGIN_PROJECT_WILDCARDS);

        WildcardFileFilter wildcardFileFilter = new WildcardFileFilter(wildCards);

        Collection<File> contents = FileUtils.listFiles(directory, wildcardFileFilter,
                DirectoryFileFilter.INSTANCE);

        if (contents == null) {
            return false;
        } else {
            for (File file : contents) {
                if (!binaryProjectFiles.contains(file) && isValidLiferayPlugin(file)) {
                    binaryProjectFiles.add(file);
                }
            }
        }

        return true;
    }

    /**
     * @param dataModel
     * @param pluginBinaryRecord
     * @param liferaySDK
     * @return
     * @throws IOException
     */
    public static ProjectRecord createSDKPluginProject(BridgedRuntime bridgedRuntime,
            BinaryProjectRecord pluginBinaryRecord, SDK liferaySDK) throws IOException {
        ProjectRecord projectRecord = null;

        if (!pluginBinaryRecord.isConflicts()) {
            String displayName = pluginBinaryRecord.getDisplayName();
            File binaryFile = pluginBinaryRecord.getBinaryFile();
            IPath projectPath = null;
            IPath sdkPluginProjectFolder = liferaySDK.getLocation();

            // IDE-110 IDE-648
            String webappRootFolder = null;
            IProgressMonitor npm = new NullProgressMonitor();

            ArrayList<String> arguments = new ArrayList<String>();
            arguments.add(displayName);
            arguments.add(displayName);

            // Create Project
            if (pluginBinaryRecord.isHook()) {
                sdkPluginProjectFolder = sdkPluginProjectFolder.append(ISDKConstants.HOOK_PLUGIN_PROJECT_FOLDER);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "hook",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.HOOK_PLUGIN_SDK_CONFIG_FOLDER;
            } else if (pluginBinaryRecord.isPortlet()) {
                final IPortletFramework[] portletFrameworks = ProjectCore.getPortletFrameworks();
                String portletFrameworkName = null;

                for (int i = 0; i < portletFrameworks.length; i++) {
                    IPortletFramework portletFramework = portletFrameworks[i];

                    if (portletFramework.isDefault() && (!portletFramework.isAdvanced())) {
                        portletFrameworkName = portletFramework.getShortName();
                        break;
                    }
                }

                sdkPluginProjectFolder = sdkPluginProjectFolder.append(ISDKConstants.PORTLET_PLUGIN_PROJECT_FOLDER);

                arguments.add(portletFrameworkName);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "portlet",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.PORTLET_PLUGIN_SDK_CONFIG_FOLDER;
            } else if (pluginBinaryRecord.isTheme()) {
                sdkPluginProjectFolder = sdkPluginProjectFolder.append(ISDKConstants.THEME_PLUGIN_PROJECT_FOLDER);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "theme",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.THEME_PLUGIN_SDK_CONFIG_FOLDER;
            } else if (pluginBinaryRecord.isLayoutTpl()) {
                sdkPluginProjectFolder = sdkPluginProjectFolder
                        .append(ISDKConstants.LAYOUTTPL_PLUGIN_PROJECT_FOLDER);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "layouttpl",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.LAYOUTTPL_PLUGIN_SDK_CONFIG_FOLDER;
            } else if (pluginBinaryRecord.isExt()) {
                sdkPluginProjectFolder = sdkPluginProjectFolder.append(ISDKConstants.EXT_PLUGIN_PROJECT_FOLDER);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "ext",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.EXT_PLUGIN_SDK_CONFIG_FOLDER;
            } else if (pluginBinaryRecord.isWeb()) {
                sdkPluginProjectFolder = sdkPluginProjectFolder.append(ISDKConstants.WEB_PLUGIN_PROJECT_FOLDER);

                try {
                    projectPath = liferaySDK.createNewProject(displayName, arguments, "web",
                            sdkPluginProjectFolder.toOSString(), npm);
                } catch (CoreException e) {
                    ProjectCore.logError(e);
                }

                webappRootFolder = IPluginFacetConstants.WEB_PLUGIN_SDK_CONFIG_FOLDER;
            }

            // Extract the contents
            File webappRoot = new File(projectPath.toFile(), webappRootFolder);
            ZipUtil.unzip(binaryFile, webappRoot);

            // IDE-569 check to see if the project already has .project
            File projectFile = new File(projectPath.toFile(), ".project"); //$NON-NLS-1$

            if (projectFile.exists()) {
                projectRecord = new ProjectRecord(projectFile);
            } else {
                projectRecord = new ProjectRecord(projectPath.toFile());
            }

        }

        return projectRecord;

    }

    /**
     * This will create the Eclipse Workspace projects
     *
     * @param monitor
     * @throws CoreException
     */
    public static void createWorkspaceProjects(final Object[] projects, final IRuntime runtime,
            final String sdkLocation, IProgressMonitor monitor) throws CoreException {
        final List<IProject> createdProjects = new ArrayList<IProject>();

        monitor.beginTask(Msgs.creatingSDKWorkspaceProjects, projects.length);

        if (projects != null && projects.length > 0) {
            SDK sdk = SDKManager.getInstance().getSDK(new Path(sdkLocation));

            // need to add the SDK to workspace if not already available.
            if (sdk == null) {
                sdk = SDKUtil.createSDKFromLocation(new Path(sdkLocation));
            }

            if (sdk != null && sdk.isValid() && !(SDKManager.getInstance().containsSDK(sdk))) {
                SDKManager.getInstance().addSDK(sdk);
            }
        }

        for (int i = 0; i < projects.length; i++) {
            if (projects[i] instanceof ProjectRecord) {
                IProject project = ProjectImportUtil.importProject((ProjectRecord) projects[i], runtime,
                        sdkLocation, monitor);

                if (project != null) {
                    createdProjects.add(project);
                    monitor.worked(createdProjects.size());
                }
            }
        }
    }

    /**
     * @return
     */
    public static final String getConfigFileLocation(String configFile) {
        StringBuilder sb = new StringBuilder("WEB-INF/"); //$NON-NLS-1$
        sb.append(configFile);
        return sb.toString();

    }

    public static IProject importProject(IPath projectdir, IProgressMonitor monitor, NewLiferayPluginProjectOp op)
            throws CoreException {
        IStatus retVal = ProjectImportUtil.validateSDKProjectPath(projectdir.toPortableString());

        if (!retVal.isOK()) {
            throw new CoreException(ProjectCore.createErrorStatus(retVal.getMessage()));
        }

        IProject project = null;

        ProjectRecord projectRecord = ProjectUtil.getProjectRecordForDir(projectdir.toPortableString());

        File projectDir = projectRecord.getProjectLocation().toFile();
        SDK sdk = SDKUtil.getSDKFromProjectDir(projectDir);

        if (projectRecord.projectSystemFile != null) {
            try {
                project = ProjectUtil.createExistingProject(projectRecord, sdk.getLocation(), monitor);
            } catch (CoreException e) {
                throw new CoreException(ProjectCore.createErrorStatus(e));
            }
        } else if (projectRecord.liferayProjectDir != null) {
            try {
                project = ProjectUtil.createNewSDKProject(projectRecord, sdk.getLocation(), monitor, op);
            } catch (CoreException e) {
                throw new CoreException(ProjectCore.createErrorStatus(e));
            }
        }

        String parentName = projectdir.removeLastSegments(1).toFile().getName();
        IProject sdkProject = CoreUtil.getProject(sdk.getName());

        IFolder folder = sdkProject.getFolder(parentName);

        FileInfoMatcherDescription fmd = new FileInfoMatcherDescription("org.eclipse.ui.ide.multiFilter",
                "1.0-name-matches-true-false-" + project.getName());

        folder.createFilter(10, fmd, IResource.BACKGROUND_REFRESH, monitor);

        return project;
    }

    public static IProject importProject(ProjectRecord projectRecord, IRuntime runtime, String sdkLocation,
            IProgressMonitor monitor) throws CoreException {
        return importProject(projectRecord, runtime, sdkLocation, null, monitor);
    }

    public static IProject importProject(ProjectRecord projectRecord, IRuntime runtime, String sdkLocation,
            NewLiferayPluginProjectOp op, IProgressMonitor monitor) throws CoreException {
        IProject project = null;

        if (projectRecord.projectSystemFile != null) {
            try {
                project = ProjectUtil.createExistingProject(projectRecord, runtime, sdkLocation, monitor);
            } catch (CoreException e) {
                throw new CoreException(ProjectCore.createErrorStatus(e));
            }
        } else if (projectRecord.liferayProjectDir != null) {
            try {
                project = ProjectUtil.createNewSDKProject(projectRecord, runtime, sdkLocation, op, monitor);
            } catch (CoreException e) {
                throw new CoreException(ProjectCore.createErrorStatus(e));
            }
        }

        return project;
    }

    /**
     * This method is used to validate whether the given plugin binary is a valid Liferay Plugin Archieve
     *
     * @param binaryFile
     *            - the binary file to be validated
     * @return
     */
    public static boolean isValidLiferayPlugin(File binaryFile) {
        boolean isValid = false;

        JarFile pluginBinary = null;

        try {
            pluginBinary = new JarFile(binaryFile);

            BinaryProjectRecord tempRecord = new BinaryProjectRecord(binaryFile);

            // Check for liferay-plugin-package.properties or liferay-plugin-package.xml
            JarEntry lfrPluginPkgPropsEntry = pluginBinary
                    .getJarEntry(getConfigFileLocation(ILiferayConstants.LIFERAY_PLUGIN_PACKAGE_PROPERTIES_FILE));
            JarEntry lfrPluginPkgXmlEntry = pluginBinary.getJarEntry(
                    getConfigFileLocation(ILiferayConstants.LIFERAY_PLUGIN_PACKAGE_PROPERTIES_XML_FILE));

            if (lfrPluginPkgPropsEntry != null || lfrPluginPkgXmlEntry != null) {
                isValid = true;
            }

            if (tempRecord.isHook()) {
                isValid = (isValid && pluginBinary
                        .getJarEntry(getConfigFileLocation(ILiferayConstants.LIFERAY_HOOK_XML_FILE)) != null);
            } else if (tempRecord.isLayoutTpl()) {
                isValid = (isValid || pluginBinary
                        .getJarEntry(getConfigFileLocation(ILiferayConstants.LIFERAY_LAYOUTTPL_XML_FILE)) != null);
            } else if (tempRecord.isPortlet()) {
                isValid = (isValid && pluginBinary
                        .getJarEntry(getConfigFileLocation(ILiferayConstants.LIFERAY_PORTLET_XML_FILE)) != null);
            } else if (tempRecord.isTheme()) {
                isValid = (isValid || pluginBinary.getJarEntry(
                        getConfigFileLocation(ILiferayConstants.LIFERAY_LOOK_AND_FEEL_XML_FILE)) != null);
            }

            if (!isValid) {
                return isValid;
            } else {
                // check if its a valid web Archieve
                isValid = isValid
                        || pluginBinary.getJarEntry(getConfigFileLocation(ILiferayConstants.WEB_XML_FILE)) != null;
            }
        } catch (IOException e) {
            isValid = false;
        } finally {
            if (pluginBinary != null) {
                try {
                    pluginBinary.close();
                } catch (IOException e) {
                }
            }
        }

        return isValid;
    }

    public static IStatus validateSDKPath(final String currentPath) {
        IStatus retVal = validatePath(currentPath);

        if (retVal.isOK()) {
            IPath osPath = org.eclipse.core.runtime.Path.fromOSString(currentPath);

            SDK sdk = SDKUtil.createSDKFromLocation(osPath);

            if (sdk != null) {
                try {
                    IProject workspaceSdkProject = SDKUtil.getWorkspaceSDKProject();

                    if (workspaceSdkProject != null) {
                        if (!workspaceSdkProject.getLocation().equals(sdk.getLocation())) {
                            return ProjectCore
                                    .createErrorStatus("This project has different sdk than current workspace sdk");
                        }
                    }
                } catch (CoreException e) {
                    return ProjectCore.createErrorStatus("Can't find sdk in workspace");
                }

                retVal = sdk.validate();
            } else {
                retVal = ProjectCore.createErrorStatus("SDK does not exist.");
            }
        }

        return retVal;
    }

    public static IStatus validateSDKProjectPath(final String currentPath) {
        IStatus retVal = validatePath(currentPath);

        if (retVal.isOK()) {
            ProjectRecord record = ProjectUtil.getProjectRecordForDir(currentPath);

            if (record != null) {
                String projectName = record.getProjectName();

                IProject existingProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);

                if (existingProject != null && existingProject.exists()) {
                    retVal = ProjectCore.createErrorStatus("Project name already exists.");
                } else {
                    File projectDir = record.getProjectLocation().toFile();

                    SDK sdk = SDKUtil.getSDKFromProjectDir(projectDir);

                    if (sdk != null) {
                        try {
                            IProject workspaceSdkProject = SDKUtil.getWorkspaceSDKProject();

                            if (workspaceSdkProject != null) {
                                if (!workspaceSdkProject.getLocation().equals(sdk.getLocation())) {
                                    return ProjectCore.createErrorStatus(
                                            "This project has different sdk than current workspace sdk");
                                }
                            }
                        } catch (CoreException e) {
                            return ProjectCore.createErrorStatus("Can't find sdk in workspace");
                        }

                        retVal = sdk.validate(true);
                    } else {
                        retVal = ProjectCore
                                .createErrorStatus("Could not determine SDK from project location " + currentPath);
                    }
                }
            } else {
                retVal = ProjectCore.createErrorStatus("Invalid project location");
            }
        }

        return retVal;
    }

    public static IStatus validatePath(final String currentPath) {
        if (!org.eclipse.core.runtime.Path.EMPTY.isValidPath(currentPath)) {
            return ProjectCore.createErrorStatus("\"" + currentPath + "\" is not a valid path.");
        }

        IPath osPath = org.eclipse.core.runtime.Path.fromOSString(currentPath);

        if (!osPath.toFile().isAbsolute()) {
            return ProjectCore.createErrorStatus("\"" + currentPath + "\" is not an absolute path.");
        }

        if (!osPath.toFile().exists()) {
            return ProjectCore.createErrorStatus("Directory doesn't exist.");
        }

        return Status.OK_STATUS;

    }

    private static class Msgs extends NLS {
        public static String checking;
        public static String creatingSDKWorkspaceProjects;

        static {
            initializeMessages(ProjectImportUtil.class.getName(), Msgs.class);
        }
    }
}