1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.forgerock.selfservice.json;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import com.fasterxml.jackson.core.Version;
25 import com.fasterxml.jackson.databind.DeserializationFeature;
26 import com.fasterxml.jackson.databind.ObjectMapper;
27 import com.fasterxml.jackson.databind.jsontype.NamedType;
28 import com.fasterxml.jackson.databind.module.SimpleModule;
29 import com.fasterxml.jackson.databind.type.TypeFactory;
30
31 import org.forgerock.json.JsonValue;
32 import org.forgerock.selfservice.core.StorageType;
33 import org.forgerock.selfservice.core.config.ProcessInstanceConfig;
34 import org.forgerock.selfservice.core.config.StageConfig;
35 import org.forgerock.selfservice.stages.captcha.CaptchaStageConfig;
36 import org.forgerock.selfservice.stages.email.VerifyEmailAccountConfig;
37 import org.forgerock.selfservice.stages.kba.SecurityAnswerDefinitionConfig;
38 import org.forgerock.selfservice.stages.kba.SecurityAnswerVerificationConfig;
39 import org.forgerock.selfservice.stages.registration.UserRegistrationConfig;
40 import org.forgerock.selfservice.stages.reset.ResetStageConfig;
41 import org.forgerock.selfservice.stages.terms.TermsAndConditionsConfig;
42 import org.forgerock.selfservice.stages.tokenhandlers.JwtTokenHandlerConfig;
43 import org.forgerock.selfservice.stages.user.EmailUsernameConfig;
44 import org.forgerock.selfservice.stages.user.RetrieveUsernameConfig;
45 import org.forgerock.selfservice.stages.user.UserDetailsConfig;
46 import org.forgerock.selfservice.stages.user.UserQueryConfig;
47 import org.forgerock.selfservice.stages.user.ValidateActiveAccountConfig;
48
49
50
51
52
53
54 final class JsonConfig {
55
56
57
58
59 private static final NamedType[] DEFAULT_NAMED_TYPES = new NamedType[] {
60
61 new NamedType(CaptchaStageConfig.class, CaptchaStageConfig.NAME),
62 new NamedType(ResetStageConfig.class, ResetStageConfig.NAME),
63 new NamedType(UserRegistrationConfig.class, UserRegistrationConfig.NAME),
64 new NamedType(UserQueryConfig.class, UserQueryConfig.NAME),
65 new NamedType(ValidateActiveAccountConfig.class, ValidateActiveAccountConfig.NAME),
66 new NamedType(VerifyEmailAccountConfig.class, VerifyEmailAccountConfig.NAME),
67 new NamedType(UserDetailsConfig.class, UserDetailsConfig.NAME),
68 new NamedType(SecurityAnswerDefinitionConfig.class, SecurityAnswerDefinitionConfig.NAME),
69 new NamedType(SecurityAnswerVerificationConfig.class, SecurityAnswerVerificationConfig.NAME),
70 new NamedType(RetrieveUsernameConfig.class, RetrieveUsernameConfig.NAME),
71 new NamedType(EmailUsernameConfig.class, EmailUsernameConfig.NAME),
72 new NamedType(TermsAndConditionsConfig.class, TermsAndConditionsConfig.NAME),
73
74
75 new NamedType(JwtTokenHandlerConfig.class, JwtTokenHandlerConfig.TYPE)
76 };
77
78 private final ObjectMapper mapper;
79
80 JsonConfig(ClassLoader classLoader) {
81 this(classLoader, new HashMap<String, Class<? extends StageConfig>>());
82 }
83
84 JsonConfig(ClassLoader classLoader, Map<String, Class<? extends StageConfig>> stageConfigMappings) {
85 final List<NamedType> namedTypes = new ArrayList<>(Arrays.asList(DEFAULT_NAMED_TYPES));
86
87 for (Map.Entry<String, Class<? extends StageConfig>> entry : stageConfigMappings.entrySet()) {
88 namedTypes.add(new NamedType(entry.getValue(), entry.getKey()));
89 }
90 mapper = new ObjectMapper();
91 mapper
92 .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
93 .setTypeFactory(TypeFactory.defaultInstance().withClassLoader(classLoader))
94 .registerModule(
95 new SimpleModule("SelfServiceModule", Version.unknownVersion())
96 .addDeserializer(StorageType.class, new StorageTypeDeserializer()))
97 .registerSubtypes(namedTypes.toArray(new NamedType[0]));
98 }
99
100
101
102
103
104
105
106
107
108 ProcessInstanceConfig buildProcessInstanceConfig(JsonValue json) {
109 return mapper.convertValue(json.getObject(), ProcessInstanceConfig.class);
110 }
111 }