/******************************************************************************* * 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.rest; import com.google.inject.Inject; import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.core.ForbiddenException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.core.model.project.NewProjectConfig; import org.eclipse.che.api.project.server.NewProjectConfigImpl; import org.eclipse.che.api.project.server.ProjectManager; import org.eclipse.che.api.project.server.ProjectRegistry; import org.eclipse.che.api.project.server.RegisteredProject; import org.eclipse.che.ide.ext.java.shared.dto.classpath.ClasspathEntryDto; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JavaModel; import org.eclipse.jdt.internal.core.JavaModelManager; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static org.eclipse.core.runtime.Path.fromOSString; import static org.eclipse.jdt.core.JavaCore.newContainerEntry; import static org.eclipse.jdt.core.JavaCore.newLibraryEntry; import static org.eclipse.jdt.core.JavaCore.newProjectEntry; import static org.eclipse.jdt.core.JavaCore.newSourceEntry; import static org.eclipse.jdt.core.JavaCore.newVariableEntry; /** * Service for updating classpath. * * @author Valeriy Svydenko */ @Path("jdt/classpath/update") public class ClasspathUpdaterService { private static final JavaModel model = JavaModelManager.getJavaModelManager().getJavaModel(); private final ProjectManager projectManager; private final ProjectRegistry projectRegistry; @Inject public ClasspathUpdaterService(ProjectManager projectManager, ProjectRegistry projectRegistry) { this.projectManager = projectManager; this.projectRegistry = projectRegistry; } /** * Updates the information about classpath. * * @param projectPath * path to the current project * @param entries * list of classpath entries which need to set * @throws JavaModelException * if JavaModel has a failure * @throws ServerException * if some server error * @throws ForbiddenException * if operation is forbidden * @throws ConflictException * if update operation causes conflicts * @throws NotFoundException * if Project with specified path doesn't exist in workspace * @throws IOException */ @POST @Consumes(MediaType.APPLICATION_JSON) public void updateClasspath(@QueryParam("projectpath") String projectPath, List<ClasspathEntryDto> entries) throws JavaModelException, ServerException, ForbiddenException, ConflictException, NotFoundException, IOException { IJavaProject javaProject = model.getJavaProject(projectPath); javaProject.setRawClasspath(createModifiedEntry(entries), javaProject.getOutputLocation(), new NullProgressMonitor()); updateProjectConfig(projectPath); } private void updateProjectConfig(String projectPath) throws IOException, ForbiddenException, ConflictException, NotFoundException, ServerException { RegisteredProject project = projectRegistry.getProject(projectPath); NewProjectConfig projectConfig = new NewProjectConfigImpl(projectPath, project.getName(), project.getType(), project.getSource()); projectManager.updateProject(projectConfig); } private IClasspathEntry[] createModifiedEntry(List<ClasspathEntryDto> entries) { List<IClasspathEntry> coreClasspathEntries = new ArrayList<>(entries.size()); for (ClasspathEntryDto entry : entries) { IPath path = fromOSString(entry.getPath()); int entryKind = entry.getEntryKind(); if (IClasspathEntry.CPE_LIBRARY == entryKind) { coreClasspathEntries.add(newLibraryEntry(path, null, null)); } else if (IClasspathEntry.CPE_SOURCE == entryKind) { coreClasspathEntries.add(newSourceEntry(path)); } else if (IClasspathEntry.CPE_VARIABLE == entryKind) { coreClasspathEntries.add(newVariableEntry(path, null, null)); } else if (IClasspathEntry.CPE_CONTAINER == entryKind) { coreClasspathEntries.add(newContainerEntry(path)); } else if (IClasspathEntry.CPE_PROJECT == entryKind) { coreClasspathEntries.add(newProjectEntry(path)); } } return coreClasspathEntries.toArray(new IClasspathEntry[coreClasspathEntries.size()]); } }