forked from forge/plugin-arquillian
/
CreateTestCommand.java
134 lines (112 loc) · 4.93 KB
/
CreateTestCommand.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package org.jboss.forge.arquillian.command;
import java.io.FileNotFoundException;
import java.io.StringWriter;
import java.util.Properties;
import java.util.concurrent.Callable;
import javax.inject.Inject;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.jboss.forge.addon.parser.java.facets.JavaSourceFacet;
import org.jboss.forge.addon.parser.java.resources.JavaResource;
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.command.UICommand;
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.hints.InputType;
import org.jboss.forge.addon.ui.input.UIInput;
import org.jboss.forge.addon.ui.metadata.UICommandMetadata;
import org.jboss.forge.addon.ui.metadata.WithAttributes;
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.arquillian.api.ArquillianFacet;
import org.jboss.forge.arquillian.api.TestFrameworkFacet;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.JavaSource;
public class CreateTestCommand extends AbstractProjectCommand implements UICommand {
static
{
Properties properties = new Properties();
properties.setProperty("resource.loader", "class");
properties.setProperty("class.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init(properties);
}
@Inject
private ProjectFactory projectFactory;
@Inject
@WithAttributes(shortName = 's', label = "Target source", required = true, type = InputType.JAVA_CLASS_PICKER)
private UIInput<JavaResource> value;
@Inject
@WithAttributes(shortName = 'e', label = "Enable JPA", defaultValue = "true", required = false)
private UIInput<Boolean> enableJPA;
@Override
public UICommandMetadata getMetadata(UIContext context) {
return Metadata.from(super.getMetadata(context), getClass())
.category(Categories.create("Arquillian"))
.name("Arquillian: Create Test")
.description("This addon will help you create a test skeleton based on a given class");
}
@Override
public void initializeUI(final UIBuilder builder) throws Exception {
builder.add(value)
.add(enableJPA);
value.setDefaultValue(new Callable<JavaResource>() {
@Override
public JavaResource call() throws Exception {
Object selected = builder.getUIContext().getInitialSelection().get();
if(selected != null && selected instanceof JavaResource) {
return (JavaResource)selected;
}
return null;
}
});
}
@Override
public Result execute(UIExecutionContext context) throws Exception {
createTest(getSelectedProject(context), value.getValue(), enableJPA.getValue());
return Results.success();
}
@Override
protected boolean isProjectRequired() {
return true;
}
@Override
public boolean isEnabled(UIContext context) {
Boolean parent = super.isEnabled(context);
if(parent) {
return getSelectedProject(context).hasFacet(ArquillianFacet.class);
}
return parent;
}
@Override
protected ProjectFactory getProjectFactory() {
return projectFactory;
}
private void createTest(Project project, JavaResource classUnderTest, boolean enableJPA)
throws FileNotFoundException
{
final TestFrameworkFacet testFrameworkFacet = project.getFacet(TestFrameworkFacet.class);
final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class);
final JavaSource<?> javaSource = Roaster.parse(JavaSource.class, classUnderTest.getContents());
final VelocityContext context = initializeVelocityContext(enableJPA, javaSource);
final StringWriter writer = new StringWriter();
Velocity.mergeTemplate(testFrameworkFacet.getTemplateName(), "UTF-8", context, writer);
final JavaSource<?> testClass = Roaster.parse(JavaSource.class, writer.toString());
java.saveTestJavaSource(testClass);
//pickup.fire(new PickupResource(java.getTestJavaResource(testClass)));
}
private VelocityContext initializeVelocityContext(boolean enableJPA, JavaSource<?> javaSource) {
VelocityContext context = new VelocityContext();
context.put("package", javaSource.getPackage());
context.put("ClassToTest", javaSource.getName());
context.put("classToTest", javaSource.getName().toLowerCase());
context.put("packageImport", javaSource.getPackage());
context.put("enableJPA", enableJPA);
return context;
}
}