/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.java.plain.server.projecttype; import com.google.inject.Singleton; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.jdt.core.launching.JREContainerInitializer; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; /** * Utility class for generating simple classpath for the Java project. Classpath is contained source folder and JRE container. * * @author Valeriy Svydenko */ @Singleton public class ClasspathBuilder { private static final Logger LOG = LoggerFactory.getLogger(PlainJavaInitHandler.class); /** * Generates classpath with default entries. * * @param project * java project which need to contain classpath * @param sourceFolders * list of the project's source folders * @param library * list of the project's library folders * @throws ServerException * happens when some problems with setting classpath */ public void generateClasspath(IJavaProject project, List<String> sourceFolders, List<String> library) throws ServerException { List<IClasspathEntry> classpathEntries = new ArrayList<>(); //create classpath container for default JRE IClasspathEntry jreContainer = JavaCore.newContainerEntry(new Path(JREContainerInitializer.JRE_CONTAINER)); classpathEntries.add(jreContainer); addSourceFolders(project, sourceFolders, classpathEntries); addJars(project, library, classpathEntries); try { project.setRawClasspath(classpathEntries.toArray(new IClasspathEntry[classpathEntries.size()]), null); } catch (JavaModelException e) { LOG.warn("Can't set classpath for: " + project.getProject().getFullPath().toOSString(), e); throw new ServerException(e); } } private void addJars(IJavaProject project, List<String> library, final List<IClasspathEntry> classpathEntries) { if (library == null || library.isEmpty()) { return; } for (String libFolder : library) { if (libFolder.isEmpty()) { continue; } IFolder libraryFolder = project.getProject().getFolder(libFolder); if (!libraryFolder.exists()) { return; } try { libraryFolder.accept(proxy -> { if (IResource.FILE != proxy.getType()) { return true; } IPath path = proxy.requestFullPath(); if (!path.toString().endsWith(".jar")) { return false; } IClasspathEntry libEntry = JavaCore.newLibraryEntry(proxy.requestResource().getLocation(), null, null); classpathEntries.add(libEntry); return false; }, IContainer.INCLUDE_PHANTOMS); } catch (CoreException e) { LOG.warn("Can't read folder structure: " + libraryFolder.getFullPath().toString()); } } } private void addSourceFolders(IJavaProject project, List<String> sourceFolders, List<IClasspathEntry> classpathEntries) { for (String source : sourceFolders) { IFolder src = project.getProject().getFolder(source); if (src.exists()) { IClasspathEntry sourceEntry = JavaCore.newSourceEntry(src.getFullPath()); classpathEntries.add(sourceEntry); } } } }