diff --git a/src/test/java/org/springframework/data/elasticsearch/SampleRecursiveMappingEntity.java b/src/test/java/org/springframework/data/elasticsearch/SampleRecursiveMappingEntity.java new file mode 100644 index 000000000..d2024c193 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/SampleRecursiveMappingEntity.java @@ -0,0 +1,75 @@ +/* + * Copyright 2013 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.elasticsearch; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; + +import static org.springframework.data.elasticsearch.annotations.FieldIndex.not_analyzed; +import static org.springframework.data.elasticsearch.annotations.FieldType.String; + +/** + * @author Jakub Vavrik + */ +@Document(indexName = "test-recursive-mapping", type = "mapping", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") +public class SampleRecursiveMappingEntity { + + @Id + private String id; + + @Field(type = String, index = not_analyzed, store = true, searchAnalyzer = "standard", indexAnalyzer = "standard") + private String message; + + @Field + private NestedEntity nested; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + static class NestedEntity { + @Field + private static NestedEntity someField = new NestedEntity(); + @Field + private Boolean something; + + public NestedEntity getSomeField() { + return someField; + } + + public void setSomeField(NestedEntity someField) { + this.someField = someField; + } + + public Boolean getSomething() { return something; } + + public void setSomething(Boolean something) { this.something = something; } + } + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/SimpleRecursiveMappingTest.java b/src/test/java/org/springframework/data/elasticsearch/core/SimpleRecursiveMappingTest.java new file mode 100644 index 000000000..0ac8cd3f9 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/core/SimpleRecursiveMappingTest.java @@ -0,0 +1,25 @@ +package org.springframework.data.elasticsearch.core; + +import junit.framework.Assert; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.junit.Test; +import org.springframework.data.elasticsearch.SampleRecursiveMappingEntity; + +import java.io.IOException; + +/** + * Test that classes that have fields of same type do not end in infinite loop when mapping. + */ +public class SimpleRecursiveMappingTest { + + private static final String EXPECTED = "{\"mapping\":{\"properties\":{\"message\":{\"store\":true,\"" + + "type\":\"string\",\"index\":\"not_analyzed\",\"search_analyzer\":\"standard\"," + + "\"index_analyzer\":\"standard\"},\"nested\":{\"type\":\"object\",\"properties\":{\"" + + "something\":{\"store\":false}}},\"nested\":{\"store\":false}}}}"; + + @Test + public void testInfiniteLoopAvoidance() throws IOException { + XContentBuilder xContentBuilder = MappingBuilder.buildMapping(SampleRecursiveMappingEntity.class, "mapping", "id"); + Assert.assertEquals(EXPECTED, xContentBuilder.string()); + } +}