1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.json.resource;
18
19 import static org.forgerock.json.JsonValueFunctions.setOf;
20
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.Collection;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.TreeMap;
28 import java.util.regex.Pattern;
29
30 import org.forgerock.services.context.AbstractContext;
31 import org.forgerock.services.context.Context;
32 import org.forgerock.json.JsonValue;
33 import org.forgerock.util.Reject;
34
35
36
37
38
39
40
41
42 public class AdviceContext extends AbstractContext {
43
44
45 private static final String ADVICE_ATTR = "advice";
46
47
48 private static final String RESTRICTED_ADVICE_NAMES_ATTR = "restrictedAdviceNames";
49
50 private static final Pattern ALLOWED_RFC_CHARACTERS = Pattern.compile("^[\\x20-\\x7E]*$");
51
52 private final Collection<String> restrictedAdviceNames = new HashSet<>();
53
54
55 private final Map<String, List<String>> advice = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
56
57
58
59
60
61
62
63 public AdviceContext(Context parent, Collection<String> restrictedAdviceNames) {
64 super(parent, "advice");
65 this.restrictedAdviceNames.addAll(restrictedAdviceNames);
66 data.put(RESTRICTED_ADVICE_NAMES_ATTR, restrictedAdviceNames);
67 data.put(ADVICE_ATTR, advice);
68 }
69
70
71
72
73
74
75
76
77
78
79 public AdviceContext(final JsonValue savedContext, final ClassLoader classLoader) {
80 super(savedContext, classLoader);
81 restrictedAdviceNames.addAll(data.get(RESTRICTED_ADVICE_NAMES_ATTR).as(setOf(String.class)));
82 advice.putAll(data.get(ADVICE_ATTR).asMapOfList(String.class));
83 }
84
85
86
87
88
89
90 public Map<String, List<String>> getAdvices() {
91 return advice;
92 }
93
94
95
96
97
98
99
100 public void putAdvice(String adviceName, String... advices) {
101 Reject.ifNull(adviceName, advices);
102 Reject.ifTrue(isRestrictedAdvice(adviceName), "Illegal use of restricted advice name, " + adviceName);
103 for (String adviceEntry : advices) {
104 Reject.ifTrue(!isRfcCompliant(adviceEntry), "Advice contains illegal characters in, " + adviceEntry);
105 }
106 List<String> adviceEntry = advice.get(adviceName);
107 if (adviceEntry == null) {
108 adviceEntry = new ArrayList<>();
109 advice.put(adviceName, adviceEntry);
110 }
111 adviceEntry.addAll(Arrays.asList(advices));
112 }
113
114 private boolean isRfcCompliant(String advice) {
115 return ALLOWED_RFC_CHARACTERS.matcher(advice).matches();
116 }
117
118 private boolean isRestrictedAdvice(String adviceName) {
119 return restrictedAdviceNames.contains(adviceName);
120 }
121 }