KEYCLOAK-19480 Introduce MapProtocolMapperEntity

This commit is contained in:
Hynek Mlnarik 2021-10-04 12:16:40 +02:00 committed by Hynek Mlnařík
parent 00feef4dbe
commit 576292a662
4 changed files with 102 additions and 25 deletions

View file

@ -503,10 +503,35 @@ public abstract class MapClientAdapter extends AbstractClientModel<MapClientEnti
/*************** Protocol mappers ****************/
private static MapProtocolMapperEntity fromModel(ProtocolMapperModel model) {
MapProtocolMapperEntity res = new MapProtocolMapperEntityImpl();
res.setId(model.getId());
res.setName(model.getName());
res.setProtocolMapper(model.getProtocolMapper());
res.setConfig(model.getConfig());
return res;
}
private ProtocolMapperModel toModel(MapProtocolMapperEntity entity) {
ProtocolMapperModel res = new ProtocolMapperModel();
res.setId(entity.getId());
res.setName(entity.getName());
res.setProtocolMapper(entity.getProtocolMapper());
res.setConfig(entity.getConfig());
res.setProtocol(safeGetProtocol());
return res;
}
@Override
public Stream<ProtocolMapperModel> getProtocolMappersStream() {
final Map<String, ProtocolMapperModel> protocolMappers = entity.getProtocolMappers();
return protocolMappers == null ? Stream.empty() : protocolMappers.values().stream().distinct();
final Map<String, MapProtocolMapperEntity> protocolMappers = entity.getProtocolMappers();
return protocolMappers == null ? Stream.empty() : protocolMappers.values().stream().distinct()
.map(this::toModel);
}
private String safeGetProtocol() {
return entity.getProtocol() == null ? "openid-connect" : entity.getProtocol();
}
@Override
@ -515,20 +540,17 @@ public abstract class MapClientAdapter extends AbstractClientModel<MapClientEnti
return null;
}
ProtocolMapperModel pm = new ProtocolMapperModel();
pm.setId(KeycloakModelUtils.generateId());
pm.setName(model.getName());
pm.setProtocol(model.getProtocol());
pm.setProtocolMapper(model.getProtocolMapper());
if (model.getConfig() != null) {
pm.setConfig(new HashMap<>(model.getConfig()));
} else {
MapProtocolMapperEntity pm = fromModel(model);
if (pm.getId() == null) {
String id = KeycloakModelUtils.generateId();
pm.setId(id);
}
if (model.getConfig() == null) {
pm.setConfig(new HashMap<>());
}
entity.setProtocolMapper(pm.getId(), pm);
return pm;
return toModel(pm);
}
@Override
@ -543,20 +565,25 @@ public abstract class MapClientAdapter extends AbstractClientModel<MapClientEnti
public void updateProtocolMapper(ProtocolMapperModel mapping) {
final String id = mapping == null ? null : mapping.getId();
if (id != null) {
entity.setProtocolMapper(id, mapping);
entity.setProtocolMapper(id, fromModel(mapping));
}
}
@Override
public ProtocolMapperModel getProtocolMapperById(String id) {
return entity.getProtocolMapper(id);
MapProtocolMapperEntity protocolMapper = entity.getProtocolMapper(id);
return protocolMapper == null ? null : toModel(protocolMapper);
}
@Override
public ProtocolMapperModel getProtocolMapperByName(String protocol, String name) {
final Map<String, ProtocolMapperModel> protocolMappers = entity.getProtocolMappers();
final Map<String, MapProtocolMapperEntity> protocolMappers = entity.getProtocolMappers();
if (! Objects.equals(protocol, safeGetProtocol())) {
return null;
}
return protocolMappers == null ? null : protocolMappers.values().stream()
.filter(pm -> Objects.equals(pm.getProtocol(), protocol) && Objects.equals(pm.getName(), name))
.filter(pm -> Objects.equals(pm.getName(), name))
.map(this::toModel)
.findAny()
.orElse(null);
}

View file

@ -16,7 +16,6 @@
*/
package org.keycloak.models.map.client;
import org.keycloak.models.ProtocolMapperModel;
import org.keycloak.models.map.common.AbstractEntity;
import org.keycloak.models.map.common.UpdatableEntity;
import java.util.Collection;
@ -35,7 +34,7 @@ import org.keycloak.models.map.annotations.GenerateEntityImplementations;
@GenerateEntityImplementations(inherits="org.keycloak.models.map.client.MapClientEntity.AbstractClientEntity")
public interface MapClientEntity extends AbstractEntity, UpdatableEntity {
static abstract class AbstractClientEntity implements MapClientEntity {
public abstract class AbstractClientEntity implements MapClientEntity {
/**
* Flag signalizing that any of the setters has been meaningfully used.
*/
@ -79,9 +78,9 @@ public interface MapClientEntity extends AbstractEntity, UpdatableEntity {
void setClientScope(String id, Boolean defaultScope);
void removeClientScope(String id);
ProtocolMapperModel getProtocolMapper(String id);
Map<String, ProtocolMapperModel> getProtocolMappers();
void setProtocolMapper(String id, ProtocolMapperModel mapping);
MapProtocolMapperEntity getProtocolMapper(String id);
Map<String, MapProtocolMapperEntity> getProtocolMappers();
void setProtocolMapper(String id, MapProtocolMapperEntity mapping);
void removeProtocolMapper(String id);
void addRedirectUri(String redirectUri);

View file

@ -16,7 +16,6 @@
*/
package org.keycloak.models.map.client;
import org.keycloak.models.ProtocolMapperModel;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -164,12 +163,12 @@ public class MapClientEntityLazyDelegate implements MapClientEntity {
}
@Override
public ProtocolMapperModel getProtocolMapper(String id) {
public MapProtocolMapperEntity getProtocolMapper(String id) {
return getReadDelegate().getProtocolMapper(id);
}
@Override
public Map<String,ProtocolMapperModel> getProtocolMappers() {
public Map<String,MapProtocolMapperEntity> getProtocolMappers() {
return getReadDelegate().getProtocolMappers();
}
@ -459,7 +458,7 @@ public class MapClientEntityLazyDelegate implements MapClientEntity {
}
@Override
public void setProtocolMapper(String id, ProtocolMapperModel mapping) {
public void setProtocolMapper(String id, MapProtocolMapperEntity mapping) {
getWriteDelegate().setProtocolMapper(id, mapping);
}

View file

@ -0,0 +1,52 @@
/*
* Copyright 2021 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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.keycloak.models.map.client;
import org.keycloak.models.map.annotations.GenerateEntityImplementations;
import org.keycloak.models.map.common.UpdatableEntity;
import java.util.Map;
/**
*
* @author hmlnarik
*/
@GenerateEntityImplementations(
inherits = "org.keycloak.models.map.client.MapProtocolMapperEntity.AbstractProtocolMapperEntity"
)
public interface MapProtocolMapperEntity extends UpdatableEntity {
public abstract class AbstractProtocolMapperEntity implements MapProtocolMapperEntity {
protected boolean updated;
@Override
public boolean isUpdated() {
return this.updated;
}
}
String getId();
void setId(String id);
String getName();
void setName(String name);
String getProtocolMapper();
void setProtocolMapper(String protocolMapper);
Map<String, String> getConfig();
void setConfig(Map<String, String> config);
}