From 9bd8e4db81be38dac4ed03a4577309e75f29aab1 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 27 Mar 2014 18:40:58 +0100 Subject: [PATCH] DATACMNS-480 - Added EntityInformation implementation based on PersistentEntity. Related ticket: DATACMNS-476. --- .../support/PersistentEntityInformation.java | 63 +++++++++++++++++++ .../PersistentEntityInformationUnitTests.java | 57 +++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/main/java/org/springframework/data/repository/core/support/PersistentEntityInformation.java create mode 100644 src/test/java/org/springframework/data/repository/core/support/PersistentEntityInformationUnitTests.java diff --git a/src/main/java/org/springframework/data/repository/core/support/PersistentEntityInformation.java b/src/main/java/org/springframework/data/repository/core/support/PersistentEntityInformation.java new file mode 100644 index 000000000..750182188 --- /dev/null +++ b/src/main/java/org/springframework/data/repository/core/support/PersistentEntityInformation.java @@ -0,0 +1,63 @@ +/* + * 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.repository.core.support; + +import java.io.Serializable; + +import org.springframework.data.mapping.PersistentEntity; +import org.springframework.data.mapping.model.BeanWrapper; +import org.springframework.data.repository.core.EntityInformation; + +/** + * {@link EntityInformation} implementation that uses a {@link PersistentEntity} to obtain id type information and uses + * a {@link BeanWrapper} to access the property value if requested. + * + * @author Oliver Gierke + */ +@SuppressWarnings("unchecked") +public class PersistentEntityInformation extends AbstractEntityInformation { + + private final PersistentEntity persistentEntity; + + /** + * Creates a new {@link PersistableEntityInformation} for the given {@link PersistentEntity}. + * + * @param entity must not be {@literal null}. + */ + public PersistentEntityInformation(PersistentEntity entity) { + + super(entity.getType()); + this.persistentEntity = entity; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.EntityInformation#getId(java.lang.Object) + */ + @Override + public ID getId(T entity) { + return (ID) BeanWrapper.create(entity, null).getProperty(this.persistentEntity.getIdProperty()); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.EntityInformation#getIdType() + */ + @Override + public Class getIdType() { + return (Class) persistentEntity.getIdProperty().getType(); + } +} diff --git a/src/test/java/org/springframework/data/repository/core/support/PersistentEntityInformationUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/PersistentEntityInformationUnitTests.java new file mode 100644 index 000000000..8fbf4ceb0 --- /dev/null +++ b/src/test/java/org/springframework/data/repository/core/support/PersistentEntityInformationUnitTests.java @@ -0,0 +1,57 @@ +/* + * 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.repository.core.support; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.data.annotation.Id; +import org.springframework.data.mapping.PersistentEntity; +import org.springframework.data.mapping.context.SampleMappingContext; +import org.springframework.data.mapping.context.SamplePersistentProperty; +import org.springframework.data.repository.core.EntityInformation; + +/** + * Unit tests for {@link PersistentEntityInformation}. + * + * @author Oliver Gierke + */ +public class PersistentEntityInformationUnitTests { + + /** + * @see DATACMNS-480 + */ + @Test + public void obtainsIdAndIdTypeInformationFromPersistentEntity() { + + SampleMappingContext context = new SampleMappingContext(); + PersistentEntity entity = context.getPersistentEntity(Sample.class); + + EntityInformation information = new PersistentEntityInformation(entity); + assertThat(information.getIdType(), is(typeCompatibleWith(Long.class))); + + Sample sample = new Sample(); + sample.id = 5L; + + assertThat(information.getId(sample), is(5L)); + } + + static class Sample { + + @Id Long id; + } +}