/******************************************************************************* * 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.server.core.ILiferayRuntime; import com.liferay.ide.server.core.LiferayServerCore; 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 Greg Amerson * @author Terry Jia */ @SuppressWarnings( "restriction" ) public class PluginClasspathContainerInitializer extends ClasspathContainerInitializer { public static final String ID = "com.liferay.ide.eclipse.server.plugin.container"; //$NON-NLS-1$ protected static final ClasspathDecorationsManager cpDecorations = PluginClasspathContainer.getDecorationsManager(); @Override public boolean canUpdateClasspathContainer( IPath containerPath, IJavaProject project ) { return true; } @Override public void initialize( IPath containerPath, IJavaProject project ) throws CoreException { IClasspathContainer classpathContainer = null; int count = containerPath.segmentCount(); if( count != 2 ) { final String msg = "Invalid plugin classpath container should expecting 2 segments."; //$NON-NLS-1$ throw new CoreException( ProjectCore.createErrorStatus( msg ) ); } String root = containerPath.segment( 0 ); if( !ID.equals( root ) ) { final String msg = "Invalid plugin classpath container, expecting container root "; //$NON-NLS-1$ throw new CoreException( ProjectCore.createErrorStatus( msg + ID ) ); } String finalSegment = containerPath.segment( 1 ); IPath portalDir = ServerUtil.getPortalDir( project ); if( portalDir == null ) { return; } String javadocURL = null; IPath sourceLocation = null; try { ILiferayRuntime liferayRuntime = ServerUtil.getLiferayRuntime( project.getProject() ); if( liferayRuntime != null ) { javadocURL = liferayRuntime.getJavadocURL(); sourceLocation = liferayRuntime.getSourceLocation(); } } catch( Exception e ) { ProjectCore.logError( e ); } classpathContainer = getCorrectContainer( containerPath, finalSegment, project, portalDir, javadocURL, sourceLocation ); 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 = PluginClasspathContainer.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; String javadocURL = null; IPath sourceLocation = null; if( containerSuggestion instanceof PluginClasspathContainer ) { portalDir = ( (PluginClasspathContainer) containerSuggestion ).getPortalDir(); javadocURL = ( (PluginClasspathContainer) containerSuggestion ).getJavadocURL(); sourceLocation = ( (PluginClasspathContainer) containerSuggestion ).getSourceLocation(); } else { portalDir = ServerUtil.getPortalDir( project ); try { ILiferayRuntime liferayRuntime = ServerUtil.getLiferayRuntime( project.getProject() ); if( liferayRuntime != null ) { javadocURL = liferayRuntime.getJavadocURL(); sourceLocation = liferayRuntime.getSourceLocation(); } } catch( Exception e ) { ProjectCore.logError( e ); } } if( portalDir != null ) { IClasspathContainer newContainer = getCorrectContainer( containerPath, containerPath.segment( 1 ), project, portalDir, javadocURL, sourceLocation ); JavaCore.setClasspathContainer( containerPath, new IJavaProject[] { project }, new IClasspathContainer[] { newContainer }, null ); } } protected IClasspathContainer getCorrectContainer( IPath containerPath, String finalSegment, IJavaProject project, IPath portalDir, String javadocURL, IPath sourceURL ) throws CoreException { IClasspathContainer classpathContainer = null; if( PortletClasspathContainer.SEGMENT_PATH.equals( finalSegment ) ) { classpathContainer = new PortletClasspathContainer( containerPath, project, portalDir, javadocURL, sourceURL ); } else if( HookClasspathContainer.SEGMENT_PATH.equals( finalSegment ) ) { classpathContainer = new HookClasspathContainer( containerPath, project, portalDir, javadocURL, sourceURL ); } else if( ExtClasspathContainer.SEGMENT_PATH.equals( finalSegment ) ) { classpathContainer = new ExtClasspathContainer( containerPath, project, portalDir, javadocURL, sourceURL ); } else if( ThemeClasspathContainer.SEGMENT_PATH.equals( finalSegment ) ) { classpathContainer = new ThemeClasspathContainer( containerPath, project, portalDir, javadocURL, sourceURL ); } else if( WebClasspathContainer.SEGMENT_PATH.equals( finalSegment ) ) { classpathContainer = new WebClasspathContainer( containerPath, project, portalDir, javadocURL, sourceURL ); } else { throw new CoreException( LiferayServerCore.error( "Invalid final segment of type: " + //$NON-NLS-1$ finalSegment ) ); } return classpathContainer; } }