diff --git a/javaee/faces/src/main/java/org/jboss/forge/addon/scaffold/faces/FacesScaffoldProvider.java b/javaee/faces/src/main/java/org/jboss/forge/addon/scaffold/faces/FacesScaffoldProvider.java index 70df4bc7ab..d3369dfa67 100644 --- a/javaee/faces/src/main/java/org/jboss/forge/addon/scaffold/faces/FacesScaffoldProvider.java +++ b/javaee/faces/src/main/java/org/jboss/forge/addon/scaffold/faces/FacesScaffoldProvider.java @@ -213,7 +213,7 @@ public List> setup(Project project, ScaffoldSetupContext setupContex } @Override - public boolean isSetup(ScaffoldSetupContext setupContext) + public boolean isSetup(Project project, ScaffoldSetupContext setupContext) { WebResourcesFacet web = project.getFacet(WebResourcesFacet.class); String targetDir = setupContext.getTargetDirectory(); diff --git a/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldExecuteGenerationStep.java b/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldExecuteGenerationStep.java index 6cd9be0794..442a16d5e3 100644 --- a/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldExecuteGenerationStep.java +++ b/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldExecuteGenerationStep.java @@ -11,6 +11,7 @@ import org.jboss.forge.addon.scaffold.spi.ResourceCollection; import org.jboss.forge.addon.scaffold.spi.ScaffoldGenerationContext; import org.jboss.forge.addon.scaffold.spi.ScaffoldProvider; +import org.jboss.forge.addon.scaffold.spi.ScaffoldSetupContext; import org.jboss.forge.addon.ui.context.UIBuilder; import org.jboss.forge.addon.ui.context.UIContext; import org.jboss.forge.addon.ui.context.UIExecutionContext; @@ -59,7 +60,13 @@ public NavigationResult next(UINavigationContext context) throws Exception public Result execute(UIExecutionContext context) throws Exception { Map attributeMap = context.getUIContext().getAttributeMap(); + boolean requiresScaffoldSetup = (boolean) attributeMap.get(ScaffoldGenerateCommandImpl.REQUIRES_SCAFFOLD_SETUP); ScaffoldProvider selectedProvider = (ScaffoldProvider) attributeMap.get(ScaffoldProvider.class); + if(requiresScaffoldSetup) + { + ScaffoldSetupContext setupContext = (ScaffoldSetupContext) attributeMap.get(ScaffoldSetupContext.class); + selectedProvider.setup(getSelectedProject(context), setupContext); + } ResourceCollection resourceCollection = (ResourceCollection) attributeMap.get(ResourceCollection.class); selectedProvider.generateFrom(getSelectedProject(context), populateGenerationContext(context.getUIContext(), resourceCollection.getResources())); diff --git a/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldGenerateCommandImpl.java b/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldGenerateCommandImpl.java index 074e40569b..e2d998dd38 100644 --- a/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldGenerateCommandImpl.java +++ b/scaffold/impl/src/main/java/org/jboss/forge/addon/scaffold/impl/ui/ScaffoldGenerateCommandImpl.java @@ -18,6 +18,7 @@ import org.jboss.forge.addon.projects.ui.AbstractProjectCommand; import org.jboss.forge.addon.scaffold.spi.ScaffoldGenerationContext; import org.jboss.forge.addon.scaffold.spi.ScaffoldProvider; +import org.jboss.forge.addon.scaffold.spi.ScaffoldSetupContext; import org.jboss.forge.addon.scaffold.ui.ScaffoldGenerateCommand; import org.jboss.forge.addon.ui.context.UIBuilder; import org.jboss.forge.addon.ui.context.UIContext; @@ -42,6 +43,8 @@ */ public class ScaffoldGenerateCommandImpl extends AbstractProjectCommand implements ScaffoldGenerateCommand { + public static final String REQUIRES_SCAFFOLD_SETUP = "REQUIRES_SCAFFOLD_SETUP"; + @Inject @WithAttributes(label = "Scaffold Type", required = true) private UISelectOne provider; @@ -113,14 +116,26 @@ public NavigationResult next(UINavigationContext context) throws Exception attributeMap.put(ScaffoldProvider.class, selectedProvider); attributeMap.put(ScaffoldGenerationContext.class, populateGenerationContext(uiContext)); - // Get the step sequence from the selected scaffold provider + NavigationResult setupFlow = null; Project project = getSelectedProject(uiContext); + + // Verify if the selected provider is installed + // If not, add the setup flow and inform the generation step to setup the scaffold. + ScaffoldSetupContext setupContext = populateSetupContext(); + if (!selectedProvider.isSetup(project, setupContext)) + { + setupFlow = selectedProvider.getSetupFlow(project); + attributeMap.put(REQUIRES_SCAFFOLD_SETUP, true); + attributeMap.put(ScaffoldSetupContext.class, setupContext); + } + + // Get the step sequence from the selected scaffold provider NavigationResult generationFlow = selectedProvider.getGenerationFlow(project); // Add the execution logic step in the end so that the scaffold generation step is executed last after all other // steps - NavigationResultBuilder builder = NavigationResultBuilder.create(generationFlow); - NavigationResult navigationResult = builder.add(ScaffoldExecuteGenerationStep.class).build(); + NavigationResultBuilder builder = NavigationResultBuilder.create(setupFlow); + NavigationResult navigationResult = builder.add(generationFlow).add(ScaffoldExecuteGenerationStep.class).build(); return navigationResult; } @@ -154,4 +169,9 @@ private ScaffoldGenerationContext populateGenerationContext(UIContext context) } } + private ScaffoldSetupContext populateSetupContext() + { + return new ScaffoldSetupContext(webRoot.getValue(), overwrite.getValue()); + } + } diff --git a/scaffold/spi/src/main/java/org/jboss/forge/addon/scaffold/spi/ScaffoldProvider.java b/scaffold/spi/src/main/java/org/jboss/forge/addon/scaffold/spi/ScaffoldProvider.java index 24635f9fb9..c08c4fed99 100644 --- a/scaffold/spi/src/main/java/org/jboss/forge/addon/scaffold/spi/ScaffoldProvider.java +++ b/scaffold/spi/src/main/java/org/jboss/forge/addon/scaffold/spi/ScaffoldProvider.java @@ -47,7 +47,7 @@ public interface ScaffoldProvider * * @return boolean value indicating whether the provider was setup */ - boolean isSetup(ScaffoldSetupContext setupContext); + boolean isSetup(Project project, ScaffoldSetupContext setupContext); /** * Generate a set of create, read, update, delete pages for the given collection of {@link Resource}s present in the diff --git a/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/ScaffoldAddonTest.java b/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/ScaffoldAddonTest.java index afb8a7bc53..d2d274452b 100644 --- a/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/ScaffoldAddonTest.java +++ b/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/ScaffoldAddonTest.java @@ -101,7 +101,7 @@ public void testCanSetupScaffoldProvider() throws Exception scaffoldProvider.setup(project, setupContext); // Verify - assertTrue(scaffoldProvider.isSetup(setupContext)); + assertTrue(scaffoldProvider.isSetup(project, setupContext)); } @Test diff --git a/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/mock/MockProvider.java b/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/mock/MockProvider.java index 893d938114..3416c2cefe 100644 --- a/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/mock/MockProvider.java +++ b/scaffold/tests/src/test/java/org/jboss/forge/addon/scaffold/mock/MockProvider.java @@ -50,7 +50,7 @@ public List> setup(Project project, ScaffoldSetupContext setupContex } @Override - public boolean isSetup(ScaffoldSetupContext setupContext) + public boolean isSetup(Project project, ScaffoldSetupContext setupContext) { return isSetup; } diff --git a/ui/api/src/main/java/org/jboss/forge/addon/ui/result/navigation/NavigationResultBuilder.java b/ui/api/src/main/java/org/jboss/forge/addon/ui/result/navigation/NavigationResultBuilder.java index 4066b81423..16711bb767 100644 --- a/ui/api/src/main/java/org/jboss/forge/addon/ui/result/navigation/NavigationResultBuilder.java +++ b/ui/api/src/main/java/org/jboss/forge/addon/ui/result/navigation/NavigationResultBuilder.java @@ -82,6 +82,21 @@ public NavigationResultBuilder add(UICommand command) return this; } + /** + * Add a UICommand instance to create a single navigation entry. + * + * @param result The NavigationResult to add + * @return This NavigationResultBuilder instance + */ + public NavigationResultBuilder add(NavigationResult result) + { + if (result != null && result.getNext() != null) + { + entries.addAll(Arrays.asList(result.getNext())); + } + return this; + } + /** * Add multiple UICommand types to create a single navigation entry. Every invocation of this method creates a * separate navigation entry. UIWizard types must not be provided as arguments since wizards and wizard steps cannot