/** * Copyright 2010 Molindo GmbH * * Licensed 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 at.molindo.esi4j.core.impl; import static org.elasticsearch.common.settings.ImmutableSettings.*; import java.util.Arrays; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.env.Environment; import org.elasticsearch.node.internal.InternalSettingsPreparer; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import at.molindo.esi4j.core.Esi4J; import at.molindo.esi4j.core.Esi4JClient; import at.molindo.esi4j.core.Esi4JClientFactory; import at.molindo.esi4j.core.Esi4JFactory; import at.molindo.esi4j.core.Esi4JIndex; import at.molindo.esi4j.core.Esi4JIndexManager; import at.molindo.esi4j.core.Esi4JManagedIndex; import at.molindo.esi4j.core.internal.InternalIndex; import at.molindo.esi4j.multi.impl.DefaultManagedMultiIndex; import at.molindo.esi4j.util.Esi4JUtils; import at.molindo.utils.collections.CollectionUtils; public class DefaultEsi4J implements Esi4J { private final Settings _settings; @SuppressWarnings("unused") private final Environment _environment; private final ConcurrentMap<String, Esi4JClient> _clients = Maps.newConcurrentMap(); private final ConcurrentMap<String, InternalIndex> _indexes = Maps.newConcurrentMap(); private final ConcurrentMap<String, Esi4JIndexManager> _indexManagers = Maps.newConcurrentMap(); public DefaultEsi4J() { this(ImmutableSettings.settingsBuilder().build(), true); } public DefaultEsi4J(final Settings settings) { this(settings, true); } public DefaultEsi4J(final Settings settings, final boolean loadConfigSettings) { final Tuple<Settings, Environment> tuple = InternalSettingsPreparer .prepareSettings(settings, loadConfigSettings); _settings = settingsBuilder().put(tuple.v1()).put("esi4j.enabled", true).build(); _environment = tuple.v2(); configure(); } private void configure() { configureClients(); configureIndexes(); } private void configureClients() { final String[] clients = _settings.getAsArray("esi4j.clients", new String[] { Esi4J.DEFAULT_CLIENT }); for (final String clientName : clients) { final Settings clientSettings = settingsBuilder().put(_settings) .put(Esi4JUtils.getSettings(_settings, "client." + clientName + ".", "esi4j.client.")).build(); final Class<? extends Esi4JClientFactory> factoryClass = clientSettings .getAsClass("esi4j.client.type", TransportClientFactory.class, "at.molindo.esi4j.core.impl.", "ClientFactory"); final Esi4JFactory<Esi4JClient> factory = Esi4JUtils.createObject(factoryClass, clientSettings); _clients.put(clientName, factory.create()); } } private void configureIndexes() { final String[] indexNames = _settings.getAsArray("esi4j.indexes", new String[] { Esi4J.DEFAULT_INDEX }); for (final String indexName : indexNames) { final Settings indexSettings = settingsBuilder().put(_settings) .put(Esi4JUtils.getSettings(_settings, "index." + indexName + ".", "index.")) .put(Esi4JUtils.getSettings(_settings, "esi4j.index." + indexName + ".", "esi4j.index.")).build(); final String clientName = indexSettings.get("esi4j.index.client", DEFAULT_CLIENT); final Esi4JClient client = _clients.get(clientName); if (client == null) { // TODO better exception throw new NullPointerException("client"); } _indexes.put(indexName, new DefaultIndex(indexName, indexSettings, new DefaultStore(client, indexName))); } } @Override public InternalIndex getIndex() { return getIndex(DEFAULT_INDEX); } @Override public InternalIndex getIndex(final String name) { final InternalIndex index = _indexes.get(name); if (index == null) { throw new IllegalStateException("index '" + name + "' not configured"); } return index; } @Override public Esi4JIndex findIndex(final Class<?> type) { return (Esi4JIndex) findMultiIndex(type); } @Override public Esi4JManagedIndex getMultiIndex(final String... names) { return getMultiIndex(Arrays.asList(names)); } @Override public Esi4JManagedIndex getMultiIndex(final List<String> names) { if (CollectionUtils.empty(names)) { return new DefaultManagedMultiIndex(_indexes.values()); } else if (names.size() == 1) { final String name = names.get(0); if ("*".equals(name)) { return new DefaultManagedMultiIndex(_indexes.values()); } else { return getIndex(name); } } else { final List<InternalIndex> indices = Lists.newArrayListWithCapacity(names.size()); for (final String name : names) { indices.add(getIndex(name)); } return new DefaultManagedMultiIndex(indices); } } @Override public Esi4JManagedIndex findMultiIndex(final Class<?>... types) { return findMultiIndex(Arrays.asList(types)); } @Override public Esi4JManagedIndex findMultiIndex(final List<Class<? extends Object>> types) { final List<String> names = Lists.newArrayListWithCapacity(_indexes.size()); for (final Entry<String, InternalIndex> e : _indexes.entrySet()) { for (final Class<?> type : types) { if (e.getValue().isMapped(type)) { names.add(e.getKey()); break; } } } return getMultiIndex(names); } @Override public void close() { for (final Esi4JClient client : _clients.values()) { client.close(); } } @Override public void registerIndexManger(final Esi4JIndexManager indexManager) { final Esi4JManagedIndex index = indexManager.getIndex(); final String indexName = index.getName(); if (_indexManagers.putIfAbsent(indexName, indexManager) == null) { index.setIndexManager(indexManager); } else { throw new IllegalStateException("already an index manager registered for index " + indexName); } } }