com.liferay.ide.project.ui.IvyUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.project.ui.IvyUtil.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.
 *
 *******************************************************************************/
package com.liferay.ide.project.ui;

import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.getDefaultRuntimePath;
import static org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil.modifyDependencyPath;

import com.liferay.ide.core.ILiferayConstants;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.sdk.core.ISDKConstants;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.server.util.ComponentUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.ivyde.eclipse.cp.ClasspathSetup;
import org.apache.ivyde.eclipse.cp.IvyClasspathContainer;
import org.apache.ivyde.eclipse.cp.IvyClasspathContainerConfiguration;
import org.apache.ivyde.eclipse.cp.IvyClasspathContainerHelper;
import org.apache.ivyde.eclipse.cp.SettingsSetup;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
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.Status;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.osgi.framework.Version;

/**
 * @author Gregory Amerson
 */
public class IvyUtil {

    public static IvyClasspathContainer addIvyLibrary(IProject project, IProgressMonitor monitor) {
        final String projectName = project.getName();
        final IJavaProject javaProject = JavaCore.create(project);

        final IvyClasspathContainerConfiguration conf = new IvyClasspathContainerConfiguration(javaProject,
                ISDKConstants.IVY_XML_FILE, true);
        final ClasspathSetup classpathSetup = new ClasspathSetup();

        conf.setAdvancedProjectSpecific(false);
        conf.setClasspathSetup(classpathSetup);
        conf.setClassthProjectSpecific(false);
        conf.setConfs(Collections.singletonList("*")); //$NON-NLS-1$
        conf.setMappingProjectSpecific(false);
        conf.setSettingsProjectSpecific(true);

        SDK sdk = SDKUtil.getSDK(project);
        final SettingsSetup settingsSetup = new SettingsSetup();

        if (sdk.getLocation().append(ISDKConstants.IVY_SETTINGS_XML_FILE).toFile().exists()) {
            StringBuilder builder = new StringBuilder();
            builder.append("${"); //$NON-NLS-1$
            builder.append(ISDKConstants.VAR_NAME_LIFERAY_SDK_DIR);
            builder.append(":"); //$NON-NLS-1$
            builder.append(projectName);
            builder.append("}/"); //$NON-NLS-1$
            builder.append(ISDKConstants.IVY_SETTINGS_XML_FILE);
            settingsSetup.setIvySettingsPath(builder.toString());
        }

        StringBuilder builder = new StringBuilder();
        builder.append("${"); //$NON-NLS-1$
        builder.append(ISDKConstants.VAR_NAME_LIFERAY_SDK_DIR);
        builder.append(":"); //$NON-NLS-1$
        builder.append(projectName);
        builder.append("}/.ivy"); //$NON-NLS-1$

        settingsSetup.setIvyUserDir(builder.toString());
        conf.setIvySettingsSetup(settingsSetup);

        final IPath path = conf.getPath();
        final IClasspathAttribute[] atts = conf.getAttributes();

        final IClasspathEntry ivyEntry = JavaCore.newContainerEntry(path, null, atts, false);

        final IVirtualComponent virtualComponent = ComponentCore.createComponent(project);

        try {
            IClasspathEntry[] entries = javaProject.getRawClasspath();
            List<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>(Arrays.asList(entries));

            IPath runtimePath = getDefaultRuntimePath(virtualComponent, ivyEntry);

            // add the deployment assembly config to deploy ivy container to /WEB-INF/lib
            final IClasspathEntry cpeTagged = modifyDependencyPath(ivyEntry, runtimePath);

            newEntries.add(cpeTagged);
            entries = (IClasspathEntry[]) newEntries.toArray(new IClasspathEntry[newEntries.size()]);
            javaProject.setRawClasspath(entries, javaProject.getOutputLocation(), monitor);

            IvyClasspathContainer ivycp = IvyClasspathContainerHelper.getContainer(path, javaProject);

            return ivycp;
        } catch (JavaModelException e) {
            ProjectUI.logError("Unable to add Ivy library container", e); //$NON-NLS-1$
        }

        return null;
    }

    public static void addIvyNature(IProject project, IProgressMonitor monitor) throws CoreException {
        CoreUtil.addNaturesToProject(project, new String[] { "org.apache.ivyde.eclipse.ivynature" }, monitor); //$NON-NLS-1$
    }

    public static IStatus configureIvyProject(final IProject project, IProgressMonitor monitor)
            throws CoreException {
        SDK sdk = SDKUtil.getSDK(project);

        // check for 6.1.2 and greater but not 6.1.10 which is older EE release
        // and match 6.2.0 and greater
        final Version version = new Version(sdk.getVersion());

        if ((CoreUtil.compareVersions(version, ILiferayConstants.V611) >= 0
                && CoreUtil.compareVersions(version, ILiferayConstants.V6110) < 0)
                || CoreUtil.compareVersions(version, ILiferayConstants.V620) >= 0) {
            IFile ivyXmlFile = project.getFile(ISDKConstants.IVY_XML_FILE);

            if (ivyXmlFile.exists()) {
                // IDE-1044
                addIvyNature(project, monitor);

                IvyClasspathContainer ivycp = addIvyLibrary(project, monitor);

                if (ivycp != null) {
                    IStatus status = ivycp.launchResolve(false, monitor);

                    if (status.isOK()) {
                        final IWebProject webproject = LiferayCore.create(IWebProject.class, project);
                        final IFolder webinfFolder = webproject.getDefaultDocrootFolder().getFolder("WEB-INF");

                        ComponentUtil.validateFolder(webinfFolder, monitor);
                    } else {
                        return status;
                    }
                }
            }
        }

        return Status.OK_STATUS;
    }

}