use of com.devonfw.cobigen.api.extension.InputReader in project cobigen by devonfw.
the class InputResolverImpl method resolveContainerElements.
@Cached
@Override
public List<Object> resolveContainerElements(Object input, Trigger trigger) {
List<Object> inputObjects = new ArrayList<>();
if (this.inputInterpreter.combinesMultipleInputs(input)) {
TriggerInterpreter triggerInterpreter = PluginRegistry.getTriggerInterpreter(trigger.getType());
InputReader inputReader = triggerInterpreter.getInputReader();
// check whether the inputs should be retrieved recursively
boolean retrieveInputsRecursively = false;
for (ContainerMatcher containerMatcher : trigger.getContainerMatchers()) {
MatcherTo matcherTo = new MatcherTo(containerMatcher.getType(), containerMatcher.getValue(), input);
if (triggerInterpreter.getMatcher().matches(matcherTo)) {
if (!retrieveInputsRecursively) {
retrieveInputsRecursively = containerMatcher.isRetrieveObjectsRecursively();
} else {
break;
}
}
}
if (retrieveInputsRecursively) {
inputObjects = inputReader.getInputObjectsRecursively(input, trigger.getInputCharset());
} else {
inputObjects = inputReader.getInputObjects(input, trigger.getInputCharset());
}
// Remove non matching inputs
Iterator<Object> it = inputObjects.iterator();
while (it.hasNext()) {
Object next = it.next();
if (!this.matcherEvaluator.matches(next, trigger.getMatcher(), triggerInterpreter)) {
it.remove();
}
}
} else {
inputObjects.add(input);
}
return inputObjects;
}
use of com.devonfw.cobigen.api.extension.InputReader in project cobigen by devonfw.
the class ClassLoadingTest method createTestDataAndConfigureMock.
/**
* Creates simple to debug test data, which includes on container object and one child of the container object. A
* {@link TriggerInterpreter TriggerInterpreter} will be mocked with all necessary supplier classes to mock a simple
* java trigger interpreter. Furthermore, the mocked trigger interpreter will be directly registered in the
* {@link PluginRegistry}.
*
* @return the container as input for generation interpreter for
*/
@SuppressWarnings("unchecked")
private Object createTestDataAndConfigureMock() {
// we only need any objects for inputs to have a unique object reference to affect the mocked method
// calls as intended
Object container = new Object() {
@Override
public String toString() {
return "container";
}
};
Object firstChildResource = new Object() {
@Override
public String toString() {
return "child";
}
};
// Pre-processing: Mocking
GeneratorPluginActivator activator = mock(GeneratorPluginActivator.class);
TriggerInterpreter triggerInterpreter = mock(TriggerInterpreter.class);
MatcherInterpreter matcher = mock(MatcherInterpreter.class);
InputReader inputReader = mock(InputReader.class);
when(triggerInterpreter.getType()).thenReturn("mockplugin");
when(triggerInterpreter.getMatcher()).thenReturn(matcher);
when(triggerInterpreter.getInputReader()).thenReturn(inputReader);
when(inputReader.isValidInput(any())).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("fqn"), ANY, sameInstance(container))))).thenReturn(false);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("package"), ANY, sameInstance(container))))).thenReturn(true);
// Simulate container children resolution of any plug-in
when(inputReader.getInputObjects(any(), any(Charset.class))).thenReturn(Lists.newArrayList(firstChildResource));
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("fqn"), ANY, sameInstance(firstChildResource))))).thenReturn(true);
// Simulate variable resolving of any plug-in
when(matcher.resolveVariables(argThat(new MatcherToMatcher(equalTo("fqn"), ANY, sameInstance(firstChildResource))), argThat(hasItemsInList(//
new VariableAssignmentToMatcher(equalTo("regex"), equalTo("rootPackage"), equalTo("1"), equalTo(false)), new VariableAssignmentToMatcher(equalTo("regex"), equalTo("entityName"), equalTo("3"), equalTo(false)))), any())).thenReturn(ImmutableMap.<String, String>builder().put("rootPackage", "com.devonfw").put("entityName", "Test").build());
PluginRegistry.registerTriggerInterpreter(triggerInterpreter, activator);
return container;
}
use of com.devonfw.cobigen.api.extension.InputReader in project cobigen by devonfw.
the class GenerationTest method testCobiGenVariableAvailabilityInTemplates_cobigenPropertiesTargetLocation.
/**
* Tests whether the cobigen properties specified in the target folder are correctly resolved to be served in the
* template in the {@link ModelBuilderImpl#NS_VARIABLES} namespace.
*
* @throws Exception test fails
*/
@Test
public void testCobiGenVariableAvailabilityInTemplates_cobigenPropertiesTargetLocation() throws Exception {
Object input = new Object() {
@Override
public String toString() {
return "input object";
}
};
// Pre-processing: Mocking
GeneratorPluginActivator activator = mock(GeneratorPluginActivator.class);
TriggerInterpreter triggerInterpreter = mock(TriggerInterpreter.class);
MatcherInterpreter matcher = mock(MatcherInterpreter.class);
InputReader inputReader = mock(InputReader.class);
when(triggerInterpreter.getType()).thenReturn("mockplugin");
when(triggerInterpreter.getMatcher()).thenReturn(matcher);
when(triggerInterpreter.getInputReader()).thenReturn(inputReader);
when(inputReader.isValidInput(any())).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("fqn"), ANY, sameInstance(input))))).thenReturn(true);
// Simulate variable resolving of any plug-in
HashMap<String, String> variables = new HashMap<>(1);
variables.put("contextVar", "contextValue");
when(matcher.resolveVariables(any(MatcherTo.class), any(List.class), any())).thenReturn(variables);
PluginRegistry.registerTriggerInterpreter(triggerInterpreter, activator);
// further setup
File folder = this.tmpFolder.newFolder();
Path cobigenPropTarget = folder.toPath().resolve("cobigen.properties");
Files.createFile(cobigenPropTarget);
try (FileWriter writer = new FileWriter(cobigenPropTarget.toFile())) {
IOUtils.write("cobigenPropTarget=extValue", writer);
}
CobiGen cobigen = CobiGenFactory.create(new File(testFileRootPath + "variableAvailability").toURI());
List<TemplateTo> templates = cobigen.getMatchingTemplates(input);
TemplateTo targetTemplate = getTemplate(templates, "t2");
// execute
GenerationReportTo report = cobigen.generate(input, targetTemplate, Paths.get(folder.toURI()));
// assert
assertThat(report).isSuccessful();
File target = new File(folder, "generated2.txt");
assertThat(target).hasContent("contextValue,cobigenPropValue,extValue");
}
use of com.devonfw.cobigen.api.extension.InputReader in project cobigen by devonfw.
the class ContainerMatcherTest method testContainerChildrenWillIndividuallyBeMatched.
/**
* Create a new {@link ContainerMatcher}, which contains two children which do not match the same trigger.
*
* @throws Exception test fails
*/
@Test
@SuppressWarnings("unchecked")
public void testContainerChildrenWillIndividuallyBeMatched() throws Exception {
Object container = new Object() {
@Override
public String toString() {
return "container";
}
};
Object child1 = new Object() {
@Override
public String toString() {
return "child1";
}
};
Object child2 = new Object() {
@Override
public String toString() {
return "child2";
}
};
// Pre-processing: Mocking
GeneratorPluginActivator activator = mock(GeneratorPluginActivator.class);
TriggerInterpreter triggerInterpreter = mock(TriggerInterpreter.class);
MatcherInterpreter matcher = mock(MatcherInterpreter.class);
InputReader inputReader = mock(InputReader.class);
when(triggerInterpreter.getType()).thenReturn("test");
when(triggerInterpreter.getMatcher()).thenReturn(matcher);
when(triggerInterpreter.getInputReader()).thenReturn(inputReader);
when(inputReader.isValidInput(any())).thenReturn(true);
// Simulate container children resolution of any plug-in
when(matcher.resolveVariables(argThat(new MatcherToMatcher(equalTo("or"), ANY, sameInstance(child1))), anyList(), any())).thenReturn(ImmutableMap.<String, String>builder().put("variable", "child1").build());
when(matcher.resolveVariables(argThat(new MatcherToMatcher(equalTo("or"), ANY, sameInstance(child2))), anyList(), any())).thenReturn(ImmutableMap.<String, String>builder().put("variable", "child2").build());
when(inputReader.getInputObjects(any(), any(Charset.class))).thenReturn(Lists.newArrayList(child1, child2));
// match container
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("container"), ANY, sameInstance(container))))).thenReturn(true);
// do not match first child
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("or"), ANY, sameInstance(child1))))).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("not"), ANY, sameInstance(child1))))).thenReturn(true);
// match second child
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("or"), ANY, sameInstance(child2))))).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("not"), ANY, sameInstance(child2))))).thenReturn(false);
PluginRegistry.registerTriggerInterpreter(triggerInterpreter, activator);
// create CobiGen instance
File templatesFolder = new File(testFileRootPath + "selectiveContainerGeneration");
CobiGen target = CobiGenFactory.create(templatesFolder.toURI());
File folder = this.tmpFolder.newFolder();
// Execution
GenerationReportTo report = target.generate(container, target.getMatchingTemplates(container), Paths.get(folder.toURI()), false);
assertThat(report).isSuccessful();
// Verification
assertNotNull(folder.list());
assertEquals(1, folder.list().length);
assertEquals("child2.txt", folder.list()[0]);
}
use of com.devonfw.cobigen.api.extension.InputReader in project cobigen by devonfw.
the class TriggerActivationTest method testNoActivation_1Of2AND_1OR_MatcherMatches.
/**
* Tests that a trigger will not be activated in case of one of two AND Matchers and one OR matcher matches.
*
* @throws Exception test fails
* @author mbrunnli (22.02.2015)
*/
@Test
@SuppressWarnings("unchecked")
public void testNoActivation_1Of2AND_1OR_MatcherMatches() throws Exception {
Object input = new Object();
// Pre-processing: Mocking
GeneratorPluginActivator activator = mock(GeneratorPluginActivator.class);
TriggerInterpreter triggerInterpreter = mock(TriggerInterpreter.class);
MatcherInterpreter matcher = mock(MatcherInterpreter.class);
InputReader inputReader = mock(InputReader.class);
when(triggerInterpreter.getType()).thenReturn("test");
when(triggerInterpreter.getMatcher()).thenReturn(matcher);
when(triggerInterpreter.getInputReader()).thenReturn(inputReader);
when(inputReader.isValidInput(any())).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("and1"), ANY, sameInstance(input))))).thenReturn(false);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("and2"), ANY, sameInstance(input))))).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("or"), ANY, sameInstance(input))))).thenReturn(true);
when(matcher.matches(argThat(new MatcherToMatcher(equalTo("not"), ANY, sameInstance(input))))).thenReturn(false);
PluginRegistry.registerTriggerInterpreter(triggerInterpreter, activator);
// execution
CobiGen cobigen = CobiGenFactory.create(new File(testFileRootPath + "templates").toURI());
List<String> matchingTriggerIds = cobigen.getMatchingTriggerIds(input);
assertThat(matchingTriggerIds, not(hasItem("triggerId")));
}
Aggregations