diff --git a/pom.xml b/pom.xml index aae488431..1b573b1bb 100644 --- a/pom.xml +++ b/pom.xml @@ -191,13 +191,6 @@ true - - com.hazelcast - hazelcast - 3.3 - true - - diff --git a/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastKeyValueAdapter.java b/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastKeyValueAdapter.java deleted file mode 100644 index 6430f457f..000000000 --- a/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastKeyValueAdapter.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast; - -import java.io.Serializable; -import java.util.Collection; - -import org.springframework.data.keyvalue.core.AbstractKeyValueAdapter; -import org.springframework.util.Assert; - -import com.hazelcast.core.Hazelcast; -import com.hazelcast.core.HazelcastInstance; -import com.hazelcast.core.IMap; - -/** - * @author Christoph Strobl - */ -public class HazelcastKeyValueAdapter extends AbstractKeyValueAdapter { - - private HazelcastInstance hzInstance; - - public HazelcastKeyValueAdapter() { - this(Hazelcast.newHazelcastInstance()); - } - - public HazelcastKeyValueAdapter(HazelcastInstance hzInstance) { - - super(new HazelcastQueryEngine()); - Assert.notNull(hzInstance, "hzInstance must not be 'null'."); - this.hzInstance = hzInstance; - } - - @SuppressWarnings("unchecked") - @Override - public Object put(Serializable id, Object item, Serializable keyspace) { - - Assert.notNull(id, "Id must not be 'null' for adding."); - Assert.notNull(item, "Item must not be 'null' for adding."); - - return getMap(keyspace).put(id, item); - } - - @Override - public boolean contains(Serializable id, Serializable keyspace) { - return getMap(keyspace).containsKey(id); - } - - @Override - public Object get(Serializable id, Serializable keyspace) { - return getMap(keyspace).get(id); - } - - @Override - public Object delete(Serializable id, Serializable keyspace) { - return getMap(keyspace).remove(id); - } - - @Override - public Collection getAllOf(Serializable keyspace) { - return getMap(keyspace).values(); - } - - @Override - public void deleteAllOf(Serializable keyspace) { - getMap(keyspace).clear(); - } - - @Override - public void clear() { - // TODO: remove all elements - } - - @SuppressWarnings("rawtypes") - protected IMap getMap(final Serializable keyspace) { - - Assert.isInstanceOf(String.class, keyspace, "Keyspace identifier must of of type String."); - return hzInstance.getMap((String) keyspace); - } - - @Override - public void destroy() throws Exception { - hzInstance.shutdown(); - } - -} diff --git a/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastQueryEngine.java b/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastQueryEngine.java deleted file mode 100644 index 5c1d74bda..000000000 --- a/src/main/java/org/springframework/data/keyvalue/hazelcast/HazelcastQueryEngine.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Comparator; -import java.util.Map.Entry; - -import org.springframework.data.keyvalue.core.CriteriaAccessor; -import org.springframework.data.keyvalue.core.QueryEngine; -import org.springframework.data.keyvalue.core.SortAccessor; -import org.springframework.data.keyvalue.core.query.KeyValueQuery; - -import com.hazelcast.query.PagingPredicate; -import com.hazelcast.query.Predicate; -import com.hazelcast.query.PredicateBuilder; - -/** - * @author Christoph Strobl - */ -public class HazelcastQueryEngine extends QueryEngine, Comparator> { - - public HazelcastQueryEngine() { - super(HazelcastCriteriaAccessor.INSTANCE, HazelcastSortAccessor.INSTANCE); - } - - @Override - public Collection execute(Predicate criteria, Comparator sort, int offset, int rows, - Serializable keyspace) { - - Predicate predicateToUse = criteria; - - if (sort != null || offset > 0 || rows > 0) { - PagingPredicate pp = new PagingPredicate(criteria, (Comparator) sort, rows); - if (offset > 0 && rows > 0) { - int x = offset / rows; - while (x > 0) { - pp.nextPage(); - x--; - } - } - predicateToUse = pp; - } - - return this.getAdapter().getMap(keyspace).values(predicateToUse); - - } - - @Override - public long count(Predicate criteria, Serializable keyspace) { - return this.getAdapter().getMap(keyspace).keySet(criteria).size(); - } - - static enum HazelcastCriteriaAccessor implements CriteriaAccessor> { - INSTANCE; - - @Override - public Predicate resolve(KeyValueQuery query) { - - if (query == null || query.getCritieria() == null) { - return null; - } - - if (query.getCritieria() instanceof Predicate) { - return (Predicate) query.getCritieria(); - } - - if (query.getCritieria() instanceof PredicateBuilder) { - return (PredicateBuilder) query.getCritieria(); - } - - throw new UnsupportedOperationException(); - } - - } - - static enum HazelcastSortAccessor implements SortAccessor> { - - INSTANCE; - - @Override - public Comparator resolve(KeyValueQuery query) { - - if (query == null || query.getSort() == null) { - return null; - } - - // TODO: create serializable sorter; - throw new UnsupportedOperationException(); - } - } - -} diff --git a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositories.java b/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositories.java deleted file mode 100644 index 8749032bf..000000000 --- a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositories.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast.repository.config; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import org.springframework.beans.factory.FactoryBean; -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.hazelcast.repository.query.HazelcastQueryCreator; -import org.springframework.data.keyvalue.repository.config.QueryCreatorType; -import org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactoryBean; -import org.springframework.data.repository.query.QueryLookupStrategy; -import org.springframework.data.repository.query.QueryLookupStrategy.Key; - -/** - * Annotation to activate Hazelcast repositories. If no base package is configured through either {@link #value()}, - * {@link #basePackages()} or {@link #basePackageClasses()} it will trigger scanning of the package of annotated class. - * - * @author Christoph Strobl - */ -@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE }) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Inherited -@Import(HazelcastRepositoriesRegistrar.class) -@QueryCreatorType(HazelcastQueryCreator.class) -public @interface EnableHazelcastRepositories { - - /** - * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation declarations e.g.: - * {@code @EnableJpaRepositories("org.my.pkg")} instead of {@code @EnableJpaRepositories(basePackages="org.my.pkg")}. - */ - String[] value() default {}; - - /** - * Base packages to scan for annotated components. {@link #value()} is an alias for (and mutually exclusive with) this - * attribute. Use {@link #basePackageClasses()} for a type-safe alternative to String-based package names. - */ - String[] basePackages() default {}; - - /** - * Type-safe alternative to {@link #basePackages()} for specifying the packages to scan for annotated components. The - * package of each class specified will be scanned. Consider creating a special no-op marker class or interface in - * each package that serves no purpose other than being referenced by this attribute. - */ - Class[] basePackageClasses() default {}; - - /** - * Specifies which types are not eligible for component scanning. - */ - Filter[] excludeFilters() default {}; - - /** - * Specifies which types are eligible for component scanning. Further narrows the set of candidate components from - * everything in {@link #basePackages()} to everything in the base packages that matches the given filter or filters. - */ - Filter[] includeFilters() default {}; - - /** - * Returns the postfix to be used when looking up custom repository implementations. Defaults to {@literal Impl}. So - * for a repository named {@code PersonRepository} the corresponding implementation class will be looked up scanning - * for {@code PersonRepositoryImpl}. - * - * @return - */ - String repositoryImplementationPostfix() default "Impl"; - - /** - * Configures the location of where to find the Spring Data named queries properties file. - * - * @return - */ - String namedQueriesLocation() default ""; - - /** - * Returns the key of the {@link QueryLookupStrategy} to be used for lookup queries for query methods. Defaults to - * {@link Key#CREATE_IF_NOT_FOUND}. - * - * @return - */ - Key queryLookupStrategy() default Key.CREATE_IF_NOT_FOUND; - - /** - * Returns the {@link FactoryBean} class to be used for each repository instance. Defaults to - * {@link KeyValueRepositoryFactoryBean}. - * - * @return - */ - Class repositoryFactoryBeanClass() default KeyValueRepositoryFactoryBean.class; - - /** - * Configures the name of the {@link KeyValueOperations} bean to be used with the repositories detected. - * - * @return - */ - String keyValueTemplateRef() default "keyValueTemplate"; - - /** - * Configures whether nested repository-interfaces (e.g. defined as inner classes) should be discovered by the - * repositories infrastructure. - */ - boolean considerNestedRepositories() default false; -} diff --git a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/HazelcastRepositoriesRegistrar.java b/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/HazelcastRepositoriesRegistrar.java deleted file mode 100644 index 68b943b1a..000000000 --- a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/config/HazelcastRepositoriesRegistrar.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast.repository.config; - -import java.lang.annotation.Annotation; - -import org.springframework.data.keyvalue.repository.config.KeyValueRepositoriesRegistrar; - -/** - * Special {@link KeyValueRepositoriesRegistrar} to point the infrastructure to inspect - * {@link EnableHazelcastRepositories}. - * - * @author Oliver Gierke - */ -class HazelcastRepositoriesRegistrar extends KeyValueRepositoriesRegistrar { - - /* - * (non-Javadoc) - * @see org.springframework.data.keyvalue.repository.config.KeyValueRepositoriesRegistrar#getAnnotation() - */ - @Override - protected Class getAnnotation() { - return EnableHazelcastRepositories.class; - } -} diff --git a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/query/HazelcastQueryCreator.java b/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/query/HazelcastQueryCreator.java deleted file mode 100644 index ffda72f51..000000000 --- a/src/main/java/org/springframework/data/keyvalue/hazelcast/repository/query/HazelcastQueryCreator.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast.repository.query; - -import java.util.Iterator; - -import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.domain.Sort; -import org.springframework.data.keyvalue.core.query.KeyValueQuery; -import org.springframework.data.keyvalue.ehcache.repository.query.EhCacheQueryCreator; -import org.springframework.data.repository.query.ParameterAccessor; -import org.springframework.data.repository.query.parser.AbstractQueryCreator; -import org.springframework.data.repository.query.parser.Part; -import org.springframework.data.repository.query.parser.PartTree; - -import com.hazelcast.query.EntryObject; -import com.hazelcast.query.Predicate; -import com.hazelcast.query.PredicateBuilder; - -/** - * @author Christoph Strobl - */ -public class HazelcastQueryCreator extends AbstractQueryCreator>, Predicate> { - - private final PredicateBuilder predicateBuilder; - - /** - * Creates a new {@link EhCacheQueryCreator} for the given {@link PartTree}. - * - * @param tree must not be {@literal null}. - */ - public HazelcastQueryCreator(PartTree tree) { - super(tree); - this.predicateBuilder = new PredicateBuilder(); - } - - /** - * Creates a new {@link HazelcastQueryCreator} for the given {@link PartTree} and {@link ParameterAccessor}. The - * latter is used to hand actual parameter values into the callback methods as well as to apply dynamic sorting via a - * {@link Sort} parameter. - * - * @param tree must not be {@literal null}. - * @param parameters can be {@literal null}. - */ - public HazelcastQueryCreator(PartTree tree, ParameterAccessor parameters) { - super(tree, parameters); - this.predicateBuilder = new PredicateBuilder(); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#create(org.springframework.data.repository.query.parser.Part, java.util.Iterator) - */ - @Override - protected Predicate create(Part part, Iterator iterator) { - return from(predicateBuilder, part, iterator); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#and(org.springframework.data.repository.query.parser.Part, java.lang.Object, java.util.Iterator) - */ - @Override - protected Predicate and(Part part, Predicate base, Iterator iterator) { - return predicateBuilder.and(from(predicateBuilder, part, iterator)); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#or(java.lang.Object, java.lang.Object) - */ - @Override - protected Predicate or(Predicate base, Predicate criteria) { - return predicateBuilder.or(criteria); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#complete(java.lang.Object, org.springframework.data.domain.Sort) - */ - @Override - protected KeyValueQuery> complete(Predicate criteria, Sort sort) { - return new KeyValueQuery>(criteria); - } - - private Predicate from(PredicateBuilder pb, Part part, Iterator iterator) { - - EntryObject e = pb.getEntryObject(); - e.get(part.getProperty().toDotPath()); - - switch (part.getType()) { - case TRUE: - return e.equal(true); - case FALSE: - return e.equal(false); - case SIMPLE_PROPERTY: - return e.equal((Comparable) iterator.next()); - case IS_NULL: - return e.isNull(); - case GREATER_THAN: - return e.greaterThan((Comparable) iterator.next()); - - default: - throw new InvalidDataAccessApiUsageException(String.format("Found invalid part '%s' in query", part.getType())); - } - } -} diff --git a/src/test/java/org/springframework/data/keyvalue/hazelcast/HazelcastUtils.java b/src/test/java/org/springframework/data/keyvalue/hazelcast/HazelcastUtils.java deleted file mode 100644 index f1437ff06..000000000 --- a/src/test/java/org/springframework/data/keyvalue/hazelcast/HazelcastUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast; - -import org.springframework.data.keyvalue.hazelcast.HazelcastKeyValueAdapter; - -import com.hazelcast.config.Config; -import com.hazelcast.core.Hazelcast; - -/** - * @author Christoph Strobl - */ -public class HazelcastUtils { - - static Config hazelcastConfig() { - - Config hazelcastConfig = new Config(); - hazelcastConfig.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); - hazelcastConfig.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(false); - hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false); - - return hazelcastConfig; - } - - public static HazelcastKeyValueAdapter preconfiguredHazelcastKeyValueAdapter() { - return new HazelcastKeyValueAdapter(Hazelcast.newHazelcastInstance(hazelcastConfig())); - } - -} diff --git a/src/test/java/org/springframework/data/keyvalue/hazelcast/KeyValueTemplateTestsUsingHazelcast.java b/src/test/java/org/springframework/data/keyvalue/hazelcast/KeyValueTemplateTestsUsingHazelcast.java deleted file mode 100644 index 349a8c3e8..000000000 --- a/src/test/java/org/springframework/data/keyvalue/hazelcast/KeyValueTemplateTestsUsingHazelcast.java +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast; - -import static org.hamcrest.collection.IsCollectionWithSize.*; -import static org.hamcrest.collection.IsEmptyCollection.*; -import static org.hamcrest.collection.IsIterableContainingInAnyOrder.*; -import static org.hamcrest.core.Is.*; -import static org.hamcrest.core.IsNull.*; -import static org.hamcrest.core.IsSame.*; -import static org.junit.Assert.*; - -import java.io.Serializable; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.annotation.Id; -import org.springframework.data.annotation.Persistent; -import org.springframework.data.keyvalue.annotation.KeySpace; -import org.springframework.data.keyvalue.core.KeyValueTemplate; -import org.springframework.data.keyvalue.core.query.KeyValueQuery; -import org.springframework.util.ObjectUtils; - -import com.hazelcast.query.Predicate; -import com.hazelcast.query.PredicateBuilder; - -/** - * @author Christoph Strobl - */ -public class KeyValueTemplateTestsUsingHazelcast { - - private static final Foo FOO_ONE = new Foo("one"); - private static final Foo FOO_TWO = new Foo("two"); - private static final Foo FOO_THREE = new Foo("three"); - private static final Bar BAR_ONE = new Bar("one"); - private static final ClassWithTypeAlias ALIASED = new ClassWithTypeAlias("super"); - private static final SubclassOfAliasedType SUBCLASS_OF_ALIASED = new SubclassOfAliasedType("sub"); - - private static final KeyValueQuery> HAZELCAST_QUERY = new KeyValueQuery>( - new PredicateBuilder().getEntryObject().get("foo").equal("two")); - - private KeyValueTemplate operations; - - @Before - public void setUp() throws InstantiationException, IllegalAccessException { - this.operations = new KeyValueTemplate(HazelcastUtils.preconfiguredHazelcastKeyValueAdapter()); - } - - @After - public void tearDown() throws Exception { - this.operations.destroy(); - } - - @Test - public void insertShouldNotThorwErrorWhenExecutedHavingNonExistingIdAndNonNullValue() { - operations.insert("1", FOO_ONE); - } - - @Test(expected = IllegalArgumentException.class) - public void insertShouldThrowExceptionForNullId() { - operations.insert(null, FOO_ONE); - } - - @Test(expected = IllegalArgumentException.class) - public void insertShouldThrowExceptionForNullObject() { - operations.insert("some-id", null); - } - - @Test(expected = InvalidDataAccessApiUsageException.class) - public void insertShouldThrowExecptionWhenObjectOfSameTypeAlreadyExists() { - - operations.insert("1", FOO_ONE); - operations.insert("1", FOO_TWO); - } - - @Test - public void insertShouldWorkCorrectlyWhenObjectsOfDifferentTypesWithSameIdAreInserted() { - - operations.insert("1", FOO_ONE); - operations.insert("1", BAR_ONE); - } - - @Test - public void createShouldReturnSameInstanceGenerateId() { - - ClassWithStringId source = new ClassWithStringId(); - ClassWithStringId target = operations.insert(source); - - assertThat(target, sameInstance(source)); - } - - @Test - public void createShouldRespectExistingId() { - - ClassWithStringId source = new ClassWithStringId(); - source.id = "one"; - - operations.insert(source); - - assertThat(operations.findById("one", ClassWithStringId.class), is(source)); - } - - @Test - public void findByIdShouldReturnObjectWithMatchingIdAndType() { - - operations.insert("1", FOO_ONE); - assertThat(operations.findById("1", Foo.class), is(FOO_ONE)); - } - - @Test - public void findByIdSouldReturnNullIfNoMatchingIdFound() { - - operations.insert("1", FOO_ONE); - assertThat(operations.findById("2", Foo.class), nullValue()); - } - - @Test - public void findByIdShouldReturnNullIfNoMatchingTypeFound() { - - operations.insert("1", FOO_ONE); - assertThat(operations.findById("1", Bar.class), nullValue()); - } - - @Test - public void findShouldExecuteQueryCorrectly() { - - operations.insert("1", FOO_ONE); - operations.insert("2", FOO_TWO); - - List result = (List) operations.find(HAZELCAST_QUERY, Foo.class); - assertThat(result, hasSize(1)); - assertThat(result.get(0), is(FOO_TWO)); - } - - @Test - public void readShouldReturnEmptyCollectionIfOffsetOutOfRange() { - - operations.insert("1", FOO_ONE); - operations.insert("2", FOO_TWO); - operations.insert("3", FOO_THREE); - - assertThat(operations.findInRange(5, 5, Foo.class), empty()); - } - - @Test - public void updateShouldReplaceExistingObject() { - - operations.insert("1", FOO_ONE); - operations.update("1", FOO_TWO); - assertThat(operations.findById("1", Foo.class), is(FOO_TWO)); - } - - @Test - public void updateShouldRespectTypeInformation() { - - operations.insert("1", FOO_ONE); - operations.update("1", BAR_ONE); - - assertThat(operations.findById("1", Foo.class), is(FOO_ONE)); - } - - @Test - public void deleteShouldRemoveObjectCorrectly() { - - operations.insert("1", FOO_ONE); - operations.delete("1", Foo.class); - assertThat(operations.findById("1", Foo.class), nullValue()); - } - - @Test - public void deleteReturnsNullWhenNotExisting() { - - operations.insert("1", FOO_ONE); - assertThat(operations.delete("2", Foo.class), nullValue()); - } - - @Test - public void deleteReturnsRemovedObject() { - - operations.insert("1", FOO_ONE); - assertThat(operations.delete("1", Foo.class), is(FOO_ONE)); - } - - @Test(expected = IllegalArgumentException.class) - public void deleteThrowsExceptionWhenIdCannotBeExctracted() { - operations.delete(FOO_ONE); - } - - @Test - public void countShouldReturnZeroWhenNoElementsPresent() { - assertThat(operations.count(Foo.class), is(0L)); - } - - @Test - public void insertShouldRespectTypeAlias() { - - operations.insert("1", ALIASED); - operations.insert("2", SUBCLASS_OF_ALIASED); - - assertThat(operations.findAll(ALIASED.getClass()), containsInAnyOrder(ALIASED, SUBCLASS_OF_ALIASED)); - } - - static class Foo implements Serializable { - - String foo; - - public Foo(String foo) { - this.foo = foo; - } - - public String getFoo() { - return foo; - } - - @Override - public int hashCode() { - return ObjectUtils.nullSafeHashCode(this.foo); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof Foo)) { - return false; - } - Foo other = (Foo) obj; - return ObjectUtils.nullSafeEquals(this.foo, other.foo); - } - - } - - static class Bar implements Serializable { - - String bar; - - public Bar(String bar) { - this.bar = bar; - } - - public String getBar() { - return bar; - } - - @Override - public int hashCode() { - return ObjectUtils.nullSafeHashCode(this.bar); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof Bar)) { - return false; - } - Bar other = (Bar) obj; - return ObjectUtils.nullSafeEquals(this.bar, other.bar); - } - - } - - static class ClassWithStringId implements Serializable { - - @Id String id; - String value; - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ObjectUtils.nullSafeHashCode(this.id); - result = prime * result + ObjectUtils.nullSafeHashCode(this.value); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof ClassWithStringId)) { - return false; - } - ClassWithStringId other = (ClassWithStringId) obj; - if (!ObjectUtils.nullSafeEquals(this.id, other.id)) { - return false; - } - if (!ObjectUtils.nullSafeEquals(this.value, other.value)) { - return false; - } - return true; - } - - } - - @ExplicitKeySpace(name = "aliased") - static class ClassWithTypeAlias implements Serializable { - - @Id String id; - String name; - - public ClassWithTypeAlias(String name) { - this.name = name; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ObjectUtils.nullSafeHashCode(this.id); - result = prime * result + ObjectUtils.nullSafeHashCode(this.name); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!(obj instanceof ClassWithTypeAlias)) { - return false; - } - ClassWithTypeAlias other = (ClassWithTypeAlias) obj; - if (!ObjectUtils.nullSafeEquals(this.id, other.id)) { - return false; - } - if (!ObjectUtils.nullSafeEquals(this.name, other.name)) { - return false; - } - return true; - } - - } - - static class SubclassOfAliasedType extends ClassWithTypeAlias { - - public SubclassOfAliasedType(String name) { - super(name); - } - - } - - @Documented - @Persistent - @Retention(RetentionPolicy.RUNTIME) - @Target({ ElementType.TYPE }) - private static @interface ExplicitKeySpace { - - @KeySpace - String name() default ""; - - } -} diff --git a/src/test/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositoriesIntegrationTests.java b/src/test/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositoriesIntegrationTests.java deleted file mode 100644 index 25bfed5a1..000000000 --- a/src/test/java/org/springframework/data/keyvalue/hazelcast/repository/config/EnableHazelcastRepositoriesIntegrationTests.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * Licensed 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.springframework.data.keyvalue.hazelcast.repository.config; - -import static org.hamcrest.collection.IsCollectionWithSize.*; -import static org.hamcrest.core.Is.*; -import static org.hamcrest.core.IsNull.*; -import static org.junit.Assert.*; - -import java.io.Serializable; -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.annotation.Id; -import org.springframework.data.keyvalue.core.KeyValueOperations; -import org.springframework.data.keyvalue.core.KeyValueTemplate; -import org.springframework.data.keyvalue.hazelcast.HazelcastUtils; -import org.springframework.data.repository.CrudRepository; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -/** - * @author Christoph Strobl - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -public class EnableHazelcastRepositoriesIntegrationTests { - - @Configuration - @EnableHazelcastRepositories(considerNestedRepositories = true) - static class Config { - - @Bean - public KeyValueOperations keyValueTemplate() { - return new KeyValueTemplate(HazelcastUtils.preconfiguredHazelcastKeyValueAdapter()); - } - } - - @Autowired PersonRepository repo; - - @Test - public void shouldEnableKeyValueRepositoryCorrectly() { - assertThat(repo, notNullValue()); - - Person person = new Person(); - person.setFirstname("foo"); - repo.save(person); - - List result = repo.findByFirstname("foo"); - assertThat(result, hasSize(1)); - assertThat(result.get(0).firstname, is("foo")); - } - - static class Person implements Serializable { - - private static final long serialVersionUID = -1654603912377346292L; - - @Id String id; - String firstname; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - } - - static interface PersonRepository extends CrudRepository { - - List findByFirstname(String firstname); - - } - -} diff --git a/template.mf b/template.mf index 8dcd4740d..52208e53b 100644 --- a/template.mf +++ b/template.mf @@ -8,7 +8,6 @@ Import-Package: sun.reflect;version="0";resolution:=optional Import-Template: com.fasterxml.jackson.*;version="${jackson:[=.=.=,+1.0.0)}";resolution:=optional, - com.hazelcast.*;version="0";resolution:=optional, com.mysema.query.*;version="${querydsl:[=.=.=,+1.0.0)}";resolution:=optional, com.google.common.*;version="${guava:[=.=.=,+1.0.0)}";resolution:=optional, javax.enterprise.*;version="${cdi:[=.=.=,+1.0.0)}";resolution:=optional,