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 <[email protected]> Authored: Tue Apr 11 13:55:32 2017 -0700 Committer: Denis Magda <[email protected]> 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; + } +} +
