package com.example.email;

import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.query.ContinuousQuery;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.ClientCacheConfiguration;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;

import javax.cache.event.CacheEntryEvent;
import javax.cache.event.CacheEntryListenerException;
import javax.cache.event.CacheEntryUpdatedListener;
import javax.cache.expiry.Duration;
import javax.cache.expiry.ExpiryPolicy;
import javax.cache.expiry.ModifiedExpiryPolicy;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;

public class ThinClientExample {
    public static void main(String[] args) {
        // Cache Cfg
        ClientCacheConfiguration cacheConfiguration = new ClientCacheConfiguration().setName("test");
        cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);
        cacheConfiguration.setBackups(3);

        // Continuous Query
        String addr = "127.0.0.1:10800";

        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setAddresses(addr);
        clientConfiguration.setBinaryConfiguration(new BinaryConfiguration().setCompactFooter(true));

        IgniteClient client1 = Ignition.startClient(clientConfiguration);

        ClientCache<Object, Object> cache = client1.getOrCreateCache(cacheConfiguration);

        ContinuousQuery<Object, Object> query = new ContinuousQuery<>();
        query.setLocalListener(new CacheEntryUpdatedListener<Object, Object>() {
            @Override
            public void onUpdated(Iterable<CacheEntryEvent<?, ?>> cacheEntryEvents) throws CacheEntryListenerException {
                Iterator<CacheEntryEvent<?, ?>> iterator = cacheEntryEvents.iterator();
                while (iterator.hasNext()) {
                    CacheEntryEvent<?, ?> next = iterator.next();
                    // process
                }
            }
        });

        cache.query(query);

        // Cache Opt
        IgniteClient client2 = Ignition.startClient(clientConfiguration);

        ClientCache<Object, Object> cache2 = client2.getOrCreateCache(cacheConfiguration);

        Duration duration = new Duration(TimeUnit.SECONDS, 10);
        ExpiryPolicy expiryPolicy = ModifiedExpiryPolicy.factoryOf(duration).create();

        // A large number of operations similar to this
        cache2.withExpiryPolicy(expiryPolicy).put("test", "test");
    }
}
