diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java index 35a7e425351..aded77e6b0d 100755 --- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java +++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/MongoStoreImpl.java @@ -18,6 +18,7 @@ import org.keycloak.connections.mongo.api.types.Mapper; import org.keycloak.connections.mongo.api.types.MapperContext; import org.keycloak.connections.mongo.api.types.MapperRegistry; import org.keycloak.connections.mongo.impl.types.BasicDBListMapper; +import org.keycloak.connections.mongo.impl.types.BasicDBListToSetMapper; import org.keycloak.connections.mongo.impl.types.BasicDBObjectMapper; import org.keycloak.connections.mongo.impl.types.BasicDBObjectToMapMapper; import org.keycloak.connections.mongo.impl.types.EnumToStringMapper; @@ -35,8 +36,10 @@ import org.keycloak.models.utils.reflection.PropertyQueries; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -71,6 +74,10 @@ public class MongoStoreImpl implements MongoStore { mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, List.class)); mapperRegistry.addDBObjectMapper(new BasicDBListMapper(mapperRegistry)); + mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, HashSet.class)); + mapperRegistry.addAppObjectMapper(new ListMapper(mapperRegistry, Set.class)); + mapperRegistry.addDBObjectMapper(new BasicDBListToSetMapper(mapperRegistry)); + mapperRegistry.addAppObjectMapper(new MapMapper(HashMap.class)); mapperRegistry.addAppObjectMapper(new MapMapper(Map.class)); mapperRegistry.addDBObjectMapper(new BasicDBObjectToMapMapper()); diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListMapper.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListMapper.java index f44f54506aa..cc229c6969d 100755 --- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListMapper.java +++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListMapper.java @@ -6,6 +6,7 @@ import org.keycloak.connections.mongo.api.types.MapperContext; import org.keycloak.connections.mongo.api.types.MapperRegistry; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListToSetMapper.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListToSetMapper.java new file mode 100644 index 00000000000..d43781a2252 --- /dev/null +++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/BasicDBListToSetMapper.java @@ -0,0 +1,44 @@ +package org.keycloak.connections.mongo.impl.types; + +import java.util.HashSet; +import java.util.Set; + +import com.mongodb.BasicDBList; +import org.keycloak.connections.mongo.api.types.Mapper; +import org.keycloak.connections.mongo.api.types.MapperContext; +import org.keycloak.connections.mongo.api.types.MapperRegistry; + +/** + * @author Marek Posolda + */ +public class BasicDBListToSetMapper implements Mapper { + + private final MapperRegistry mapperRegistry; + + public BasicDBListToSetMapper(MapperRegistry mapperRegistry) { + this.mapperRegistry = mapperRegistry; + } + + @Override + public Set convertObject(MapperContext context) { + BasicDBList dbList = context.getObjectToConvert(); + Set appObjects = new HashSet(); + Class expectedListElementType = context.getGenericTypes().get(0); + + for (Object dbObject : dbList) { + MapperContext newContext = new MapperContext(dbObject, expectedListElementType, null); + appObjects.add(mapperRegistry.convertDBObjectToApplicationObject(newContext)); + } + return appObjects; + } + + @Override + public Class getTypeOfObjectToConvert() { + return BasicDBList.class; + } + + @Override + public Class getExpectedReturnType() { + return Set.class; + } +} diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/ListMapper.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/ListMapper.java index 3274fe36d56..dc649d67c56 100755 --- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/ListMapper.java +++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/impl/types/ListMapper.java @@ -5,12 +5,12 @@ import org.keycloak.connections.mongo.api.types.Mapper; import org.keycloak.connections.mongo.api.types.MapperContext; import org.keycloak.connections.mongo.api.types.MapperRegistry; -import java.util.List; +import java.util.Collection; /** * @author Marek Posolda */ -public class ListMapper implements Mapper { +public class ListMapper implements Mapper { private final MapperRegistry mapperRegistry; private final Class listType; diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java index 7ce4935bc2f..691bce4925c 100755 --- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java +++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProvider.java @@ -27,11 +27,9 @@ public class MongoRealmProvider implements RealmProvider { private final MongoStoreInvocationContext invocationContext; private final KeycloakSession session; - private final MongoStore mongoStore; - public MongoRealmProvider(KeycloakSession session, MongoStore mongoStore, MongoStoreInvocationContext invocationContext) { + public MongoRealmProvider(KeycloakSession session, MongoStoreInvocationContext invocationContext) { this.session = session; - this.mongoStore = mongoStore; this.invocationContext = invocationContext; } diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java index fceeb82ae9f..96067533a4b 100755 --- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java +++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoRealmProviderFactory.java @@ -27,7 +27,7 @@ public class MongoRealmProviderFactory implements RealmProviderFactory { @Override public RealmProvider create(KeycloakSession session) { MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class); - return new MongoRealmProvider(session, connection.getMongoStore(), connection.getInvocationContext()); + return new MongoRealmProvider(session, connection.getInvocationContext()); } @Override diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProvider.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProvider.java index 52d4c98d2b4..94227112d0e 100755 --- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProvider.java +++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProvider.java @@ -33,11 +33,9 @@ public class MongoUserProvider implements UserProvider { private final MongoStoreInvocationContext invocationContext; private final KeycloakSession session; - private final MongoStore mongoStore; - public MongoUserProvider(KeycloakSession session, MongoStore mongoStore, MongoStoreInvocationContext invocationContext) { + public MongoUserProvider(KeycloakSession session, MongoStoreInvocationContext invocationContext) { this.session = session; - this.mongoStore = mongoStore; this.invocationContext = invocationContext; } @@ -311,6 +309,7 @@ public class MongoUserProvider implements UserProvider { @Override public void updateFederatedIdentity(RealmModel realm, UserModel federatedUser, FederatedIdentityModel federatedIdentityModel) { + federatedUser = getUserById(federatedUser.getId(), realm); MongoUserEntity userEntity = ((UserAdapter) federatedUser).getUser(); FederatedIdentityEntity federatedIdentityEntity = findFederatedIdentityLink(userEntity, federatedIdentityModel.getIdentityProvider()); diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProviderFactory.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProviderFactory.java index 083d0c03bfe..a11704827bd 100755 --- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProviderFactory.java +++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/MongoUserProviderFactory.java @@ -27,7 +27,7 @@ public class MongoUserProviderFactory implements UserProviderFactory { @Override public UserProvider create(KeycloakSession session) { MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class); - return new MongoUserProvider(session, connection.getMongoStore(), connection.getInvocationContext()); + return new MongoUserProvider(session, connection.getInvocationContext()); } @Override