You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dm...@apache.org on 2017/04/11 20:55:37 UTC

ignite git commit: IGNITE-1192: removed key-value based implementation, the tests are passing

Repository: ignite
Updated Branches:
  refs/heads/ignite-1192 423709fb1 -> 2fded40c5


IGNITE-1192: removed key-value based implementation, the tests are passing


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2fded40c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2fded40c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2fded40c

Branch: refs/heads/ignite-1192
Commit: 2fded40c53077a1bfb5b9048c92445fb0835d7bc
Parents: 423709f
Author: Denis Magda <dm...@gridgain.com>
Authored: Tue Apr 11 13:55:32 2017 -0700
Committer: Denis Magda <dm...@gridgain.com>
Committed: Tue Apr 11 13:55:32 2017 -0700

----------------------------------------------------------------------
 modules/spring-data/pom.xml                     |  15 +-
 .../springdata/IgniteKeyValueAdapter.java       | 206 -------------------
 .../springdata/repository/IgniteRepository.java |  17 +-
 .../config/EnableIgniteRepositories.java        |  19 +-
 .../IgniteRepositoryConfigurationExtension.java |   9 +-
 .../support/IgniteRepositoryFactory.java        | 106 +++++-----
 .../support/IgniteRepositoryFactoryBean.java    |  66 ++++--
 .../support/IgniteRepositoryImpl.java           | 160 ++++++++++++++
 .../support/SimpleIgniteRepository.java         |  64 ------
 .../springdata/IgniteSpringDataTestSuite.java   |  38 ----
 .../misc/ApplicationConfiguration.java          |  13 --
 .../testsuites/IgniteSpringDataTestSuite.java   |  39 ++++
 12 files changed, 320 insertions(+), 432 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/pom.xml
----------------------------------------------------------------------
diff --git a/modules/spring-data/pom.xml b/modules/spring-data/pom.xml
index 5954760..4d8107b 100644
--- a/modules/spring-data/pom.xml
+++ b/modules/spring-data/pom.xml
@@ -20,7 +20,8 @@
 <!--
     POM file.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         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>
 
     <parent>
@@ -55,15 +56,15 @@
         </dependency>
 
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-core</artifactId>
-            <version>4.3.7.RELEASE</version>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-commons</artifactId>
+            <version>1.12.2.RELEASE</version>
         </dependency>
 
         <dependency>
-            <groupId>org.springframework.data</groupId>
-            <artifactId>spring-data-keyvalue</artifactId>
-            <version>${spring.data.version}</version>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-spring</artifactId>
+            <version>${project.version}</version>
         </dependency>
 
         <dependency>

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
deleted file mode 100644
index ff5b727..0000000
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/IgniteKeyValueAdapter.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.springdata;
-
-import java.io.Serializable;
-import java.util.AbstractMap;
-import java.util.Iterator;
-import java.util.Map;
-import javax.cache.Cache;
-import javax.cache.processor.EntryProcessor;
-import javax.cache.processor.EntryProcessorException;
-import javax.cache.processor.MutableEntry;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.Ignition;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.springframework.data.keyvalue.core.AbstractKeyValueAdapter;
-import org.springframework.data.util.CloseableIterator;
-
-/**
- * Ignite's Spring Data Key-Value adapter implementation.
- */
-public class IgniteKeyValueAdapter extends AbstractKeyValueAdapter {
-    /** */
-    private final Ignite ignite;
-
-    /**
-     * Instantiates {@code IgniteKeyValueAdapter} spawning an Apache Ignite client node with default
-     * configuration parameters. The node will use the multicast protocol to discover an existing Apache Ignite
-     * cluster and will connect to it if any.
-     */
-    public IgniteKeyValueAdapter() {
-        IgniteConfiguration cfg = new IgniteConfiguration();
-
-        cfg.setClientMode(true);
-
-        ignite = Ignition.start(cfg);
-    }
-
-    /**
-     * Instantiates {@code IgniteKeyValueAdapter} with already running Apache Ignite node.
-     *
-     * @param ignite Apache Ignite node.
-     */
-    public IgniteKeyValueAdapter(Ignite ignite) {
-        this.ignite = ignite;
-    }
-
-    /**
-     * Instantiates {@code IgniteKeyValueAdapter} spawning an Apache Ignite node with the Spring XML configuration
-     * under {@code springCfgPath}.
-     *
-     * @param springCfgPath A path to Spring XML configuration.
-     */
-    public IgniteKeyValueAdapter(String springCfgPath) {
-        ignite = Ignition.start(springCfgPath);
-    }
-
-    /**
-     * Instantiates {@code IgniteKeyValueAdapter} spawning an Apache Ignite node with provided
-     * {@code IgniteConfiguration}.
-     *
-     * @param cfg Ignite configuration.
-     */
-    public IgniteKeyValueAdapter(IgniteConfiguration cfg) {
-        ignite = Ignition.start(cfg);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Object put(Serializable id, Object item, Serializable keyspace) {
-        return cache(keyspace).getAndPut(id, item);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean contains(Serializable id, Serializable keyspace) {
-        return cache(keyspace).containsKey(id);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Object get(Serializable id, Serializable keyspace) {
-        return cache(keyspace).get(id);
-    }
-
-    /** {@inheritDoc} */
-    @Override public Object delete(Serializable id, Serializable keyspace) {
-        return cache(keyspace).invoke(id, new RemoveEntryProcessor());
-    }
-
-    /** {@inheritDoc} */
-    @Override public Iterable<?> getAllOf(Serializable keyspace) {
-        return new Iterable<Object>() {
-            @Override public Iterator<Object> iterator() {
-                return new CloseableIterator<Object>() {
-                    Iterator<Cache.Entry<Serializable, Object>> iter = cache(keyspace).iterator();
-
-                    @Override public boolean hasNext() {
-                        return iter.hasNext();
-                    }
-
-                    @Override public Object next() {
-                        Cache.Entry<Serializable, Object> entry = iter.next();
-
-                        assert entry != null;
-
-                        return entry.getValue();
-                    }
-
-                    @Override public void close() {
-                        // Ignite's internal iterator is referenced by a weak reference. Releasing it.
-                        iter = null;
-                    }
-                };
-            }
-        };
-    }
-
-    /** {@inheritDoc} */
-    @Override public CloseableIterator<Map.Entry<Serializable, Object>> entries(Serializable keyspace) {
-        return new CloseableIterator<Map.Entry<Serializable, Object>>() {
-            Iterator<Cache.Entry<Serializable, Object>> iter = cache(keyspace).iterator();
-
-            @Override public boolean hasNext() {
-                return iter.hasNext();
-            }
-
-            @Override public Map.Entry<Serializable, Object> next() {
-                Cache.Entry<Serializable, Object> entry = iter.next();
-
-                assert entry != null;
-
-                return new AbstractMap.SimpleEntry<Serializable, Object>(entry.getKey(), entry.getValue());
-            }
-
-            @Override public void close() {
-                // Ignite's internal iterator is referenced by a weak reference. Releasing it.
-                iter = null;
-            }
-        };
-    }
-
-    /** {@inheritDoc} */
-    @Override public void deleteAllOf(Serializable keyspace) {
-        cache(keyspace).removeAll();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void clear() {
-        for (String name : ignite.cacheNames())
-            ignite.cache(name).removeAll();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long count(Serializable keyspace) {
-        return cache(keyspace).size();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void destroy() throws Exception {
-        ignite.close();
-    }
-
-    /**
-     * Gets {@code IgniteCache} instance.
-     *
-     * @param keyspace A keyspace.
-     * @return Ignite cache instance.
-     */
-    private IgniteCache<Serializable, Object> cache(Serializable keyspace) {
-        if (!keyspace.getClass().equals(String.class))
-            throw new IgniteException("Keyspace must be of String type");
-
-        return ignite.getOrCreateCache((String)keyspace);
-    }
-
-    /**
-     *
-     */
-    private static class RemoveEntryProcessor implements EntryProcessor<Serializable, Object, Object> {
-        /** {@inheritDoc} */
-        @Override public Object process(MutableEntry<Serializable, Object> entry, Object... arguments)
-            throws EntryProcessorException {
-
-            Object val = entry.getValue();
-
-            entry.remove();
-
-            return val;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/IgniteRepository.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/IgniteRepository.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/IgniteRepository.java
index 656f7d6..472d2e0 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/IgniteRepository.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/IgniteRepository.java
@@ -18,16 +18,16 @@ package org.apache.ignite.springdata.repository;
 
 import java.io.Serializable;
 import java.util.Map;
-import org.springframework.data.keyvalue.repository.KeyValueRepository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
- * Apache Ignite repository that extends basic capabilities of {@link KeyValueRepository}.
+ * Apache Ignite repository that extends basic capabilities of {@link CrudRepository}.
  */
-public interface IgniteRepository<T, ID extends Serializable> extends KeyValueRepository<T, ID> {
+public interface IgniteRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
     /**
      * Saves a given entity using provided key.
      * </p>
-     * It's suggested to use this method instead of default {@link KeyValueRepository#save(Object)} that generates
+     * It's suggested to use this method instead of default {@link CrudRepository#save(Object)} that generates
      * IDs (keys) that are not unique cluster wide.
      *
      * @param key Entity's key.
@@ -40,7 +40,7 @@ public interface IgniteRepository<T, ID extends Serializable> extends KeyValueRe
     /**
      * Saves all given keys and entities combinations.
      * </p>
-     * It's suggested to use this method instead of default {@link KeyValueRepository#save(Iterable)} that generates
+     * It's suggested to use this method instead of default {@link CrudRepository#save(Iterable)} that generates
      * IDs (keys) that are not unique cluster wide.
      *
      * @param entities Map of key-entities pairs to save.
@@ -48,4 +48,11 @@ public interface IgniteRepository<T, ID extends Serializable> extends KeyValueRe
      * @return Saved entities.
      */
     <S extends T> Iterable<S> save(Map<ID, S> entities);
+
+    /**
+     * Deletes all the entities for the provided ids.
+     *
+     * @param ids List of ids to delete.
+     */
+    void deleteAll(Iterable<ID> ids);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
index 1b18e4d..667342a 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/EnableIgniteRepositories.java
@@ -23,18 +23,10 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import org.apache.ignite.springdata.repository.support.IgniteRepositoryFactoryBean;
-import org.apache.ignite.springdata.repository.support.SimpleIgniteRepository;
+import org.apache.ignite.springdata.repository.support.IgniteRepositoryImpl;
 import org.springframework.beans.factory.FactoryBean;
-import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.ComponentScan.Filter;
 import org.springframework.context.annotation.Import;
-import org.springframework.data.keyvalue.core.KeyValueOperations;
-import org.springframework.data.keyvalue.core.KeyValueTemplate;
-import org.springframework.data.keyvalue.repository.config.QueryCreatorType;
-import org.springframework.data.keyvalue.repository.query.CachingKeyValuePartTreeQuery;
-import org.springframework.data.keyvalue.repository.query.SpelQueryCreator;
-import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactoryBean;
-import org.springframework.data.repository.config.DefaultRepositoryBaseClass;
 import org.springframework.data.repository.query.QueryLookupStrategy;
 import org.springframework.data.repository.query.QueryLookupStrategy.Key;
 
@@ -117,14 +109,7 @@ public @interface EnableIgniteRepositories {
      *
      * @return
      */
-    Class<?> repositoryBaseClass() default SimpleIgniteRepository.class;
-
-    /**
-     * Configures the name of the {@link KeyValueOperations} bean to be used with the repositories detected.
-     *
-     * @return
-     */
-    String keyValueTemplateRef() default "igniteKeyValueTemplate";
+    Class<?> repositoryBaseClass() default IgniteRepositoryImpl.class;
 
     /**
      * Configures whether nested repository-interfaces (e.g. defined as inner classes) should be discovered by the

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
index 9c2965c..630690a 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/config/IgniteRepositoryConfigurationExtension.java
@@ -20,13 +20,13 @@ import java.util.Collection;
 import java.util.Collections;
 import org.apache.ignite.springdata.repository.IgniteRepository;
 import org.apache.ignite.springdata.repository.support.IgniteRepositoryFactoryBean;
-import org.springframework.data.keyvalue.repository.config.KeyValueRepositoryConfigurationExtension;
 import org.springframework.data.repository.config.RepositoryConfigurationExtension;
+import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport;
 
 /**
  * Apache Ignite specific implementation of {@link RepositoryConfigurationExtension}.
  */
-public class IgniteRepositoryConfigurationExtension extends KeyValueRepositoryConfigurationExtension {
+public class IgniteRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport {
     /** {@inheritDoc} */
     @Override public String getModuleName() {
         return "Apache Ignite";
@@ -38,11 +38,6 @@ public class IgniteRepositoryConfigurationExtension extends KeyValueRepositoryCo
     }
 
     /** {@inheritDoc} */
-    @Override protected String getDefaultKeyValueTemplateRef() {
-        return "igniteKeyValueTemplate";
-    }
-
-    /** {@inheritDoc} */
     @Override public String getRepositoryFactoryClassName() {
         return IgniteRepositoryFactoryBean.class.getName();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
index 006bd5a..95c4190 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactory.java
@@ -16,101 +16,87 @@
  */
 package org.apache.ignite.springdata.repository.support;
 
-import java.lang.reflect.Field;
+import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.springdata.IgniteKeyValueAdapter;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.springdata.repository.IgniteRepository;
 import org.apache.ignite.springdata.repository.Query;
 import org.apache.ignite.springdata.repository.config.RepositoryConfig;
 import org.apache.ignite.springdata.repository.query.IgniteQuery;
 import org.apache.ignite.springdata.repository.query.IgniteQueryGenerator;
 import org.apache.ignite.springdata.repository.query.IgniteRepositoryQuery;
-import org.springframework.data.keyvalue.core.KeyValueAdapter;
-import org.springframework.data.keyvalue.core.KeyValueOperations;
-import org.springframework.data.keyvalue.core.KeyValueTemplate;
-import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactory;
 import org.springframework.data.projection.ProjectionFactory;
+import org.springframework.data.repository.core.EntityInformation;
 import org.springframework.data.repository.core.NamedQueries;
+import org.springframework.data.repository.core.RepositoryInformation;
 import org.springframework.data.repository.core.RepositoryMetadata;
+import org.springframework.data.repository.core.support.AbstractEntityInformation;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
 import org.springframework.data.repository.query.EvaluationContextProvider;
 import org.springframework.data.repository.query.QueryLookupStrategy;
 import org.springframework.data.repository.query.RepositoryQuery;
-import org.springframework.data.repository.query.parser.AbstractQueryCreator;
-import org.springframework.data.util.ReflectionUtils;
 import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 
 /**
  * Crucial for spring-data functionality class. Create proxies for repositories.
  */
-public class IgniteRepositoryFactory extends KeyValueRepositoryFactory {
+public class IgniteRepositoryFactory extends RepositoryFactorySupport {
     /** Ignite instance */
     private Ignite ignite;
 
     /** Mapping of a repository to a cache. */
     private final Map<Class<?>, String> repoToCache = new HashMap<>();
 
-    public IgniteRepositoryFactory(KeyValueOperations keyValueOperations) {
-        super(keyValueOperations);
-
-        initRepositoryFactory(keyValueOperations);
+    /**
+     * Creates the factory with initialized {@link Ignite} instance.
+     *
+     * @param ignite
+     */
+    public IgniteRepositoryFactory(Ignite ignite) {
+        this.ignite = ignite;
     }
 
-    public IgniteRepositoryFactory(KeyValueOperations keyValueOperations,
-        Class<? extends AbstractQueryCreator<?, ?>> queryCreator) {
-        super(keyValueOperations, queryCreator);
-
-        initRepositoryFactory(keyValueOperations);
+    /**
+     * Initializes the factory with provided {@link IgniteConfiguration} that is used to start up an underlying
+     * {@link Ignite} instance.
+     *
+     * @param cfg Ignite configuration.
+     */
+    public IgniteRepositoryFactory(IgniteConfiguration cfg) {
+        this.ignite = Ignition.start(cfg);
     }
 
-    public IgniteRepositoryFactory(KeyValueOperations keyValueOperations,
-        Class<? extends AbstractQueryCreator<?, ?>> queryCreator,
-        Class<? extends RepositoryQuery> repositoryQueryType) {
-        super(keyValueOperations, queryCreator, repositoryQueryType);
-
-        initRepositoryFactory(keyValueOperations);
+    /**
+     * Initializes the factory with provided a configuration under {@code springCfgPath} that is used to start up
+     * an underlying {@link Ignite} instance.
+     *
+     * @param springCfgPath A path to Ignite configuration.
+     */
+    public IgniteRepositoryFactory(String springCfgPath) {
+        this.ignite = Ignition.start(springCfgPath);
     }
 
-    private void initRepositoryFactory(KeyValueOperations keyValueOperations) {
-        try {
-            Field field = ReflectionUtils.findField(KeyValueTemplate.class,
-                new org.springframework.util.ReflectionUtils.FieldFilter() {
-                    @Override public boolean matches(Field field) {
-                        return field.getName().equals("adapter");
-                    }
-                });
-
-            field.setAccessible(true);
-
-            IgniteKeyValueAdapter adapter = (IgniteKeyValueAdapter)field.get(keyValueOperations);
-
-            field = ReflectionUtils.findField(IgniteKeyValueAdapter.class,
-                new org.springframework.util.ReflectionUtils.FieldFilter() {
-                    @Override public boolean matches(Field field) {
-                        return field.getName().equals("ignite");
-                    }
-                });
-
-            field.setAccessible(true);
-
-            ignite = (Ignite)field.get(adapter);
-
-            if (ignite == null)
-                throw new IgniteException("Failed to initialize IgniteRepositoryFactory properly: Ignite instance is " +
-                    "not set in IgniteKeyValueAdapter");
-        }
-        catch (Exception e) {
-            throw new IgniteException("Failed to initialize IgniteRepositoryFactory properly.", e);
-        }
+    /** {@inheritDoc} */
+    @Override public <T, ID extends Serializable> EntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {
+        return new AbstractEntityInformation<T, ID>(domainClass) {
+            @Override public ID getId(T entity) {
+                return null;
+            }
+
+            @Override public Class<ID> getIdType() {
+                return null;
+            }
+        };
     }
 
     /** {@inheritDoc} */
     @Override protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
-        return SimpleIgniteRepository.class;
+        return IgniteRepositoryImpl.class;
     }
 
     /** {@inheritDoc} */
@@ -132,6 +118,12 @@ public class IgniteRepositoryFactory extends KeyValueRepositoryFactory {
     }
 
     /** {@inheritDoc} */
+    @Override protected Object getTargetRepository(RepositoryInformation metadata) {
+        return getTargetRepositoryViaReflection(metadata,
+            ignite.getOrCreateCache(repoToCache.get(metadata.getRepositoryInterface())));
+    }
+
+    /** {@inheritDoc} */
     @Override protected QueryLookupStrategy getQueryLookupStrategy(final QueryLookupStrategy.Key key,
         EvaluationContextProvider evaluationCtxProvider) {
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactoryBean.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactoryBean.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactoryBean.java
index 9d1c8c1..f4131ba 100644
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactoryBean.java
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryFactoryBean.java
@@ -18,38 +18,68 @@
 package org.apache.ignite.springdata.repository.support;
 
 import java.io.Serializable;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.springdata.repository.IgniteRepository;
-import org.springframework.data.keyvalue.core.KeyValueOperations;
-import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactory;
-import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactoryBean;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
 import org.springframework.data.repository.Repository;
-import org.springframework.data.repository.query.RepositoryQuery;
-import org.springframework.data.repository.query.parser.AbstractQueryCreator;
+import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
 
 /**
  * Apache Ignite repository factory bean.
  *
+ * The repository requires to define one of the parameters below in your Spring application configuration in order
+ * to get an access to Apache Ignite cluster:
+ * <ul>
+ * <li>{@link Ignite} instance bean named "igniteInstance"</li>
+ * <li>{@link IgniteConfiguration} bean named "igniteCfg"</li>
+ * <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath"</li>
+ * <ul/>
+ *
  * @param <T> Repository type, {@link IgniteRepository}
  * @param <S> Domain object class.
  * @param <ID> Domain object key, super expects {@link Serializable}.
  */
 public class IgniteRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
-    extends KeyValueRepositoryFactoryBean<T, S, ID> {
-
-    /**
-     * Creates a new {@code IgniteRepositoryFactoryBean} for the given repository interface.
-     *
-     * @param repositoryInterface must not be {@literal null}.
-     */
-    public IgniteRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
-        super(repositoryInterface);
+    extends RepositoryFactoryBeanSupport<T, S, ID> implements ApplicationContextAware {
+    /** Application context. */
+    private ApplicationContext ctx;
+
+    /** {@inheritDoc} */
+    @Override public void setApplicationContext(ApplicationContext context) throws BeansException {
+        this.ctx = context;
     }
 
     /** {@inheritDoc} */
-    @Override protected KeyValueRepositoryFactory createRepositoryFactory(KeyValueOperations operations,
-        Class<? extends AbstractQueryCreator<?, ?>> queryCreator,
-        Class<? extends RepositoryQuery> repositoryQueryType) {
-        return new IgniteRepositoryFactory(operations, queryCreator, repositoryQueryType);
+    @Override protected RepositoryFactorySupport createRepositoryFactory() {
+        try {
+            Ignite ignite = (Ignite)ctx.getBean("igniteInstance");
+
+            return new IgniteRepositoryFactory(ignite);
+        }
+        catch (BeansException ex) {
+            try {
+                IgniteConfiguration cfg = (IgniteConfiguration)ctx.getBean("igniteCfg");
+
+                return new IgniteRepositoryFactory(cfg);
+            }
+            catch (BeansException ex2) {
+                try {
+                    String path = (String)ctx.getBean("igniteSpringCfgPath");
+
+                    return new IgniteRepositoryFactory(path);
+                }
+                catch (BeansException ex3) {
+                    throw new IgniteException("Failed to initialize Ignite repository factory. Ignite instance or" +
+                        " IgniteConfiguration or a path to Ignite's spring XML configuration must be defined in the" +
+                        " application configuration");
+                }
+            }
+        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryImpl.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryImpl.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryImpl.java
new file mode 100644
index 0000000..4290272
--- /dev/null
+++ b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/IgniteRepositoryImpl.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.springdata.repository.support;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import javax.cache.Cache;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.springdata.repository.IgniteRepository;
+
+/**
+ * General Apache Ignite repository implementation.
+ */
+public class IgniteRepositoryImpl<T, ID extends Serializable> implements IgniteRepository<T, ID> {
+    /** Ignite Cache bound to the repository */
+    private final IgniteCache<ID, T> cache;
+
+    /**
+     * Repository constructor.
+     *
+     * @param cache Initialized cache instance.
+     */
+    public IgniteRepositoryImpl(IgniteCache<ID, T> cache) {
+        this.cache = cache;
+    }
+
+    /** {@inheritDoc} */
+    @Override public <S extends T> S save(ID key, S entity) {
+        cache.put(key, entity);
+
+        return entity;
+    }
+
+    /** {@inheritDoc} */
+    @Override public <S extends T> Iterable<S> save(Map<ID, S> entities) {
+        cache.putAll(entities);
+
+        return entities.values();
+    }
+
+    /** {@inheritDoc} */
+    @Override public <S extends T> S save(S entity) {
+        throw new UnsupportedOperationException("Use IgniteRepository.save(key,value) method instead.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public <S extends T> Iterable<S> save(Iterable<S> entities) {
+        throw new UnsupportedOperationException("Use IgniteRepository.save(Map<keys,value>) method instead.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public T findOne(ID id) {
+        return cache.get(id);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean exists(ID id) {
+        return cache.containsKey(id);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Iterable<T> findAll() {
+        final Iterator<Cache.Entry<ID, T>> iter = cache.iterator();
+
+        return new Iterable<T>() {
+            @Override public Iterator<T> iterator() {
+                return new Iterator<T>() {
+                    @Override public boolean hasNext() {
+                        return iter.hasNext();
+                    }
+
+                    @Override public T next() {
+                        return iter.next().getValue();
+                    }
+
+                    @Override public void remove() {
+                        iter.remove();
+                    }
+                };
+            }
+        };
+    }
+
+    /** {@inheritDoc} */
+    @Override public Iterable<T> findAll(Iterable<ID> ids) {
+        if (ids instanceof Set)
+            return cache.getAll((Set<ID>)ids).values();
+
+        if (ids instanceof Collection)
+            return cache.getAll(new HashSet<>((Collection<ID>)ids)).values();
+
+        TreeSet<ID> keys = new TreeSet<>();
+
+        for (ID id : ids)
+            keys.add(id);
+
+        return cache.getAll(keys).values();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long count() {
+        return cache.size(CachePeekMode.PRIMARY);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void delete(ID id) {
+        cache.remove(id);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void delete(T entity) {
+        throw new UnsupportedOperationException("Use IgniteRepository.delete(key) method instead.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public void delete(Iterable<? extends T> entities) {
+        throw new UnsupportedOperationException("Use IgniteRepository.deleteAll(keys) method instead.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public void deleteAll(Iterable<ID> ids) {
+        if (ids instanceof Set)
+            cache.removeAll((Set<ID>)ids);
+
+        if (ids instanceof Collection)
+            cache.removeAll(new HashSet<>((Collection<ID>)ids));
+
+        TreeSet<ID> keys = new TreeSet<>();
+
+        for (ID id : ids)
+            keys.add(id);
+
+        cache.removeAll(keys);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void deleteAll() {
+        cache.clear();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/SimpleIgniteRepository.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/SimpleIgniteRepository.java b/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/SimpleIgniteRepository.java
deleted file mode 100644
index 2f75652..0000000
--- a/modules/spring-data/src/main/java/org/apache/ignite/springdata/repository/support/SimpleIgniteRepository.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ignite.springdata.repository.support;
-
-import java.io.Serializable;
-import java.util.Map;
-import org.apache.ignite.springdata.repository.IgniteRepository;
-import org.springframework.data.keyvalue.core.KeyValueOperations;
-import org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository;
-import org.springframework.data.repository.core.EntityInformation;
-import org.springframework.util.Assert;
-
-/**
- * General Apache Ignite repository implementation.
- */
-public class SimpleIgniteRepository<T, ID extends Serializable>
-    extends SimpleKeyValueRepository<T, ID> implements IgniteRepository<T, ID> {
-    /** */
-    private final KeyValueOperations operations;
-
-    /**
-     * Creates a new {@link SimpleKeyValueRepository} for the given {@link EntityInformation} and {@link
-     * KeyValueOperations}.
-     *
-     * @param metadata must not be {@literal null}.
-     * @param operations must not be {@literal null}.
-     */
-    public SimpleIgniteRepository(EntityInformation<T, ID> metadata, KeyValueOperations operations) {
-        super(metadata, operations);
-
-        this.operations = operations;
-    }
-
-    /** {@inheritDoc} */
-    @Override public <S extends T> S save(ID key, S entity) {
-        Assert.notNull(entity, "Entity must not be null!");
-
-        operations.update(key, entity);
-
-        return entity;
-    }
-
-    /** {@inheritDoc} */
-    @Override public <S extends T> Iterable<S> save(Map<ID, S> entities) {
-        for (ID key : entities.keySet())
-            operations.update(key, entities.get(key));
-
-        return entities.values();
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/test/java/org/apache/ignite/springdata/IgniteSpringDataTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/test/java/org/apache/ignite/springdata/IgniteSpringDataTestSuite.java b/modules/spring-data/src/test/java/org/apache/ignite/springdata/IgniteSpringDataTestSuite.java
deleted file mode 100644
index fb8c2a4..0000000
--- a/modules/spring-data/src/test/java/org/apache/ignite/springdata/IgniteSpringDataTestSuite.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.springdata;
-
-import junit.framework.TestSuite;
-
-/**
- *
- */
-public class IgniteSpringDataTestSuite extends TestSuite {
-    /**
-     * @return Test suite.
-     * @throws Exception Thrown in case of the failure.
-     */
-    public static TestSuite suite() throws Exception {
-        TestSuite suite = new TestSuite("Spring Data Test Suite");
-
-        suite.addTest(new IgniteSpringDataSelfTest());
-
-        return suite;
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/test/java/org/apache/ignite/springdata/misc/ApplicationConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/test/java/org/apache/ignite/springdata/misc/ApplicationConfiguration.java b/modules/spring-data/src/test/java/org/apache/ignite/springdata/misc/ApplicationConfiguration.java
index aa7a7ae..fb614ae 100644
--- a/modules/spring-data/src/test/java/org/apache/ignite/springdata/misc/ApplicationConfiguration.java
+++ b/modules/spring-data/src/test/java/org/apache/ignite/springdata/misc/ApplicationConfiguration.java
@@ -21,12 +21,9 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.springdata.IgniteKeyValueAdapter;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.apache.ignite.springdata.repository.config.EnableIgniteRepositories;
-import org.springframework.data.keyvalue.core.KeyValueOperations;
-import org.springframework.data.keyvalue.core.KeyValueTemplate;
 
 /**
  *
@@ -46,14 +43,4 @@ public class ApplicationConfiguration {
 
         return Ignition.start(cfg);
     }
-
-    @Bean
-    public KeyValueOperations igniteKeyValueTemplate(Ignite igniteInstance) {
-        return new KeyValueTemplate(new IgniteKeyValueAdapter(igniteInstance));
-    }
-
-    @Bean
-    public IgniteKeyValueAdapter igniteKeyValueAdapter(Ignite igniteInstance) {
-        return new IgniteKeyValueAdapter(igniteInstance);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2fded40c/modules/spring-data/src/test/java/org/apache/ignite/testsuites/IgniteSpringDataTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/spring-data/src/test/java/org/apache/ignite/testsuites/IgniteSpringDataTestSuite.java b/modules/spring-data/src/test/java/org/apache/ignite/testsuites/IgniteSpringDataTestSuite.java
new file mode 100644
index 0000000..36fb267
--- /dev/null
+++ b/modules/spring-data/src/test/java/org/apache/ignite/testsuites/IgniteSpringDataTestSuite.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.TestSuite;
+import org.apache.ignite.springdata.IgniteSpringDataSelfTest;
+
+/**
+ *
+ */
+public class IgniteSpringDataTestSuite extends TestSuite {
+    /**
+     * @return Test suite.
+     * @throws Exception Thrown in case of the failure.
+     */
+    public static TestSuite suite() throws Exception {
+        TestSuite suite = new TestSuite("Spring Data Test Suite");
+
+        suite.addTestSuite(IgniteSpringDataSelfTest.class);
+
+        return suite;
+    }
+}
+