org.graylog.scheduler.DBJobDefinitionService Maven / Gradle / Ivy
/*
* Copyright (C) 2020 Graylog, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Server Side Public License, version 1,
* as published by MongoDB, Inc.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Server Side Public License for more details.
*
* You should have received a copy of the Server Side Public License
* along with this program. If not, see
* .
*/
package org.graylog.scheduler;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import one.util.streamex.StreamEx;
import org.graylog2.bindings.providers.MongoJackObjectMapperProvider;
import org.graylog2.database.MongoConnection;
import org.graylog2.database.PaginatedDbService;
import org.graylog2.database.PaginatedList;
import org.mongojack.DBQuery;
import org.mongojack.DBSort;
import javax.inject.Inject;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
public class DBJobDefinitionService extends PaginatedDbService {
private static final String COLLECTION_NAME = "scheduler_job_definitions";
private final ObjectMapper objectMapper;
@Inject
public DBJobDefinitionService(MongoConnection mongoConnection, MongoJackObjectMapperProvider mapper) {
super(mongoConnection, mapper, JobDefinitionDto.class, COLLECTION_NAME);
this.objectMapper = mapper.get();
}
public PaginatedList getAllPaginated(String sortByField, int page, int perPage) {
return findPaginatedWithQueryAndSort(DBQuery.empty(), DBSort.asc(sortByField), page, perPage);
}
/**
* Returns the job definition that has the given config field value.
*
* @param configField the config field
* @param value the value of the config field
* @return the job definition with the given config field, or an empty optional
*/
public Optional getByConfigField(String configField, Object value) {
final String field = String.format(Locale.US, "%s.%s", JobDefinitionDto.FIELD_CONFIG, configField);
return Optional.ofNullable(db.findOne(DBQuery.is(field, value)));
}
/**
* Returns all job definitions that have the given config field values, grouped by config field value.
*
* @param configField the config field
* @param values the values of the config field
* @return the job definitions grouped by the given values
*/
public Map> getAllByConfigField(String configField, Collection extends Object> values) {
final String field = String.format(Locale.US, "%s.%s", JobDefinitionDto.FIELD_CONFIG, configField);
return StreamEx.of(db.find(DBQuery.in(field, values))).groupingBy(configFieldGroup(configField));
}
private Function configFieldGroup(final String key) {
// Since JobDefinitionDto#config() is a pluggable interface type and we don't have methods we can access,
// convert the value to a JsonNode and access the group key with that.
return jobDefinition -> objectMapper.convertValue(jobDefinition.config(), JsonNode.class).path(key).asText();
}
}