Skip to content

Commit 5b02a00

Browse files
author
Anton Bashirov
authored
Merge pull request #264 from art-community/feature/context-thread-safe
Feature/context thread safe
2 parents 39737a3 + 27a4bb3 commit 5b02a00

File tree

1 file changed

+63
-4
lines changed
  • application-core/src/main/java/ru/art/core/context

1 file changed

+63
-4
lines changed

application-core/src/main/java/ru/art/core/context/Context.java

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,119 +131,154 @@ public <C extends ModuleConfiguration, S extends ModuleState> C getModule(String
131131
if (isNull(INSTANCE) || state != READY) {
132132
return toLoadIfNotExists.getDefaultConfiguration();
133133
}
134+
ReentrantLock lock = Context.LOCK;
135+
lock.lock();
134136
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
135137
PreconfiguredModuleProvider preconfiguredModulesProvider;
136138
if (nonNull(moduleContainer)) {
139+
lock.unlock();
137140
return cast(moduleContainer.getConfiguration());
138141
}
139142
C configuration;
140143
if (nonNull(preconfiguredModulesProvider = contextConfiguration().getPreconfiguredModulesProvider())) {
144+
lock.unlock();
141145
return loadModule(toLoadIfNotExists, preconfiguredModulesProvider);
142146
}
147+
lock.unlock();
143148
loadModule(toLoadIfNotExists, (configuration = toLoadIfNotExists.getDefaultConfiguration()));
144149
return cast(configuration);
145150
}
146151

147152
public <C extends ModuleConfiguration, S extends ModuleState> S getModuleState(String moduleId, Module<C, S> toLoadIfNotExists) {
148153
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
154+
ReentrantLock lock = Context.LOCK;
155+
lock.lock();
149156
if (isNull(INSTANCE) || state == LOADING_MODULES) {
157+
lock.unlock();
150158
return toLoadIfNotExists.getState();
151159
}
152160
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
153161
PreconfiguredModuleProvider preconfiguredModulesProvider;
154162
if (nonNull(moduleContainer)) {
163+
lock.unlock();
155164
return cast(moduleContainer.getModule().getState());
156165
}
157166
if (nonNull(preconfiguredModulesProvider = contextConfiguration().getPreconfiguredModulesProvider())) {
167+
lock.unlock();
158168
loadModule(toLoadIfNotExists, preconfiguredModulesProvider);
159169
return cast(toLoadIfNotExists.getState());
160170
}
171+
lock.unlock();
161172
loadModule(toLoadIfNotExists, toLoadIfNotExists.getDefaultConfiguration());
162173
return cast(toLoadIfNotExists.getState());
163174
}
164175

165176
public <C extends ModuleConfiguration, S extends ModuleState> C getModule(String moduleId, Supplier<Module<C, S>> toLoadIfNotExists) {
166177
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
178+
ReentrantLock lock = Context.LOCK;
179+
lock.lock();
167180
if (isNull(INSTANCE) || state != READY) {
181+
lock.unlock();
168182
return toLoadIfNotExists.get().getDefaultConfiguration();
169183
}
170184
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
171185
PreconfiguredModuleProvider preconfiguredModulesProvider;
172186
if (nonNull(moduleContainer)) {
187+
lock.unlock();
173188
return cast(moduleContainer.getConfiguration());
174189
}
175190
C configuration;
176191
Module<C, S> module = toLoadIfNotExists.get();
177192
if (nonNull(preconfiguredModulesProvider = contextConfiguration().getPreconfiguredModulesProvider())) {
193+
lock.unlock();
178194
return loadModule(module, preconfiguredModulesProvider);
179195
}
196+
lock.unlock();
180197
loadModule(module, (configuration = module.getDefaultConfiguration()));
181198
return cast(configuration);
182199
}
183200

184201
public <C extends ModuleConfiguration, S extends ModuleState> S getModuleState(String moduleId, Supplier<Module<C, S>> toLoadIfNotExists) {
185202
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
203+
ReentrantLock lock = Context.LOCK;
204+
lock.lock();
186205
if (isNull(INSTANCE) || state == LOADING_MODULES) {
206+
lock.unlock();
187207
return toLoadIfNotExists.get().getState();
188208
}
189209
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
190210
PreconfiguredModuleProvider preconfiguredModulesProvider;
191211
if (nonNull(moduleContainer)) {
212+
lock.unlock();
192213
return cast(moduleContainer.getModule().getState());
193214
}
194215
Module<C, S> module = toLoadIfNotExists.get();
195216
if (nonNull(preconfiguredModulesProvider = contextConfiguration().getPreconfiguredModulesProvider())) {
217+
lock.unlock();
196218
loadModule(module, preconfiguredModulesProvider);
197219
return module.getState();
198220
}
221+
lock.unlock();
199222
loadModule(module, module.getDefaultConfiguration());
200223
return cast(module.getState());
201224
}
202225

203226
public <C extends ModuleConfiguration, S extends ModuleState> Context loadModule(Module<C, S> module) {
204227
if (isNull(module)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
228+
ReentrantLock lock = Context.LOCK;
229+
lock.lock();
205230
ContextState currentState = state;
206231
state = LOADING_MODULES;
207232
C configuration = module.getDefaultConfiguration();
208233
modules.put(module.getId(), new ModuleContainer<>(module, cast(configuration)));
209234
out.println(format(MODULE_LOADED_MESSAGE, module.getId(), currentTimeMillis() - lastActionTimestamp, configuration.getClass().getName()));
210235
state = currentState;
236+
lock.unlock();
211237
module.onLoad();
212238
lastActionTimestamp = currentTimeMillis();
213239
return this;
214240
}
215241

216242
public <C extends ModuleConfiguration, S extends ModuleState> Context loadModule(Module<C, S> module, ModuleConfigurator<C, S> moduleConfigurator) {
217243
if (isNull(module)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
244+
ReentrantLock lock = Context.LOCK;
245+
lock.lock();
218246
ContextState currentState = state;
219247
state = LOADING_MODULES;
220248
C configuration = cast(moduleConfigurator.configure(module));
221249
modules.put(module.getId(), new ModuleContainer<>(module, configuration));
222250
out.println(format(MODULE_LOADED_MESSAGE, module.getId(), currentTimeMillis() - lastActionTimestamp, configuration.getClass().getName()));
223251
state = currentState;
252+
lock.unlock();
224253
module.onLoad();
225254
lastActionTimestamp = currentTimeMillis();
226255
return this;
227256
}
228257

229258
public <C extends ModuleConfiguration, S extends ModuleState> Context loadModule(Module<C, S> module, C customModuleConfiguration) {
230259
if (isNull(module)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
260+
ReentrantLock lock = Context.LOCK;
261+
lock.lock();
231262
ContextState currentState = state;
232263
state = LOADING_MODULES;
233264
C configuration = cast(nonNull(customModuleConfiguration) ? customModuleConfiguration : module.getDefaultConfiguration());
234265
modules.put(module.getId(), new ModuleContainer<>(module, configuration));
235266
state = currentState;
267+
lock.unlock();
236268
module.onLoad();
237269
out.println(format(MODULE_LOADED_MESSAGE, module.getId(), currentTimeMillis() - lastActionTimestamp, configuration.getClass().getName()));
238270
lastActionTimestamp = currentTimeMillis();
239271
return this;
240272
}
241273

242274
private <C extends ModuleConfiguration, S extends ModuleState> C loadModule(Module<C, S> module, PreconfiguredModuleProvider preconfiguredModulesProvider) {
275+
ReentrantLock lock = Context.LOCK;
276+
lock.lock();
243277
ContextState currentState = state;
244278
state = LOADING_MODULES;
245279
C configuration = cast(preconfiguredModulesProvider.getModuleConfiguration(module.getId()).orElse(module.getDefaultConfiguration()));
246280
state = currentState;
281+
lock.unlock();
247282
loadModule(module, configuration);
248283
return cast(configuration);
249284
}
@@ -254,56 +289,80 @@ public <C extends ModuleConfiguration> Context overrideModule(String moduleId, C
254289
if (isNull(customModuleConfiguration)) {
255290
throw new ContextInitializationException(CUSTOM_MODULE_CONFIGURATION_IS_NULL);
256291
}
292+
ReentrantLock lock = Context.LOCK;
293+
lock.lock();
257294
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
258-
if (isNull(moduleContainer)) return this;
295+
if (isNull(moduleContainer)) {
296+
lock.unlock();
297+
return this;
298+
}
259299
ContextState currentState = state;
260300
state = LOADING_MODULES;
261301
modules.put(moduleId, moduleContainer.overrideConfiguration(cast(customModuleConfiguration)));
262302
out.println(format(MODULE_OVERRIDDEN_MESSAGE, moduleId, currentTimeMillis() - lastActionTimestamp));
263303
lastActionTimestamp = currentTimeMillis();
264304
state = currentState;
305+
lock.unlock();
265306
return this;
266307
}
267308

268309
@SuppressWarnings("Duplicates")
269310
public Context reloadModule(String moduleId) {
270311
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
312+
ReentrantLock lock = Context.LOCK;
313+
lock.lock();
271314
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
272-
if (isNull(moduleContainer)) return this;
315+
if (isNull(moduleContainer)) {
316+
lock.unlock();
317+
return this;
318+
}
273319
ContextState currentState = state;
274320
state = RELOADING_MODULES;
275321
moduleContainer.reloadModule();
276322
out.println(format(MODULE_RELOADED_MESSAGE, moduleId, currentTimeMillis() - lastActionTimestamp));
277323
lastActionTimestamp = currentTimeMillis();
278324
state = currentState;
325+
lock.unlock();
279326
return this;
280327
}
281328

282329
@SuppressWarnings("Duplicates")
283330
public Context refreshModule(String moduleId) {
284331
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
332+
ReentrantLock lock = Context.LOCK;
333+
lock.lock();
285334
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
286-
if (isNull(moduleContainer)) return this;
335+
if (isNull(moduleContainer)) {
336+
lock.unlock();
337+
return this;
338+
}
287339
ContextState currentState = state;
288340
state = REFRESHING_MODULES;
289341
moduleContainer.refreshConfiguration();
290342
out.println(format(MODULE_REFRESHED_MESSAGE, moduleId, currentTimeMillis() - lastActionTimestamp));
291343
lastActionTimestamp = currentTimeMillis();
292344
state = currentState;
345+
lock.unlock();
293346
return this;
294347
}
295348

296349
public Context refreshAndReloadModule(String moduleId) {
297350
if (isNull(moduleId)) throw new ContextInitializationException(MODULE_ID_IS_NULL);
351+
ReentrantLock lock = Context.LOCK;
352+
lock.lock();
298353
ContextState currentState = state;
299354
state = REFRESHING_AND_RELOADING_MODULES;
300355
ModuleContainer<? extends ModuleConfiguration, ? extends ModuleState> moduleContainer = modules.get(moduleId);
301-
if (isNull(moduleContainer)) return this;
356+
if (isNull(moduleContainer)) {
357+
lock.unlock();
358+
return this;
359+
}
302360
moduleContainer.reloadModule();
303361
moduleContainer.refreshConfiguration();
304362
out.println(format(MODULE_REFRESHED_AND_RELOADED_MESSAGE, moduleId, currentTimeMillis() - lastActionTimestamp));
305363
lastActionTimestamp = currentTimeMillis();
306364
state = currentState;
365+
lock.unlock();
307366
return this;
308367
}
309368

0 commit comments

Comments
 (0)