|
1 | 1 | package act.app.conf; |
2 | 2 |
|
| 3 | +import act.app.event.AppEventId; |
3 | 4 | import act.conf.AppConfig; |
4 | 5 | import act.route.RouteSource; |
5 | 6 | import act.route.Router; |
|
10 | 11 |
|
11 | 12 | import java.lang.reflect.Method; |
12 | 13 | import java.lang.reflect.Modifier; |
13 | | -import java.util.Map; |
14 | | -import java.util.Set; |
| 14 | +import java.util.*; |
15 | 15 |
|
16 | 16 | /** |
17 | 17 | * Base class for app developer implement source code based configuration |
@@ -62,6 +62,10 @@ protected T registerStringValueResolver(Class<T> targetType, StringValueResolver |
62 | 62 | return me(); |
63 | 63 | } |
64 | 64 |
|
| 65 | + protected CorsSetting cors() { |
| 66 | + return new CorsSetting(this); |
| 67 | + } |
| 68 | + |
65 | 69 | protected RouteBuilder route(String path) { |
66 | 70 | return new RouteBuilder(this).map(path); |
67 | 71 | } |
@@ -98,14 +102,104 @@ public <V> V propVal(String key) { |
98 | 102 |
|
99 | 103 | protected void releaseAppConfigResources() {} |
100 | 104 |
|
| 105 | + protected static class CorsSetting { |
| 106 | + private AppConfigurator conf; |
| 107 | + private boolean enabled; |
| 108 | + private String allowOrigin; |
| 109 | + private int maxAge; |
| 110 | + private List<String> methods = new ArrayList<>(); |
| 111 | + private List<String> headersBoth = new ArrayList<>(); |
| 112 | + private List<String> headersAllowed = new ArrayList<>(); |
| 113 | + private List<String> headersExpose = new ArrayList<>(); |
| 114 | + |
| 115 | + CorsSetting(AppConfigurator conf) { |
| 116 | + this.conf = conf; |
| 117 | + this.enabled = true; |
| 118 | + conf.app().jobManager().on(AppEventId.CONFIG_PREMERGE, new Runnable() { |
| 119 | + @Override |
| 120 | + public void run() { |
| 121 | + checkAndCommit(); |
| 122 | + } |
| 123 | + }); |
| 124 | + } |
| 125 | + |
| 126 | + public CorsSetting enable() { |
| 127 | + enabled = true; |
| 128 | + return this; |
| 129 | + } |
| 130 | + |
| 131 | + public CorsSetting disable() { |
| 132 | + enabled = false; |
| 133 | + return this; |
| 134 | + } |
| 135 | + |
| 136 | + public CorsSetting allowOrigin(String allowOrigin) { |
| 137 | + E.illegalArgumentIf(S.blank(allowOrigin), "allow origin cannot be empty"); |
| 138 | + this.allowOrigin = allowOrigin; |
| 139 | + return this; |
| 140 | + } |
| 141 | + |
| 142 | + public CorsSetting allowMethods(String ... methods) { |
| 143 | + this.methods.addAll(C.listOf(methods)); |
| 144 | + return this; |
| 145 | + } |
| 146 | + |
| 147 | + public CorsSetting maxAge(int maxAge) { |
| 148 | + E.illegalArgumentIf(maxAge < 0); |
| 149 | + this.maxAge = maxAge; |
| 150 | + return this; |
| 151 | + } |
| 152 | + |
| 153 | + public CorsSetting allowHeaders(String ... headers) { |
| 154 | + headersAllowed.addAll(C.listOf(headers)); |
| 155 | + return this; |
| 156 | + } |
| 157 | + |
| 158 | + public CorsSetting exposeHeaders(String ... headers) { |
| 159 | + headersExpose.addAll(C.listOf(headers)); |
| 160 | + return this; |
| 161 | + } |
| 162 | + |
| 163 | + public CorsSetting allowAndExposeHeaders(String ... headers) { |
| 164 | + headersBoth.addAll(C.listOf(headers)); |
| 165 | + return this; |
| 166 | + } |
| 167 | + |
| 168 | + private void checkAndCommit() { |
| 169 | + if (!enabled) { |
| 170 | + logger.info("Global CORS is disabled"); |
| 171 | + conf.enableCors(false); |
| 172 | + return; |
| 173 | + } |
| 174 | + logger.info("Global CORS is enabled"); |
| 175 | + conf.enableCors(true); |
| 176 | + conf.corsAllowOrigin(allowOrigin); |
| 177 | + conf.corsHeaders(consolidate(headersBoth)); |
| 178 | + conf.corsAllowHeaders(consolidate(headersAllowed)); |
| 179 | + conf.corsHeadersExpose(consolidate(headersExpose)); |
| 180 | + conf.corsAllowMethods(consolidate(methods)); |
| 181 | + conf.corsMaxAge(maxAge); |
| 182 | + } |
| 183 | + |
| 184 | + private String consolidate(List<String> stringList) { |
| 185 | + if (stringList.isEmpty()) { |
| 186 | + return null; |
| 187 | + } |
| 188 | + Set<String> set = new HashSet<>(); |
| 189 | + for (String s : stringList) { |
| 190 | + set.addAll(C.listOf(s.split(","))); |
| 191 | + } |
| 192 | + return S.join(", ", set); |
| 193 | + } |
| 194 | + } |
| 195 | + |
101 | 196 | protected static class RouteBuilder { |
102 | 197 |
|
103 | 198 | private AppConfigurator conf; |
104 | 199 | private Router router; |
105 | 200 | private C.List<H.Method> methods = C.newListOf(Router.supportedHttpMethods()); |
106 | 201 | private String path; |
107 | 202 | private String action; |
108 | | - private Class<?> controller; |
109 | 203 | RouteBuilder(AppConfigurator config) { |
110 | 204 | router = config.app().router(); |
111 | 205 | E.illegalStateIf(null == router); |
|
0 commit comments