1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.classic.model.processor;
15
16 import ch.qos.logback.classic.joran.ReconfigureOnChangeTask;
17 import ch.qos.logback.classic.model.ConfigurationModel;
18 import ch.qos.logback.core.Context;
19 import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil;
20 import ch.qos.logback.core.model.processor.ModelHandlerBase;
21 import ch.qos.logback.core.model.processor.ModelInterpretationContext;
22 import ch.qos.logback.core.spi.ConfigurationEvent;
23 import ch.qos.logback.core.util.Duration;
24 import ch.qos.logback.core.util.OptionHelper;
25
26 import java.net.URL;
27 import java.util.concurrent.ScheduledExecutorService;
28 import java.util.concurrent.ScheduledFuture;
29 import java.util.concurrent.TimeUnit;
30
31
32
33
34
35 public class ConfigurationModelHandlerFull extends ConfigurationModelHandler {
36
37 public ConfigurationModelHandlerFull(Context context) {
38 super(context);
39 }
40
41
42
43 static public ModelHandlerBase makeInstance2(Context context, ModelInterpretationContext mic) {
44 return new ConfigurationModelHandlerFull(context);
45 }
46
47
48 protected void processScanAttrib(ModelInterpretationContext mic, ConfigurationModel configurationModel) {
49 String scanStr = mic.subst(configurationModel.getScanStr());
50 if (!OptionHelper.isNullOrEmptyOrAllSpaces(scanStr) && !"false".equalsIgnoreCase(scanStr)) {
51
52 ScheduledExecutorService scheduledExecutorService = context.getScheduledExecutorService();
53 URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(context);
54 if (mainURL == null) {
55 addWarn("Due to missing top level configuration file, reconfiguration on change (configuration file scanning) cannot be done.");
56 return;
57 }
58 ReconfigureOnChangeTask rocTask = new ReconfigureOnChangeTask();
59 rocTask.setContext(context);
60
61 addInfo("Registering a new ReconfigureOnChangeTask "+ rocTask);
62
63 context.fireConfigurationEvent(ConfigurationEvent.newConfigurationChangeDetectorRegisteredEvent(rocTask));
64
65 String scanPeriodStr = mic.subst(configurationModel.getScanPeriodStr());
66 Duration duration = getDurationOfScanPeriodAttribute(scanPeriodStr, SCAN_PERIOD_DEFAULT);
67
68 addInfo("Will scan for changes in [" + mainURL + "] ");
69
70
71
72
73
74
75 addInfo("Setting ReconfigureOnChangeTask scanning period to " + duration);
76
77 ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(rocTask,
78 duration.getMilliseconds(), duration.getMilliseconds(), TimeUnit.MILLISECONDS);
79 rocTask.setScheduredFuture(scheduledFuture);
80 context.addScheduledFuture(scheduledFuture);
81 }
82 }
83
84 private Duration getDurationOfScanPeriodAttribute(String scanPeriodAttrib, Duration defaultDuration) {
85 Duration duration = null;
86
87 if (!OptionHelper.isNullOrEmptyOrAllSpaces(scanPeriodAttrib)) {
88 try {
89 duration = Duration.valueOf(scanPeriodAttrib);
90 } catch (IllegalStateException | IllegalArgumentException e) {
91 addWarn("Failed to parse 'scanPeriod' attribute [" + scanPeriodAttrib + "]", e);
92
93 }
94 }
95
96 if (duration == null) {
97 addInfo("No 'scanPeriod' specified. Defaulting to " + defaultDuration.toString());
98 duration = defaultDuration;
99 }
100 return duration;
101 }
102
103 }