/*******************************************************************************
* 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.server.tomcat.core;
import com.liferay.ide.core.util.CoreUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.server.tomcat.core.internal.TomcatRuntimeClasspathProvider;
import org.eclipse.wst.server.core.IRuntime;
/**
* @author Greg Amerson
*/
@SuppressWarnings( "restriction" )
public class LiferayTomcatRuntimeClasspathProvider extends TomcatRuntimeClasspathProvider
{
private static final String[] JARS = { "portal-impl.jar", "portal-service.jar", "support-tomcat.jar", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
public LiferayTomcatRuntimeClasspathProvider()
{
super();
}
private IClasspathEntry[] getUpdatedJavadocEntries(
IClasspathEntry[] entries, ILiferayTomcatRuntime liferayTomcatRuntime )
{
List<IClasspathEntry> updatedEntries = new ArrayList<IClasspathEntry>();
String javadocURL = liferayTomcatRuntime.getJavadocURL();
if( javadocURL != null )
{
for( IClasspathEntry existingEntry : entries )
{
IPath path = existingEntry.getPath();
IClasspathEntry newEntry = null;
for( String javadocJar : JARS )
{
if( path.lastSegment().equalsIgnoreCase( javadocJar ) )
{
IClasspathAttribute[] extraAttrs = existingEntry.getExtraAttributes();
List<IClasspathAttribute> newExtraAttrs = new ArrayList<IClasspathAttribute>();
IClasspathAttribute javadocAttr = newJavadocAttr( javadocURL );
newExtraAttrs.add( javadocAttr );
if( !CoreUtil.isNullOrEmpty( extraAttrs ) )
{
for( IClasspathAttribute attr : extraAttrs )
{
if( !attr.getName().equals( IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME ) )
{
newExtraAttrs.add( attr );
}
}
}
newEntry =
JavaCore.newLibraryEntry(
existingEntry.getPath(), existingEntry.getSourceAttachmentPath(),
existingEntry.getSourceAttachmentRootPath(), existingEntry.getAccessRules(),
newExtraAttrs.toArray( new IClasspathAttribute[0] ), existingEntry.isExported() );
break;
}
}
if( newEntry != null )
{
updatedEntries.add( newEntry );
}
else
{
updatedEntries.add( existingEntry );
}
}
}
else
{
Collections.addAll( updatedEntries, entries );
}
return updatedEntries.toArray( new IClasspathEntry[0] );
}
private IClasspathEntry[] getUpdatedSourceEntries(
IClasspathEntry[] entries, ILiferayTomcatRuntime liferayTomcatRuntime )
{
List<IClasspathEntry> updatedEntries = new ArrayList<IClasspathEntry>();
IPath sourceLocation = liferayTomcatRuntime.getSourceLocation();
if( sourceLocation != null )
{
for( IClasspathEntry existingEntry : entries )
{
IPath path = existingEntry.getPath();
IClasspathEntry newEntry = null;
for( String sourceJar : JARS )
{
if( path.lastSegment().equalsIgnoreCase( sourceJar ) )
{
IPath sourcePath = existingEntry.getSourceAttachmentPath();
if( sourcePath == null )
{
sourcePath = sourceLocation;
}
newEntry =
JavaCore.newLibraryEntry(
existingEntry.getPath(), sourcePath, existingEntry.getSourceAttachmentRootPath(),
existingEntry.getAccessRules(), existingEntry.getExtraAttributes(),
existingEntry.isExported() );
break;
}
}
if( newEntry != null )
{
updatedEntries.add( newEntry );
}
else
{
updatedEntries.add( existingEntry );
}
}
}
else
{
Collections.addAll( updatedEntries, entries );
}
return updatedEntries.toArray( new IClasspathEntry[0] );
}
private IClasspathAttribute newJavadocAttr( String url )
{
return JavaCore.newClasspathAttribute( IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, url );
}
@Override
public IClasspathEntry[] resolveClasspathContainer( final IProject project, final IRuntime runtime )
{
IPath installPath = runtime.getLocation();
if( installPath == null )
return new IClasspathEntry[0];
String runtimeId = runtime.getRuntimeType().getId();
IClasspathEntry[] entries = resolveClasspathContainerForPath( installPath, runtimeId );
// IDE-483
ILiferayTomcatRuntime liferayTomcatRuntime =
(ILiferayTomcatRuntime) runtime.loadAdapter( ILiferayTomcatRuntime.class, null );
if( liferayTomcatRuntime != null )
{
if( liferayTomcatRuntime.getJavadocURL() != null )
{
entries = getUpdatedJavadocEntries( entries, liferayTomcatRuntime );
}
if( liferayTomcatRuntime.getSourceLocation() != null )
{
entries = getUpdatedSourceEntries( entries, liferayTomcatRuntime );
}
}
return entries;
}
protected IClasspathEntry[] resolveClasspathContainerForPath( IPath installPath, String runtimeTypeId )
{
List<IClasspathEntry> list = new ArrayList<IClasspathEntry>();
if( runtimeTypeId.endsWith( "60" ) || runtimeTypeId.endsWith( "70" ) || //$NON-NLS-1$ //$NON-NLS-2$
installPath.append( "lib" ).toFile().exists() ) //$NON-NLS-1$
{
IPath path = installPath.append( "lib" ); //$NON-NLS-1$
addLibraryEntries( list, path.toFile(), true );
}
// go through all classpath entries and remove some unneeded ones
List<IClasspathEntry> optimizedList = new ArrayList<IClasspathEntry>();
List<String> excludes = Arrays.asList( ILiferayTomcatConstants.LIB_EXCLUDES );
for( IClasspathEntry entry : list )
{
if( !excludes.contains( entry.getPath().lastSegment() ) )
{
optimizedList.add( entry );
}
}
return (IClasspathEntry[]) optimizedList.toArray( new IClasspathEntry[optimizedList.size()] );
}
protected void updateClasspath( IProject project, IRuntime runtime )
{
// IJavaProject javaProject = JavaCore.create(project);
}
}