/*
* Copyright (C) 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.forge.ui.setup;
import org.jboss.errai.forge.config.ProjectConfig;
import org.jboss.errai.forge.util.Condition;
import org.jboss.forge.addon.facets.FacetFactory;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.projects.ProjectFactory;
import org.jboss.forge.addon.projects.ui.AbstractProjectCommand;
import org.jboss.forge.addon.ui.context.UIBuilder;
import org.jboss.forge.addon.ui.context.UIContext;
import org.jboss.forge.addon.ui.context.UIExecutionContext;
import org.jboss.forge.addon.ui.context.UINavigationContext;
import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
import org.jboss.forge.addon.ui.result.Failed;
import org.jboss.forge.addon.ui.result.NavigationResult;
import org.jboss.forge.addon.ui.result.Result;
import org.jboss.forge.addon.ui.result.Results;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.addon.ui.wizard.UIWizard;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collection;
public class AddErrai extends AbstractProjectCommand implements UIWizard {
@Inject
private ProjectFactory projectFactory;
@Inject
private FacetFactory facetFactory;
@Inject
private ProjectHolder holder;
@SuppressWarnings("unchecked")
private final Condition<Project>[] conditions = new Condition[] {
new Condition<Project>() {
@Override
public boolean isSatisfied(final Project subject) {
return subject.hasFacet(MavenFacet.class);
}
@Override
public String getShortDescription() {
return "The given project must be a Maven project.";
}
}
};
public UICommandMetadata getMetadata(UIContext context) {
return Metadata.forCommand(AddErrai.class)
.name("Errai: Setup")
.category(Categories.create("Project", "Errai"))
.description("Setup base configuration for developing a GWT/Errai Application.");
};
@Override
public Result execute(final UIExecutionContext context) throws Exception {
final Result result = verifyProject(holder.getProject());
if (!(result instanceof Failed)) {
facetFactory.install(holder.getProject(), ProjectConfig.class);
}
return result;
}
@Override
public void initializeUI(final UIBuilder builder) throws Exception {
final Project selectedProject = getSelectedProject(builder.getUIContext());
holder.setProject(selectedProject);
}
private Result verifyProject(final Project project) {
final Collection<String> problems = getProblems(project);
if (problems.isEmpty()) {
return Results.success();
}
else {
final StringBuilder messageBuilder = new StringBuilder();
messageBuilder.append(String.format(
"There are some problems with your project (%s) preventing the installation of Errai with this Addon.",
project.getRootDirectory().getUnderlyingResourceObject().getAbsolutePath()));
for (final String problem : problems) {
messageBuilder.append(problem);
}
return Results.fail(messageBuilder.toString());
}
}
private Collection<String> getProblems(final Project project) {
final Collection<String> problems = new ArrayList<String>();
for (int i = 0; i < conditions.length; i++) {
if (!conditions[i].isSatisfied(project))
problems.add(conditions[i].getShortDescription());
}
return problems;
}
@Override
@SuppressWarnings("unchecked")
public NavigationResult next(UINavigationContext context) throws Exception {
if (holder.getProject() != null) {
return context.navigateTo(VersionSelect.class);
}
else {
return null;
}
}
@Override
protected boolean isProjectRequired() {
return true;
}
@Override
protected ProjectFactory getProjectFactory() {
return projectFactory;
}
}