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;
+ }
+}
+