/* * Copyright (C) 2013 All rights reserved * VPRO The Netherlands */ package dgm.fixtures; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.inject.Provider; import dgm.configuration.*; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * User: rico * Date: 03/04/2013 */ public class CreateTargetIndexesCommand implements Command<List<String>> { private final Client client; private final Provider<Configuration> cfgProvider; private final ObjectMapper objectMapper = new ObjectMapper(); private static final Logger log = LoggerFactory.getLogger(WriteResultDocumentsCommand.class); @Inject public CreateTargetIndexesCommand(Client client, Provider<Configuration> cfgProvider) { this.client = client; this.cfgProvider = cfgProvider; } @Override public List<String> execute() throws Exception { List<String> indexes = new ArrayList<String>(); FixtureConfiguration fixtureConfiguration = cfgProvider.get().getFixtureConfiguration(); Set<String> indexNames = new HashSet<String>(); for (String index : fixtureConfiguration.getIndexNames()) { for (String type : fixtureConfiguration.getIndexConfig(index).getTypeNames()) { final Iterable<TypeConfig> configs = Configurations.configsFor(cfgProvider.get(), index, type); for (TypeConfig typeConfig : configs) { indexNames.add(typeConfig.targetIndex()); } } } for (String indexName : indexNames) { log.debug("Creating index [{}]", indexName); FixtureIndexConfiguration indexConfig = fixtureConfiguration.getIndexConfig(indexName); try { client.admin().indices().create(buildCreateIndexRequest(indexName, indexConfig)).get(); indexes.add(indexName); } catch (Exception e) { throw new Exception("something went wrong creating index [" + indexName + "]", e); } } return indexes; } CreateIndexRequest buildCreateIndexRequest(String indexName, FixtureIndexConfiguration indexConfig) throws IOException { CreateIndexRequest request = new CreateIndexRequest(indexName, createSettings()); if (indexConfig != null) { for (String typeName : indexConfig.getTypeNames()) { FixtureTypeConfiguration typeConfig = indexConfig.getTypeConfig(typeName); if (typeConfig.getMapping() != null) { request.mapping(typeName, typeConfig.getMapping().toString()); log.debug("Add mapping for type [{}] in index [{}]", typeName, indexName); } } } return request; } private Settings createSettings() { ObjectNode indexConfigSettingsNode = objectMapper.createObjectNode(); indexConfigSettingsNode. put("number_of_shards", 2). put("number_of_replicas", 1); return ImmutableSettings.settingsBuilder().loadFromSource(indexConfigSettingsNode.toString()).build(); } }