diff --git a/graylog2-server/src/main/java/org/graylog2/bindings/ServerBindings.java b/graylog2-server/src/main/java/org/graylog2/bindings/ServerBindings.java index ed9056d554d0..034085aaf663 100644 --- a/graylog2-server/src/main/java/org/graylog2/bindings/ServerBindings.java +++ b/graylog2-server/src/main/java/org/graylog2/bindings/ServerBindings.java @@ -62,7 +62,7 @@ import org.graylog2.plugin.BaseConfiguration; import org.graylog2.plugin.RulesEngine; import org.graylog2.plugin.cluster.ClusterConfigService; -import org.graylog2.plugin.decorators.MessageDecorator; +import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.plugin.inject.Graylog2Module; import org.graylog2.rest.NotFoundExceptionMapper; import org.graylog2.rest.ScrollChunkWriter; @@ -115,7 +115,7 @@ protected void configure() { bindAdditionalJerseyComponents(); bindEventBusListeners(); install(new AuthenticatingRealmModule()); - bindMessageDecorators(); + bindSearchResponseDecorators(); } private void bindProviders() { @@ -208,8 +208,8 @@ private void bindEventBusListeners() { bind(ClusterDebugEventListener.class).asEagerSingleton(); } - private void bindMessageDecorators() { + private void bindSearchResponseDecorators() { // only triggering an initialize to make sure that the binding exists - final MapBinder messageDecoratorBinder = messageDecoratorBinder(); + final MapBinder searchResponseDecoratorBinder = searchResponseDecoratorBinder(); } } diff --git a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorBindings.java b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorBindings.java index 1a8f44088583..97c91bb1af18 100644 --- a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorBindings.java +++ b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorBindings.java @@ -17,15 +17,12 @@ package org.graylog2.decorators; import com.google.inject.multibindings.Multibinder; -import org.graylog2.plugin.decorators.MessageDecorator; import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.plugin.inject.Graylog2Module; public class DecoratorBindings extends Graylog2Module { @Override protected void configure() { - Multibinder messageDecoratorMultibinder = Multibinder.newSetBinder(binder(), MessageDecorator.class); - Multibinder searchResponseDecoratorMultibinder = Multibinder.newSetBinder(binder(), SearchResponseDecorator.class); } } diff --git a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessor.java b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessor.java index 8e5e58f15393..061c80b4a427 100644 --- a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessor.java +++ b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessor.java @@ -17,14 +17,11 @@ package org.graylog2.decorators; import com.google.inject.ImplementedBy; -import org.graylog2.indexer.results.ResultMessage; import org.graylog2.rest.resources.search.responses.SearchResponse; -import java.util.List; import java.util.Optional; @ImplementedBy(DecoratorProcessorImpl.class) public interface DecoratorProcessor { - List decorate(List messages, Optional stream); SearchResponse decorate(SearchResponse searchResponse, Optional stream); } diff --git a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessorImpl.java b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessorImpl.java index dd5caf56978e..aca8b56f873e 100644 --- a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessorImpl.java +++ b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorProcessorImpl.java @@ -16,8 +16,6 @@ */ package org.graylog2.decorators; -import org.graylog2.indexer.results.ResultMessage; -import org.graylog2.plugin.decorators.MessageDecorator; import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.rest.resources.search.responses.SearchResponse; @@ -33,18 +31,6 @@ public DecoratorProcessorImpl(DecoratorResolver decoratorResolver) { this.decoratorResolver = decoratorResolver; } - @Override - public List decorate(List messages, Optional streamId) { - final List messageDecorators = streamId.isPresent() ? - decoratorResolver.messageDecoratorsForStream(streamId.get()) : decoratorResolver.messageDecoratorsForGlobal(); - final Optional metaDecorator = messageDecorators.stream() - .reduce((f, g) -> (v) -> f.apply(g.apply(v))); - if (metaDecorator.isPresent()) { - return metaDecorator.get().apply(messages); - } - return messages; - } - @Override public SearchResponse decorate(SearchResponse searchResponse, Optional streamId) { final List searchResponseDecorators = streamId.isPresent() ? diff --git a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorResolver.java b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorResolver.java index 05857751dfad..a3349e12ecf3 100644 --- a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorResolver.java +++ b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorResolver.java @@ -17,7 +17,6 @@ package org.graylog2.decorators; import com.google.inject.Singleton; -import org.graylog2.plugin.decorators.MessageDecorator; import org.graylog2.plugin.decorators.SearchResponseDecorator; import javax.annotation.Nullable; @@ -25,56 +24,37 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; @Singleton public class DecoratorResolver { private final DecoratorService decoratorService; - private final Map messageDecoratorMap; - private final Map searchResponseDecoratorsMap; + private final Map searchResponseDecoratorsMap; @Inject public DecoratorResolver(DecoratorService decoratorService, - Map messageDecorators, - Set searchResponseDecorators) { + Map searchResponseDecorators) { this.decoratorService = decoratorService; - this.messageDecoratorMap = messageDecorators; - this.searchResponseDecoratorsMap = searchResponseDecorators.stream().collect(Collectors.toMap((decorator) -> decorator.getClass().toString(), Function.identity())); - } - - public List messageDecoratorsForStream(String streamId) { - return this.decoratorService.findForStream(streamId).stream() - .map(this::instantiateMessageDecorator) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - public List messageDecoratorsForGlobal() { - return this.decoratorService.findForGlobal().stream() - .map(this::instantiateMessageDecorator) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + this.searchResponseDecoratorsMap = searchResponseDecorators; } public List searchResponseDecoratorsForStream(String streamId) { return this.decoratorService.findForStream(streamId).stream() - .map(decorator -> this.searchResponseDecoratorsMap.get(decorator.type())) + .map(this::instantiateSearchResponseDecorator) .filter(Objects::nonNull) .collect(Collectors.toList()); } public List searchResponseDecoratorsForGlobal() { return this.decoratorService.findForGlobal().stream() - .map(decorator -> this.searchResponseDecoratorsMap.get(decorator.type())) + .map(this::instantiateSearchResponseDecorator) .filter(Objects::nonNull) .collect(Collectors.toList()); } @Nullable - private MessageDecorator instantiateMessageDecorator(Decorator decorator) { - final MessageDecorator.Factory factory = this.messageDecoratorMap.get(decorator.type()); + private SearchResponseDecorator instantiateSearchResponseDecorator(Decorator decorator) { + final SearchResponseDecorator.Factory factory = this.searchResponseDecoratorsMap.get(decorator.type()); if (factory != null) { return factory.create(decorator); } diff --git a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorTypeInfo.java b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorTypeInfo.java index b6d4e302e2a3..f688c9b3ef0b 100644 --- a/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorTypeInfo.java +++ b/graylog2-server/src/main/java/org/graylog2/decorators/DecoratorTypeInfo.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.auto.value.AutoValue; import org.graylog2.plugin.configuration.ConfigurationRequest; -import org.graylog2.plugin.decorators.MessageDecorator; +import org.graylog2.plugin.decorators.SearchResponseDecorator; @AutoValue @JsonAutoDetect @@ -52,7 +52,7 @@ public static DecoratorTypeInfo create(@JsonProperty(FIELD_TYPE) String type, return new AutoValue_DecoratorTypeInfo(type, name, humanName, requestedConfiguration, linkToDocs); } - public static DecoratorTypeInfo create(String type, MessageDecorator.Descriptor descriptor, ConfigurationRequest requestedConfiguration) { + public static DecoratorTypeInfo create(String type, SearchResponseDecorator.Descriptor descriptor, ConfigurationRequest requestedConfiguration) { return create(type, descriptor.getName(), descriptor.getHumanName(), requestedConfiguration, descriptor.getLinkToDocs()); } } diff --git a/graylog2-server/src/main/java/org/graylog2/plugin/decorators/AbstractMessageDecorator.java b/graylog2-server/src/main/java/org/graylog2/plugin/decorators/AbstractMessageDecorator.java new file mode 100644 index 000000000000..a0eb42a207ea --- /dev/null +++ b/graylog2-server/src/main/java/org/graylog2/plugin/decorators/AbstractMessageDecorator.java @@ -0,0 +1,40 @@ +/** + * This file is part of Graylog. + * + * Graylog is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Graylog 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Graylog. If not, see . + */ +package org.graylog2.plugin.decorators; + +import org.graylog2.plugin.Message; +import org.graylog2.rest.models.messages.responses.ResultMessageSummary; +import org.graylog2.rest.resources.search.responses.SearchResponse; + +import java.util.List; +import java.util.stream.Collectors; + +public abstract class AbstractMessageDecorator implements SearchResponseDecorator { + abstract Message decorate(Message message); + + @Override + public SearchResponse apply(SearchResponse searchResponse) { + final List results = searchResponse.messages().stream() + .map(resultMessageSummary -> { + final Message decoratedMessage = decorate(new Message(resultMessageSummary.message())); + return ResultMessageSummary.create(resultMessageSummary.highlightRanges(), decoratedMessage.getFields(), resultMessageSummary.index()); + }) + .collect(Collectors.toList()); + + return searchResponse.toBuilder().messages(results).build(); + } +} diff --git a/graylog2-server/src/main/java/org/graylog2/plugin/decorators/MessageDecorator.java b/graylog2-server/src/main/java/org/graylog2/plugin/decorators/MessageDecorator.java deleted file mode 100644 index e13eda07b4cd..000000000000 --- a/graylog2-server/src/main/java/org/graylog2/plugin/decorators/MessageDecorator.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file is part of Graylog. - * - * Graylog is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Graylog 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 - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Graylog. If not, see . - */ -package org.graylog2.plugin.decorators; - -import org.graylog2.decorators.Decorator; -import org.graylog2.indexer.results.ResultMessage; -import org.graylog2.plugin.AbstractDescriptor; -import org.graylog2.plugin.Message; -import org.graylog2.plugin.configuration.ConfigurationRequest; - -import java.util.List; -import java.util.function.Function; - -@FunctionalInterface -public interface MessageDecorator extends Function, List> { - interface Factory { - MessageDecorator create(Decorator decorator); - Config getConfig(); - Descriptor getDescriptor(); - } - - interface Config { - ConfigurationRequest getRequestedConfiguration(); - } - - abstract class Descriptor extends AbstractDescriptor { - private final String humanName; - - protected Descriptor() { - throw new IllegalStateException("This class should not be instantiated directly, this is a bug."); - } - - public Descriptor(String name, boolean exclusive, String linkToDocs, String humanName) { - super(name, exclusive, linkToDocs); - this.humanName = humanName; - } - - public String getHumanName() { - return humanName; - } - } -} diff --git a/graylog2-server/src/main/java/org/graylog2/plugin/decorators/SearchResponseDecorator.java b/graylog2-server/src/main/java/org/graylog2/plugin/decorators/SearchResponseDecorator.java index 51e6902335fe..3a3cf18ffd17 100644 --- a/graylog2-server/src/main/java/org/graylog2/plugin/decorators/SearchResponseDecorator.java +++ b/graylog2-server/src/main/java/org/graylog2/plugin/decorators/SearchResponseDecorator.java @@ -16,10 +16,39 @@ */ package org.graylog2.plugin.decorators; +import org.graylog2.decorators.Decorator; +import org.graylog2.plugin.AbstractDescriptor; +import org.graylog2.plugin.configuration.ConfigurationRequest; import org.graylog2.rest.resources.search.responses.SearchResponse; import java.util.function.Function; @FunctionalInterface public interface SearchResponseDecorator extends Function { + interface Factory { + SearchResponseDecorator create(Decorator decorator); + Config getConfig(); + Descriptor getDescriptor(); + } + + interface Config { + ConfigurationRequest getRequestedConfiguration(); + } + + abstract class Descriptor extends AbstractDescriptor { + private final String humanName; + + protected Descriptor() { + throw new IllegalStateException("This class should not be instantiated directly, this is a bug."); + } + + public Descriptor(String name, boolean exclusive, String linkToDocs, String humanName) { + super(name, exclusive, linkToDocs); + this.humanName = humanName; + } + + public String getHumanName() { + return humanName; + } + } } diff --git a/graylog2-server/src/main/java/org/graylog2/plugin/inject/Graylog2Module.java b/graylog2-server/src/main/java/org/graylog2/plugin/inject/Graylog2Module.java index 81273b28f3c5..3ab5168f4e8c 100644 --- a/graylog2-server/src/main/java/org/graylog2/plugin/inject/Graylog2Module.java +++ b/graylog2-server/src/main/java/org/graylog2/plugin/inject/Graylog2Module.java @@ -26,7 +26,7 @@ import com.google.inject.name.Names; import org.apache.shiro.realm.AuthenticatingRealm; import org.graylog2.plugin.dashboards.widgets.WidgetStrategy; -import org.graylog2.plugin.decorators.MessageDecorator; +import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.plugin.indexer.retention.RetentionStrategy; import org.graylog2.plugin.indexer.rotation.RotationStrategy; import org.graylog2.plugin.inputs.MessageInput; @@ -309,20 +309,19 @@ protected MapBinder passwordAlgorithmBinder() { return MapBinder.newMapBinder(binder(), String.class, PasswordAlgorithm.class); } - protected MapBinder authenticationRealmBinder() { return MapBinder.newMapBinder(binder(), String.class, AuthenticatingRealm.class); } - protected MapBinder messageDecoratorBinder() { - return MapBinder.newMapBinder(binder(), String.class, MessageDecorator.Factory.class); + protected MapBinder searchResponseDecoratorBinder() { + return MapBinder.newMapBinder(binder(), String.class, SearchResponseDecorator.Factory.class); } - protected void installMessageDecorator(MapBinder messageDecoratorBinder, - Class messageDecoratorClass, - Class messageDecoratorFactoryClass) { - install(new FactoryModuleBuilder().implement(MessageDecorator.class, messageDecoratorClass).build(messageDecoratorFactoryClass)); - messageDecoratorBinder.addBinding(messageDecoratorClass.getCanonicalName()).to(messageDecoratorFactoryClass); + protected void installSearchResponseDecorator(MapBinder searchResponseDecoratorBinder, + Class searchResponseDecoratorClass, + Class searchResponseDecoratorFactoryClass) { + install(new FactoryModuleBuilder().implement(SearchResponseDecorator.class, searchResponseDecoratorClass).build(searchResponseDecoratorFactoryClass)); + searchResponseDecoratorBinder.addBinding(searchResponseDecoratorClass.getCanonicalName()).to(searchResponseDecoratorFactoryClass); } private static class DynamicFeatureType extends TypeLiteral> {} diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/DecoratorResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/DecoratorResource.java index 82ccdc4e9f48..e3ae636e4587 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/DecoratorResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/DecoratorResource.java @@ -21,14 +21,12 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.apache.shiro.authz.annotation.RequiresAuthentication; -import org.apache.shiro.authz.annotation.RequiresPermissions; import org.graylog2.database.NotFoundException; import org.graylog2.decorators.Decorator; import org.graylog2.decorators.DecoratorImpl; import org.graylog2.decorators.DecoratorService; import org.graylog2.decorators.DecoratorTypeInfo; -import org.graylog2.plugin.configuration.ConfigurationRequest; -import org.graylog2.plugin.decorators.MessageDecorator; +import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.shared.rest.resources.RestResource; import org.graylog2.shared.security.RestPermissions; @@ -53,13 +51,13 @@ @Consumes(MediaType.APPLICATION_JSON) public class DecoratorResource extends RestResource { private final DecoratorService decoratorService; - private final Map messageDecorators; + private final Map searchResponseDecorators; @Inject public DecoratorResource(DecoratorService decoratorService, - Map messageDecorators) { + Map searchResponseDecorators) { this.decoratorService = decoratorService; - this.messageDecorators = messageDecorators; + this.searchResponseDecorators = searchResponseDecorators; } @GET @@ -77,7 +75,7 @@ public List get() { @ApiOperation(value = "Returns all available message decorations", notes = "") public Map getAvailable() { - return this.messageDecorators.entrySet().stream() + return this.searchResponseDecorators.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> DecoratorTypeInfo.create( entry.getKey(), diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/RelativeSearchResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/RelativeSearchResource.java index 2c81b2db168b..498b5874cbea 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/RelativeSearchResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/RelativeSearchResource.java @@ -31,8 +31,6 @@ import org.graylog2.indexer.searches.SearchesConfig; import org.graylog2.indexer.searches.Sorting; import org.graylog2.plugin.cluster.ClusterConfigService; -import org.graylog2.plugin.decorators.MessageDecorator; -import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.plugin.indexer.searches.timeranges.InvalidRangeParametersException; import org.graylog2.plugin.indexer.searches.timeranges.RelativeRange; import org.graylog2.plugin.indexer.searches.timeranges.TimeRange; @@ -59,7 +57,6 @@ import java.util.List; import java.util.Locale; import java.util.Optional; -import java.util.Set; @RequiresAuthentication @Api(value = "Search/Relative", description = "Message search") diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SavedSearchesResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SavedSearchesResource.java index db1ed8bf5a95..f88e7750b202 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SavedSearchesResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SavedSearchesResource.java @@ -32,8 +32,6 @@ import org.graylog2.plugin.Tools; import org.graylog2.plugin.cluster.ClusterConfigService; import org.graylog2.plugin.database.ValidationException; -import org.graylog2.plugin.decorators.MessageDecorator; -import org.graylog2.plugin.decorators.SearchResponseDecorator; import org.graylog2.rest.resources.search.requests.CreateSavedSearchRequest; import org.graylog2.savedsearches.SavedSearch; import org.graylog2.savedsearches.SavedSearchService; @@ -55,7 +53,6 @@ import java.net.URI; import java.util.List; import java.util.Map; -import java.util.Set; @RequiresAuthentication @Api(value = "Search/Saved", description = "Saved searches") diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SearchResource.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SearchResource.java index 4ccc5ae3c9ed..08287a8c3ba8 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SearchResource.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/SearchResource.java @@ -35,7 +35,6 @@ import org.graylog2.indexer.searches.Searches; import org.graylog2.indexer.searches.SearchesClusterConfig; import org.graylog2.indexer.searches.Sorting; -import org.graylog2.plugin.Message; import org.graylog2.plugin.cluster.ClusterConfigService; import org.graylog2.plugin.indexer.searches.timeranges.AbsoluteRange; import org.graylog2.rest.models.messages.responses.ResultMessageSummary; @@ -61,7 +60,6 @@ import javax.ws.rs.core.Response; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Optional; @@ -173,11 +171,10 @@ protected SearchResponse buildSearchResponse(SearchResult sr, org.graylog2.plugin.indexer.searches.timeranges.TimeRange timeRange, boolean decorate, Optional streamId) { - final List resultMessages = decorate ? decoratorProcessor.decorate(sr.getResults(), streamId) : sr.getResults(); final SearchResponse result = SearchResponse.create(sr.getOriginalQuery(), sr.getBuiltQuery(), indexRangeListToValueList(sr.getUsedIndices()), - resultMessageListtoValueList(resultMessages), + resultMessageListtoValueList(sr.getResults()), sr.getFields(), sr.took().millis(), sr.getTotalResults(), diff --git a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/responses/SearchResponse.java b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/responses/SearchResponse.java index 4689ff3e30bb..11d3f3e2c08f 100644 --- a/graylog2-server/src/main/java/org/graylog2/rest/resources/search/responses/SearchResponse.java +++ b/graylog2-server/src/main/java/org/graylog2/rest/resources/search/responses/SearchResponse.java @@ -56,6 +56,12 @@ public abstract class SearchResponse { @JsonProperty public abstract DateTime to(); + public abstract Builder toBuilder(); + + public static Builder builder() { + return new AutoValue_SearchResponse.Builder(); + } + public static SearchResponse create(String query, String builtQuery, Set usedIndices, @@ -65,7 +71,30 @@ public static SearchResponse create(String query, long totalResults, DateTime from, DateTime to) { - return new AutoValue_SearchResponse(query, builtQuery, usedIndices, messages, - fields, time, totalResults, from, to); + return builder() + .query(query) + .builtQuery(builtQuery) + .usedIndices(usedIndices) + .messages(messages) + .fields(fields) + .time(time) + .totalResults(totalResults) + .from(from) + .to(to) + .build(); + } + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder query(String query); + public abstract Builder builtQuery(String builtQuery); + public abstract Builder usedIndices(Set usedIndices); + public abstract Builder messages(List messages); + public abstract Builder fields(Set fields); + public abstract Builder time(long time); + public abstract Builder totalResults(long totalResults); + public abstract Builder from(DateTime from); + public abstract Builder to(DateTime to); + public abstract SearchResponse build(); } } diff --git a/graylog2-web-interface/src/pages/SearchPage.jsx b/graylog2-web-interface/src/pages/SearchPage.jsx index 280f5373c273..2f99d15a8f55 100644 --- a/graylog2-web-interface/src/pages/SearchPage.jsx +++ b/graylog2-web-interface/src/pages/SearchPage.jsx @@ -12,10 +12,12 @@ const RefreshStore = StoreProvider.getStore('Refresh'); const StreamsStore = StoreProvider.getStore('Streams'); const UniversalSearchStore = StoreProvider.getStore('UniversalSearch'); const SearchStore = StoreProvider.getStore('Search'); +const DecoratorsStore = StoreProvider.getStore('Decorators'); import ActionsProvider from 'injection/ActionsProvider'; const NodesActions = ActionsProvider.getActions('Nodes'); const InputsActions = ActionsProvider.getActions('Inputs'); +const DecoratorsActions = ActionsProvider.getActions('Decorators'); import { Spinner } from 'components/common'; import { MalformedSearchQuery, SearchResult } from 'components/search'; @@ -40,6 +42,7 @@ const SearchPage = React.createClass({ }; }, componentDidMount() { + [DecoratorsActions.create.completed, DecoratorsActions.remove.completed, DecoratorsActions.update.completed].forEach((action) => action.listen(this._refreshData)); this._refreshData(); InputsActions.list.triggerPromise();