Skip to content

Commit c9be21a

Browse files
committed
Extract Querydsl fragment from QuerydslLdapRepository.
Closes #273
1 parent 79ce689 commit c9be21a

File tree

5 files changed

+529
-337
lines changed

5 files changed

+529
-337
lines changed

src/main/java/org/springframework/data/ldap/repository/support/LdapEntityInformation.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import org.springframework.data.repository.core.support.AbstractEntityInformation;
2222
import org.springframework.lang.Nullable;
23-
import org.springframework.ldap.odm.core.impl.DefaultObjectDirectoryMapper;
23+
import org.springframework.ldap.odm.core.ObjectDirectoryMapper;
2424

2525
/**
2626
* ODM-based {@link org.springframework.data.repository.core.EntityInformation} for LDAP entities.
@@ -32,16 +32,17 @@
3232
*/
3333
class LdapEntityInformation<T> extends AbstractEntityInformation<T, Name> {
3434

35-
private final DefaultObjectDirectoryMapper MAPPER = new DefaultObjectDirectoryMapper();
35+
private final ObjectDirectoryMapper odm;
3636

37-
public LdapEntityInformation(Class<T> domainClass) {
37+
public LdapEntityInformation(Class<T> domainClass, ObjectDirectoryMapper odm) {
3838
super(domainClass);
39+
this.odm = odm;
3940
}
4041

4142
@Nullable
4243
@Override
4344
public Name getId(T entity) {
44-
return MAPPER.getId(entity);
45+
return odm.getId(entity);
4546
}
4647

4748
@Override

src/main/java/org/springframework/data/ldap/repository/support/LdapRepositoryFactory.java

+40-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
package org.springframework.data.ldap.repository.support;
1717

1818
import static org.springframework.data.querydsl.QuerydslUtils.*;
19+
import static org.springframework.data.repository.core.support.RepositoryComposition.*;
1920

2021
import java.lang.reflect.Constructor;
2122
import java.lang.reflect.Method;
2223
import java.util.Optional;
2324

25+
import org.springframework.dao.InvalidDataAccessApiUsageException;
2426
import org.springframework.data.ldap.core.mapping.LdapMappingContext;
2527
import org.springframework.data.ldap.repository.query.AnnotatedLdapRepositoryQuery;
2628
import org.springframework.data.ldap.repository.query.LdapQueryMethod;
@@ -94,9 +96,9 @@ public LdapRepositoryFactory(LdapOperations ldapOperations) {
9496
* @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getEntityInformation(java.lang.Class)
9597
*/
9698
@Override
97-
@SuppressWarnings("unchecked")
99+
@SuppressWarnings({ "unchecked", "rawtypes" })
98100
public <T, ID> EntityInformation<T, ID> getEntityInformation(Class<T> domainClass) {
99-
return new LdapEntityInformation(domainClass);
101+
return new LdapEntityInformation(domainClass, ldapOperations.getObjectDirectoryMapper());
100102
}
101103

102104
/*
@@ -105,11 +107,46 @@ public <T, ID> EntityInformation<T, ID> getEntityInformation(Class<T> domainClas
105107
*/
106108
@Override
107109
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
110+
return SimpleLdapRepository.class;
111+
}
112+
113+
/*
114+
* (non-Javadoc)
115+
* @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getRepositoryFragments(org.springframework.data.repository.core.RepositoryMetadata)
116+
*/
117+
@Override
118+
protected RepositoryFragments getRepositoryFragments(RepositoryMetadata metadata) {
119+
return getRepositoryFragments(metadata, this.ldapOperations);
120+
}
121+
122+
/**
123+
* Creates {@link RepositoryFragments} based on {@link RepositoryMetadata} to add LDAP-specific extensions. Typically,
124+
* adds a {@link QuerydslLdapPredicateExecutor} if the repository interface uses Querydsl.
125+
* <p>
126+
* Can be overridden by subclasses to customize {@link RepositoryFragments}.
127+
*
128+
* @param metadata repository metadata.
129+
* @param operations the LDAP operations manager.
130+
* @return
131+
* @since 2.6
132+
*/
133+
protected RepositoryFragments getRepositoryFragments(RepositoryMetadata metadata, LdapOperations operations) {
108134

109135
boolean isQueryDslRepository = QUERY_DSL_PRESENT
110136
&& QuerydslPredicateExecutor.class.isAssignableFrom(metadata.getRepositoryInterface());
111137

112-
return isQueryDslRepository ? QuerydslLdapRepository.class : SimpleLdapRepository.class;
138+
if (isQueryDslRepository) {
139+
140+
if (metadata.isReactiveRepository()) {
141+
throw new InvalidDataAccessApiUsageException(
142+
"Cannot combine Querydsl and reactive repository support in a single interface");
143+
}
144+
145+
return RepositoryFragments.just(new QuerydslLdapPredicateExecutor<>(
146+
getEntityInformation(metadata.getDomainType()), getProjectionFactory(), operations, mappingContext));
147+
}
148+
149+
return RepositoryFragments.empty();
113150
}
114151

115152
/*

0 commit comments

Comments
 (0)