Skip to content

Commit

Permalink
FORGE-2225: Add CDI producer method. (forge#616)
Browse files Browse the repository at this point in the history
  • Loading branch information
mkouba authored and gastaldi committed Oct 6, 2017
1 parent 0517bb7 commit e2b2096
Show file tree
Hide file tree
Showing 6 changed files with 578 additions and 89 deletions.
@@ -0,0 +1,149 @@
/**
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.addon.javaee.cdi.ui;

import java.io.FileNotFoundException;

import javax.inject.Inject;

import org.jboss.forge.addon.convert.Converter;
import org.jboss.forge.addon.javaee.cdi.CDIFacet;
import org.jboss.forge.addon.javaee.ui.AbstractJavaEECommand;
import org.jboss.forge.addon.parser.java.beans.ProjectOperations;
import org.jboss.forge.addon.parser.java.resources.JavaResource;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.ui.command.PrerequisiteCommandsProvider;
import org.jboss.forge.addon.ui.context.UIBuilder;
import org.jboss.forge.addon.ui.context.UIContext;
import org.jboss.forge.addon.ui.context.UISelection;
import org.jboss.forge.addon.ui.context.UIValidationContext;
import org.jboss.forge.addon.ui.hints.InputType;
import org.jboss.forge.addon.ui.input.UIInput;
import org.jboss.forge.addon.ui.input.UISelectOne;
import org.jboss.forge.addon.ui.metadata.WithAttributes;
import org.jboss.forge.addon.ui.result.NavigationResult;
import org.jboss.forge.addon.ui.result.navigation.NavigationResultBuilder;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.roaster.model.Visibility;
import org.jboss.forge.roaster.model.source.JavaClassSource;

/**
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
* @author Martin Kouba
*/
public abstract class AbstractMethodCDICommand extends AbstractJavaEECommand implements PrerequisiteCommandsProvider
{
@Inject
@WithAttributes(label = "Target Class", description = "The class where the method will be created", required = true, type = InputType.DROPDOWN)
protected UISelectOne<JavaResource> targetClass;

@Inject
@WithAttributes(label = "Method Name", description = "The name of the created method", required = true)
protected UIInput<String> named;

@Inject
@WithAttributes(label = "Access Type", description = "The access type", type = InputType.RADIO, defaultValue = "PRIVATE")
protected UISelectOne<Visibility> accessType;

@Inject
private ProjectOperations projectOperations;

@Override
public void initializeUI(UIBuilder builder) throws Exception
{
setupTargetClass(builder.getUIContext());
setupAccessType();
builder.add(targetClass).add(named).add(accessType);
}

@Override
public Metadata getMetadata(UIContext context)
{
return Metadata.from(super.getMetadata(context), getClass())
.category(Categories.create(Categories.create("Java EE"), "CDI"));
}

@Override
public void validate(UIValidationContext validator)
{
JavaResource javaResource = targetClass.getValue();
if (javaResource != null && javaResource.exists())
{
JavaClassSource javaClass;
try
{
javaClass = javaResource.getJavaType();
if (javaClass.hasMethodSignature(named.getValue()))
{
validator.addValidationError(named, "Method signature already exists");
}
}
catch (FileNotFoundException ignored)
{
}
}
}

@Override
public NavigationResult getPrerequisiteCommands(UIContext context)
{
NavigationResultBuilder builder = NavigationResultBuilder.create();
Project project = getSelectedProject(context);
if (project != null)
{
if (!project.hasFacet(CDIFacet.class))
{
builder.add(CDISetupCommand.class);
}
}
return builder.build();
}


protected void setupTargetClass(UIContext uiContext)
{
Project project = getSelectedProject(uiContext);
UISelection<Resource<?>> resource = uiContext.getInitialSelection();
if (resource.get() instanceof JavaResource)
{
targetClass.setDefaultValue((JavaResource) resource.get());
}
targetClass.setValueChoices(projectOperations.getProjectClasses(project));
}

@Override
protected boolean isProjectRequired()
{
return true;
}

protected Visibility getDefaultVisibility() {
return Visibility.PUBLIC;
}

private void setupAccessType()
{
accessType.setItemLabelConverter(new Converter<Visibility, String>()
{
@Override
public String convert(Visibility source)
{
if (source == null)
return null;
if (source == Visibility.PACKAGE_PRIVATE)
{
return "default";
}
return source.toString();
}
});
accessType.setDefaultValue(getDefaultVisibility());
}
}
Expand Up @@ -13,83 +13,49 @@
import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.jboss.forge.addon.javaee.cdi.CDIFacet;
import org.jboss.forge.addon.javaee.cdi.CDIOperations;
import org.jboss.forge.addon.javaee.cdi.ui.input.Qualifiers;
import org.jboss.forge.addon.javaee.ui.AbstractJavaEECommand;
import org.jboss.forge.addon.parser.java.beans.ProjectOperations;
import org.jboss.forge.addon.parser.java.resources.JavaResource;
import org.jboss.forge.addon.projects.Project;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.ui.command.PrerequisiteCommandsProvider;
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.UISelection;
import org.jboss.forge.addon.ui.context.UIValidationContext;
import org.jboss.forge.addon.ui.hints.InputType;
import org.jboss.forge.addon.ui.input.InputComponent;
import org.jboss.forge.addon.ui.input.UICompleter;
import org.jboss.forge.addon.ui.input.UIInput;
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.result.navigation.NavigationResultBuilder;
import org.jboss.forge.addon.ui.util.Categories;
import org.jboss.forge.addon.ui.util.Metadata;
import org.jboss.forge.furnace.util.Strings;
import org.jboss.forge.roaster.model.Visibility;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.jboss.forge.roaster.model.source.JavaSource;
import org.jboss.forge.roaster.model.source.ParameterSource;

/**
*
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public class CDIAddObserverMethodCommand extends AbstractJavaEECommand implements PrerequisiteCommandsProvider
public class CDIAddObserverMethodCommand extends AbstractMethodCDICommand
{
@Inject
@WithAttributes(label = "Target Class", description = "The class where the method will be created", required = true, type = InputType.DROPDOWN)
private UISelectOne<JavaResource> targetClass;

@Inject
@WithAttributes(label = "Method Name", description = "The name of the created method", required = true)
private UIInput<String> named;

@Inject
@WithAttributes(label = "Event Type", description = "The event type of the created method", type = InputType.JAVA_CLASS_PICKER, required = true)
private UIInput<String> eventType;

@Inject
private Qualifiers qualifiers;

@Inject
private ProjectOperations projectOperations;

@Inject
private CDIOperations cdiOperations;

@Override
public void initializeUI(UIBuilder builder) throws Exception
{
UIContext uiContext = builder.getUIContext();
Project project = getSelectedProject(uiContext);
setupTargetClass(uiContext, project);
super.initializeUI(builder);
setupType();
builder.add(targetClass).add(named).add(eventType).add(qualifiers);
}

private void setupTargetClass(UIContext uiContext, Project project)
{
UISelection<Resource<?>> resource = uiContext.getInitialSelection();
if (resource.get() instanceof JavaResource)
{
targetClass.setDefaultValue((JavaResource) resource.get());
}
targetClass.setValueChoices(projectOperations.getProjectClasses(project));
builder.add(eventType).add(qualifiers);
}

private void setupType()
Expand Down Expand Up @@ -126,54 +92,10 @@ public Iterable<String> getCompletionProposals(final UIContext context, final In
}

@Override
protected boolean isProjectRequired()
{
return true;
}

@Override
public UICommandMetadata getMetadata(UIContext context)
public Metadata getMetadata(UIContext context)
{
return Metadata.from(super.getMetadata(context), getClass()).name("CDI: Add Observer Method")
.description("Adds a new observer method to a bean")
.category(Categories.create(Categories.create("Java EE"), "CDI"));
}

@Override
public void validate(UIValidationContext validator)
{
JavaResource javaResource = targetClass.getValue();
if (javaResource != null && javaResource.exists())
{
JavaClassSource javaClass;
try
{
javaClass = javaResource.getJavaType();
if (javaClass.hasMethodSignature(named.getValue(), eventType.getValue()))
{
validator.addValidationError(named, "Method signature already exists");
}
}
catch (FileNotFoundException e)
{
// ignore
}
}
}

@Override
public NavigationResult getPrerequisiteCommands(UIContext context)
{
NavigationResultBuilder builder = NavigationResultBuilder.create();
Project project = getSelectedProject(context);
if (project != null)
{
if (!project.hasFacet(CDIFacet.class))
{
builder.add(CDISetupCommand.class);
}
}
return builder.build();
.description("Adds a new observer method to a bean");
}

@Override
Expand All @@ -193,4 +115,11 @@ public Result execute(UIExecutionContext context) throws Exception
javaResource.setContents(javaClass);
return Results.success();
}


@Override
protected Visibility getDefaultVisibility()
{
return Visibility.PRIVATE;
}
}

0 comments on commit e2b2096

Please sign in to comment.