/******************************************************************************* * 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.core; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKUtil; import com.liferay.ide.server.core.portal.PortalBundle; import com.liferay.ide.server.util.ServerUtil; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.ClasspathContainerInitializer; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jst.common.jdt.internal.classpath.ClasspathDecorations; import org.eclipse.jst.common.jdt.internal.classpath.ClasspathDecorationsManager; /** * @author Simon.Jiang */ @SuppressWarnings( "restriction" ) public class SDKClasspathContainerInitializer extends ClasspathContainerInitializer { protected static final ClasspathDecorationsManager cpDecorations = SDKClasspathContainer.getDecorationsManager(); @Override public boolean canUpdateClasspathContainer( IPath containerPath, IJavaProject project ) { return true; } private IPath[] getSDKDependencies( IJavaProject project ) { IPath[] dependencyJarPaths = null; SDK sdk = SDKUtil.getSDKFromProjectDir( project.getProject().getLocation().toFile() ); if ( sdk != null ) { dependencyJarPaths = sdk.getDependencyJarPaths(); } return dependencyJarPaths; } @Override public void initialize( IPath containerPath, IJavaProject project ) throws CoreException { IClasspathContainer classpathContainer = null; String root = containerPath.segment( 0 ); if( !SDKClasspathContainer.ID.equals( root ) ) { final String msg = "Invalid plugin classpath container, expecting container root "; //$NON-NLS-1$ throw new CoreException( ProjectCore.createErrorStatus( msg + SDKClasspathContainer.ID ) ); } PortalBundle bundle = ServerUtil.getPortalBundle(project.getProject()); if ( bundle == null ) { final String msg = "Invalid sdk properties setting."; throw new CoreException( ProjectCore.createErrorStatus( msg ) ); } IPath globalDir = bundle.getAppServerLibGlobalDir(); IPath portalDir = bundle.getAppServerPortalDir(); IPath bundleDir = bundle.getAppServerDir(); IPath[] bundleDependencyJars = bundle.getBundleDependencyJars(); IPath[] sdkDependencyJarPaths = getSDKDependencies( project ); if( portalDir == null ) { return; } classpathContainer = new SDKClasspathContainer( containerPath, project, portalDir, null, null, globalDir, bundleDir, bundleDependencyJars, sdkDependencyJarPaths ); JavaCore.setClasspathContainer( containerPath, new IJavaProject[] { project }, new IClasspathContainer[] { classpathContainer }, null ); } @Override public void requestClasspathContainerUpdate( IPath containerPath, IJavaProject project, IClasspathContainer containerSuggestion ) throws CoreException { final String key = SDKClasspathContainer.getDecorationManagerKey( project.getProject(), containerPath.toString() ); final IClasspathEntry[] entries = containerSuggestion.getClasspathEntries(); cpDecorations.clearAllDecorations( key ); for( int i = 0; i < entries.length; i++ ) { final IClasspathEntry entry = entries[i]; final IPath srcpath = entry.getSourceAttachmentPath(); final IPath srcrootpath = entry.getSourceAttachmentRootPath(); final IClasspathAttribute[] attrs = entry.getExtraAttributes(); if( srcpath != null || attrs.length > 0 ) { final String eid = entry.getPath().toString(); final ClasspathDecorations dec = new ClasspathDecorations(); dec.setSourceAttachmentPath( srcpath ); dec.setSourceAttachmentRootPath( srcrootpath ); dec.setExtraAttributes( attrs ); cpDecorations.setDecorations( key, eid, dec ); } } cpDecorations.save(); IPath portalDir = null; IPath portalGlobalDir = null; String javadocURL = null; IPath sourceLocation = null; IPath bundleDir = null; IPath[] bundleDependencyJarPaths = null; PortalBundle bundle = ServerUtil.getPortalBundle(project.getProject()); boolean containerChanged = true; if( containerSuggestion instanceof SDKClasspathContainer ) { portalDir = ( (SDKClasspathContainer) containerSuggestion ).getPortalDir(); bundleDir = ( (SDKClasspathContainer) containerSuggestion ).getBundleDir(); portalGlobalDir = ( (SDKClasspathContainer) containerSuggestion ).getPortalGlobalDir(); javadocURL = ( (SDKClasspathContainer) containerSuggestion ).getJavadocURL(); sourceLocation = ( (SDKClasspathContainer) containerSuggestion ).getSourceLocation(); bundleDependencyJarPaths = ( (SDKClasspathContainer) containerSuggestion ).getBundleLibDependencyPath(); if ( bundle != null && bundle.getAppServerPortalDir().equals( portalDir ) ) { containerChanged = false; } } if ( containerChanged == true) { if ( bundle == null ) { return; } portalDir = bundle.getAppServerPortalDir(); portalGlobalDir = bundle.getAppServerLibGlobalDir(); bundleDependencyJarPaths = bundle.getBundleDependencyJars(); } IPath[] sdkDependencyPaths = getSDKDependencies( project ); if( portalDir != null && portalGlobalDir != null ) { IClasspathContainer newContainer = new SDKClasspathContainer( containerPath, project, portalDir, javadocURL, sourceLocation, portalGlobalDir, bundleDir, bundleDependencyJarPaths, sdkDependencyPaths ); JavaCore.setClasspathContainer( containerPath, new IJavaProject[] { project }, new IClasspathContainer[] { newContainer }, null ); } } }