/*
* 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 java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.jboss.errai.forge.config.ProjectConfig;
import org.jboss.errai.forge.config.ProjectProperty;
import org.jboss.errai.forge.constant.DefaultVault.DefaultValue;
import org.jboss.forge.addon.maven.projects.MavenFacet;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.ui.command.AbstractUICommand;
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.input.UISelectOne;
import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
import org.jboss.forge.addon.ui.metadata.WithAttributes;
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.Metadata;
import org.jboss.forge.addon.ui.wizard.UIWizardStep;
public class ModuleSelect extends AbstractUICommand implements UIWizardStep {
private static final String CREATE_A_NEW_MODULE_GUI = "Create a new module...";
private static final String CREATE_A_NEW_MODULE_CLI = "create-new";
@Inject
private ProjectHolder holder;
@Inject
@WithAttributes(label = "Select a GWT module for Errai", required = true)
private UISelectOne<String> moduleSelect;
@Override
public UICommandMetadata getMetadata(UIContext context) {
return Metadata.forCommand(ModuleSelect.class)
.name("Select a GWT Module")
.description("Select the GWT Module which will inherit all Errai GWT dependencies for your application.");
}
private boolean isCreateNew(final String value) {
return CREATE_A_NEW_MODULE_CLI.equals(value) || CREATE_A_NEW_MODULE_GUI.equals(value);
}
@Override
@SuppressWarnings("unchecked")
public NavigationResult next(UINavigationContext context) throws Exception {
if (moduleSelect.getValue() == null) {
return null;
}
else if (isCreateNew(moduleSelect.getValue())) {
return context.navigateTo(NewModuleName.class);
}
else {
return context.navigateTo(ModuleRename.class);
}
}
@Override
public void initializeUI(UIBuilder builder) throws Exception {
final List<String> choices = getExistingModules();
// Workaround FORGE-1639
final boolean isGui = builder.getUIContext().getProvider().isGUI();
final String createNew = (isGui) ? CREATE_A_NEW_MODULE_GUI : CREATE_A_NEW_MODULE_CLI;
choices.add(createNew);
moduleSelect.setValueChoices(choices);
moduleSelect.setDefaultValue(createNew);
builder.add(moduleSelect);
}
@Override
public Result execute(UIExecutionContext context) throws Exception {
if (!isCreateNew(moduleSelect.getValue())) {
final ProjectConfig projectConfig = holder.getProject().getFacet(ProjectConfig.class);
projectConfig.setProjectProperty(ProjectProperty.MODULE_LOGICAL, moduleSelect.getValue());
projectConfig.setProjectProperty(ProjectProperty.MODULE_FILE,
moduleLogicalNameToFile(moduleSelect.getValue(), holder.getProject()));
}
return Results.success();
}
private static Collection<File> findGwtModuleFiles(final File f) {
if (f.exists()) {
if (f.isDirectory()) {
final Collection<File> retVal = new LinkedList<File>();
final File[] files = f.listFiles();
if (files != null) {
for (final File child : files) {
final Collection<File> result = findGwtModuleFiles(child);
if (result.size() > 0) {
retVal.addAll(result);
}
}
}
return retVal;
}
else if (f.isFile()) {
if (f.getName().endsWith(".gwt.xml")) {
final Collection<File> retVal = new LinkedList<File>();
retVal.add(f);
return retVal;
}
}
}
return new LinkedList<File>();
}
private List<String> getExistingModules() {
final File dir = getSourceFolder();
final List<String> retVal = new ArrayList<String>();
if (dir.exists()) {
final Collection<File> found = findGwtModuleFiles(dir);
for (final File file : found) {
String relPath = file.getAbsolutePath().replace(dir.getAbsolutePath(), "");
if (relPath.charAt(0) == File.separatorChar)
relPath = relPath.substring(1);
retVal.add(relPath.replace(File.separatorChar, '.').replaceFirst("\\.gwt\\.xml$", ""));
}
}
return retVal;
}
private File getSourceFolder() {
final MavenFacet mavenFacet = holder.getProject().getFacet(MavenFacet.class);
final Model model = mavenFacet.getModel();
Build build = model.getBuild();
if (build == null) {
build = new Build();
model.setBuild(build);
}
String srcDir = build.getSourceDirectory();
if (srcDir == null || srcDir.equals("")) {
srcDir = DefaultValue.SourceDirectory.getDefaultValue();
}
return new File(holder.getProject().getRootDirectory().getUnderlyingResourceObject(), srcDir);
}
public static File moduleLogicalNameToFile(final String moduleName, final Project project) {
final String relModuleFile = moduleName.replace('.', File.separatorChar) + ".gwt.xml";
final MavenFacet coreFacet = project.getFacet(MavenFacet.class);
final Build build = coreFacet.getModel().getBuild();
final String relSrcRoot = (build == null || build.getSourceDirectory() == null) ?
DefaultValue.SourceDirectory.getDefaultValue() :
build.getSourceDirectory();
final File modulePath = new File(new File(project.getRootDirectory().getUnderlyingResourceObject(), relSrcRoot),
relModuleFile);
return modulePath;
}
}