From ff8dc2673f74b85ea7ea55a7ea9900b29fc9fb25 Mon Sep 17 00:00:00 2001 From: kimchy Date: Tue, 29 Mar 2011 13:50:25 +0200 Subject: [PATCH] Get Settings API: Allow to retrieve (just) a specific index / indices settings, closes #810. --- .../rest/action/RestActionModule.java | 8 +- .../settings/RestGetSettingsAction.java | 100 ++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/settings/RestGetSettingsAction.java diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/RestActionModule.java b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/RestActionModule.java index 1eb5335663e..b1193a21727 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/RestActionModule.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/RestActionModule.java @@ -45,6 +45,7 @@ import org.elasticsearch.rest.action.admin.indices.mapping.put.RestPutMappingAct import org.elasticsearch.rest.action.admin.indices.open.RestOpenIndexAction; import org.elasticsearch.rest.action.admin.indices.optimize.RestOptimizeAction; import org.elasticsearch.rest.action.admin.indices.refresh.RestRefreshAction; +import org.elasticsearch.rest.action.admin.indices.settings.RestGetSettingsAction; import org.elasticsearch.rest.action.admin.indices.settings.RestUpdateSettingsAction; import org.elasticsearch.rest.action.admin.indices.status.RestIndicesStatusAction; import org.elasticsearch.rest.action.admin.indices.template.delete.RestDeleteIndexTemplateAction; @@ -70,8 +71,8 @@ import java.util.List; public class RestActionModule extends AbstractModule { private List> restPluginsActions = Lists.newArrayList(); - public RestActionModule(List> restPluginsActions){ - this.restPluginsActions=restPluginsActions; + public RestActionModule(List> restPluginsActions) { + this.restPluginsActions = restPluginsActions; } @Override protected void configure() { @@ -98,7 +99,10 @@ public class RestActionModule extends AbstractModule { bind(RestDeleteIndexAction.class).asEagerSingleton(); bind(RestCloseIndexAction.class).asEagerSingleton(); bind(RestOpenIndexAction.class).asEagerSingleton(); + bind(RestUpdateSettingsAction.class).asEagerSingleton(); + bind(RestGetSettingsAction.class).asEagerSingleton(); + bind(RestAnalyzeAction.class).asEagerSingleton(); bind(RestGetIndexTemplateAction.class).asEagerSingleton(); bind(RestPutIndexTemplateAction.class).asEagerSingleton(); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/settings/RestGetSettingsAction.java b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/settings/RestGetSettingsAction.java new file mode 100644 index 00000000000..54b0e520a2a --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/rest/action/admin/indices/settings/RestGetSettingsAction.java @@ -0,0 +1,100 @@ +/* + * Licensed to Elastic Search and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Elastic Search licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.rest.action.admin.indices.settings; + +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest; +import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.Requests; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.cluster.metadata.MetaData; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.settings.SettingsFilter; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.rest.*; +import org.elasticsearch.rest.action.support.RestXContentBuilder; + +import java.io.IOException; +import java.util.Map; + +import static org.elasticsearch.rest.RestRequest.Method.*; +import static org.elasticsearch.rest.RestStatus.*; +import static org.elasticsearch.rest.action.support.RestActions.*; + +public class RestGetSettingsAction extends BaseRestHandler { + + private final SettingsFilter settingsFilter; + + @Inject public RestGetSettingsAction(Settings settings, Client client, RestController controller, SettingsFilter settingsFilter) { + super(settings, client); + controller.registerHandler(GET, "/_settings", this); + controller.registerHandler(GET, "/{index}/_settings", this); + + this.settingsFilter = settingsFilter; + } + + @Override public void handleRequest(final RestRequest request, final RestChannel channel) { + final String[] indices = splitIndices(request.param("index")); + + ClusterStateRequest clusterStateRequest = Requests.clusterStateRequest() + .filterRoutingTable(true) + .filterNodes(true) + .filteredIndices(indices); + + client.admin().cluster().state(clusterStateRequest, new ActionListener() { + @Override public void onResponse(ClusterStateResponse response) { + try { + MetaData metaData = response.state().metaData(); + XContentBuilder builder = RestXContentBuilder.restContentBuilder(request); + builder.startObject(); + + for (IndexMetaData indexMetaData : metaData) { + builder.startObject(indexMetaData.index()); + + builder.startObject("settings"); + Settings settings = settingsFilter.filterSettings(indexMetaData.settings()); + for (Map.Entry entry : settings.getAsMap().entrySet()) { + builder.field(entry.getKey(), entry.getValue()); + } + builder.endObject(); + + builder.endObject(); + } + + builder.endObject(); + + channel.sendResponse(new XContentRestResponse(request, OK, builder)); + } catch (Exception e) { + onFailure(e); + } + } + + @Override public void onFailure(Throwable e) { + try { + channel.sendResponse(new XContentThrowableRestResponse(request, e)); + } catch (IOException e1) { + logger.error("Failed to send failure response", e1); + } + } + }); + } +}