/******************************************************************************* * 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; } }