1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.shiro.web;
20
21 import groovy.lang.Closure;
22
23 import java.io.Closeable;
24 import java.util.Collections;
25 import java.util.Map;
26 import java.util.Properties;
27
28
29
30
31
32
33 public class RestoreSystemProperties implements Closeable {
34
35 private final Properties originalProperties;
36
37 public RestoreSystemProperties() {
38 originalProperties = System.getProperties();
39 System.setProperties(copyOf(originalProperties));
40 }
41
42 public void restore() {
43 System.setProperties(originalProperties);
44 }
45
46 private Properties copyOf(Properties source) {
47 Properties copy = new Properties();
48 copy.putAll(source);
49 return copy;
50 }
51
52 public static <T> T withProperties(Closure<T> closure) {
53 return withProperties(Collections.emptyMap(), closure);
54 }
55
56 public static <T> T withProperties(Map<String, String> properties, Closure<T> closure) {
57
58 try (RestoreSystemPropertiesmProperties">RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties()) {
59 properties.forEach(System::setProperty);
60
61 return closure.call();
62 }
63 }
64
65 @Override
66 public void close() {
67 restore();
68 }
69 }