Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Template front end #85

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group 'cd.go.plugin.config.yaml'
version '0.7.0'
version '0.8.0'

apply plugin: 'java'

Expand Down
10 changes: 8 additions & 2 deletions src/main/java/cd/go/plugin/config/yaml/PluginSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@

public class PluginSettings {
private String filePattern;
private String generatorConfigPattern;;

public PluginSettings() {
}

public PluginSettings(String filePattern) {
public PluginSettings(String filePattern, String generatorConfigPattern) {
this.filePattern = filePattern;
this.generatorConfigPattern = generatorConfigPattern;
}

public String getFilePattern() {
return filePattern;
}
}

public String getGeneratorConfigPattern() {
return generatorConfigPattern;
}
}
37 changes: 34 additions & 3 deletions src/main/java/cd/go/plugin/config/yaml/YamlConfigPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,17 @@
public class YamlConfigPlugin implements GoPlugin {
public static final String GET_PLUGIN_SETTINGS = "go.processor.plugin-settings.get";
private static final String DISPLAY_NAME_FILE_PATTERN = "Go YAML files pattern";
private static final String DISPLAY_NAME_GENERATOR_CONFIG_PATTERN = "Go YAML generator config files pattern";
private static final String PLUGIN_SETTINGS_FILE_PATTERN = "file_pattern";
private static final String PLUGIN_SETTINGS_GENERATOR_CONFIG_PATTERN = "generator_config_pattern";
private static final String MISSING_DIRECTORY_MESSAGE = "directory property is missing in parse-directory request";
private static final String EMPTY_REQUEST_BODY_MESSAGE = "Request body cannot be null or empty";
private static final String PLUGIN_ID = "yaml.config.plugin";
public static final String PLUGIN_SETTINGS_GET_CONFIGURATION = "go.plugin-settings.get-configuration";
public static final String PLUGIN_SETTINGS_GET_VIEW = "go.plugin-settings.get-view";
public static final String PLUGIN_SETTINGS_VALIDATE_CONFIGURATION = "go.plugin-settings.validate-configuration";
public static final String DEFAULT_FILE_PATTERN = "**/*.gocd.yaml,**/*.gocd.yml";
public static final String DEFAULT_GENERATOR_CONFIG_PATTERN = "**/*.gocd-yaml-generator.yaml,**/*.gocd-yaml-generator.yml";

private static Logger LOGGER = Logger.getLoggerFor(YamlConfigPlugin.class);

Expand Down Expand Up @@ -97,6 +100,7 @@ private GoPluginApiResponse handleParseDirectoryRequest(GoPluginApiRequest reque
File baseDir = new File(directory);

String pattern = null;
String generatorConfigPattern = null;
JsonArray perRepoConfig = parsedResponseObject.getAsJsonArray("configurations");
if(perRepoConfig != null) {
for(JsonElement config : perRepoConfig) {
Expand All @@ -105,21 +109,46 @@ private GoPluginApiResponse handleParseDirectoryRequest(GoPluginApiRequest reque
if(key.equals(PLUGIN_SETTINGS_FILE_PATTERN)) {
pattern = configObj.getAsJsonPrimitive("value").getAsString();
}
else if(key.equals(PLUGIN_SETTINGS_GENERATOR_CONFIG_PATTERN)) {
generatorConfigPattern = configObj.getAsJsonPrimitive("value").getAsString();
}
else
return badRequest("Config repo configuration has invalid key=" + key);
}
}

YamlFileParser parser = new YamlFileParser();
PluginSettings settings = getPluginSettings();
ConfigDirectoryScanner scanner = new AntDirectoryScanner();

if(generatorConfigPattern == null) {
generatorConfigPattern = isBlank(settings.getGeneratorConfigPattern()) ?
DEFAULT_GENERATOR_CONFIG_PATTERN : settings.getGeneratorConfigPattern();
}

List<YamlGenerator> generators = new ArrayList<>();

String[] generatorConfigFiles = scanner.getFilesMatchingPattern(baseDir, generatorConfigPattern);
if (generatorConfigFiles.length > 0) {
YamlGeneratorConfigParser parser = new YamlGeneratorConfigParser();
for (String file : generatorConfigFiles) {
generators.addAll(parser.parseFile(baseDir, file));
}
}

List<String> files = new ArrayList<>();

for (YamlGenerator generator : generators) {
files.addAll(generator.generateFiles(baseDir));
}

if(pattern == null) {
pattern = isBlank(settings.getFilePattern()) ?
DEFAULT_FILE_PATTERN : settings.getFilePattern();
}

String[] files = scanner.getFilesMatchingPattern(baseDir, pattern);
YamlFileParser parser = new YamlFileParser();
for (String file : scanner.getFilesMatchingPattern(baseDir, pattern))
files.add(file);
JsonConfigCollection config = parser.parseFiles(baseDir, files);

config.updateTargetVersionFromFiles();
Expand Down Expand Up @@ -152,6 +181,7 @@ private GoPluginApiResponse handleValidatePluginSettingsConfiguration(GoPluginAp
private GoPluginApiResponse handleGetPluginSettingsConfiguration() {
Map<String, Object> response = new HashMap<String, Object>();
response.put(PLUGIN_SETTINGS_FILE_PATTERN, createField(DISPLAY_NAME_FILE_PATTERN, DEFAULT_FILE_PATTERN, false, false, "0"));
response.put(PLUGIN_SETTINGS_GENERATOR_CONFIG_PATTERN, createField(DISPLAY_NAME_GENERATOR_CONFIG_PATTERN, DEFAULT_GENERATOR_CONFIG_PATTERN, false, false, "0"));
return renderJSON(DefaultGoPluginApiResponse.SUCCESS_RESPONSE_CODE, response);
}

Expand All @@ -174,7 +204,8 @@ public PluginSettings getPluginSettings() {
}
Map<String, String> responseBodyMap = (Map<String, String>) JSONUtils.fromJSON(response.responseBody());
return new PluginSettings(
responseBodyMap.get(PLUGIN_SETTINGS_FILE_PATTERN));
responseBodyMap.get(PLUGIN_SETTINGS_FILE_PATTERN),
responseBodyMap.get(PLUGIN_SETTINGS_GENERATOR_CONFIG_PATTERN));
}

private GoApiRequest createGoApiRequest(final String api, final String responseBody) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/cd/go/plugin/config/yaml/YamlFileParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.esotericsoftware.yamlbeans.YamlReader;

import java.io.*;
import java.util.List;

public class YamlFileParser {
private RootTransform rootTransform;
Expand All @@ -17,7 +18,7 @@ public YamlFileParser(RootTransform rootTransform) {
this.rootTransform = rootTransform;
}

public JsonConfigCollection parseFiles(File baseDir, String[] files) {
public JsonConfigCollection parseFiles(File baseDir, List<String> files) {
JsonConfigCollection collection = new JsonConfigCollection();
for (String file : files) {
InputStream inputStream = null;
Expand Down
45 changes: 45 additions & 0 deletions src/main/java/cd/go/plugin/config/yaml/YamlGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package cd.go.plugin.config.yaml;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class YamlGenerator {
private final String name;
private final String pattern;
private final String script;

private final static boolean isWindows =
System.getProperty("os.name").toLowerCase().startsWith("windows");

private final AntDirectoryScanner scanner = new AntDirectoryScanner();

public YamlGenerator(String name, String pattern, String script) {
this.name = name;
this.pattern = pattern;
this.script = script;
}

public List<String> generateFiles(File baseDir) throws Exception {
String[] inputFiles = scanner.getFilesMatchingPattern(baseDir, pattern);
List<String> outputFiles = new ArrayList<>();
for (String file : inputFiles) {
String outputFile = file + ".out";
String absPath = new File(baseDir, file).getAbsolutePath();
ProcessBuilder builder = new ProcessBuilder();
String instance = script.replace("{{file}}", absPath);
if (isWindows) {
builder.command("cmd.exe", "/c", instance);
} else {
builder.command("sh", "-c", instance);
}
builder.redirectOutput(new File(baseDir, outputFile));
builder.redirectError(new File(absPath + ".err"));
Process process = builder.start();
int exitCode = process.waitFor();
if (exitCode == 0)
outputFiles.add(outputFile);
}
return outputFiles;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package cd.go.plugin.config.yaml;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.esotericsoftware.yamlbeans.YamlConfig;
import com.esotericsoftware.yamlbeans.YamlReader;

public class YamlGeneratorConfigParser {
private static class GeneratorConfigs {
public Map<String, GeneratorConfig> generators;
}
private static class GeneratorConfig {
public String pattern;
public String script;
}
public List<YamlGenerator> parseFile(File baseDir, String file) {
try (FileInputStream inputStream = new FileInputStream(new File(baseDir, file))) {
YamlConfig config = new YamlConfig();
config.setAllowDuplicates(false);
YamlReader reader = new YamlReader(new InputStreamReader(inputStream), config);
GeneratorConfigs configs = reader.read(GeneratorConfigs.class);
return createGenerators(configs);
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
private List<YamlGenerator> createGenerators(GeneratorConfigs configs) {
List<YamlGenerator> generators = new ArrayList<>();
for (Map.Entry<String, GeneratorConfig>
entry : configs.generators.entrySet()) {
generators.add(createGenerator(entry.getKey(), entry.getValue()));
}
return generators;
}
protected YamlGenerator createGenerator(String name, GeneratorConfig config) {
return new YamlGenerator(name, config.pattern, config.script);
}
}
2 changes: 2 additions & 0 deletions src/main/resources/plugin-settings.template.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<div class="form_item_block">
<label>Go YAML files global pattern:</label>
<input type="text" ng-model="file_pattern" ng-required="false" placeholder="**/*.gocd.yaml,**/*.gocd.yml" />
<label>Go YAML generator config files pattern:</label>
<input type="text" ng-model="generator_config_pattern" ng-required="false" placeholder="**/gocd-yaml-generator-config.yaml,**/gocd-yaml-generator-config.yml" />
<span class="form_error" ng-show="GOINPUTNAME[file_pattern].$error.server">{{ GOINPUTNAME[file_pattern].$error.server }}</span>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
public class PluginSettingsTest {
@Test
public void shouldGetFilePattern() {
PluginSettings pluginSettings = new PluginSettings("file-pattern");
PluginSettings pluginSettings = new PluginSettings("file-pattern", "generator-config-pattern");

assertThat(pluginSettings.getFilePattern(), is(equalTo("file-pattern")));
assertThat(pluginSettings.getGeneratorConfigPattern(), is(equalTo("generator-config-pattern")));
}

}
}