/******************************************************************************* * 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.maven.server.core.classpath; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; /** * Helper class for build and manage Java project classpath. * * Inspired by org.eclipse.m2e.jdt.internal.ClasspathDescriptor * * @author Evgen Vidolob */ public class ClasspathHelper { private final List<ClasspathEntryHelper> entries = new ArrayList<>(); private final Map<IPath, ClasspathEntryHelper> defaultEntries = new HashMap<>(); private final boolean uniquePaths; public ClasspathHelper(boolean uniquePaths) { this.uniquePaths = uniquePaths; } public ClasspathHelper(IJavaProject javaProject) throws JavaModelException { this(true); for (IClasspathEntry classpathEntry : javaProject.getRawClasspath()) { if (!classpathEntry.getPath().equals(javaProject.getProject().getFullPath())) { ClasspathEntryHelper helper = new ClasspathEntryHelper(classpathEntry); entries.add(helper); defaultEntries.put(helper.getPath(), helper); } } } public ClasspathEntryHelper addSourceEntry(IPath path) { ClasspathEntryHelper helper = new ClasspathEntryHelper(path, IClasspathEntry.CPE_SOURCE); ClasspathEntryHelper oldHelper = defaultEntries.get(path); if (oldHelper != null) { oldHelper.getClasspathAttribute().forEach(helper::setClasspathAttribute); } addEntryHelper(helper); return helper; } public ClasspathEntryHelper addProjectEntry(IPath projectPath) { ClasspathEntryHelper helper = new ClasspathEntryHelper(projectPath, IClasspathEntry.CPE_PROJECT); addEntryHelper(helper); return helper; } public ClasspathEntryHelper addLibraryEntry(IPath libPath) { ClasspathEntryHelper helper = new ClasspathEntryHelper(libPath, IClasspathEntry.CPE_LIBRARY); addEntryHelper(helper); return helper; } public ClasspathEntryHelper addContainerEntry(IPath conPath) { ClasspathEntryHelper helper = new ClasspathEntryHelper(conPath, IClasspathEntry.CPE_CONTAINER); addEntryHelper(helper); return helper; } private void addEntryHelper(ClasspathEntryHelper helper) { defaultEntries.remove(helper.getPath()); ListIterator<ClasspathEntryHelper> iterator = entries.listIterator(); while (iterator.hasNext()) { if (iterator.next().getPath().equals(helper.getPath())) { iterator.set(helper); return; } } entries.add(helper); } public IClasspathEntry[] getEntries() { return entries.stream().map(ClasspathEntryHelper::toClasspathEntry).toArray(IClasspathEntry[]::new); } }