|
24 | 24 | import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
|
25 | 25 | import org.apache.commons.lang3.StringUtils;
|
26 | 26 | import org.wiremock.extensions.state.internal.ContextManager;
|
27 |
| -import org.wiremock.extensions.state.internal.DeleteStateParameters; |
28 |
| -import org.wiremock.extensions.state.internal.ResponseTemplateModel; |
29 | 27 | import org.wiremock.extensions.state.internal.StateExtensionMixin;
|
| 28 | +import org.wiremock.extensions.state.internal.api.DeleteStateParameters; |
| 29 | +import org.wiremock.extensions.state.internal.model.ResponseTemplateModel; |
30 | 30 |
|
31 | 31 | import java.util.List;
|
32 | 32 | import java.util.Map;
|
@@ -72,122 +72,139 @@ public void beforeResponseSent(ServeEvent serveEvent, Parameters parameters) {
|
72 | 72 | "response", ResponseTemplateModel.from(serveEvent.getResponse())
|
73 | 73 | );
|
74 | 74 | var configuration = Json.mapToObject(parameters, DeleteStateParameters.class);
|
75 |
| - Optional.ofNullable(configuration.getList()).ifPresentOrElse( |
76 |
| - listConfig -> handleListDeletion(listConfig, createContextName(model, configuration.getContext()), model), |
77 |
| - () -> handleContextDeletion(configuration, model) |
78 |
| - ); |
| 75 | + new ListenerInstance(serveEvent.getId().toString(), model, configuration).run(); |
79 | 76 | }
|
80 | 77 |
|
81 |
| - private void handleContextDeletion(DeleteStateParameters configuration, Map<String, Object> model) { |
82 |
| - if (configuration.getContext() != null) { |
83 |
| - deleteContext(configuration.getContext(), model); |
84 |
| - } else if (configuration.getContexts() != null) { |
85 |
| - deleteContexts(configuration.getContexts(), model); |
86 |
| - } else if (configuration.getContextsMatching() != null) { |
87 |
| - deleteContextsMatching(configuration.getContextsMatching(), model); |
88 |
| - } else { |
89 |
| - throw createConfigurationError("Missing/invalid configuration for context deletion"); |
90 |
| - } |
| 78 | + private String renderTemplate(Object context, String value) { |
| 79 | + return templateEngine.getUncachedTemplate(value).apply(context); |
91 | 80 | }
|
92 | 81 |
|
93 |
| - private void deleteContexts(List<String> rawContexts, Map<String, Object> model) { |
| 82 | + private class ListenerInstance { |
| 83 | + private final String requestId; |
| 84 | + private final DeleteStateParameters configuration; |
| 85 | + private final Map<String, Object> model; |
94 | 86 |
|
95 |
| - var contexts = rawContexts.stream().map(it -> renderTemplate(model, it)).collect(Collectors.toList()); |
96 |
| - contextManager.onEach(context -> { |
97 |
| - if(contexts.contains(context.getContextName())) { |
98 |
| - contextManager.deleteContext(context.getContextName()); |
| 87 | + ListenerInstance(String requestId, Map<String, Object> model, DeleteStateParameters configuration) { |
| 88 | + this.requestId = requestId; |
| 89 | + this.model = model; |
| 90 | + this.configuration = configuration; |
| 91 | + } |
| 92 | + |
| 93 | + public void run() { |
| 94 | + Optional.ofNullable(configuration.getList()).ifPresentOrElse( |
| 95 | + listConfig -> handleListDeletion(listConfig, createContextName(configuration.getContext())), |
| 96 | + this::handleContextDeletion |
| 97 | + ); |
| 98 | + } |
| 99 | + |
| 100 | + private void handleContextDeletion() { |
| 101 | + if (configuration.getContext() != null) { |
| 102 | + deleteContext(configuration.getContext()); |
| 103 | + } else if (configuration.getContexts() != null) { |
| 104 | + deleteContexts(configuration.getContexts()); |
| 105 | + } else if (configuration.getContextsMatching() != null) { |
| 106 | + deleteContextsMatching(configuration.getContextsMatching()); |
| 107 | + } else { |
| 108 | + throw createConfigurationError("Missing/invalid configuration for context deletion"); |
99 | 109 | }
|
100 |
| - }); |
101 |
| - } |
| 110 | + } |
| 111 | + |
| 112 | + private void deleteContexts(List<String> rawContexts) { |
102 | 113 |
|
103 |
| - private void deleteContextsMatching(String rawRegex, Map<String, Object> model) { |
104 |
| - try { |
105 |
| - var regex = renderTemplate(model, rawRegex); |
106 |
| - var pattern = Pattern.compile(regex); |
107 |
| - contextManager.onEach(context -> { |
108 |
| - if(pattern.matcher(context.getContextName()).matches()) { |
109 |
| - contextManager.deleteContext(context.getContextName()); |
| 114 | + var contexts = rawContexts.stream().map(it -> renderTemplate(model, it)).collect(Collectors.toList()); |
| 115 | + contextManager.onEach(requestId, context -> { |
| 116 | + if (contexts.contains(context.getContextName())) { |
| 117 | + contextManager.deleteContext(requestId, context.getContextName()); |
110 | 118 | }
|
111 | 119 | });
|
112 |
| - } catch (PatternSyntaxException ex) { |
113 |
| - throw createConfigurationError("Missing/invalid configuration for context deletion: %s", ex.getMessage()); |
114 | 120 | }
|
115 |
| - } |
116 | 121 |
|
117 |
| - private void deleteContext(String rawContext, Map<String, Object> model) { |
118 |
| - contextManager.deleteContext(createContextName(model, rawContext)); |
119 |
| - } |
| 122 | + private void deleteContextsMatching(String rawRegex) { |
| 123 | + try { |
| 124 | + var regex = renderTemplate(model, rawRegex); |
| 125 | + var pattern = Pattern.compile(regex); |
| 126 | + contextManager.onEach(requestId, context -> { |
| 127 | + if (pattern.matcher(context.getContextName()).matches()) { |
| 128 | + contextManager.deleteContext(requestId, context.getContextName()); |
| 129 | + } |
| 130 | + }); |
| 131 | + } catch (PatternSyntaxException ex) { |
| 132 | + throw createConfigurationError("Missing/invalid configuration for context deletion: %s", ex.getMessage()); |
| 133 | + } |
| 134 | + } |
120 | 135 |
|
121 |
| - private void handleListDeletion(DeleteStateParameters.ListParameters listConfig, String contextName, Map<String, Object> model) { |
122 |
| - if (Boolean.TRUE.equals(listConfig.getDeleteFirst())) { |
123 |
| - deleteFirst(contextName); |
124 |
| - } else if (Boolean.TRUE.equals(listConfig.getDeleteLast())) { |
125 |
| - deleteLast(contextName); |
126 |
| - } else if (StringUtils.isNotBlank(listConfig.getDeleteIndex())) { |
127 |
| - deleteIndex(listConfig, contextName, model); |
128 |
| - } else if (listConfig.getDeleteWhere() != null && |
129 |
| - listConfig.getDeleteWhere().getProperty() != null && |
130 |
| - listConfig.getDeleteWhere().getValue() != null |
131 |
| - ) { |
132 |
| - deleteWhere(listConfig, contextName, model); |
133 |
| - } else { |
134 |
| - throw createConfigurationError("Missing/invalid configuration for list entry deletion"); |
| 136 | + private void deleteContext(String rawContext) { |
| 137 | + contextManager.deleteContext(requestId, createContextName(rawContext)); |
135 | 138 | }
|
136 |
| - } |
137 | 139 |
|
138 |
| - private Long deleteFirst(String contextName) { |
139 |
| - return contextManager.createOrUpdateContextList(contextName, maps -> { |
140 |
| - if (!maps.isEmpty()) maps.removeFirst(); |
141 |
| - logger().info(contextName, "list::deleteFirst"); |
142 |
| - }); |
143 |
| - } |
| 140 | + private void handleListDeletion(DeleteStateParameters.ListParameters listConfig, String contextName) { |
| 141 | + if (Boolean.TRUE.equals(listConfig.getDeleteFirst())) { |
| 142 | + deleteFirst(contextName); |
| 143 | + } else if (Boolean.TRUE.equals(listConfig.getDeleteLast())) { |
| 144 | + deleteLast(contextName); |
| 145 | + } else if (StringUtils.isNotBlank(listConfig.getDeleteIndex())) { |
| 146 | + deleteIndex(listConfig, contextName); |
| 147 | + } else if (listConfig.getDeleteWhere() != null && |
| 148 | + listConfig.getDeleteWhere().getProperty() != null && |
| 149 | + listConfig.getDeleteWhere().getValue() != null |
| 150 | + ) { |
| 151 | + deleteWhere(listConfig, contextName); |
| 152 | + } else { |
| 153 | + throw createConfigurationError("Missing/invalid configuration for list entry deletion"); |
| 154 | + } |
| 155 | + } |
144 | 156 |
|
145 |
| - private void deleteLast(String contextName) { |
146 |
| - contextManager.createOrUpdateContextList(contextName, maps -> { |
147 |
| - if (!maps.isEmpty()) maps.removeLast(); |
148 |
| - logger().info(contextName, "list::deleteLast"); |
149 |
| - }); |
150 |
| - } |
| 157 | + private void deleteFirst(String contextName) { |
| 158 | + contextManager.createOrUpdateContextList(requestId, contextName, maps -> { |
| 159 | + if (!maps.isEmpty()) maps.removeFirst(); |
| 160 | + logger().info(contextName, "list::deleteFirst"); |
| 161 | + }); |
| 162 | + } |
151 | 163 |
|
152 |
| - private void deleteIndex(DeleteStateParameters.ListParameters listConfig, String contextName, Map<String, Object> model) { |
153 |
| - try { |
154 |
| - var index = Integer.parseInt(renderTemplate(model, listConfig.getDeleteIndex())); |
155 |
| - contextManager.createOrUpdateContextList(contextName, list -> { |
156 |
| - list.remove(index); |
157 |
| - logger().info(contextName, String.format("list::deleteIndex(%d)", index)); |
| 164 | + private void deleteLast(String contextName) { |
| 165 | + contextManager.createOrUpdateContextList(requestId, contextName, maps -> { |
| 166 | + if (!maps.isEmpty()) maps.removeLast(); |
| 167 | + logger().info(contextName, "list::deleteLast"); |
158 | 168 | });
|
159 |
| - } catch (IndexOutOfBoundsException | NumberFormatException e) { |
160 |
| - logger().info(contextName, String.format("Unknown or unparsable list index: '%s' - ignoring", listConfig.getDeleteIndex())); |
161 | 169 | }
|
162 |
| - } |
163 | 170 |
|
164 |
| - private void deleteWhere(DeleteStateParameters.ListParameters listConfig, String contextName, Map<String, Object> model) { |
165 |
| - var property = renderTemplate(model, listConfig.getDeleteWhere().getProperty()); |
166 |
| - var value = renderTemplate(model, listConfig.getDeleteWhere().getValue()); |
167 |
| - contextManager.createOrUpdateContextList(contextName, list -> { |
168 |
| - var iterator = list.iterator(); |
169 |
| - while (iterator.hasNext()) { |
170 |
| - var element = iterator.next(); |
171 |
| - if (Objects.equals(element.getOrDefault(property, null), value)) { |
172 |
| - iterator.remove(); |
173 |
| - logger().info(contextName, String.format("list::deleteWhere(property=%s)", property)); |
174 |
| - break; |
175 |
| - } |
| 171 | + private void deleteIndex(DeleteStateParameters.ListParameters listConfig, String contextName) { |
| 172 | + try { |
| 173 | + var index = Integer.parseInt(renderTemplate(model, listConfig.getDeleteIndex())); |
| 174 | + contextManager.createOrUpdateContextList(requestId, contextName, list -> { |
| 175 | + list.remove(index); |
| 176 | + logger().info(contextName, String.format("list::deleteIndex(%d)", index)); |
| 177 | + }); |
| 178 | + } catch (IndexOutOfBoundsException | NumberFormatException e) { |
| 179 | + logger().info(contextName, String.format("Unknown or unparsable list index: '%s' - ignoring", listConfig.getDeleteIndex())); |
176 | 180 | }
|
177 |
| - }); |
178 |
| - } |
| 181 | + } |
179 | 182 |
|
180 |
| - private String createContextName(Map<String, Object> model, String rawContext) { |
181 |
| - var context = Optional.ofNullable(rawContext).filter(StringUtils::isNotBlank) |
182 |
| - .map(it -> renderTemplate(model, it)) |
183 |
| - .orElseThrow(() -> new ConfigurationException("no context specified")); |
184 |
| - if (StringUtils.isBlank(context)) { |
185 |
| - throw createConfigurationError("Context cannot be blank"); |
| 183 | + private void deleteWhere(DeleteStateParameters.ListParameters listConfig, String contextName) { |
| 184 | + var property = renderTemplate(model, listConfig.getDeleteWhere().getProperty()); |
| 185 | + var value = renderTemplate(model, listConfig.getDeleteWhere().getValue()); |
| 186 | + contextManager.createOrUpdateContextList(requestId, contextName, list -> { |
| 187 | + var iterator = list.iterator(); |
| 188 | + while (iterator.hasNext()) { |
| 189 | + var element = iterator.next(); |
| 190 | + if (Objects.equals(element.getOrDefault(property, null), value)) { |
| 191 | + iterator.remove(); |
| 192 | + logger().info(contextName, String.format("list::deleteWhere(property=%s)", property)); |
| 193 | + break; |
| 194 | + } |
| 195 | + } |
| 196 | + }); |
| 197 | + } |
| 198 | + |
| 199 | + private String createContextName(String rawContext) { |
| 200 | + var context = Optional.ofNullable(rawContext).filter(StringUtils::isNotBlank) |
| 201 | + .map(it -> renderTemplate(model, it)) |
| 202 | + .orElseThrow(() -> new ConfigurationException("no context specified")); |
| 203 | + if (StringUtils.isBlank(context)) { |
| 204 | + throw createConfigurationError("Context cannot be blank"); |
| 205 | + } |
| 206 | + return context; |
186 | 207 | }
|
187 |
| - return context; |
188 |
| - } |
189 | 208 |
|
190 |
| - private String renderTemplate(Object context, String value) { |
191 |
| - return templateEngine.getUncachedTemplate(value).apply(context); |
192 | 209 | }
|
193 | 210 | }
|
0 commit comments