Full Code of ozlerhakan/mongolastic for AI

master e7456115f39c cached
32 files
62.5 KB
15.8k tokens
140 symbols
1 requests
Download .txt
Repository: ozlerhakan/mongolastic
Branch: master
Commit: e7456115f39c
Files: 32
Total size: 62.5 KB

Directory structure:
gitextract_t9r72zye/

├── .gitignore
├── .travis.yml
├── Contributors.adoc
├── Dockerfile
├── LICENSE
├── README.adoc
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── kodcu/
    │   │           ├── config/
    │   │           │   ├── ElasticConfiguration.java
    │   │           │   ├── FileConfiguration.java
    │   │           │   ├── MongoConfiguration.java
    │   │           │   ├── YamlConfiguration.java
    │   │           │   └── structure/
    │   │           │       ├── Auth.java
    │   │           │       ├── Elastic.java
    │   │           │       ├── Misc.java
    │   │           │       ├── Mongo.java
    │   │           │       └── Namespace.java
    │   │           ├── listener/
    │   │           │   └── BulkProcessorListener.java
    │   │           ├── main/
    │   │           │   └── Mongolastic.java
    │   │           ├── provider/
    │   │           │   ├── ElasticToMongoProvider.java
    │   │           │   ├── MongoToElasticProvider.java
    │   │           │   └── Provider.java
    │   │           ├── service/
    │   │           │   ├── BulkService.java
    │   │           │   ├── ElasticBulkService.java
    │   │           │   └── MongoBulkService.java
    │   │           └── util/
    │   │               └── codecs/
    │   │                   ├── CustomDateCodec.java
    │   │                   └── CustomLongCodec.java
    │   └── resources/
    │       └── log4j2.properties
    └── test/
        ├── java/
        │   └── com/
        │       └── kodcu/
        │           └── test/
        │               ├── TestMongoToElastic.java
        │               └── TestMongolasticQueries.java
        └── resources/
            ├── conf1
            ├── conf2
            └── conf3

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
!.gitignore
*.iml
target
.idea
*.log

*.class
/.classpath
/.project
/.settings

dependency-reduced-pom.xml



================================================
FILE: .travis.yml
================================================
sudo: required
notifications:
  email: false
language: java
jdk:
- oraclejdk8
os:
- linux
services:
- docker
env:
- MONGOLASTIC_FULL="ozlerhakan/mongolastic:1.4.4"
script: mvn install
before_install:
- curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.deb && sudo dpkg -i --force-confnew elasticsearch-6.1.1.deb
- sudo service elasticsearch start
- sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
- echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
- sudo apt-get update
- sudo apt-get install -y mongodb-org
- sudo service mongod start
- mongod --version
before_script:
- wget https://dl.dropbox.com/s/jvngnitppao8hay/tweets.zip
- unzip tweets.zip
- sleep 15
- curl http://localhost:9200/
- mongorestore -h 127.0.0.1 --port 27017 dump
- mvn clean
after_success:
- docker build -t $MONGOLASTIC_FULL .
- docker tag $MONGOLASTIC_FULL ozlerhakan/mongolastic:1.4;
- docker tag $MONGOLASTIC_FULL ozlerhakan/mongolastic:latest;
- docker images
- if [ "$TRAVIS_BRANCH" == "master" ]; then
  docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD";
  docker push $MONGOLASTIC_FULL;
  docker push ozlerhakan/mongolastic:1.4;
  docker push ozlerhakan/mongolastic:latest;
  fi
deploy:
  provider: releases
  skip_cleanup: true
  api_key:
    secure: E8iX+y1svn/88ftT5fnMIfECNUNek0T/VtrkdacuFriC/cNcopcZUuIEqmCTuMIvo+iL/h4F4wYzGLadRU6iOhnPk8oMPadcR+2Pll/mz7/I4zcj/iZL8KMJGlJxLpnTKBw3QEGnWflg/S8I6g6bOcGnPhQW0AQZ6bj7FBR59Gd7abtqAkwZVki+zxXbMzMqA3VYRaMc2UEdTU6AlcR7GeCdcDFhQ/4uqmMySGGGKLAROZ+0r9BhbaZ0ivuR7Uza9l68d0FhN2wRxDhP86RM3hbZttGQw+CBw7+3IcHoJ9MpSGgatxWd3eudWypDoocVs9FxYKS3zJcVzzLWtmB1yRdY/zOcLkr7Tkz2z+LIZbjPJFjeDUgpRJPqw8ckPOEbsdmp+/0zVBp+aDdMgpa3hfXkchTa4hXUDWJCZiuN4oByWxnBqoALUAjRdIflCeZuukbmHzZb6QWNTfRSGAZtQHO+sdJIvMFFC9v0k6T2WXvlEWDXt0cA8Gid9iBZLZfemJiBRNRP94TDcakMZzwnBH/G3l1nc7tk8AR7gX0b/biLeloSdxdI7UGV+uLvy+LgrsJp5TeLvBaylCRJ6672IvroGZwZm/GG3NsPS1vb2WoZfbjiS+paWUxreeFumJyg43Vuv0LiDND2y2P8zTtnC7HaM0k54ewt86Kx5w86Ma0=
  file: /home/travis/build/ozlerhakan/mongolastic/target/mongolastic.jar
  on:
    tags: true
    all_branches: true
    repo: ozlerhakan/mongolastic



================================================
FILE: Contributors.adoc
================================================
== Contributors

Thank you for our contributors to make this project more usable! ✨

* https://github.com/hakdogan[Hüseyin Hakdoğan]
* https://github.com/winder[Will Winder]
* https://github.com/wareninja[Yılmaz Güleryüz]

================================================
FILE: Dockerfile
================================================
FROM openjdk:8-jdk-alpine
MAINTAINER Hakan Ozler <ozler.hakan@gmail.com>
ADD target/mongolastic.jar .
ENTRYPOINT ["java","-jar","mongolastic.jar","-f"]

================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015-2016 Kodcu.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.adoc
================================================
= Mongolastic
:version: v1.4.3

image:https://travis-ci.org/ozlerhakan/mongolastic.svg?branch=master["Build Status", link="https://travis-ci.org/ozlerhakan/mongolastic"]
image:https://api.codacy.com/project/badge/Grade/8d768c2fc37246019115e4d090a33b98["Codacy code quality", link="https://www.codacy.com/app/ozlerhakan/mongolastic?utm_source=github.com&utm_medium=referral&utm_content=ozlerhakan/mongolastic&utm_campaign=Badge_Grade"]
image:https://img.shields.io/docker/pulls/ozlerhakan/mongolastic.svg["Docker Pulls,link="https://hub.docker.com/r/ozlerhakan/mongolastic"]
image:https://img.shields.io/github/release/ozlerhakan/mongolastic.svg[]
image:https://img.shields.io/badge/mongo.java.driver-3.4.2-brightgreen.svg[] image:https://img.shields.io/badge/elastic.java.driver-6.2.4-brightgreen.svg[]
image:https://img.shields.io/badge/license-MIT-blue.svg[]

Mongolastic enables you to migrate your datasets from a mongod node to an elasticsearch node and vice versa. Since mongo and elastic servers can run with different characteristics, the tool provides several optional and required features to ably connect them. Mongolastic works with a yaml or json configuration file to begin a migration process. It reads your demand on the file and start syncing data in the specified direction.

== How it works

First, you can either pull the corresponding image of the app from https://hub.docker.com/r/ozlerhakan/mongolastic/[Docker Hub]

Supported tags and respective Dockerfile links:

*  `_1.4_`, `_1.4.4_`, `_latest_` https://github.com/ozlerhakan/mongolastic/blob/master/Dockerfile[_(master/Dockerfile)_]
*  `_1.4.3_` https://github.com/ozlerhakan/mongolastic/blob/0dacd80cbdf7b5b7b282bf6dd89ede8558021577/Dockerfile[_(1.4.2/Dockerfile)_]


or download the latest https://github.com/ozlerhakan/mongolastic/releases/download/{version}/mongolastic.jar[mongolastic.jar] file.

Second, create a yaml or json file which must contain the following structure:

[source,yaml]
----
misc:
    dindex:
        name: <string>      <1>
        as: <string>        <2>
    ctype:
        name: <string>      <3>
        as: <string>        <4>
    direction: (em | me)    <5>
    batch: <number>         <6>
    dropDataset: <bool>     <7>
mongo:
    host: <ip-address>      <8>
    port: <number>          <9>
    query: "mongo-query"    <10>
    project: "projection"   <11>
    auth:                   <12>
        user: <string>
        pwd: "password"
        source: <db-name>
        mechanism: ( plain | scram-sha-1 | x509 | gssapi | cr )
elastic:
    host: <ip-address>     <13>
    port: <number>         <14>
    dateFormat: "<format>" <15>
    longToString: <bool>   <16>
    clusterName: <string>  <17>
    auth:                  <18>
        user: <string>
        pwd: "password"
----
<1>  the _database/index name_ to connect to.
<2>  another _database/index name_ in which documents will be located in the target service (*Optional*)
<3>  the _collection/type name_ to export.
<4>  another _collection/type name_ in which indexed/collected documents will reside in the target service (*Optional*)
<5>  direction of the data transfer. the default direction is me (that is, mongo to elasticsearch). You can skip this option if your data move from mongo to es.
<6>  Override the default batch size which is normally 200. (*Optional*)
<7>  configures whether or not the target table should be dropped prior to loading data. Default value is true (*Optional*)
<8>  the name of the host machine where the `mongod` is running.
<9>  the port where the `mongod` instance is listening.
<10>  data will be transferred based on a json mongodb query (*Optional*)
<11> with 1.4.1, you can manipulate documents that will be migrated from mongo to es based on the https://docs.mongodb.com/manual/reference/operator/aggregation/project/[`$project`] operator (*Optional*)
<12> as of v1.3.5, you can access an auth mongodb by giving auth configuration. (*Optional*)
<13> the name of the host machine where the `elastic node` is running.
<14> the *transport* port where the transport module will communicate with the running elastic node. E.g. *9300* for node-to-node communication.
<15> a custom formatter for Date fields rather than the default DateCodec (*Optional*)
<16> serialize long value as a string for backwards compatibility with other tools (*Optional*)
<17> connect to a spesific elastic cluster (*Optional*)
<18> as of v1.3.9, you can access an auth elastic search by giving auth configuration. (*Optional*)

---

Alternatively, a JSON file can be specified as a mongolastic configuration file including the same YAML file structure above.

[source,json]
----
{
	"misc": {
		"dindex": {
			"name": "twitter",
			"as": "media"
		},
		"ctype": {
			"name": "tweets",
			"as": "posts"
		},
		"direction": "me",
		"batch": 400,
		"dropDataset": true
	},
	"mongo": {
		"host": "127.0.0.1",
		"port": 27017,
		"query": "{ lang: 'en' }",
		"project": "{ user:1, name:'$user.name', location: { $substr: [ '$user.location', 10, 15 ] }}",
		"auth": {
			"user": "joe",
			"pwd": "1234",
			"source": "twitter",
			"mechanism": "scram-sha-1"
		}
	},
	"elastic": {
		"host": "127.0.0.1",
		"port": 9300,
		"dateFormat": "yyyy-MM-dd",
		"longToString": true,
		"auth": {
			"user": "joe",
			"pwd": "4321"
		}
	}
}
----

== Example #1

The following files have the same configuration details:

.yaml file
[source,yaml]
----
misc:
    dindex:
        name: twitter
        as: kodcu
    ctype:
        name: tweets
        as: posts
mongo:
    host: localhost
    port: 27017
    query: "{ 'user.name' : 'kodcu.com'}"
elastic:
    host: localhost
    port: 9300
----

.json file
[source,json]
----
{
	"misc": {
		"dindex": {
			"name": "twitter",
			"as": "kodcu"
		},
		"ctype": {
			"name": "tweets",
			"as": "posts"
		}
	},
	"mongo": {
		"host": "localhost",
		"port": 27017,
		"query": "{ 'user.name' : 'kodcu.com'}"
	},
	"elastic": {
		"host": "localhost",
		"port": 9300
	}
}
----

the config says that the transfer direction is from mongodb to elasticsearch, mongolastic first looks at the _tweets_ collection, where the _user name_ is _kodcu.com_, of the _twitter_ database located on a mongod server running on default host interface and port number. If It finds the corresponding data, It will start copying those into an elasticsearch environment running on default host and transport number. After all, you should see a type called _"posts"_ in an index called _"kodcu"_ in the current elastic node. Why the index and type are different is because "dindex.as" and "ctype.as" options were set, these indicates that your data being transferred exist in _posts_ type of the _kodcu_ index.

After downloading the jar or pulling the image and providing a conf file, you can either run the tool as:

    $ java -jar mongolastic.jar -f config.file

__or__

    $ docker run --rm -v $(PWD)/config.file:/config.file --net host ozlerhakan/mongolastic:<tag> config.file

== Example #2

Using the project field, you are able to manipulate documents when migrating them from mongodb to elasticsearch. For more examples about the `$project` operator of the aggregation pipeline, take a look at its https://docs.mongodb.com/manual/reference/operator/aggregation/project/[documentation].

[source,yaml]
----
misc:
    dindex:
        name: twitter
    ctype:
        name: tweets
mongo:
    host: 192.168.10.151
    port: 27017
    project: "{ user: 1, name: '$user.name', location: { $substr: [ '$user.location', 10, 15 ] }}" <1>
elastic:
    host: 192.168.10.152
    port: 9300
----
<1> the migrated documents will include the user field and contain new fields `name` and `location`.

NOTE: Every attempt of running the tool drops the mentioned db/index in the target environment unless the dropDataset parameter is configured otherwise.

== License

Mongolastic is released under http://showalicense.com/?hide_explanations=false&year=2015&fullname=Kodcu.com#license-mit[MIT].


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kodcu.mongolastic</groupId>
    <artifactId>mongolastic</artifactId>
    <version>1.4.4</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <elastic.version>6.2.4</elastic.version>
        <mongo.version>3.4.2</mongo.version>
        <logger.version>2.8</logger.version>
    </properties>

    <inceptionYear>2015</inceptionYear>

    <name>mongolastic</name>
    <description>
        A tool that migrates data from mongodb to elasticsearch and vice versa.
    </description>
    <url>http://github.com/ozlerhakan/mongolastic</url>

    <organization>
        <name>Kodcu.com</name>
    </organization>

    <developers>
        <developer>
            <id>ozlerhakan</id>
            <name>Hakan Ozler</name>
            <email>ozler.hakan@gmail.com</email>
            <url>http://github.com/ozlerhakan</url>
            <roles>
                <role>developer</role>
            </roles>
        </developer>
        <developer>
            <id>hakdogan</id>
            <name>Hüseyin Akdoğan</name>
            <email>huseyin.akdogan@kodcu.com</email>
            <url>http://github.com/hakdogan</url>
            <roles>
                <role>software evangelist - developer</role>
            </roles>
        </developer>
    </developers>

    <prerequisites>
        <maven>3.0</maven>
    </prerequisites>

    <issueManagement>
        <system>github.com</system>
        <url>https://github.com/ozlerhakan/mongolastic/issues</url>
    </issueManagement>

    <repositories>
        <!-- add the elasticsearch repo -->
        <repository>
            <id>elasticsearch-releases</id>
            <url>https://artifacts.elastic.co/maven</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>${mongo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>${elastic.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${logger.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${logger.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${logger.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.kodcu.main.Mongolastic</mainClass>
                                    <manifestEntries>
                                        <Change></Change>
                                        <Build-Date></Build-Date>
                                    </manifestEntries>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.PluginXmlResourceTransformer"/>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            </transformers>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


================================================
FILE: src/main/java/com/kodcu/config/ElasticConfiguration.java
================================================
package com.kodcu.config;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Objects;
import java.util.Optional;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.Settings.Builder;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

/**
 * Created by hakdogan on 21/05/15.
 */
public class ElasticConfiguration {

    private final Logger logger = LogManager.getLogger(ElasticConfiguration.class);
    private final YamlConfiguration config;
    private Client client;

    public ElasticConfiguration(final YamlConfiguration config) {
        this.config = config;
        this.prepareClient();
    }

    private void prepareClient() {

        Builder settingsBuilder = applySettings();
        try {
            TransportAddress ista = new TransportAddress(InetAddress.getByName(config.getElastic().getHost()), config.getElastic().getPort());
            client = new PreBuiltTransportClient(settingsBuilder.build())
                    .addTransportAddress(ista);

        } catch (UnknownHostException ex) {
            logger.error(ex.getMessage(), ex);
            System.exit(-1);
        }
    }

    private Builder applySettings() {
        Builder settingsBuilder = Settings.builder();

        settingsBuilder.put("client.transport.ping_timeout", "15s");
        settingsBuilder.put("client.transport.nodes_sampler_interval", "5s");
        // YG: to ensure reliable connection & resolve NoNodeAvailableException
        settingsBuilder.put("client.transport.sniff", true);
        settingsBuilder.put("network.bind_host", 0);

        // YG: for supporting ES Auth with ES Shield
        Optional.ofNullable(config.getElastic().getAuth())
                .ifPresent(auth -> settingsBuilder.put("xpack.security.user", String.join(":", auth.getUser(), auth.getPwd())));

        if (Objects.nonNull(config.getElastic().getClusterName())) {
            settingsBuilder.put("cluster.name", config.getElastic().getClusterName());
        } else {
            settingsBuilder.put("client.transport.ignore_cluster_name", true);
        }
        return settingsBuilder;
    }

    public void closeNode() {
        client.close();
    }

    public Client getClient() {
        return client;
    }

}


================================================
FILE: src/main/java/com/kodcu/config/FileConfiguration.java
================================================
package com.kodcu.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Objects;

/**
 * Created by Hakan on 5/19/2015.
 */
public class FileConfiguration {

    private final Logger logger = LoggerFactory.getLogger(FileConfiguration.class);
    private final String parameter;

    public FileConfiguration(String parameter) {
        this.parameter = parameter;
    }

    public YamlConfiguration getFileContent() {
        YamlConfiguration config = null;
        File ymlFile = new File(parameter);
        try {
            Yaml yaml = new Yaml();
            if (ymlFile.isFile()) {
                FileInputStream configFile = new FileInputStream(ymlFile);
                config = yaml.loadAs(configFile, YamlConfiguration.class);
            } else {
                // we expect that this is just a string including yaml format
                config = yaml.loadAs(parameter, YamlConfiguration.class);
            }
        } catch (Exception e) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                config = mapper.readValue(ymlFile, YamlConfiguration.class);
            } catch (IOException ex) {
                logger.error(e.getMessage(), e);
                System.exit(0);
            }
        }

        logger.info(System.lineSeparator() + "Config Output:" + System.lineSeparator() + config.toString() + System.lineSeparator());
        config = this.controlAsSettings(config);
        return config;
    }

    private YamlConfiguration controlAsSettings(YamlConfiguration config) {
        String dIndexAs = config.getMisc().getDindex().getAs();
        String cTypeAs = config.getMisc().getCtype().getAs();
        if (Objects.isNull(dIndexAs))
            config.getMisc().getDindex().setAs(config.getMisc().getDindex().getName());
        if (Objects.isNull(cTypeAs))
            config.getMisc().getCtype().setAs(config.getMisc().getCtype().getName());
        if (config.getMisc().getBatch() < 200)
            config.getMisc().setBatch(200);

        return config;
    }

}


================================================
FILE: src/main/java/com/kodcu/config/MongoConfiguration.java
================================================
package com.kodcu.config;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.Objects;

import static com.mongodb.assertions.Assertions.notNull;

/**
 * Created by Hakan on 5/19/2015.
 */
public class MongoConfiguration {

    private final Logger logger = LoggerFactory.getLogger(MongoConfiguration.class);
    private final YamlConfiguration config;
    private MongoClient client;

    public MongoConfiguration(final YamlConfiguration config) {
        this.config = config;
        this.prepareClient();
    }

    private void prepareClient() {
        try {
            ServerAddress address = new ServerAddress(config.getMongo().getHost(), config.getMongo().getPort());
            MongoClientOptions options = MongoClientOptions.builder()
                    .serverSelectionTimeout(5000)
                    .socketKeepAlive(false)
                    .readPreference(ReadPreference.primaryPreferred())
                    .sslInvalidHostNameAllowed(true)
                    .build();

             client = connectToClient(address, options);
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            System.exit(-1);
        }
    }

    private MongoClient connectToClient(ServerAddress address, MongoClientOptions options) {
        if (Objects.nonNull(config.getMongo().getAuth())) {

            String user = notNull("auth.name", config.getMongo().getAuth().getUser());
            String database = config.getMongo().getAuth().getSource();
            char[] pwd = config.getMongo().getAuth().getPwd().toCharArray();
            String mechanism = config.getMongo().getAuth().getMechanism();

            MongoCredential credential = findMongoCredential(user, database, pwd, mechanism);
            return new MongoClient(Arrays.asList(address), Arrays.asList(credential), options);

        } else {
            return new MongoClient(Arrays.asList(address), options);
        }
    }

    private MongoCredential findMongoCredential(String user, String database, char[] pwd, String mechanism) {
        MongoCredential credential = null;
        switch (mechanism) {
            case "scram-sha-1":
                credential = MongoCredential.createScramSha1Credential(user, database, pwd);
                break;
            case "x509":
                credential = MongoCredential.createMongoX509Credential(user);
                break;
            case "cr":
                credential = MongoCredential.createMongoCRCredential(user, database, pwd);
                break;
            case "plain":
                credential = MongoCredential.createPlainCredential(user, database, pwd);
                break;
            case "gssapi":
                credential = MongoCredential.createGSSAPICredential(user);
                break;
            default:
                credential = MongoCredential.createCredential(user, database, pwd);
                break;
        }
        return credential;
    }

    public MongoCollection<Document> getMongoCollection() {
        MongoCollection<Document> collection = null;
        try {
            MongoDatabase database = client.getDatabase(config.getMisc().getDindex().getName());
            collection = database.getCollection(config.getMisc().getCtype().getName());
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
        }
        return collection;
    }

    public void closeConnection() {
        if (Objects.nonNull(client))
            client.close();
    }

    public MongoClient getClient() {
        return client;
    }
}


================================================
FILE: src/main/java/com/kodcu/config/YamlConfiguration.java
================================================
package com.kodcu.config;

import com.kodcu.config.structure.Elastic;
import com.kodcu.config.structure.Misc;
import com.kodcu.config.structure.Mongo;

/**
 * Created by Hakan on 5/19/2015.
 */
public class YamlConfiguration {

    private Misc misc;
    private Mongo mongo;
    private Elastic elastic;

    public Elastic getElastic() {
        return elastic;
    }

    public void setElastic(Elastic elastic) {
        this.elastic = elastic;
    }

    public Misc getMisc() {
        return misc;
    }

    public void setMisc(Misc misc) {
        this.misc = misc;
    }

    public Mongo getMongo() {
        return mongo;
    }

    public void setMongo(Mongo mongo) {
        this.mongo = mongo;
    }

    @Override
    public String toString() {
        return "{" +
                "elastic=" + elastic +
                ", misc=" + misc +
                ", mongo=" + mongo +
                '}';
    }
}

================================================
FILE: src/main/java/com/kodcu/config/structure/Auth.java
================================================
package com.kodcu.config.structure;

/**
 * Created by Hakan on 5/14/2016.
 */
public class Auth {

    private String user;
    private String pwd;
    private String source;
    private String mechanism;

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getMechanism() {
        return mechanism;
    }

    public void setMechanism(String mechanism) {
        this.mechanism = mechanism;
    }

    @Override
    public String toString() {
        return "Auth [user=" + user + ", pwd=" + pwd + ", source=" + source + ", mechanism=" + mechanism + "]";
    }

}


================================================
FILE: src/main/java/com/kodcu/config/structure/Elastic.java
================================================
package com.kodcu.config.structure;

/**
 * Created by Hakan on 1/16/2016.
 */
public class Elastic {

    private String host;
    private int port;
    private String dateFormat;
    private Boolean longToString = false;
    private String clusterName; // optional
    private Auth auth; // optional

    public Auth getAuth() {
        return auth;
    }

    public void setAuth(Auth auth) {
        this.auth = auth;
    }

    public String getClusterName() {
        return clusterName;
    }

    public void setClusterName(String clusterName) {
        this.clusterName = clusterName;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getDateFormat() {
        return dateFormat;
    }

    public void setDateFormat(String dateFormat) {
        this.dateFormat = dateFormat;
    }

    public Boolean getLongToString() {
        return this.longToString;
    }

    public void setLongToString(Boolean longToString) {
        this.longToString = longToString;
    }

    @Override
    public String toString() {
        return "Elastic{" +
                "host='" + host + '\'' +
                ", port=" + port +
                ", clusterName=" + clusterName +
                ", dateFormat=" + dateFormat +
                ", longToString=" + longToString +
                ", auth=" + auth +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Elastic elastic = (Elastic) o;

        if (port != elastic.port) return false;
        return host != null ? host.equals(elastic.host) : elastic.host == null;

    }

    @Override
    public int hashCode() {
        int result = host != null ? host.hashCode() : 0;
        result = 31 * result + port;
        return result;
    }
}


================================================
FILE: src/main/java/com/kodcu/config/structure/Misc.java
================================================
package com.kodcu.config.structure;

/**
 * Created by Hakan on 1/16/2016.
 */
public class Misc {

    private String direction = "me";
    private Namespace dindex;
    private Namespace ctype;
    private Boolean dropDataset = true;
    private int batch = 200;

    public int getBatch() {
        return batch;
    }

    public void setBatch(int batch) {
        this.batch = batch;
    }

    public Namespace getCtype() {
        return ctype;
    }

    public void setCtype(Namespace ctype) {
        this.ctype = ctype;
    }

    public String getDirection() {
        return direction;
    }

    public void setDirection(String direction) {
        this.direction = direction;
    }

    public Namespace getDindex() {
        return dindex;
    }

    public void setDindex(Namespace dindex) {
        this.dindex = dindex;
    }

    public Boolean getDropDataset() {
        return this.dropDataset;
    }

    public void setDropDataset(Boolean dropDataset) {
        this.dropDataset = dropDataset;
    }

    @Override
    public String toString() {
        return "Misc{" +
                "batch=" + batch +
                ", direction='" + direction + '\'' +
                ", dindex=" + dindex +
                ", ctype=" + ctype +
                ", dropDataset=" + dropDataset +
                '}';
    }
}


================================================
FILE: src/main/java/com/kodcu/config/structure/Mongo.java
================================================
package com.kodcu.config.structure;

/**
 * Created by Hakan on 1/16/2016.
 */
public class Mongo {

    private String host;
    private int port;
    private String query = "{}";
    private String project;
    private Auth auth;

    @Override
    public String toString() {
        return "Mongo{" +
                "host='" + host + '\'' +
                ", port=" + port +
                ", query='" + query + '\'' +
                ", project='" + project + '\'' +
                ", auth=" + auth +
                '}';
    }

    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    public Auth getAuth() {
        return auth;
    }

    public void setAuth(Auth auth) {
        this.auth = auth;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }
}


================================================
FILE: src/main/java/com/kodcu/config/structure/Namespace.java
================================================
package com.kodcu.config.structure;

/**
 * Created by Hakan on 1/16/2016.
 */
public class Namespace {
    private String name;
    private String as;

    public String getAs() {
        return as;
    }

    public void setAs(String as) {
        this.as = as;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Namespace{" +
                "as='" + as + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}


================================================
FILE: src/main/java/com/kodcu/listener/BulkProcessorListener.java
================================================
package com.kodcu.listener;

import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by Hakan on 5/21/2015.
 */
public class BulkProcessorListener implements BulkProcessor.Listener {

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

    @Override
    public void beforeBulk(long executionId, BulkRequest request) {
    }

    @Override
    public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
        if (response.hasFailures()) {
            logger.error(response.buildFailureMessage());
        } else {
            logger.info(String.format("Data transfer successfully terminated.(%d)", response.getItems().length));
        }

    }

    @Override
    public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
        logger.error("Transfer failed.");
        logger.error(failure.getMessage(), failure.fillInStackTrace());
    }
}


================================================
FILE: src/main/java/com/kodcu/main/Mongolastic.java
================================================
package com.kodcu.main;

import com.kodcu.config.ElasticConfiguration;
import com.kodcu.config.FileConfiguration;
import com.kodcu.config.MongoConfiguration;
import com.kodcu.config.YamlConfiguration;
import com.kodcu.provider.ElasticToMongoProvider;
import com.kodcu.provider.MongoToElasticProvider;
import com.kodcu.provider.Provider;
import com.kodcu.service.BulkService;
import com.kodcu.service.ElasticBulkService;
import com.kodcu.service.MongoBulkService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Optional;

/**
 * Created by Hakan on 5/19/2015.
 */
public class Mongolastic {

    private static final Logger logger = LoggerFactory.getLogger(Mongolastic.class);
    private final String parameter;

    public Mongolastic(String parameter) {
        this.parameter = parameter;
    }

    public static void main(String[] args) throws Exception {
        configAssertion(args);

        String parameter = args[1];
        Mongolastic app = new Mongolastic(parameter);
        app.start();
    }

    private static void configAssertion(String[] args) {
        if (args.length == 0) {
            logger.error("Incorrect syntax. Should be mongolastic.jar -f /path/file");
            System.exit(0);
        }
        if (!args[0].equals("-f")) {
            logger.error("Please specify the -f parameter with a correct yaml or json file");
            System.exit(0);
        }
        if (args.length != 2) {
            logger.error("Incorrect syntax. Pass max 2 parameters");
            System.exit(0);
        }
    }

    public void start() {
        FileConfiguration fConfig = new FileConfiguration(parameter);
        Optional<YamlConfiguration> yamlConfig = Optional.ofNullable(fConfig.getFileContent());
        long begin = System.currentTimeMillis();
        try {
            yamlConfig.ifPresent(this::proceedService);
        } finally {
            logger.info("Load duration: " + (System.currentTimeMillis() - begin) + "ms");
        }
    }

    public void proceedService(YamlConfiguration config) {
        ElasticConfiguration elastic = new ElasticConfiguration(config);
        MongoConfiguration mongo = new MongoConfiguration(config);
        BulkService bulkService = this.initializeBulkService(config, mongo, elastic);
        Provider provider = this.initializeProvider(config, mongo, elastic);
        provider.transfer(bulkService, config, () -> {
            bulkService.close();
            mongo.closeConnection();
            elastic.closeNode();
        });
    }

    private Provider initializeProvider(YamlConfiguration config, MongoConfiguration mongo, ElasticConfiguration elastic) {
        if (config.getMisc().getDirection().equals("em")) {
            return new ElasticToMongoProvider(elastic, config);
        }
        return new MongoToElasticProvider(mongo.getMongoCollection(), config);
    }

    private BulkService initializeBulkService(YamlConfiguration config, MongoConfiguration mongo, ElasticConfiguration elastic) {
        if (config.getMisc().getDirection().equals("em")) {
            return new MongoBulkService(mongo.getClient(), config);
        }
        return new ElasticBulkService(config, elastic);
    }
}


================================================
FILE: src/main/java/com/kodcu/provider/ElasticToMongoProvider.java
================================================
package com.kodcu.provider;

import com.kodcu.config.ElasticConfiguration;
import com.kodcu.config.YamlConfiguration;
import org.bson.Document;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.common.unit.TimeValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * Created by Hakan on 6/29/2015.
 */
public class ElasticToMongoProvider implements Provider {

    private final Logger logger = LoggerFactory.getLogger(ElasticToMongoProvider.class);
    private final ElasticConfiguration elastic;
    private final YamlConfiguration config;
    private SearchResponse response;

    public ElasticToMongoProvider(final ElasticConfiguration elastic, final YamlConfiguration config) {
        this.elastic = elastic;
        this.config = config;
    }

    @Override
    public long getCount() {
        long count = 0;
        IndicesAdminClient admin = elastic.getClient().admin().indices();
        IndicesExistsRequestBuilder builder = admin.prepareExists(config.getMisc().getDindex().getName());
        if (builder.execute().actionGet().isExists()) {
            SearchResponse countResponse = elastic.getClient().prepareSearch(config.getMisc().getDindex().getName())
                    .setTypes(config.getMisc().getCtype().getName())
                    .setSearchType(SearchType.QUERY_THEN_FETCH)
                    .setSize(0)
                    .execute().actionGet();
            count = countResponse.getHits().getTotalHits();
        } else {
            logger.info("Index/Type does not exist or does not contain the record");
            System.exit(-1);
        }

        logger.info("Elastic Index/Type count: " + count);
        return count;
    }

    @Override
    public List buildJSONContent(int skip, int limit) {

        if (Objects.isNull(response)) {
            response = elastic.getClient().prepareSearch(config.getMisc().getDindex().getName())
                    .setTypes(config.getMisc().getCtype().getName())
                    .setSearchType(SearchType.QUERY_THEN_FETCH)
                    .setScroll(new TimeValue(60000))
                    .setSize(limit)
                    .execute().actionGet();
        }
        else {
            response = elastic.getClient()
                    .prepareSearchScroll(response.getScrollId())
                    .setScroll(new TimeValue(60000))
                    .execute().actionGet();
        }

        return Arrays.stream(response.getHits().getHits())
                .map(hit -> new Document(hit.getSourceAsMap()))
                .collect(Collectors.toList());
    }
}


================================================
FILE: src/main/java/com/kodcu/provider/MongoToElasticProvider.java
================================================
package com.kodcu.provider;

import com.kodcu.config.YamlConfiguration;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static com.mongodb.client.model.Aggregates.*;

/**
 * Created by Hakan on 5/18/2015.
 */
public class MongoToElasticProvider implements Provider {

    private final Logger logger = LoggerFactory.getLogger(MongoToElasticProvider.class);
    private final MongoCollection<Document> collection;
    private final YamlConfiguration config;
    private MongoCursor<Document> cursor;
    private long cursorId = 0;

    public MongoToElasticProvider(final MongoCollection<Document> collection, final YamlConfiguration config) {
        this.collection = collection;
        this.config = config;
    }

    @Override
    public long getCount() {
        long count = collection.count(Document.parse(config.getMongo().getQuery()));
        logger.info("Mongo collection count: " + count);
        if (count == 0) {
            logger.error("Database/Collection does not exist or does not contain the record");
            System.exit(-1);
        }
        return count;
    }

    @Override
    public List buildJSONContent(int skip, int limit) {
        ArrayList<Document> result = new ArrayList<>(limit);
        result.ensureCapacity(limit);

        MongoCursor<Document> cursor = getCursor(skip);
        while (cursor.hasNext() && result.size() < limit) {
            result.add(cursor.next());
        }
        return result;
    }

    /**
     * Get the MongoDB cursor.
     */
    private MongoCursor<Document> getCursor(int skip) {
        if (cursor == null && cursorId == 0) {
            Document query = Document.parse(config.getMongo().getQuery());
            List<Bson> pipes = new ArrayList<>(3);
            pipes.add(match(query));
            pipes.add(skip(skip));

            Optional.ofNullable(config.getMongo().getProject()).ifPresent(p -> pipes.add(project(Document.parse(p))));

            AggregateIterable<Document> aggregate = collection.aggregate(pipes)
                    .allowDiskUse(true)
                    .useCursor(true);

            cursor = aggregate.iterator();

            // TODO: Persist cursor ID somewhere to allow restarts.
            Optional.ofNullable(cursor.getServerCursor()).ifPresent(serverCursor -> cursorId = serverCursor.getId());
        } else if (cursor == null && cursorId != 0) {
            // TODO: Lookup cursor ID for resume.
            // Open existing cursor in case of restart??
        }

        return cursor;
    }
}


================================================
FILE: src/main/java/com/kodcu/provider/Provider.java
================================================
package com.kodcu.provider;


import com.kodcu.config.YamlConfiguration;
import com.kodcu.service.BulkService;
import org.bson.Document;

import java.util.List;

/**
 * Created by Hakan on 6/30/2015.
 */
public interface Provider {

    default void transfer(final BulkService bulkService, final YamlConfiguration config, final Runnable closeConnections) {
        long count = this.getCount();
        final int limit = config.getMisc().getBatch();
        int skip = 0;

        if (count != 0 && config.getMisc().getDropDataset())
            bulkService.dropDataSet();

        while (count >= limit) {
            List content = this.buildJSONContent(skip, limit);
            bulkService.proceed(content);
            count -= limit;
            skip += limit;
        }

        if (count > 0) {
            List content = this.buildJSONContent(skip, (int) count);
            bulkService.proceed(content);
        }

        closeConnections.run();
    }

    long getCount();

    List<Document> buildJSONContent(int skip, int limit);
}


================================================
FILE: src/main/java/com/kodcu/service/BulkService.java
================================================
package com.kodcu.service;

import java.util.List;

/**
 * Created by Hakan on 6/30/2015.
 */
public interface BulkService {

    void proceed(List content);

    void dropDataSet();

    void close();
}


================================================
FILE: src/main/java/com/kodcu/service/ElasticBulkService.java
================================================
package com.kodcu.service;

import com.kodcu.config.ElasticConfiguration;
import com.kodcu.config.YamlConfiguration;
import com.kodcu.listener.BulkProcessorListener;
import com.kodcu.util.codecs.CustomDateCodec;
import com.kodcu.util.codecs.CustomLongCodec;
import com.mongodb.MongoClient;
import org.bson.Document;
import org.bson.codecs.BsonTypeClassMap;
import org.bson.codecs.Codec;
import org.bson.codecs.DocumentCodec;
import org.bson.codecs.Encoder;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by Hakan on 5/21/2015.
 */
public class ElasticBulkService implements BulkService {

    private final Logger logger = LoggerFactory.getLogger(ElasticBulkService.class);
    private final YamlConfiguration config;
    private final ElasticConfiguration client;
    private final BulkProcessor bulkProcessor;
    private final Encoder<Document> encoder;

    public ElasticBulkService(final YamlConfiguration config, final ElasticConfiguration client) {
        this.config = config;
        this.client = client;

        this.bulkProcessor = BulkProcessor.builder(client.getClient(), new BulkProcessorListener())
                .setBulkActions(config.getMisc().getBatch())
                .setFlushInterval(TimeValue.timeValueSeconds(5))
                .setBulkSize(new ByteSizeValue(1, ByteSizeUnit.GB))
                .build();

        encoder = getEncoder();
    }

    @Override
    public void proceed(List content) {
        try {
            logger.info("Transferring data began to elasticsearch.");
            final String indexName = config.getMisc().getDindex().getAs();
            final String typeName = config.getMisc().getCtype().getAs();
            for (Object o : content) {
                Document doc = (Document) o;
                Object id = doc.get("_id");
                IndexRequest indexRequest = new IndexRequest(indexName, typeName, String.valueOf(id));
                doc.remove("_id");
                indexRequest.source(doc.toJson(encoder), XContentType.JSON);
                bulkProcessor.add(indexRequest);
            }
        } catch (Exception ex) {
            logger.debug(ex.getMessage(), ex);
        }
    }

    @Override
    public void close() {
        try {
            bulkProcessor.awaitClose(10, TimeUnit.MINUTES);
        } catch (InterruptedException ex) {
            logger.error(ex.getMessage(), ex);
        }
    }

    @Override
    public void dropDataSet() {
        final String indexName = config.getMisc().getDindex().getAs();
        IndicesAdminClient admin = client.getClient().admin().indices();
        IndicesExistsRequestBuilder builder = admin.prepareExists(indexName);
        if (builder.execute().actionGet().isExists()) {
            DeleteIndexResponse delete = admin.delete(new DeleteIndexRequest(indexName)).actionGet();
            if (delete.isAcknowledged())
                logger.info(String.format("The current index %s was deleted.", indexName));
            else
                logger.info(String.format("The current index %s was not deleted.", indexName));
        }
    }

    /**
     * Customizations for the document.toJson output.
     * <p>
     * http://mongodb.github.io/mongo-java-driver/3.0/bson/codecs/
     *
     * @return the toJson encoder.
     */
    private Encoder<Document> getEncoder() {
        ArrayList<Codec<?>> codecs = new ArrayList<>();

        if (config.getElastic().getDateFormat() != null) {
            // Replace default DateCodec class to use the custom date formatter.
            codecs.add(new CustomDateCodec(config.getElastic().getDateFormat()));
        }

        if (config.getElastic().getLongToString()) {
            // Replace default LongCodec class
            codecs.add(new CustomLongCodec());
        }

        if (codecs.size() > 0) {
            BsonTypeClassMap bsonTypeClassMap = new BsonTypeClassMap();

            CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
                    CodecRegistries.fromCodecs(codecs),
                    MongoClient.getDefaultCodecRegistry());

            return new DocumentCodec(codecRegistry, bsonTypeClassMap);
        } else {
            return new DocumentCodec();
        }
    }
}


================================================
FILE: src/main/java/com/kodcu/service/MongoBulkService.java
================================================
package com.kodcu.service;

import com.kodcu.config.YamlConfiguration;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Created by Hakan on 6/29/2015.
 */
public class MongoBulkService implements BulkService {

    private final Logger logger = LoggerFactory.getLogger(MongoBulkService.class);
    private final MongoCollection<Document> collection;

    public MongoBulkService(final MongoClient client, final YamlConfiguration config) {
        this.collection = client.getDatabase(config.getMisc().getDindex().getAs()).getCollection(config.getMisc().getCtype().getAs());
    }

    @Override
    public void proceed(List content) {
        try {
            logger.info("Transferring data began to mongodb.");
            collection.insertMany((List<Document>) content);
        } catch (Exception ex) {
            logger.debug(ex.getMessage(), ex);
        }
    }

    @Override
    public void dropDataSet() {
        if (collection.count() != 0) {
            String collectionName = collection.getNamespace().getCollectionName();
            collection.drop();
            logger.info(String.format("The current collection called %s was deleted.", collectionName));
        }
    }

    @Override
    public void close() {
        //no-op
    }

}


================================================
FILE: src/main/java/com/kodcu/util/codecs/CustomDateCodec.java
================================================
package com.kodcu.util.codecs;

import org.bson.BsonWriter;
import org.bson.codecs.DateCodec;
import org.bson.codecs.EncoderContext;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author wwinder
 *         Created on: 5/27/16
 */
public class CustomDateCodec extends DateCodec {
    private final SimpleDateFormat formatter;

    public CustomDateCodec(String format) {
        formatter = new SimpleDateFormat(format);
    }

    @Override
    public void encode(final BsonWriter writer, final Date value, final EncoderContext encoderContext) {
        writer.writeString(formatter.format(value));
    }
}


================================================
FILE: src/main/java/com/kodcu/util/codecs/CustomLongCodec.java
================================================
package com.kodcu.util.codecs;

import org.bson.BsonWriter;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.LongCodec;

/**
 * @author wwinder
 *         Created on: 5/27/16
 */
public class CustomLongCodec extends LongCodec {
    @Override
    public void encode(final BsonWriter writer, final Long value, final EncoderContext encoderContext) {
        writer.writeString(value.toString());
    }
}


================================================
FILE: src/main/resources/log4j2.properties
================================================
name=PropertiesConfig
property.filename = mongolastic
appenders = console, file

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] [%d{yyyy-MM-dd HH:mm:ss}] [%t] [%p]: - %msg%n
appender.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=mongolastic.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] [%d{yyyy-MM-dd HH:mm:ss}] [%t] [%p]: - %msg%n

loggers=file
logger.file.name=guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE

rootLogger.level = info
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

================================================
FILE: src/test/java/com/kodcu/test/TestMongoToElastic.java
================================================
package com.kodcu.test;

import com.kodcu.config.ElasticConfiguration;
import com.kodcu.config.FileConfiguration;
import com.kodcu.config.MongoConfiguration;
import com.kodcu.config.YamlConfiguration;
import com.kodcu.provider.ElasticToMongoProvider;
import com.kodcu.provider.MongoToElasticProvider;
import com.kodcu.provider.Provider;
import com.kodcu.service.BulkService;
import com.kodcu.service.ElasticBulkService;
import com.kodcu.service.MongoBulkService;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
import org.elasticsearch.action.admin.indices.flush.FlushRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.IndicesAdminClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Objects;

import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

/**
 * Created by Hakan on 9/8/2015.
 */
@RunWith(Parameterized.class)
public class TestMongoToElastic {

    private final FileConfiguration file;

    public TestMongoToElastic(final FileConfiguration file) {
        super();
        this.file = file;
    }

    @Parameterized.Parameters(name = "{index}: ({0})={1}")
    public static Iterable<Object[]> queries() throws Exception {
        String query = "misc:\n" +
                "    dindex:\n" +
                "        name: twitter\n" +
                "    ctype:\n" +
                "        name: tweets\n" +
                "    batch: 500\n" +
                "mongo:\n" +
                "    host: mongo\n" +
                "    port: 27017\n" +
                "elastic:\n" +
                "    host: es\n" +
                "    port: 9300";
        return Arrays.asList(new Object[][]{
                {new FileConfiguration("src/test/resources/conf1")},
                {new FileConfiguration("src/test/resources/conf3")},
                {new FileConfiguration(query)}
        });
    }

    @Test
    public void shouldCopyOneQueryToEsFromMongoDB() {
        YamlConfiguration config = file.getFileContent();
        assertThat(config, is(notNullValue()));

        if (Objects.isNull(config.getMongo().getAuth()))
            if (Objects.nonNull(System.getenv("MONGO_IP")))
                config.getMongo().setHost(System.getenv("MONGO_IP"));
            else
                config.getMongo().setHost("localhost");
        else {
            if (Objects.nonNull(System.getenv("MONGO_AUTH_IP")))
                config.getMongo().setHost(System.getenv("MONGO_AUTH_IP"));
            else
                return;
        }

        if (Objects.isNull(System.getenv("ES_IP")))
            config.getElastic().setHost("localhost");
        else
            config.getElastic().setHost(System.getenv("ES_IP"));


        ElasticConfiguration elastic = new ElasticConfiguration(config);
        MongoConfiguration mongo = new MongoConfiguration(config);

        BulkService bulkService = this.initializeBulkService(config, mongo, elastic);
        assertThat(bulkService, is(instanceOf(ElasticBulkService.class)));

        Provider provider = this.initializeProvider(config, mongo, elastic);
        assertThat(provider, is(instanceOf(MongoToElasticProvider.class)));

        provider.transfer(bulkService, config, () -> {
            bulkService.close();
            assertThat(provider.getCount(), equalTo(this.getCount(elastic, config)));
            elastic.closeNode();
            mongo.closeConnection();
        });
    }

    private Provider initializeProvider(YamlConfiguration config, MongoConfiguration mongo, ElasticConfiguration elastic) {
        if (config.getMisc().getDirection().equals("em")) {
            return new ElasticToMongoProvider(elastic, config);
        }
        return new MongoToElasticProvider(mongo.getMongoCollection(), config);
    }

    private BulkService initializeBulkService(YamlConfiguration config, MongoConfiguration mongo, ElasticConfiguration elastic) {
        if (config.getMisc().getDirection().equals("em")) {
            return new MongoBulkService(mongo.getClient(), config);
        }
        return new ElasticBulkService(config, elastic);
    }

    public long getCount(ElasticConfiguration elastic, YamlConfiguration config) {
        IndicesAdminClient admin = elastic.getClient().admin().indices();
        IndicesExistsRequestBuilder builder = admin.prepareExists(config.getMisc().getDindex().getAs());
        assertThat(builder.execute().actionGet().isExists(), is(true));

        elastic.getClient().admin().indices().flush(new FlushRequest(config.getMisc().getDindex().getAs())).actionGet();

        SearchResponse response = elastic.getClient().prepareSearch(config.getMisc().getDindex().getAs())
                .setTypes(config.getMisc().getCtype().getAs())
                .setSearchType(SearchType.QUERY_THEN_FETCH)
                .setSize(0)
                .execute().actionGet();
        long count = response.getHits().getTotalHits();
        return count;
    }
}


================================================
FILE: src/test/java/com/kodcu/test/TestMongolasticQueries.java
================================================
package com.kodcu.test;

import com.kodcu.config.FileConfiguration;
import com.kodcu.config.YamlConfiguration;
import com.kodcu.config.structure.Elastic;
import com.kodcu.config.structure.Misc;
import com.kodcu.config.structure.Mongo;
import com.kodcu.config.structure.Namespace;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

/**
 * Created by Hakan on 8/24/2015.
 */
@RunWith(Parameterized.class)
public class TestMongolasticQueries {

    private final FileConfiguration config;
    private final YamlConfiguration expected;

    public TestMongolasticQueries(final FileConfiguration config, final YamlConfiguration expected) {
        super();
        this.config = config;
        this.expected = expected;
    }

    @Parameterized.Parameters(name = "{index}: ({0})={1}")
    public static Iterable<Object[]> queries() throws Exception {
        return Arrays.asList(new Object[][]{
                {new FileConfiguration("src/test/resources/conf1"), createQueryConfiguration1()},
                {new FileConfiguration("src/test/resources/conf2"), createQueryConfiguration2()}
        });
    }

    private static YamlConfiguration createQueryConfiguration1() {
        YamlConfiguration query = new YamlConfiguration();

        Misc misc = new Misc();
        Namespace db = new Namespace();
        db.setName("twitter");
        db.setAs("kodcu");
        misc.setDindex(db);
        Namespace c = new Namespace();
        c.setName("tweets");
        c.setAs("tweets");
        misc.setCtype(c);
        misc.setBatch(300);
        query.setMisc(misc);

        Mongo mongod = new Mongo();
        mongod.setHost("mongo");
        mongod.setPort(27017);
        mongod.setQuery("{}");
        query.setMongo(mongod);

        Elastic es = new Elastic();
        es.setHost("es");
        es.setPort(9300);
        query.setElastic(es);
        return query;
    }

    private static YamlConfiguration createQueryConfiguration2() {
        YamlConfiguration query = new YamlConfiguration();

        Misc misc = new Misc();
        Namespace db = new Namespace();
        db.setName("twitter");
        db.setAs("twitter");
        misc.setDindex(db);
        Namespace c = new Namespace();
        c.setName("tweets");
        c.setAs("posts");
        misc.setCtype(c);
        misc.setDirection("em");
        misc.setBatch(200);
        query.setMisc(misc);

        Mongo mongod = new Mongo();
        mongod.setHost("127.0.0.1");
        mongod.setPort(27017);
        query.setMongo(mongod);

        Elastic es = new Elastic();
        es.setHost("127.0.0.1");
        es.setPort(9300);
        query.setElastic(es);
        return query;
    }

    @Test
    public void shouldProceedQueries() {
        YamlConfiguration actual = config.getFileContent();
        assertThat(actual, notNullValue());
        assertThat(actual.getMongo().getQuery(), is(expected.getMongo().getQuery()));
        assertThat(actual.getMongo().getHost(), is(expected.getMongo().getHost()));
        assertThat(actual.getMongo().getPort(), is(expected.getMongo().getPort()));
        assertThat(actual.getElastic().getHost(), is(expected.getElastic().getHost()));
        assertThat(actual.getElastic().getPort(), is(expected.getElastic().getPort()));
        assertThat(actual.getMisc().getDindex().getName(), is(expected.getMisc().getDindex().getName()));
        assertThat(actual.getMisc().getDindex().getAs(), is(expected.getMisc().getDindex().getAs()));
        assertThat(actual.getMisc().getCtype().getName(), is(expected.getMisc().getCtype().getName()));
        assertThat(actual.getMisc().getCtype().getAs(), is(expected.getMisc().getCtype().getAs()));
    }
}


================================================
FILE: src/test/resources/conf1
================================================
misc:
    dindex:
        name: twitter
        as: kodcu
    ctype:
        name: tweets
        as: tweets
    batch: 300
#    direction: me
mongo:
    host: mongo
    port: 27017
elastic:
    host: es
    port: 9300

================================================
FILE: src/test/resources/conf2
================================================
{
	"misc": {
		"dindex": {
			"name": "twitter"
		},
		"ctype": {
			"name": "tweets",
			"as": "posts"
		},
		"direction": "em"
	},
	"mongo": {
		"host": "127.0.0.1",
		"port": 27017
	},
	"elastic": {
		"host": "127.0.0.1",
		"port": 9300
	}
}

================================================
FILE: src/test/resources/conf3
================================================
misc:
    dindex:
        name: twitter
        as: twt
    ctype:
        name: tweets
        as: posts
    batch: 500
#    direction: me
mongo:
    host: mongo_auth
    port: 27017
    auth:
        user: hakan
        pwd: "1234"
        source: admin
        mechanism: scram-sha-1
elastic:
    host: es
    port: 9300
Download .txt
gitextract_t9r72zye/

├── .gitignore
├── .travis.yml
├── Contributors.adoc
├── Dockerfile
├── LICENSE
├── README.adoc
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── kodcu/
    │   │           ├── config/
    │   │           │   ├── ElasticConfiguration.java
    │   │           │   ├── FileConfiguration.java
    │   │           │   ├── MongoConfiguration.java
    │   │           │   ├── YamlConfiguration.java
    │   │           │   └── structure/
    │   │           │       ├── Auth.java
    │   │           │       ├── Elastic.java
    │   │           │       ├── Misc.java
    │   │           │       ├── Mongo.java
    │   │           │       └── Namespace.java
    │   │           ├── listener/
    │   │           │   └── BulkProcessorListener.java
    │   │           ├── main/
    │   │           │   └── Mongolastic.java
    │   │           ├── provider/
    │   │           │   ├── ElasticToMongoProvider.java
    │   │           │   ├── MongoToElasticProvider.java
    │   │           │   └── Provider.java
    │   │           ├── service/
    │   │           │   ├── BulkService.java
    │   │           │   ├── ElasticBulkService.java
    │   │           │   └── MongoBulkService.java
    │   │           └── util/
    │   │               └── codecs/
    │   │                   ├── CustomDateCodec.java
    │   │                   └── CustomLongCodec.java
    │   └── resources/
    │       └── log4j2.properties
    └── test/
        ├── java/
        │   └── com/
        │       └── kodcu/
        │           └── test/
        │               ├── TestMongoToElastic.java
        │               └── TestMongolasticQueries.java
        └── resources/
            ├── conf1
            ├── conf2
            └── conf3
Download .txt
SYMBOL INDEX (140 symbols across 21 files)

FILE: src/main/java/com/kodcu/config/ElasticConfiguration.java
  class ElasticConfiguration (line 19) | public class ElasticConfiguration {
    method ElasticConfiguration (line 25) | public ElasticConfiguration(final YamlConfiguration config) {
    method prepareClient (line 30) | private void prepareClient() {
    method applySettings (line 44) | private Builder applySettings() {
    method closeNode (line 65) | public void closeNode() {
    method getClient (line 69) | public Client getClient() {

FILE: src/main/java/com/kodcu/config/FileConfiguration.java
  class FileConfiguration (line 16) | public class FileConfiguration {
    method FileConfiguration (line 21) | public FileConfiguration(String parameter) {
    method getFileContent (line 25) | public YamlConfiguration getFileContent() {
    method controlAsSettings (line 52) | private YamlConfiguration controlAsSettings(YamlConfiguration config) {

FILE: src/main/java/com/kodcu/config/MongoConfiguration.java
  class MongoConfiguration (line 22) | public class MongoConfiguration {
    method MongoConfiguration (line 28) | public MongoConfiguration(final YamlConfiguration config) {
    method prepareClient (line 33) | private void prepareClient() {
    method connectToClient (line 50) | private MongoClient connectToClient(ServerAddress address, MongoClient...
    method findMongoCredential (line 66) | private MongoCredential findMongoCredential(String user, String databa...
    method getMongoCollection (line 91) | public MongoCollection<Document> getMongoCollection() {
    method closeConnection (line 102) | public void closeConnection() {
    method getClient (line 107) | public MongoClient getClient() {

FILE: src/main/java/com/kodcu/config/YamlConfiguration.java
  class YamlConfiguration (line 10) | public class YamlConfiguration {
    method getElastic (line 16) | public Elastic getElastic() {
    method setElastic (line 20) | public void setElastic(Elastic elastic) {
    method getMisc (line 24) | public Misc getMisc() {
    method setMisc (line 28) | public void setMisc(Misc misc) {
    method getMongo (line 32) | public Mongo getMongo() {
    method setMongo (line 36) | public void setMongo(Mongo mongo) {
    method toString (line 40) | @Override

FILE: src/main/java/com/kodcu/config/structure/Auth.java
  class Auth (line 6) | public class Auth {
    method getUser (line 13) | public String getUser() {
    method setUser (line 17) | public void setUser(String user) {
    method getPwd (line 21) | public String getPwd() {
    method setPwd (line 25) | public void setPwd(String pwd) {
    method getSource (line 29) | public String getSource() {
    method setSource (line 33) | public void setSource(String source) {
    method getMechanism (line 37) | public String getMechanism() {
    method setMechanism (line 41) | public void setMechanism(String mechanism) {
    method toString (line 45) | @Override

FILE: src/main/java/com/kodcu/config/structure/Elastic.java
  class Elastic (line 6) | public class Elastic {
    method getAuth (line 15) | public Auth getAuth() {
    method setAuth (line 19) | public void setAuth(Auth auth) {
    method getClusterName (line 23) | public String getClusterName() {
    method setClusterName (line 27) | public void setClusterName(String clusterName) {
    method getHost (line 31) | public String getHost() {
    method setHost (line 35) | public void setHost(String host) {
    method getPort (line 39) | public int getPort() {
    method setPort (line 43) | public void setPort(int port) {
    method getDateFormat (line 47) | public String getDateFormat() {
    method setDateFormat (line 51) | public void setDateFormat(String dateFormat) {
    method getLongToString (line 55) | public Boolean getLongToString() {
    method setLongToString (line 59) | public void setLongToString(Boolean longToString) {
    method toString (line 63) | @Override
    method equals (line 75) | @Override
    method hashCode (line 87) | @Override

FILE: src/main/java/com/kodcu/config/structure/Misc.java
  class Misc (line 6) | public class Misc {
    method getBatch (line 14) | public int getBatch() {
    method setBatch (line 18) | public void setBatch(int batch) {
    method getCtype (line 22) | public Namespace getCtype() {
    method setCtype (line 26) | public void setCtype(Namespace ctype) {
    method getDirection (line 30) | public String getDirection() {
    method setDirection (line 34) | public void setDirection(String direction) {
    method getDindex (line 38) | public Namespace getDindex() {
    method setDindex (line 42) | public void setDindex(Namespace dindex) {
    method getDropDataset (line 46) | public Boolean getDropDataset() {
    method setDropDataset (line 50) | public void setDropDataset(Boolean dropDataset) {
    method toString (line 54) | @Override

FILE: src/main/java/com/kodcu/config/structure/Mongo.java
  class Mongo (line 6) | public class Mongo {
    method toString (line 14) | @Override
    method getProject (line 25) | public String getProject() {
    method setProject (line 29) | public void setProject(String project) {
    method getAuth (line 33) | public Auth getAuth() {
    method setAuth (line 37) | public void setAuth(Auth auth) {
    method getQuery (line 41) | public String getQuery() {
    method setQuery (line 45) | public void setQuery(String query) {
    method getPort (line 49) | public int getPort() {
    method setPort (line 53) | public void setPort(int port) {
    method getHost (line 57) | public String getHost() {
    method setHost (line 61) | public void setHost(String host) {

FILE: src/main/java/com/kodcu/config/structure/Namespace.java
  class Namespace (line 6) | public class Namespace {
    method getAs (line 10) | public String getAs() {
    method setAs (line 14) | public void setAs(String as) {
    method getName (line 18) | public String getName() {
    method setName (line 22) | public void setName(String name) {
    method toString (line 26) | @Override

FILE: src/main/java/com/kodcu/listener/BulkProcessorListener.java
  class BulkProcessorListener (line 12) | public class BulkProcessorListener implements BulkProcessor.Listener {
    method beforeBulk (line 16) | @Override
    method afterBulk (line 20) | @Override
    method afterBulk (line 30) | @Override

FILE: src/main/java/com/kodcu/main/Mongolastic.java
  class Mongolastic (line 21) | public class Mongolastic {
    method Mongolastic (line 26) | public Mongolastic(String parameter) {
    method main (line 30) | public static void main(String[] args) throws Exception {
    method configAssertion (line 38) | private static void configAssertion(String[] args) {
    method start (line 53) | public void start() {
    method proceedService (line 64) | public void proceedService(YamlConfiguration config) {
    method initializeProvider (line 76) | private Provider initializeProvider(YamlConfiguration config, MongoCon...
    method initializeBulkService (line 83) | private BulkService initializeBulkService(YamlConfiguration config, Mo...

FILE: src/main/java/com/kodcu/provider/ElasticToMongoProvider.java
  class ElasticToMongoProvider (line 22) | public class ElasticToMongoProvider implements Provider {
    method ElasticToMongoProvider (line 29) | public ElasticToMongoProvider(final ElasticConfiguration elastic, fina...
    method getCount (line 34) | @Override
    method buildJSONContent (line 55) | @Override

FILE: src/main/java/com/kodcu/provider/MongoToElasticProvider.java
  class MongoToElasticProvider (line 21) | public class MongoToElasticProvider implements Provider {
    method MongoToElasticProvider (line 29) | public MongoToElasticProvider(final MongoCollection<Document> collecti...
    method getCount (line 34) | @Override
    method buildJSONContent (line 45) | @Override
    method getCursor (line 60) | private MongoCursor<Document> getCursor(int skip) {

FILE: src/main/java/com/kodcu/provider/Provider.java
  type Provider (line 13) | public interface Provider {
    method transfer (line 15) | default void transfer(final BulkService bulkService, final YamlConfigu...
    method getCount (line 38) | long getCount();
    method buildJSONContent (line 40) | List<Document> buildJSONContent(int skip, int limit);

FILE: src/main/java/com/kodcu/service/BulkService.java
  type BulkService (line 8) | public interface BulkService {
    method proceed (line 10) | void proceed(List content);
    method dropDataSet (line 12) | void dropDataSet();
    method close (line 14) | void close();

FILE: src/main/java/com/kodcu/service/ElasticBulkService.java
  class ElasticBulkService (line 36) | public class ElasticBulkService implements BulkService {
    method ElasticBulkService (line 44) | public ElasticBulkService(final YamlConfiguration config, final Elasti...
    method proceed (line 57) | @Override
    method close (line 76) | @Override
    method dropDataSet (line 85) | @Override
    method getEncoder (line 106) | private Encoder<Document> getEncoder() {

FILE: src/main/java/com/kodcu/service/MongoBulkService.java
  class MongoBulkService (line 15) | public class MongoBulkService implements BulkService {
    method MongoBulkService (line 20) | public MongoBulkService(final MongoClient client, final YamlConfigurat...
    method proceed (line 24) | @Override
    method dropDataSet (line 34) | @Override
    method close (line 43) | @Override

FILE: src/main/java/com/kodcu/util/codecs/CustomDateCodec.java
  class CustomDateCodec (line 14) | public class CustomDateCodec extends DateCodec {
    method CustomDateCodec (line 17) | public CustomDateCodec(String format) {
    method encode (line 21) | @Override

FILE: src/main/java/com/kodcu/util/codecs/CustomLongCodec.java
  class CustomLongCodec (line 11) | public class CustomLongCodec extends LongCodec {
    method encode (line 12) | @Override

FILE: src/test/java/com/kodcu/test/TestMongoToElastic.java
  class TestMongoToElastic (line 32) | @RunWith(Parameterized.class)
    method TestMongoToElastic (line 37) | public TestMongoToElastic(final FileConfiguration file) {
    method queries (line 42) | @Parameterized.Parameters(name = "{index}: ({0})={1}")
    method shouldCopyOneQueryToEsFromMongoDB (line 63) | @Test
    method initializeProvider (line 103) | private Provider initializeProvider(YamlConfiguration config, MongoCon...
    method initializeBulkService (line 110) | private BulkService initializeBulkService(YamlConfiguration config, Mo...
    method getCount (line 117) | public long getCount(ElasticConfiguration elastic, YamlConfiguration c...

FILE: src/test/java/com/kodcu/test/TestMongolasticQueries.java
  class TestMongolasticQueries (line 22) | @RunWith(Parameterized.class)
    method TestMongolasticQueries (line 28) | public TestMongolasticQueries(final FileConfiguration config, final Ya...
    method queries (line 34) | @Parameterized.Parameters(name = "{index}: ({0})={1}")
    method createQueryConfiguration1 (line 42) | private static YamlConfiguration createQueryConfiguration1() {
    method createQueryConfiguration2 (line 70) | private static YamlConfiguration createQueryConfiguration2() {
    method shouldProceedQueries (line 98) | @Test
Condensed preview — 32 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (69K chars).
[
  {
    "path": ".gitignore",
    "chars": 108,
    "preview": "!.gitignore\n*.iml\ntarget\n.idea\n*.log\n\n*.class\n/.classpath\n/.project\n/.settings\n\ndependency-reduced-pom.xml\n\n"
  },
  {
    "path": ".travis.yml",
    "chars": 2253,
    "preview": "sudo: required\nnotifications:\n  email: false\nlanguage: java\njdk:\n- oraclejdk8\nos:\n- linux\nservices:\n- docker\nenv:\n- MONG"
  },
  {
    "path": "Contributors.adoc",
    "chars": 221,
    "preview": "== Contributors\n\nThank you for our contributors to make this project more usable! ✨\n\n* https://github.com/hakdogan[Hüsey"
  },
  {
    "path": "Dockerfile",
    "chars": 151,
    "preview": "FROM openjdk:8-jdk-alpine\nMAINTAINER Hakan Ozler <ozler.hakan@gmail.com>\nADD target/mongolastic.jar .\nENTRYPOINT [\"java\""
  },
  {
    "path": "LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2016 Kodcu.com\n\nPermission is hereby granted, free of charge, to any person ob"
  },
  {
    "path": "README.adoc",
    "chars": 7965,
    "preview": "= Mongolastic\n:version: v1.4.3\n\nimage:https://travis-ci.org/ozlerhakan/mongolastic.svg?branch=master[\"Build Status\", lin"
  },
  {
    "path": "pom.xml",
    "chars": 7008,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xmlns=\"ht"
  },
  {
    "path": "src/main/java/com/kodcu/config/ElasticConfiguration.java",
    "chars": 2487,
    "preview": "package com.kodcu.config;\n\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\nimport java.util.Objects;\n"
  },
  {
    "path": "src/main/java/com/kodcu/config/FileConfiguration.java",
    "chars": 2305,
    "preview": "package com.kodcu.config;\r\n\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\nimport org.slf4j.Logger;\r\nimport org.s"
  },
  {
    "path": "src/main/java/com/kodcu/config/MongoConfiguration.java",
    "chars": 4024,
    "preview": "package com.kodcu.config;\r\n\r\nimport com.mongodb.MongoClient;\r\nimport com.mongodb.MongoClientOptions;\r\nimport com.mongodb"
  },
  {
    "path": "src/main/java/com/kodcu/config/YamlConfiguration.java",
    "chars": 921,
    "preview": "package com.kodcu.config;\n\nimport com.kodcu.config.structure.Elastic;\nimport com.kodcu.config.structure.Misc;\nimport com"
  },
  {
    "path": "src/main/java/com/kodcu/config/structure/Auth.java",
    "chars": 929,
    "preview": "package com.kodcu.config.structure;\n\n/**\n * Created by Hakan on 5/14/2016.\n */\npublic class Auth {\n\n    private String u"
  },
  {
    "path": "src/main/java/com/kodcu/config/structure/Elastic.java",
    "chars": 2064,
    "preview": "package com.kodcu.config.structure;\n\n/**\n * Created by Hakan on 1/16/2016.\n */\npublic class Elastic {\n\n    private Strin"
  },
  {
    "path": "src/main/java/com/kodcu/config/structure/Misc.java",
    "chars": 1337,
    "preview": "package com.kodcu.config.structure;\n\n/**\n * Created by Hakan on 1/16/2016.\n */\npublic class Misc {\n\n    private String d"
  },
  {
    "path": "src/main/java/com/kodcu/config/structure/Mongo.java",
    "chars": 1202,
    "preview": "package com.kodcu.config.structure;\n\n/**\n * Created by Hakan on 1/16/2016.\n */\npublic class Mongo {\n\n    private String "
  },
  {
    "path": "src/main/java/com/kodcu/config/structure/Namespace.java",
    "chars": 585,
    "preview": "package com.kodcu.config.structure;\n\n/**\n * Created by Hakan on 1/16/2016.\n */\npublic class Namespace {\n    private Stri"
  },
  {
    "path": "src/main/java/com/kodcu/listener/BulkProcessorListener.java",
    "chars": 1103,
    "preview": "package com.kodcu.listener;\n\nimport org.elasticsearch.action.bulk.BulkProcessor;\nimport org.elasticsearch.action.bulk.Bu"
  },
  {
    "path": "src/main/java/com/kodcu/main/Mongolastic.java",
    "chars": 3221,
    "preview": "package com.kodcu.main;\n\nimport com.kodcu.config.ElasticConfiguration;\nimport com.kodcu.config.FileConfiguration;\nimport"
  },
  {
    "path": "src/main/java/com/kodcu/provider/ElasticToMongoProvider.java",
    "chars": 2915,
    "preview": "package com.kodcu.provider;\n\nimport com.kodcu.config.ElasticConfiguration;\nimport com.kodcu.config.YamlConfiguration;\nim"
  },
  {
    "path": "src/main/java/com/kodcu/provider/MongoToElasticProvider.java",
    "chars": 2801,
    "preview": "package com.kodcu.provider;\n\nimport com.kodcu.config.YamlConfiguration;\nimport com.mongodb.client.AggregateIterable;\nimp"
  },
  {
    "path": "src/main/java/com/kodcu/provider/Provider.java",
    "chars": 1046,
    "preview": "package com.kodcu.provider;\n\n\nimport com.kodcu.config.YamlConfiguration;\nimport com.kodcu.service.BulkService;\nimport or"
  },
  {
    "path": "src/main/java/com/kodcu/service/BulkService.java",
    "chars": 204,
    "preview": "package com.kodcu.service;\n\nimport java.util.List;\n\n/**\n * Created by Hakan on 6/30/2015.\n */\npublic interface BulkServi"
  },
  {
    "path": "src/main/java/com/kodcu/service/ElasticBulkService.java",
    "chars": 5025,
    "preview": "package com.kodcu.service;\n\nimport com.kodcu.config.ElasticConfiguration;\nimport com.kodcu.config.YamlConfiguration;\nimp"
  },
  {
    "path": "src/main/java/com/kodcu/service/MongoBulkService.java",
    "chars": 1398,
    "preview": "package com.kodcu.service;\n\nimport com.kodcu.config.YamlConfiguration;\nimport com.mongodb.MongoClient;\nimport com.mongod"
  },
  {
    "path": "src/main/java/com/kodcu/util/codecs/CustomDateCodec.java",
    "chars": 628,
    "preview": "package com.kodcu.util.codecs;\n\nimport org.bson.BsonWriter;\nimport org.bson.codecs.DateCodec;\nimport org.bson.codecs.Enc"
  },
  {
    "path": "src/main/java/com/kodcu/util/codecs/CustomLongCodec.java",
    "chars": 414,
    "preview": "package com.kodcu.util.codecs;\n\nimport org.bson.BsonWriter;\nimport org.bson.codecs.EncoderContext;\nimport org.bson.codec"
  },
  {
    "path": "src/main/resources/log4j2.properties",
    "chars": 775,
    "preview": "name=PropertiesConfig\nproperty.filename = mongolastic\nappenders = console, file\n\nappender.console.type = Console\nappende"
  },
  {
    "path": "src/test/java/com/kodcu/test/TestMongoToElastic.java",
    "chars": 5177,
    "preview": "package com.kodcu.test;\n\nimport com.kodcu.config.ElasticConfiguration;\nimport com.kodcu.config.FileConfiguration;\nimport"
  },
  {
    "path": "src/test/java/com/kodcu/test/TestMongolasticQueries.java",
    "chars": 3890,
    "preview": "package com.kodcu.test;\n\nimport com.kodcu.config.FileConfiguration;\nimport com.kodcu.config.YamlConfiguration;\nimport co"
  },
  {
    "path": "src/test/resources/conf1",
    "chars": 218,
    "preview": "misc:\n    dindex:\n        name: twitter\n        as: kodcu\n    ctype:\n        name: tweets\n        as: tweets\n    batch: "
  },
  {
    "path": "src/test/resources/conf2",
    "chars": 244,
    "preview": "{\n\t\"misc\": {\n\t\t\"dindex\": {\n\t\t\t\"name\": \"twitter\"\n\t\t},\n\t\t\"ctype\": {\n\t\t\t\"name\": \"tweets\",\n\t\t\t\"as\": \"posts\"\n\t\t},\n\t\t\"directio"
  },
  {
    "path": "src/test/resources/conf3",
    "chars": 323,
    "preview": "misc:\n    dindex:\n        name: twitter\n        as: twt\n    ctype:\n        name: tweets\n        as: posts\n    batch: 500"
  }
]

About this extraction

This page contains the full source code of the ozlerhakan/mongolastic GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 32 files (62.5 KB), approximately 15.8k tokens, and a symbol index with 140 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!