Skip to content

Commit

Permalink
Change yaml parser to yamlbeans (#995)
Browse files Browse the repository at this point in the history
* Change yaml parser

* Add a unit test
  • Loading branch information
imbyungjun authored Jan 9, 2024
1 parent f6d0672 commit 1a28741
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 17 deletions.
2 changes: 1 addition & 1 deletion ngrinder-controller/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ dependencies {
implementation (group: "jaxen", name: "jaxen", version: "1.1.4")
implementation (group: "com.beust", name: "jcommander", version: "1.32")
implementation (group: "org.pf4j", name: "pf4j", version: "3.0.1")
implementation (group: "org.yaml", name: "snakeyaml", version: "1.25")
implementation (group: "com.esotericsoftware.yamlbeans", name: "yamlbeans", version: "1.17")
implementation (group: "commons-collections", name: "commons-collections", version: "3.2.1")
implementation (group: "org.reflections", name: "reflections", version: "0.9.9")
implementation (group: "com.hazelcast", name: "hazelcast", version: hazelcast_version)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.ngrinder.script.service;

import com.esotericsoftware.yamlbeans.YamlReader;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -26,7 +27,6 @@
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.BasicAuthenticationManager;
import org.tmatesoft.svn.core.wc.*;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileNotFoundException;
Expand Down Expand Up @@ -280,23 +280,24 @@ public Set<GitHubConfig> getAllGitHubConfig(User user) throws FileNotFoundExcept

private Set<GitHubConfig> getAllGithubConfig(FileEntry gitConfigYaml) {
Set<GitHubConfig> gitHubConfig = new HashSet<>();
// Yaml is not thread safe. so create it every time.
Yaml yaml = new Yaml();
Iterable<Map<String, Object>> gitConfigs = cast(yaml.loadAll(gitConfigYaml.getContent()));
for (Map<String, Object> configMap : gitConfigs) {
if (configMap == null) {
continue;
}
configMap.put("revision", gitConfigYaml.getRevision());
GitHubConfig config = objectMapper.convertValue(configMap, GitHubConfig.class);
try (YamlReader reader = new YamlReader(gitConfigYaml.getContent())) {
Map<String, Object> gitConfigMap = cast(reader.read());
while (gitConfigMap != null) {
gitConfigMap.put("revision", gitConfigYaml.getRevision());
GitHubConfig config = objectMapper.convertValue(gitConfigMap, GitHubConfig.class);

if (gitHubConfig.contains(config)) {
throw new InvalidGitHubConfigurationException("GitHub configuration '"
+ config.getName() + "' is duplicated.\nPlease check your .gitconfig.yml");
}

if (gitHubConfig.contains(config)) {
throw new InvalidGitHubConfigurationException("GitHub configuration '"
+ config.getName() + "' is duplicated.\nPlease check your .gitconfig.yml");
}
gitHubConfig.add(config);

gitHubConfig.add(config);
}
gitConfigMap = cast(reader.read());
}
} catch (IOException e) {
throw new InvalidGitHubConfigurationException("Fail to read GitHub configuration.", e);
}
return gitHubConfig;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.ngrinder.script.service;

import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.ngrinder.AbstractNGrinderTransactionalTest;
import org.ngrinder.common.util.CompressionUtils;
import org.ngrinder.model.User;
import org.ngrinder.script.model.FileEntry;
import org.ngrinder.script.model.GitHubConfig;
import org.ngrinder.script.repository.MockFileEntityRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.IOException;
import java.util.Set;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.is;

public class GitHubFileEntryServiceTest extends AbstractNGrinderTransactionalTest {

private static final String GITHUB_CONFIG_NAME = ".gitconfig.yml";

@Autowired
private GitHubFileEntryService gitHubFileEntryService;

@Autowired
private MockFileEntityRepository mockFileEntityRepository;

@Before
public void before() throws IOException {
File file = new File(System.getProperty("java.io.tmpdir"), "repo");
FileUtils.deleteQuietly(file);
CompressionUtils.unzip(new ClassPathResource("TEST_USER.zip").getFile(), file);
mockFileEntityRepository.setUserRepository(new File(file, getTestUser().getUserId()));
}

@Test
public void getAllGitHubConfig() throws Exception {
User testUser = getTestUser();

FileEntry fileEntry = new FileEntry();
fileEntry.setContent("name: My Github Config\n" +
"owner: naver\n" +
"repo: ngrinder\n" +
"access-token: e1a47e652762b60a...3ddc0713b07g13k\n" +
"---\n" +
"name: Another Config\n" +
"owner: naver\n" +
"repo: pinpoint\n" +
"access-token: t9a47e6ff262b60a...3dac0713b07e82a\n" +
"branch: feature/add-ngrinder-scripts\n" +
"base-url: https://api.mygithub.com\n" +
"script-root: ngrinder-scripts\n"
);
fileEntry.setEncoding("UTF-8");
fileEntry.setPath(GITHUB_CONFIG_NAME);
fileEntry.setDescription("for unit test");
mockFileEntityRepository.save(testUser, fileEntry, fileEntry.getEncoding());

Set<GitHubConfig> gitHubConfigs = gitHubFileEntryService.getAllGitHubConfig(testUser);

assertThat(gitHubConfigs.size(), is(2));
assertThat(
gitHubConfigs,
hasItems(
GitHubConfig.builder()
.name("My Github Config")
.owner("naver")
.repo("ngrinder")
.accessToken("e1a47e652762b60a...3ddc0713b07g13k")
.build(),
GitHubConfig.builder()
.name("Another Config")
.owner("naver")
.repo("pinpoint")
.accessToken("t9a47e6ff262b60a...3dac0713b07e82a")
.branch("feature/add-ngrinder-scripts")
.baseUrl("https://api.mygithub.com")
.scriptRoot("ngrinder-scripts")
.build()
)
);
}
}

0 comments on commit 1a28741

Please sign in to comment.