1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.starter;
20
21 import java.util.Comparator;
22 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
23 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
24 import org.apache.syncope.core.persistence.api.DomainHolder;
25 import org.apache.syncope.core.persistence.api.SyncopeCoreLoader;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.aop.support.AopUtils;
29 import org.springframework.context.event.ContextClosedEvent;
30 import org.springframework.core.Ordered;
31
32
33
34
35 public class SyncopeCoreStop extends KeymasterStop implements Ordered {
36
37 private static final Logger LOG = LoggerFactory.getLogger(SyncopeCoreStop.class);
38
39 private final DomainHolder domainHolder;
40
41 public SyncopeCoreStop(final DomainHolder domainHolder) {
42 super(NetworkService.Type.CORE);
43 this.domainHolder = domainHolder;
44 }
45
46 @Override
47 public int getOrder() {
48 return 0;
49 }
50
51 @Override
52 public void onApplicationEvent(final ContextClosedEvent event) {
53 event.getApplicationContext().getBeansOfType(SyncopeCoreLoader.class).values().stream().
54 sorted(Comparator.comparing(SyncopeCoreLoader::getOrder).reversed()).
55 forEachOrdered(loader -> {
56 String loaderName = AopUtils.getTargetClass(loader).getName();
57
58 LOG.debug("[{}#{}] Starting dispose", loaderName, loader.getOrder());
59
60 domainHolder.getDomains().forEach((domain, datasource) -> {
61 LOG.debug("[{}] Starting dispose on domain '{}'", loaderName, domain);
62 loader.unload(domain);
63 LOG.debug("[{}] Dispose completed on domain '{}'", loaderName, domain);
64 });
65
66 loader.unload();
67
68 LOG.debug("[{}] Dispose completed", loaderName);
69 });
70
71 super.onApplicationEvent(event);
72 }
73 }