/*******************************************************************************
* 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.projecttype;
import org.eclipse.che.api.core.ForbiddenException;
import org.eclipse.che.api.core.ServerException;
import org.eclipse.che.api.project.server.FileEntry;
import org.eclipse.che.api.project.server.FolderEntry;
import org.eclipse.che.api.project.server.type.ReadonlyValueProvider;
import org.eclipse.che.api.project.server.type.ValueStorageException;
import org.eclipse.che.commons.xml.XMLTreeException;
import org.eclipse.che.ide.maven.tools.Model;
import org.eclipse.che.ide.maven.tools.Resource;
import org.eclipse.che.maven.data.MavenResource;
import org.eclipse.che.plugin.maven.server.core.MavenProjectManager;
import org.eclipse.che.plugin.maven.server.core.project.MavenProject;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static java.util.Collections.singletonList;
import static org.eclipse.che.ide.ext.java.shared.Constants.SOURCE_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.ARTIFACT_ID;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.DEFAULT_PACKAGING;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.DEFAULT_RESOURCES_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.DEFAULT_SOURCE_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.DEFAULT_TEST_RESOURCES_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.DEFAULT_TEST_SOURCE_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.GROUP_ID;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.PACKAGING;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.PARENT_ARTIFACT_ID;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.PARENT_GROUP_ID;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.PARENT_VERSION;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.RESOURCE_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.TEST_SOURCE_FOLDER;
import static org.eclipse.che.plugin.maven.shared.MavenAttributes.VERSION;
/**
* @author Vitalii Parfonov
*/
public class MavenValueProvider extends ReadonlyValueProvider {
private MavenProjectManager mavenProjectManager;
private FolderEntry projectFolder;
protected MavenValueProvider(MavenProjectManager mavenProjectManager, FolderEntry projectFolder) {
this.mavenProjectManager = mavenProjectManager;
this.projectFolder = projectFolder;
}
@Override
public List<String> getValues(String attributeName) throws ValueStorageException {
try {
if (mavenProjectManager == null) {
return readFromPom(attributeName);
}
final MavenProject mavenProject = mavenProjectManager.getMavenProject(projectFolder.getPath().toString());
if (mavenProject != null) {
return getFromMavenProject(mavenProject, attributeName);
} else {
return readFromPom(attributeName);
}
} catch (ServerException | ForbiddenException | IOException e) {
throwReadException(e);
} catch (XMLTreeException e) {
throw new ValueStorageException("Error parsing pom.xml : " + e.getMessage());
}
return null;
}
private List<String> getFromMavenProject(MavenProject mavenProject, String attributeName) throws ValueStorageException {
switch (attributeName) {
case ARTIFACT_ID:
return singletonList(mavenProject.getMavenKey().getArtifactId());
case GROUP_ID:
return singletonList(mavenProject.getMavenKey().getGroupId());
case PACKAGING:
String packaging = mavenProject.getPackaging();
return singletonList(packaging != null ? packaging : DEFAULT_PACKAGING);
case VERSION:
return singletonList(mavenProject.getMavenKey().getVersion());
case PARENT_ARTIFACT_ID:
return singletonList(mavenProject.getParentKey() == null ? "" : mavenProject.getParentKey().getArtifactId());
case PARENT_GROUP_ID:
return singletonList(mavenProject.getParentKey() == null ? "" : mavenProject.getParentKey().getGroupId());
case PARENT_VERSION:
return singletonList(mavenProject.getParentKey() == null ? "" : mavenProject.getParentKey().getVersion());
case SOURCE_FOLDER:
return (mavenProject.getSources() != null && !mavenProject.getSources().isEmpty()) ? mavenProject.getSources()
: singletonList(DEFAULT_SOURCE_FOLDER);
case TEST_SOURCE_FOLDER:
return (mavenProject.getTestSources() != null && !mavenProject.getTestSources().isEmpty()) ? mavenProject.getTestSources()
: singletonList(
DEFAULT_TEST_SOURCE_FOLDER);
case RESOURCE_FOLDER:
if (mavenProject.getResources() != null && !mavenProject.getResources().isEmpty()) {
return mavenProject.getResources().stream().map(MavenResource::getDirectory).collect(Collectors.toList());
} else {
return Arrays.asList(DEFAULT_RESOURCES_FOLDER, DEFAULT_TEST_RESOURCES_FOLDER);
}
default:
throw new ValueStorageException(String.format("Unknown attribute %s", attributeName));
}
}
private List<String> readFromPom(String attributeName)
throws ServerException, ForbiddenException, IOException, XMLTreeException, ValueStorageException {
final Model model = readModel(projectFolder);
switch (attributeName) {
case ARTIFACT_ID:
return singletonList(model.getArtifactId());
case GROUP_ID:
return singletonList(model.getGroupId());
case PACKAGING:
String packaging = model.getPackaging();
return singletonList(packaging != null ? packaging : DEFAULT_PACKAGING);
case VERSION:
return singletonList(model.getVersion());
case PARENT_ARTIFACT_ID:
return singletonList(model.getParent() == null ? "" : model.getParent().getArtifactId());
case PARENT_GROUP_ID:
return singletonList(model.getParent() == null ? "" : model.getParent().getGroupId());
case PARENT_VERSION:
return singletonList(model.getParent() == null ? "" : model.getParent().getVersion());
case SOURCE_FOLDER:
if (model.getBuild() != null && model.getBuild().getSourceDirectory() != null) {
return singletonList(model.getBuild().getSourceDirectory());
} else {
return singletonList(DEFAULT_SOURCE_FOLDER);
}
case TEST_SOURCE_FOLDER:
if (model.getBuild() != null && model.getBuild().getTestSourceDirectory() != null) {
return singletonList(model.getBuild().getTestSourceDirectory());
} else {
return singletonList(DEFAULT_TEST_SOURCE_FOLDER);
}
case RESOURCE_FOLDER:
if (model.getBuild() != null && model.getBuild().getResources() != null) {
return model.getBuild().getResources().stream().map(Resource::getDirectory).collect(Collectors.toList());
} else {
return Arrays.asList(DEFAULT_RESOURCES_FOLDER, DEFAULT_TEST_RESOURCES_FOLDER);
}
default:
throw new ValueStorageException(String.format("Unknown attribute %s", attributeName));
}
}
protected Model readModel(FolderEntry projectFolder) throws ValueStorageException, ServerException, ForbiddenException, IOException {
FileEntry pomFile = (FileEntry)projectFolder.getChild("pom.xml");
if (pomFile == null) {
throw new ValueStorageException("pom.xml does not exist.");
}
return Model.readFrom(pomFile.getInputStream());
}
protected void throwReadException(Exception e) throws ValueStorageException {
throw new ValueStorageException("Can't read pom.xml : " + e.getMessage());
}
}