diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/StringToLdapNameConverter.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/StringToLdapNameConverter.java new file mode 100644 index 000000000..275385cb9 --- /dev/null +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/StringToLdapNameConverter.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018 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.rest.core; + +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.ldap.LdapName; + +import org.springframework.core.convert.converter.Converter; + +/** + * {@link Converter} to convert a {@link String} to a {@link LdapName}. + * + * @author Mark Paluch + * @since 3.1 + */ +public enum StringToLdapNameConverter implements Converter { + + INSTANCE; + + /* + * (non-Javadoc) + * @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) + */ + @Override + public LdapName convert(String source) { + + try { + return new LdapName(source); + } catch (InvalidNameException e) { + throw new IllegalArgumentException(String.format("Cannot create LdapName for '%s'!", source), e); + } + } +} diff --git a/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/StringToLdapNameConverterUnitTests.java b/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/StringToLdapNameConverterUnitTests.java new file mode 100644 index 000000000..e6983c04f --- /dev/null +++ b/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/StringToLdapNameConverterUnitTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2018 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.rest.core; + +import static org.assertj.core.api.Assertions.*; + +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.ldap.LdapName; + +import org.junit.Test; +import org.springframework.core.convert.support.DefaultConversionService; + +/** + * Unit tests for {@link StringToLdapNameConverter}. + * + * @author Mark Paluch + */ +public class StringToLdapNameConverterUnitTests { + + @Test // DATAREST-1198 + public void shouldCreateLdapName() throws InvalidNameException { + + LdapName converted = StringToLdapNameConverter.INSTANCE.convert("dc=foo"); + + assertThat(converted).isEqualTo(new LdapName("dc=foo")); + } + + @Test // DATAREST-1198 + public void failedConversionShouldThrowIAE() { + + assertThatThrownBy(() -> StringToLdapNameConverter.INSTANCE.convert("foo")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test // DATAREST-1198 + public void shouldConvertStringInNameViaConversionService() { + + DefaultConversionService conversionService = new DefaultConversionService(); + conversionService.addConverter(StringToLdapNameConverter.INSTANCE); + + Name converted = conversionService.convert("dc=foo", Name.class); + + assertThat(converted).isInstanceOf(LdapName.class); + } +} diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java index fe4c5dc0a..58074fb2d 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java @@ -15,6 +15,7 @@ */ package org.springframework.data.rest.webmvc.config; +import javax.naming.Name; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -43,6 +44,7 @@ import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.core.Ordered; import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; import org.springframework.core.io.ClassPathResource; import org.springframework.data.auditing.AuditableBeanWrapperFactory; import org.springframework.data.auditing.MappingAuditableBeanWrapperFactory; @@ -57,6 +59,7 @@ import org.springframework.data.repository.support.DefaultRepositoryInvokerFactory; import org.springframework.data.repository.support.Repositories; import org.springframework.data.repository.support.RepositoryInvokerFactory; +import org.springframework.data.rest.core.StringToLdapNameConverter; import org.springframework.data.rest.core.UriToEntityConverter; import org.springframework.data.rest.core.config.MetadataConfiguration; import org.springframework.data.rest.core.config.Projection; @@ -247,6 +250,7 @@ public DefaultFormattingConversionService defaultConversionService() { DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); // Add Spring Data Commons formatters conversionService.addConverter(uriToEntityConverter(conversionService)); + conversionService.addConverter(stringToNameConverter()); addFormatters(conversionService); configurerDelegate.configureConversionService(conversionService); @@ -673,6 +677,10 @@ protected UriToEntityConverter uriToEntityConverter(ConversionService conversion return new UriToEntityConverter(persistentEntities(), repositoryInvokerFactory(conversionService), repositories()); } + protected Converter stringToNameConverter() { + return StringToLdapNameConverter.INSTANCE; + } + @Bean public ExcerptProjector excerptProjector() { diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java index f63a0e6d7..76573963e 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java @@ -17,6 +17,8 @@ import static org.assertj.core.api.Assertions.*; +import javax.naming.Name; +import javax.naming.ldap.LdapName; import java.util.Collection; import java.util.Date; import java.util.List; @@ -63,6 +65,7 @@ * Integration tests for basic application bootstrapping (general configuration related checks). * * @author Oliver Gierke + * @author Mark Paluch */ public class RepositoryRestMvConfigurationIntegrationTests { @@ -184,6 +187,15 @@ public void hasConvertersForPointAndDistance() { assertThat(service.canConvert(Distance.class, String.class)).isTrue(); } + @Test // DATAREST-1198 + public void hasConvertersForNamAndLdapName() { + + ConversionService service = context.getBean("defaultConversionService", ConversionService.class); + + assertThat(service.canConvert(String.class, Name.class)).isTrue(); + assertThat(service.canConvert(String.class, LdapName.class)).isTrue(); + } + @Test // DATAREST-686 public void defaultsEncodingForMessageSourceToUtfEight() {