Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
Add support for file parser factory
Browse files Browse the repository at this point in the history
  • Loading branch information
mapingo committed Feb 13, 2018
1 parent 2bc0832 commit a223db8
Show file tree
Hide file tree
Showing 11 changed files with 136 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to
[Semantic Versioning](http://semver.org/).

## Unreleased
### Added
- Support for FileParser Factory

## [2.3.0]
### Changed
Expand Down
2 changes: 1 addition & 1 deletion generator-plugin-it/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
<generatorName>
uk.gov.justice.maven.generator.io.files.parser.json.test.JsonTitleAppendingGeneratorFactory
</generatorName>
<parserName>uk.gov.justice.maven.generator.io.files.parser.JsonSchemaFileParser</parserName>
<parserName>uk.gov.justice.maven.generator.io.files.parser.JsonSchemaFileParserFactory</parserName>
<basePackageName>uk.gov.justice.api</basePackageName>
<sourceDirectory>${basedir}/src/json</sourceDirectory>
<outputDirectory>${project.build.directory}/generated-sources
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package uk.gov.justice.maven.generator.io.files.parser.generator;

import static java.lang.Class.forName;
import static java.lang.String.format;
import static java.util.Arrays.asList;

import uk.gov.justice.maven.generator.io.files.parser.FileParser;
import uk.gov.justice.maven.generator.io.files.parser.FileParserFactory;

public class FileParserInstanceFactory {

public FileParser newInstanceOf(final String parserName) {

try {
final Object instance = forName(parserName).newInstance();

if (isFileParserFactory(instance)) {
final FileParserFactory fileParserFactory = (FileParserFactory) instance;
return fileParserFactory.create();
}

return (FileParser) instance;

} catch (InstantiationException | IllegalAccessException | ClassNotFoundException ex) {
throw new FileParserInstantiationException(format("Failed to instantiate file parser: %s", parserName), ex);
}
}

private boolean isFileParserFactory(final Object instance) {
return asList(instance.getClass().getInterfaces()).contains(FileParserFactory.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package uk.gov.justice.maven.generator.io.files.parser.generator;

public class FileParserInstantiationException extends RuntimeException {

public FileParserInstantiationException(final String message, final Throwable cause) {
super(message, cause);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package uk.gov.justice.maven.generator.io.files.parser.generator;

import static java.lang.Class.forName;
import static org.apache.maven.plugins.annotations.ResolutionScope.COMPILE_PLUS_RUNTIME;

import uk.gov.justice.maven.generator.io.files.parser.FileParser;
import uk.gov.justice.maven.generator.io.files.parser.common.BasicMojo;
import uk.gov.justice.maven.generator.io.files.parser.core.GeneratorProperties;
import uk.gov.justice.maven.generator.io.files.parser.io.FileTreeScannerFactory;
Expand Down Expand Up @@ -71,7 +69,7 @@ public void execute() throws MojoExecutionException {
new GenerateGoalProcessor(
new MojoGeneratorFactory(),
new FileTreeScannerFactory(),
(FileParser) forName(parserName).newInstance())
new FileParserInstanceFactory().newInstanceOf(parserName))
.generate(configuration(sourcePaths));
} catch (Exception e) {
throw new MojoExecutionException("Failed to apply generator to source file", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package uk.gov.justice.maven.generator.io.files.parser.generator;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import uk.gov.justice.maven.generator.io.files.parser.FileParser;
import uk.gov.justice.maven.generator.io.files.parser.generator.parser.TestFileParser;
import uk.gov.justice.maven.generator.io.files.parser.generator.parser.TestFileParserFactory;

import org.junit.Test;

public class FileParserInstanceFactoryTest {

@Test
public void shouldCreateInstanceOfFileParserFromGivenFileParserName() throws Exception {

final String parserName = TestFileParser.class.getName();

final FileParser fileParser = new FileParserInstanceFactory().newInstanceOf(parserName);

assertThat(fileParser, is(instanceOf(TestFileParser.class)));
}

@Test
public void shouldCreateInstanceOfFileParserFromGivenParserFactoryName() throws Exception {

final String parserFactoryName = TestFileParserFactory.class.getName();

final FileParser fileParser = new FileParserInstanceFactory().newInstanceOf(parserFactoryName);

assertThat(fileParser, is(instanceOf(TestFileParser.class)));
}

@Test
public void shouldThrowExceptionIfUnableToInstantiateFileParser() throws Exception {

final String parserName = "unknown";

try {
new FileParserInstanceFactory().newInstanceOf(parserName);
fail();
} catch (final FileParserInstantiationException ex) {
assertThat(ex.getMessage(), is("Failed to instantiate file parser: unknown"));
assertThat(ex.getCause(), is(instanceOf(ClassNotFoundException.class)));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ public void testShouldGenerateFromOnlyIncludedRaml() throws Exception {

}

//WARNING: This test will fail in Intellij, as everything is on the one classpath in Intellij
@SuppressWarnings("unchecked")
public void testShouldIncludeRamlFilesFromTheClasspath() throws Exception {
File pom = getTestFile("src/test/resources/includes-excludes-external/pom.xml");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package uk.gov.justice.maven.generator.io.files.parser.generator.parser;

import uk.gov.justice.maven.generator.io.files.parser.FileParser;

import java.nio.file.Path;
import java.util.Collection;

public class TestFileParser implements FileParser<String> {

@Override
public Collection<String> parse(final Path baseDir, final Collection<Path> paths) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package uk.gov.justice.maven.generator.io.files.parser.generator.parser;

import uk.gov.justice.maven.generator.io.files.parser.FileParser;
import uk.gov.justice.maven.generator.io.files.parser.FileParserFactory;

public class TestFileParserFactory implements FileParserFactory<String> {

public FileParser<String> create() {
return new TestFileParser();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package uk.gov.justice.maven.generator.io.files.parser;

public interface FileParserFactory<T> {

FileParser<T> create();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package uk.gov.justice.maven.generator.io.files.parser;

import javax.json.JsonObject;

public class JsonSchemaFileParserFactory implements FileParserFactory<JsonObject> {

@Override
public FileParser<JsonObject> create() {
return new JsonSchemaFileParser();
}
}

0 comments on commit a223db8

Please sign in to comment.