Skip to content

Commit

Permalink
New Log Type JSON format (#465)
Browse files Browse the repository at this point in the history
* New Log Type JSON format
Signed-off-by: Petar Dzepina <[email protected]>
Co-authored-by: Subhobrata Dey <[email protected]>
(cherry picked from commit faccf6c)
  • Loading branch information
petardz authored and sbcd90 committed Jul 11, 2023
1 parent fa0e18e commit b9f3a1e
Show file tree
Hide file tree
Showing 39 changed files with 2,883 additions and 629 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.opensearch.securityanalytics.correlation.index.mapper.CorrelationVectorFieldMapper;
import org.opensearch.securityanalytics.correlation.index.query.CorrelationQueryBuilder;
import org.opensearch.securityanalytics.indexmanagment.DetectorIndexManagementService;
import org.opensearch.securityanalytics.logtype.LogTypeService;
import org.opensearch.securityanalytics.mapper.IndexTemplateManager;
import org.opensearch.securityanalytics.mapper.MapperService;
import org.opensearch.securityanalytics.resthandler.*;
Expand Down Expand Up @@ -90,6 +91,8 @@ public class SecurityAnalyticsPlugin extends Plugin implements ActionPlugin, Map

private IndexTemplateManager indexTemplateManager;

private LogTypeService logTypeService;

@Override
public Collection<Object> createComponents(Client client,
ClusterService clusterService,
Expand All @@ -102,12 +105,13 @@ public Collection<Object> createComponents(Client client,
NamedWriteableRegistry namedWriteableRegistry,
IndexNameExpressionResolver indexNameExpressionResolver,
Supplier<RepositoriesService> repositoriesServiceSupplier) {
logTypeService = new LogTypeService();

Check warning on line 108 in src/main/java/org/opensearch/securityanalytics/SecurityAnalyticsPlugin.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/SecurityAnalyticsPlugin.java#L108

Added line #L108 was not covered by tests
detectorIndices = new DetectorIndices(client.admin(), clusterService, threadPool);
ruleTopicIndices = new RuleTopicIndices(client, clusterService);
correlationIndices = new CorrelationIndices(client, clusterService);
indexTemplateManager = new IndexTemplateManager(client, clusterService, indexNameExpressionResolver, xContentRegistry);
mapperService = new MapperService(client, clusterService, indexNameExpressionResolver, indexTemplateManager);
ruleIndices = new RuleIndices(client, clusterService, threadPool);
ruleIndices = new RuleIndices(logTypeService, client, clusterService, threadPool);

Check warning on line 114 in src/main/java/org/opensearch/securityanalytics/SecurityAnalyticsPlugin.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/SecurityAnalyticsPlugin.java#L114

Added line #L114 was not covered by tests
correlationRuleIndices = new CorrelationRuleIndices(client, clusterService);

return List.of(detectorIndices, correlationIndices, correlationRuleIndices, ruleTopicIndices, ruleIndices, mapperService, indexTemplateManager);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/
package org.opensearch.securityanalytics.logtype;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.common.settings.SettingsException;
import org.opensearch.common.xcontent.XContentHelper;
import org.opensearch.common.xcontent.json.JsonXContent;
import org.opensearch.securityanalytics.model.LogType;
import org.opensearch.securityanalytics.util.FileUtils;

public class BuiltinLogTypeLoader {

Check warning on line 28 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L28

Added line #L28 was not covered by tests

private static final Logger logger = LogManager.getLogger(BuiltinLogTypeLoader.class);

Check warning on line 30 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L30

Added line #L30 was not covered by tests

private static final String BASE_PATH = "OSMapping/";

private static final String LOG_TYPE_FILE_SUFFIX = "_logtype.json";

private static List<LogType> logTypes;
private static Map<String, LogType> logTypeMap;


static {
ensureLogTypesLoaded();
}

Check warning on line 42 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L41-L42

Added lines #L41 - L42 were not covered by tests

public static List<LogType> getAllLogTypes() {
ensureLogTypesLoaded();
return logTypes;

Check warning on line 46 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L45-L46

Added lines #L45 - L46 were not covered by tests
}

public static LogType getLogTypeByName(String logTypeName) {
ensureLogTypesLoaded();
return logTypeMap.get(logTypeName);

Check warning on line 51 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L50-L51

Added lines #L50 - L51 were not covered by tests
}

public static boolean logTypeExists(String logTypeName) {
ensureLogTypesLoaded();
return logTypeMap.containsKey(logTypeName);

Check warning on line 56 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L55-L56

Added lines #L55 - L56 were not covered by tests
}

private static void ensureLogTypesLoaded() {
try {
if (logTypes != null) {
return;

Check warning on line 62 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L62

Added line #L62 was not covered by tests
}
logTypes = loadBuiltinLogTypes();
logTypeMap = logTypes.stream()
.collect(Collectors.toMap(LogType::getName, Function.identity()));
} catch (Exception e) {
logger.error("Failed loading builtin log types from disk!", e);
}
}

Check warning on line 70 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L64-L70

Added lines #L64 - L70 were not covered by tests

private static List<LogType> loadBuiltinLogTypes() throws URISyntaxException, IOException {
List<LogType> logTypes = new ArrayList<>();

Check warning on line 73 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L73

Added line #L73 was not covered by tests

final String url = Objects.requireNonNull(BuiltinLogTypeLoader.class.getClassLoader().getResource(BASE_PATH)).toURI().toString();

Check warning on line 75 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L75

Added line #L75 was not covered by tests

Path dirPath = null;

Check warning on line 77 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L77

Added line #L77 was not covered by tests
if (url.contains("!")) {
final String[] paths = url.split("!");
dirPath = FileUtils.getFs().getPath(paths[1]);
} else {
dirPath = Path.of(url);

Check warning on line 82 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L79-L82

Added lines #L79 - L82 were not covered by tests
}

Stream<Path> folder = Files.list(dirPath);
List<Path> logTypePaths = folder.filter(e -> e.toString().endsWith(LOG_TYPE_FILE_SUFFIX)).collect(Collectors.toList());

Check warning on line 86 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L85-L86

Added lines #L85 - L86 were not covered by tests

for (Path logTypePath : logTypePaths) {
try (
InputStream is = BuiltinLogTypeLoader.class.getResourceAsStream(logTypePath.toString())

Check warning on line 90 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L90

Added line #L90 was not covered by tests
) {
String logTypeFilePayload = new String(Objects.requireNonNull(is).readAllBytes(), StandardCharsets.UTF_8);

Check warning on line 92 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L92

Added line #L92 was not covered by tests

if (logTypeFilePayload != null) {
Map<String, Object> logTypeFileAsMap =
XContentHelper.convertToMap(JsonXContent.jsonXContent, logTypeFilePayload, false);

Check warning on line 96 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L95-L96

Added lines #L95 - L96 were not covered by tests

logTypes.add(new LogType(logTypeFileAsMap));

Check warning on line 98 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L98

Added line #L98 was not covered by tests

logger.info("Loaded [{}] log type", logTypePath.getFileName());

Check warning on line 100 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L100

Added line #L100 was not covered by tests
}
} catch (Exception e) {
throw new SettingsException("Failed to load builtin log types", e);
}
}

Check warning on line 105 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L102-L105

Added lines #L102 - L105 were not covered by tests

return logTypes;

Check warning on line 107 in src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/BuiltinLogTypeLoader.java#L107

Added line #L107 was not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/
package org.opensearch.securityanalytics.logtype;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.securityanalytics.model.LogType;
import org.opensearch.securityanalytics.util.SecurityAnalyticsException;


/**
*
* */
public class LogTypeService {

private static final Logger logger = LogManager.getLogger(LogTypeService.class);

Check warning on line 22 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L22

Added line #L22 was not covered by tests

private BuiltinLogTypeLoader builtinLogTypeLoader;

public LogTypeService() {
this.builtinLogTypeLoader = new BuiltinLogTypeLoader();
}

Check warning on line 28 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L26-L28

Added lines #L26 - L28 were not covered by tests


public List<LogType> getAllLogTypes() {
return BuiltinLogTypeLoader.getAllLogTypes();

Check warning on line 32 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L32

Added line #L32 was not covered by tests
}

public LogType getLogTypeByName(String logType) {
return BuiltinLogTypeLoader.getLogTypeByName(logType);

Check warning on line 36 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L36

Added line #L36 was not covered by tests
}

/**
* Returns sigmaRule rawField to ECS field mapping
*
* @param logType Log type
* @return Map of rawField to ecs field
*/
public Map<String, String> getRuleFieldMappings(String logType) {
LogType lt = getLogTypeByName(logType);

Check warning on line 46 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L46

Added line #L46 was not covered by tests

if (lt == null) {
throw SecurityAnalyticsException.wrap(new IllegalArgumentException("Can't get rule field mappings for invalid logType: [" + logType + "]"));

Check warning on line 49 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L49

Added line #L49 was not covered by tests
}
if (lt.getMappings() == null) {
return Map.of();

Check warning on line 52 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L52

Added line #L52 was not covered by tests
} else {
return lt.getMappings()
.stream()
.collect(Collectors.toMap(LogType.Mapping::getRawField, LogType.Mapping::getEcs));

Check warning on line 56 in src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/logtype/LogTypeService.java#L54-L56

Added lines #L54 - L56 were not covered by tests
}
}
}
137 changes: 137 additions & 0 deletions src/main/java/org/opensearch/securityanalytics/model/LogType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/
package org.opensearch.securityanalytics.model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.opensearch.common.io.stream.StreamInput;
import org.opensearch.common.io.stream.StreamOutput;
import org.opensearch.common.io.stream.Writeable;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;

public class LogType implements Writeable {

private static final String ID = "id";
private static final String NAME = "name";
private static final String DESCRIPTION = "description";
private static final String IS_BUILTIN = "is_builtin";
private static final String MAPPINGS = "mappings";
private static final String RAW_FIELD = "raw_field";
private static final String ECS = "ecs";
private static final String OCSF = "ocsf";

private String id;
private String name;
private String description;
private Boolean isBuiltIn;
private List<Mapping> mappings;

public LogType(StreamInput sin) throws IOException {
this.id = sin.readString();
this.isBuiltIn = sin.readOptionalBoolean();
this.name = sin.readString();
this.description = sin.readString();
this.mappings = sin.readList(Mapping::readFrom);
}

public LogType(String id, String name, String description, boolean isBuiltIn, List<Mapping> mappings) {
this.id = id;
this.name = name;
this.description = description;
this.isBuiltIn = isBuiltIn;
this.mappings = mappings == null ? List.of() : mappings;
}

public LogType(Map<String, Object> logTypeAsMap) {
this.id = (String) logTypeAsMap.get(ID);
this.name = (String) logTypeAsMap.get(NAME);
this.description = (String) logTypeAsMap.get(DESCRIPTION);

Check warning on line 54 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L51-L54

Added lines #L51 - L54 were not covered by tests
if (logTypeAsMap.containsKey(IS_BUILTIN)) {
this.isBuiltIn = (Boolean) logTypeAsMap.get(IS_BUILTIN);

Check warning on line 56 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L56

Added line #L56 was not covered by tests
}
List<Map<String, String>> mappings = (List<Map<String, String>>)logTypeAsMap.get(MAPPINGS);

Check warning on line 58 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L58

Added line #L58 was not covered by tests
if (mappings.size() > 0) {
this.mappings = new ArrayList<>(mappings.size());
this.mappings = mappings.stream().map(e ->
new Mapping(e.get(RAW_FIELD), e.get(ECS), e.get(OCSF))
).collect(Collectors.toList());

Check warning on line 63 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L60-L63

Added lines #L60 - L63 were not covered by tests
}
}

Check warning on line 65 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L65

Added line #L65 was not covered by tests

public String getName() {
return name;
}

public String getDescription() {
return description;
}

public boolean getIsBuiltIn() { return isBuiltIn; }

public List<Mapping> getMappings() {
return mappings;
}

@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeString(id);
out.writeOptionalBoolean(isBuiltIn);
out.writeString(name);
out.writeString(description);
out.writeCollection(mappings);
}

@Override
public String toString() {
return name;

Check warning on line 92 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L92

Added line #L92 was not covered by tests
}

public static class Mapping implements Writeable {

private String rawField;
private String ecs;
private String ocsf;

public Mapping(StreamInput sin) throws IOException {
this.rawField = sin.readString();
this.ecs = sin.readOptionalString();
this.ocsf = sin.readOptionalString();
}

public Mapping(String rawField, String ecs, String ocsf) {
this.rawField = rawField;
this.ecs = ecs;
this.ocsf = ocsf;
}

public String getRawField() {
return rawField;
}

public String getEcs() {
return ecs;

Check warning on line 118 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L118

Added line #L118 was not covered by tests
}

public String getOcsf() {
return ocsf;

Check warning on line 122 in src/main/java/org/opensearch/securityanalytics/model/LogType.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearch/securityanalytics/model/LogType.java#L122

Added line #L122 was not covered by tests
}

@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeString(rawField);
out.writeOptionalString(ecs);
out.writeOptionalString(ocsf);
}

public static Mapping readFrom(StreamInput sin) throws IOException {
return new Mapping(sin);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ public class OSQueryBackend extends QueryBackend {

private static final List<Class<?>> precedence = Arrays.asList(ConditionNOT.class, ConditionAND.class, ConditionOR.class);

public OSQueryBackend(String ruleCategory, boolean collectErrors, boolean enableFieldMappings) throws IOException {
super(ruleCategory, true, enableFieldMappings, true, collectErrors);
public OSQueryBackend(Map<String, String> fieldMappings, boolean collectErrors, boolean enableFieldMappings) throws IOException {
super(fieldMappings, true, enableFieldMappings, true, collectErrors);
this.tokenSeparator = " ";
this.orToken = "OR";
this.andToken = "AND";
Expand Down Expand Up @@ -445,11 +445,7 @@ private String getMappedField(String field) {
}

private String getFinalField(String field) {
field = this.getMappedField(field);
if (field.contains(".")) {
field = field.replace(".", "_");
}
return field;
return this.getMappedField(field);
}

private String getFinalValueField() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public abstract class QueryBackend {
protected Map<String, Object> ruleQueryFields;

@SuppressWarnings("unchecked")
public QueryBackend(String ruleCategory, boolean convertAndAsIn, boolean enableFieldMappings, boolean convertOrAsIn, boolean collectErrors) throws IOException {
public QueryBackend(Map<String, String> fieldMappings, boolean convertAndAsIn, boolean enableFieldMappings, boolean convertOrAsIn, boolean collectErrors) {
this.convertAndAsIn = convertAndAsIn;
this.convertOrAsIn = convertOrAsIn;
this.collectErrors = collectErrors;
Expand All @@ -68,15 +68,7 @@ public QueryBackend(String ruleCategory, boolean convertAndAsIn, boolean enableF
this.queryFields = new HashMap<>();

if (this.enableFieldMappings) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(String.format(Locale.getDefault(), "OSMapping/%s/fieldmappings.yml", ruleCategory));
assert is != null;
String content = new String(is.readAllBytes(), Charset.defaultCharset());

Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
Map<String, Object> fieldMappingsObj = yaml.load(content);
this.fieldMappings = (Map<String, String>) fieldMappingsObj.get("fieldmappings");

is.close();
this.fieldMappings = fieldMappings;
} else {
this.fieldMappings = new HashMap<>();
}
Expand Down
Loading

0 comments on commit b9f3a1e

Please sign in to comment.