2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017 Amdocs
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
23 package org.onap.aai.sparky.synchronizer.config;
25 import java.text.DateFormat;
26 import java.text.SimpleDateFormat;
27 import java.text.ParseException;
28 import java.util.Arrays;
29 import java.util.Calendar;
30 import java.util.Date;
31 import java.util.List;
32 import java.util.Properties;
33 import java.util.TimeZone;
34 import java.util.regex.Matcher;
35 import java.util.regex.Pattern;
36 import java.util.regex.PatternSyntaxException;
38 import org.onap.aai.sparky.logging.AaiUiMsgs;
39 import org.onap.aai.sparky.util.ConfigHelper;
40 import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants;
41 import org.onap.aai.cl.api.Logger;
42 import org.onap.aai.cl.eelf.LoggerFactory;
46 * The Class SynchronizerConfiguration.
48 public class SynchronizerConfiguration {
50 private static final Logger LOG =
51 LoggerFactory.getInstance().getLogger(SynchronizerConfiguration.class);
53 public static final String CONFIG_FILE =
54 TierSupportUiConstants.DYNAMIC_CONFIG_APP_LOCATION + "synchronizer.properties";
56 private static SynchronizerConfiguration instance;
58 public static final String DEPTH_MODIFIER = "?depth=0";
59 public static final String DEPTH_ALL_MODIFIER = "?depth=all";
60 public static final String DEPTH_AND_NODES_ONLY_MODIFIER = "?depth=0&nodes-only";
61 public static final String NODES_ONLY_MODIFIER = "?nodes-only";
63 public static SynchronizerConfiguration getConfig() throws Exception {
65 if (instance == null) {
66 instance = new SynchronizerConfiguration();
73 * Instantiates a new synchronizer configuration.
75 public SynchronizerConfiguration()
76 throws NumberFormatException, PatternSyntaxException, ParseException {
77 Properties props = ConfigHelper.loadConfigFromExplicitPath(CONFIG_FILE);
81 public SynchronizerConfiguration(Properties props)
82 throws NumberFormatException, PatternSyntaxException, ParseException {
89 * @throws Exception the exception
91 protected void initialize(Properties props)
92 throws NumberFormatException, PatternSyntaxException, ParseException {
94 // parse config for startup sync
96 syncTaskInitialDelayInMs =
97 Integer.parseInt(props.getProperty("synchronizer.syncTask.initialDelayInMs",
98 SynchronizerConstants.DEFAULT_INITIAL_DELAY_IN_MS));
99 if (syncTaskInitialDelayInMs < 0) {
100 throw new NumberFormatException("Error. Sync Task Delay has to be positive");
102 } catch (NumberFormatException exc) {
103 this.setConfigOkForStartupSync(false);
104 syncTaskInitialDelayInMs = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
105 String message = "Invalid configuration for synchronizer parameter:"
106 + " 'synchronizer.syncTask.initialDelayInMs'";
107 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
110 // parse config for periodic sync
112 syncTaskFrequencyInDay =
113 Integer.parseInt(props.getProperty("synchronizer.syncTask.taskFrequencyInDay",
114 SynchronizerConstants.DEFAULT_TASK_FREQUENCY_IN_DAY));
115 if (syncTaskFrequencyInDay < 0) {
116 throw new NumberFormatException("Error. Sync Task Frequency has to be positive");
118 } catch (NumberFormatException exc) {
119 this.setConfigOkForPeriodicSync(false);
120 syncTaskFrequencyInDay = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
121 String message = "Invalid configuration for synchronizer parameter:"
122 + " 'synchronizer.syncTask.taskFrequencyInDay'";
123 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
127 syncTaskStartTime = props.getProperty("synchronizer.syncTask.startTimestamp",
128 SynchronizerConstants.DEFAULT_START_TIMESTAMP); // Default 05:00:00 UTC
129 Pattern pattern = Pattern.compile(SynchronizerConstants.TIMESTAMP24HOURS_PATTERN);
130 Matcher matcher = pattern.matcher(syncTaskStartTime);
131 if (!matcher.matches()) {
132 throw new PatternSyntaxException("Pattern Mismatch",
133 "The erroneous pattern is not available", -1);
136 List<String> timestampVal = Arrays.asList(syncTaskStartTime.split(" "));
138 if (timestampVal.size() == SynchronizerConstants.COMPONENTS_IN_TIMESTAMP) {
139 // Need both time and timezone offset
140 syncTaskStartTimeTimeZone = timestampVal
141 .get(SynchronizerConstants.IDX_TIMEZONE_IN_TIMESTAMP).replaceAll("UTC", "GMT");
143 String time = timestampVal.get(SynchronizerConstants.IDX_TIME_IN_TIMESTAMP);
144 DateFormat format = new SimpleDateFormat("HH:mm:ss");
145 Date date = format.parse(time);
146 Calendar calendar = Calendar.getInstance();
147 calendar.setTime(date);
149 syncTaskStartTimeHr = calendar.get(Calendar.HOUR_OF_DAY);
150 syncTaskStartTimeMin = calendar.get(Calendar.MINUTE);
151 syncTaskStartTimeSec = calendar.get(Calendar.SECOND);
153 LOG.info(AaiUiMsgs.SYNC_START_TIME);
155 } catch (ParseException exc) {
156 this.setConfigOkForPeriodicSync(false);
157 String message = "Invalid configuration for synchronizer parameter:"
158 + " 'synchronizer.syncTask.startTimestamp'";
159 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
162 scrollContextTimeToLiveInMinutes =
163 Integer.parseInt(props.getProperty("synchronizer.scrollContextTimeToLiveInMinutes", "5"));
164 numScrollContextItemsToRetrievePerRequest = Integer.parseInt(
165 props.getProperty("synchronizer.numScrollContextItemsToRetrievePerRequest", "5000"));
167 resolverProgressLogFrequencyInMs = Long
168 .parseLong(props.getProperty("synchronizer.resolver.progressLogFrequencyInMs", "60000"));
169 resolverQueueMonitorFrequencyInMs = Long
170 .parseLong(props.getProperty("synchronizer.resolver.queueMonitorFrequencyInMs", "1000"));
172 indexIntegrityValidatorEnabled = Boolean
173 .parseBoolean(props.getProperty("synchronizer.indexIntegrityValidator.enabled", "false"));
174 indexIntegrityValidatorFrequencyInMs = Long.parseLong(
175 props.getProperty("synchronizer.indexIntegrityValidatorFrequencyInMs", "300000"));
177 displayVerboseQueueManagerStats = Boolean
178 .parseBoolean(props.getProperty("synchronizer.resolver.displayVerboseQueueManagerStats"));
180 resourceNotFoundErrorsSupressed =
181 Boolean.parseBoolean(props.getProperty("synchronizer.suppressResourceNotFoundErrors"));
183 nodesOnlyModifierEnabled =
184 Boolean.parseBoolean(props.getProperty("synchronizer.applyNodesOnlyModifier"));
186 autosuggestSynchronizationEnabled = Boolean
187 .parseBoolean(props.getProperty("synchronizer.autosuggestSynchronizationEnabled", "true"));
189 if (LOG.isDebugEnabled()) {
190 LOG.debug(AaiUiMsgs.DEBUG_GENERIC, this.toString());
194 public boolean isNodesOnlyModifierEnabled() {
195 return nodesOnlyModifierEnabled;
198 public void setNodesOnlyModifierEnabled(boolean nodesOnlyModifierEnabled) {
199 this.nodesOnlyModifierEnabled = nodesOnlyModifierEnabled;
202 public int getSyncTaskInitialDelayInMs() {
203 return syncTaskInitialDelayInMs;
206 public void setSyncTaskInitialDelayInMs(int syncTaskInitialDelayInMs) {
207 this.syncTaskInitialDelayInMs = syncTaskInitialDelayInMs;
210 public boolean isDisplayVerboseQueueManagerStats() {
211 return displayVerboseQueueManagerStats;
214 public void setDisplayVerboseQueueManagerStats(boolean displayVerboseQueueManagerStats) {
215 this.displayVerboseQueueManagerStats = displayVerboseQueueManagerStats;
218 private int syncTaskInitialDelayInMs;
220 private int syncTaskFrequencyInMs;
222 private int scrollContextTimeToLiveInMinutes;
224 private int numScrollContextItemsToRetrievePerRequest;
226 private long resolverProgressLogFrequencyInMs;
228 private long resolverQueueMonitorFrequencyInMs;
230 private boolean indexIntegrityValidatorEnabled;
232 private long indexIntegrityValidatorFrequencyInMs;
234 private int syncTaskFrequencyInDay;
236 private String syncTaskStartTime;
238 private int syncTaskStartTimeHr = 5; // for default sync start time
240 private int syncTaskStartTimeMin;
242 private int syncTaskStartTimeSec;
244 private String syncTaskStartTimeTimeZone;
246 private boolean displayVerboseQueueManagerStats;
248 private boolean resourceNotFoundErrorsSupressed;
250 private boolean nodesOnlyModifierEnabled;
252 private boolean autosuggestSynchronizationEnabled;
254 private boolean configOkForStartupSync = true;
256 private boolean configOkForPeriodicSync = true;
258 public boolean isResourceNotFoundErrorsSupressed() {
259 return resourceNotFoundErrorsSupressed;
262 public void setResourceNotFoundErrorsSupressed(boolean resourceNotFoundErrorsSupressed) {
263 this.resourceNotFoundErrorsSupressed = resourceNotFoundErrorsSupressed;
266 public int getScrollContextTimeToLiveInMinutes() {
267 return scrollContextTimeToLiveInMinutes;
270 public void setScrollContextTimeToLiveInMinutes(int scrollContextTimeToLiveInMinutes) {
271 this.scrollContextTimeToLiveInMinutes = scrollContextTimeToLiveInMinutes;
274 public int getNumScrollContextItemsToRetrievePerRequest() {
275 return numScrollContextItemsToRetrievePerRequest;
278 public void setNumScrollContextItemsToRetrievePerRequest(
279 int numScrollContextItemsToRetrievePerRequest) {
280 this.numScrollContextItemsToRetrievePerRequest = numScrollContextItemsToRetrievePerRequest;
283 public int getSyncTaskFrequencyInDay() {
284 return syncTaskFrequencyInDay;
287 public void setSyncTaskFrequencyInDay(int syncTaskFrequencyInDay) {
288 this.syncTaskFrequencyInDay = syncTaskFrequencyInDay;
291 public String getSyncTaskStartTime() {
292 return syncTaskStartTime;
295 public void setSyncTaskStartTime(String syncTaskStartTime) {
296 this.syncTaskStartTime = syncTaskStartTime;
299 public int getSyncTaskStartTimeHr() {
300 return syncTaskStartTimeHr;
303 public void setSyncTaskStartTimeHr(int syncTaskStartTimeHr) {
304 this.syncTaskStartTimeHr = syncTaskStartTimeHr;
307 public int getSyncTaskStartTimeMin() {
308 return syncTaskStartTimeMin;
311 public void setSyncTaskStartTimeMin(int syncTaskStartTimeMin) {
312 this.syncTaskStartTimeMin = syncTaskStartTimeMin;
315 public int getSyncTaskStartTimeSec() {
316 return syncTaskStartTimeSec;
319 public void setSyncTaskStartTimeSec(int syncTaskStartTimeSec) {
320 this.syncTaskStartTimeSec = syncTaskStartTimeSec;
323 public String getSyncTaskStartTimeTimeZone() {
324 return syncTaskStartTimeTimeZone;
327 public void setSyncTaskStartTimeTimeZone(String syncTaskStartTimeTimeZone) {
328 this.syncTaskStartTimeTimeZone = syncTaskStartTimeTimeZone;
331 public int getSyncTaskFrequencyInMs() {
332 return syncTaskFrequencyInMs;
335 public void setSyncTaskFrequencyInMs(int syncTaskFrequencyInMs) {
336 this.syncTaskFrequencyInMs = syncTaskFrequencyInMs;
339 public long getResolverProgressLogFrequencyInMs() {
340 return resolverProgressLogFrequencyInMs;
343 public void setResolverProgressLogFrequencyInMs(long resolverProgressLogFrequencyInMs) {
344 this.resolverProgressLogFrequencyInMs = resolverProgressLogFrequencyInMs;
347 public long getResolverQueueMonitorFrequencyInMs() {
348 return resolverQueueMonitorFrequencyInMs;
351 public void setResolverQueueMonitorFrequencyInMs(long resolverQueueMonitorFrequencyInMs) {
352 this.resolverQueueMonitorFrequencyInMs = resolverQueueMonitorFrequencyInMs;
355 public boolean isIndexIntegrityValidatorEnabled() {
356 return indexIntegrityValidatorEnabled;
359 public void setIndexIntegrityValidatorEnabled(boolean indexIntegrityValidatorEnabled) {
360 this.indexIntegrityValidatorEnabled = indexIntegrityValidatorEnabled;
363 public long getIndexIntegrityValidatorFrequencyInMs() {
364 return indexIntegrityValidatorFrequencyInMs;
367 public void setIndexIntegrityValidatorFrequencyInMs(long indexIntegrityValidatorFrequencyInMs) {
368 this.indexIntegrityValidatorFrequencyInMs = indexIntegrityValidatorFrequencyInMs;
371 public boolean isConfigOkForStartupSync() {
372 return configOkForStartupSync;
375 public void setConfigOkForStartupSync(boolean configOkForStartupSync) {
376 this.configOkForStartupSync = configOkForStartupSync;
379 public boolean isConfigOkForPeriodicSync() {
380 return configOkForPeriodicSync;
383 public void setConfigOkForPeriodicSync(boolean configOkForPeriodicSync) {
384 this.configOkForPeriodicSync = configOkForPeriodicSync;
387 public boolean isConfigDisabledForInitialSync() {
388 return syncTaskInitialDelayInMs == SynchronizerConstants.DELAY_NO_STARTUP_SYNC_IN_MS;
391 public boolean isAutosuggestSynchronizationEnabled() {
392 return autosuggestSynchronizationEnabled;
395 public void setAutosuggestSynchronizationEnabled(boolean autosuggestSynchronizationEnabled) {
396 this.autosuggestSynchronizationEnabled = autosuggestSynchronizationEnabled;
399 public Calendar getTargetSyncTime() {
401 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
402 Calendar targetSyncTime = Calendar.getInstance(tz);
404 targetSyncTime.set(Calendar.HOUR_OF_DAY, getSyncTaskStartTimeHr());
405 targetSyncTime.set(Calendar.MINUTE, getSyncTaskStartTimeMin());
406 targetSyncTime.set(Calendar.SECOND, getSyncTaskStartTimeSec());
408 return targetSyncTime;
412 public long getDefaultInitialSyncDelayInMs(Calendar timeNow) {
414 int taskFrequencyInDays = getSyncTaskFrequencyInDay();
416 long nextSyncTimeInMs = getNextSyncTime(getTargetSyncTime(), timeNow.getTimeInMillis(),
417 taskFrequencyInDays * 86400);
420 * If the the current time is after the scheduled start time, then delay by the initial task
421 * delay configuration value
423 long delayUntilNextSyncInMs =
424 Math.max(getSyncTaskInitialDelayInMs(), nextSyncTimeInMs - timeNow.getTimeInMillis());
426 return delayUntilNextSyncInMs;
430 public long getNextSyncTime(Calendar syncTime, int taskFrequencyInSeconds) {
432 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
433 Calendar timeNow = Calendar.getInstance(tz);
435 return getNextSyncTime(syncTime, timeNow.getTimeInMillis(), taskFrequencyInSeconds);
439 * Gets the first sync time.
441 * @param calendar the calendar
442 * @param timeNow the time now in ms
443 * @param taskFrequencyInMs task period in ms
444 * @return the first sync time
446 public long getNextSyncTime(Calendar syncTime, long timeNowInMs, int taskFrequencyInSeconds) {
447 if (taskFrequencyInSeconds == 0) {
449 } else if (timeNowInMs > syncTime.getTimeInMillis()) {
452 * If current time is after the scheduled sync start time, then we'll skip ahead to the next
456 syncTime.add(Calendar.SECOND, taskFrequencyInSeconds);
459 return syncTime.getTimeInMillis();
463 * @return the instance
465 public static SynchronizerConfiguration getInstance() {
470 * @param instance the instance to set
472 public static void setInstance(SynchronizerConfiguration instance) {
473 SynchronizerConfiguration.instance = instance;
479 public static Logger getLog() {
484 * @return the configFile
486 public static String getConfigFile() {
491 * @return the depthModifier
493 public static String getDepthModifier() {
494 return DEPTH_MODIFIER;
498 * @return the depthAllModifier
500 public static String getDepthAllModifier() {
501 return DEPTH_ALL_MODIFIER;
505 * @return the depthAndNodesOnlyModifier
507 public static String getDepthAndNodesOnlyModifier() {
508 return DEPTH_AND_NODES_ONLY_MODIFIER;
512 * @return the nodesOnlyModifier
514 public static String getNodesOnlyModifier() {
515 return NODES_ONLY_MODIFIER;
521 * @see java.lang.Object#toString()
524 public String toString() {
525 return "SynchronizerConfiguration [syncTaskInitialDelayInMs=" + syncTaskInitialDelayInMs
526 + ", syncTaskFrequencyInMs=" + syncTaskFrequencyInMs + ", scrollContextTimeToLiveInMinutes="
527 + scrollContextTimeToLiveInMinutes + ", numScrollContextItemsToRetrievePerRequest="
528 + numScrollContextItemsToRetrievePerRequest + ", resolverProgressLogFrequencyInMs="
529 + resolverProgressLogFrequencyInMs + ", resolverQueueMonitorFrequencyInMs="
530 + resolverQueueMonitorFrequencyInMs + ", indexIntegrityValidatorEnabled="
531 + indexIntegrityValidatorEnabled + ", indexIntegrityValidatorFrequencyInMs="
532 + indexIntegrityValidatorFrequencyInMs + ", ssyncTaskFrequencyInDay="
533 + syncTaskFrequencyInDay + ", syncTaskStartTime=" + syncTaskStartTime
534 + ", syncTaskStartTimeHr=" + syncTaskStartTimeHr + ", syncTaskStartTimeMin="
535 + syncTaskStartTimeMin + ", syncTaskStartTimeSec=" + syncTaskStartTimeSec
536 + ", syncTaskStartTimeTimeZone=" + syncTaskStartTimeTimeZone
537 + ", displayVerboseQueueManagerStats=" + displayVerboseQueueManagerStats
538 + ", resourceNotFoundErrorsSupressed=" + resourceNotFoundErrorsSupressed
539 + ", nodesOnlyModifierEnabled=" + nodesOnlyModifierEnabled + ", configOKForStartupSync="
540 + configOkForStartupSync + ", configOKForPeriodicSync=" + configOkForPeriodicSync
541 + ", autosuggestSynchronizationEnabled=" + autosuggestSynchronizationEnabled + "]";