/*******************************************************************************
* Copyright (c) 2012-2016 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.ide.extension.maven.server.projecttype;
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.SourceStorage;
import org.eclipse.che.api.core.model.workspace.ProjectConfig;
import org.eclipse.che.api.project.server.FolderEntry;
import org.eclipse.che.api.project.server.Project;
import org.eclipse.che.api.project.server.ProjectManager;
import org.eclipse.che.api.project.server.ValueStorageException;
import org.eclipse.che.api.project.server.VirtualFileEntry;
import org.eclipse.che.api.workspace.server.model.impl.ProjectConfigImpl;
import org.eclipse.che.api.workspace.server.model.impl.SourceStorageImpl;
import org.eclipse.che.ide.maven.tools.Model;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.MAVEN_ID;
/**
* @author Evgen Vidolob
* @author Dmitry Shnurenko
*/
public class MavenProjectResolver {
/**
* The method allows define project structure as it is in project tree. Project can has got some modules and each module can has got
* own modules.
*
* @param projectFolder
* base folder which represents project
* @param projectManager
* special manager which is necessary for updating project after resolve
* @throws ConflictException
* @throws ForbiddenException
* @throws ServerException
* @throws NotFoundException
* @throws IOException
*/
public static void resolve(FolderEntry projectFolder, ProjectManager projectManager) throws ConflictException,
ForbiddenException,
ServerException,
NotFoundException,
IOException {
VirtualFileEntry pom = projectFolder.getChild("pom.xml");
if (pom == null) {
return;
}
Model model = Model.readFrom(pom.getVirtualFile());
MavenClassPathConfigurator.configure(projectFolder);
String packaging = model.getPackaging();
if (packaging != null && packaging.equals("pom")) {
Project project = new Project(projectFolder, projectManager);
ProjectConfigImpl projectConfig = createConfig(projectFolder);
List<ProjectConfig> modules = new ArrayList<>();
for (FolderEntry folderEntry : project.getBaseFolder().getChildFolders()) {
MavenClassPathConfigurator.configure(folderEntry);
defineModules(folderEntry, modules);
}
projectConfig.setModules(modules);
projectConfig.setSource(getSourceStorage(project.getConfig()));
project.updateConfig(projectConfig);
}
}
private static ProjectConfigImpl createConfig(FolderEntry folderEntry) throws ValueStorageException {
ProjectConfigImpl projectConfig = new ProjectConfigImpl();
projectConfig.setName(folderEntry.getName());
projectConfig.setPath(folderEntry.getPath());
projectConfig.setType(MAVEN_ID);
return projectConfig;
}
private static SourceStorageImpl getSourceStorage(ProjectConfig config) {
SourceStorage sourceStorage = config.getSource();
if (sourceStorage == null) {
return new SourceStorageImpl("", "", Collections.emptyMap());
}
return new SourceStorageImpl(sourceStorage.getType(), sourceStorage.getLocation(), sourceStorage.getParameters());
}
private static void defineModules(FolderEntry folderEntry, List<ProjectConfig> modules) throws ServerException,
ForbiddenException,
IOException,
ConflictException {
VirtualFileEntry pom = folderEntry.getChild("pom.xml");
if (pom == null) {
return;
}
ProjectConfigImpl moduleConfig = createConfig(folderEntry);
List<ProjectConfig> internalModules = new ArrayList<>();
for (FolderEntry internalModule : folderEntry.getChildFolders()) {
MavenClassPathConfigurator.configure(folderEntry);
defineModules(internalModule, internalModules);
}
moduleConfig.setModules(internalModules);
modules.add(moduleConfig);
}
}