org.apache.usergrid.persistence.index.migration.EsIndexMappingMigrationPlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.usergrid.persistence.index.migration.EsIndexMappingMigrationPlugin.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  The ASF 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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
package org.apache.usergrid.persistence.index.migration;

import com.google.common.base.Charsets;
import com.google.common.io.Resources;
import com.google.inject.Inject;
import org.apache.usergrid.persistence.core.migration.data.MigrationInfoSerialization;
import org.apache.usergrid.persistence.core.migration.data.MigrationPlugin;
import org.apache.usergrid.persistence.core.migration.data.PluginPhase;
import org.apache.usergrid.persistence.core.migration.data.ProgressObserver;
import org.apache.usergrid.persistence.index.impl.EsProvider;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;

import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

/**
 * Classy class class.
 */
public class EsIndexMappingMigrationPlugin implements MigrationPlugin {

    private static final Logger logger = LoggerFactory.getLogger(EsIndexMappingMigrationPlugin.class);

    private final MigrationInfoSerialization migrationInfoSerialization;
    private final EsProvider provider;

    @Inject
    public EsIndexMappingMigrationPlugin(final MigrationInfoSerialization migrationInfoSerialization,
            final EsProvider provider) {

        this.migrationInfoSerialization = migrationInfoSerialization;
        this.provider = provider;
    }

    @Override
    public String getName() {
        return "index_mapping_migration";
    }

    @Override
    public void run(ProgressObserver observer) {

        final int version = migrationInfoSerialization.getVersion(getName());

        if (version == getMaxVersion()) {
            logger.debug("Skipping Migration Plugin: {}", getName());
            return;
        }

        try {
            ActionFuture<GetIndexResponse> responseFuture = provider.getClient().admin().indices()
                    .getIndex(new GetIndexRequest());
            Observable.from(responseFuture).flatMap(response -> {
                List<String> indices = Arrays.asList(response.getIndices());
                return Observable.from(indices);
            })

                    .doOnNext(index -> {
                        createMappings(index);
                        observer.update(getMaxVersion(), "running update for " + index);
                    }).doOnError(t -> {
                        observer.failed(getMaxVersion(), "failed to update", t);
                    }).doOnCompleted(() -> {
                        migrationInfoSerialization.setVersion(getName(), getMaxVersion());
                        observer.complete();
                    }).toBlocking().lastOrDefault(null); //should run through

        } catch (Exception ee) {
            observer.failed(getMaxVersion(), "failed to update", ee);
            throw new RuntimeException(ee);
        }

    }

    /**
     * Setup ElasticSearch type mappings as a template that applies to all new indexes.
     * Applies to all indexes that* start with our prefix.
     */
    private void createMappings(final String indexName) {

        //Added For Graphite Metrics
        PutMappingResponse pitr = provider.getClient().admin().indices().preparePutMapping(indexName)
                .setType("entity").setSource(getMappingsContent()).execute().actionGet();
        if (!pitr.isAcknowledged()) {
            throw new RuntimeException("Unable to create default mappings");
        }
    }

    /**
     * Get the content from our mappings file
     * @return
     */
    private String getMappingsContent() {
        URL url = Resources.getResource("org/apache/usergrid/persistence/index/usergrid-mappings.json");
        try {
            return Resources.toString(url, Charsets.UTF_8);
        } catch (IOException e) {
            throw new RuntimeException("Unable to read mappings file", e);
        }
    }

    @Override
    public int getMaxVersion() {
        return 2;//1->new storage format,2->remove uuid
    }

    @Override
    public PluginPhase getPhase() {
        return PluginPhase.BOOTSTRAP;
    }
}