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.util.Arrays;
28 import java.util.Calendar;
29 import java.util.Date;
30 import java.util.List;
31 import java.util.Properties;
32 import java.util.TimeZone;
33 import java.util.regex.Matcher;
34 import java.util.regex.Pattern;
36 import org.onap.aai.sparky.logging.AaiUiMsgs;
37 import org.onap.aai.sparky.util.ConfigHelper;
38 import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants;
39 import org.onap.aai.cl.api.Logger;
40 import org.onap.aai.cl.eelf.LoggerFactory;
44 * The Class SynchronizerConfiguration.
46 public class SynchronizerConfiguration {
48 private static final Logger LOG = LoggerFactory.getInstance().getLogger(SynchronizerConfiguration.class);
50 public static final String CONFIG_FILE =
51 TierSupportUiConstants.DYNAMIC_CONFIG_APP_LOCATION + "synchronizer.properties";
53 private static SynchronizerConfiguration instance;
55 public static final String DEPTH_MODIFIER = "?depth=0";
56 public static final String DEPTH_ALL_MODIFIER = "?depth=all";
57 public static final String DEPTH_AND_NODES_ONLY_MODIFIER = "?depth=0&nodes-only";
58 public static final String NODES_ONLY_MODIFIER = "?nodes-only";
60 public static SynchronizerConfiguration getConfig() throws Exception {
62 if (instance == null) {
63 instance = new SynchronizerConfiguration();
70 * Instantiates a new synchronizer configuration.
72 public SynchronizerConfiguration() throws Exception {
73 Properties props = ConfigHelper.loadConfigFromExplicitPath(CONFIG_FILE);
77 public SynchronizerConfiguration(Properties props) throws Exception {
83 * @throws Exception the exception
85 protected void initialize(Properties props) throws Exception {
87 // parse config for startup sync
89 syncTaskInitialDelayInMs =
90 Integer.parseInt(props.getProperty("synchronizer.syncTask.initialDelayInMs",
91 SynchronizerConstants.DEFAULT_INITIAL_DELAY_IN_MS));
92 if (syncTaskInitialDelayInMs < 0) {
93 throw new Exception();
95 } catch (Exception exc) {
96 this.setConfigOkForStartupSync(false);
97 syncTaskInitialDelayInMs = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
98 String message = "Invalid configuration for synchronizer parameter:"
99 + " 'synchronizer.syncTask.initialDelayInMs'";
100 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
103 // parse config for periodic sync
105 syncTaskFrequencyInDay =
106 Integer.parseInt(props.getProperty("synchronizer.syncTask.taskFrequencyInDay",
107 SynchronizerConstants.DEFAULT_TASK_FREQUENCY_IN_DAY));
108 if (syncTaskFrequencyInDay < 0) {
109 throw new Exception();
111 } catch (Exception exc) {
112 this.setConfigOkForPeriodicSync(false);
113 syncTaskFrequencyInDay = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
114 String message = "Invalid configuration for synchronizer parameter:"
115 + " 'synchronizer.syncTask.taskFrequencyInDay'";
116 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
120 syncTaskStartTime = props.getProperty("synchronizer.syncTask.startTimestamp",
121 SynchronizerConstants.DEFAULT_START_TIMESTAMP); // Default 05:00:00 UTC
122 Pattern pattern = Pattern.compile(SynchronizerConstants.TIMESTAMP24HOURS_PATTERN);
123 Matcher matcher = pattern.matcher(syncTaskStartTime);
124 if (!matcher.matches()) {
125 throw new Exception();
128 List<String> timestampVal = Arrays.asList(syncTaskStartTime.split(" "));
130 if (timestampVal.size() == SynchronizerConstants.COMPONENTS_IN_TIMESTAMP) {
131 // Need both time and timezone offset
132 syncTaskStartTimeTimeZone = timestampVal
133 .get(SynchronizerConstants.IDX_TIMEZONE_IN_TIMESTAMP).replaceAll("UTC", "GMT");
135 String time = timestampVal.get(SynchronizerConstants.IDX_TIME_IN_TIMESTAMP);
136 DateFormat format = new SimpleDateFormat("HH:mm:ss");
137 Date date = format.parse(time);
138 Calendar calendar = Calendar.getInstance();
139 calendar.setTime(date);
141 syncTaskStartTimeHr = calendar.get(Calendar.HOUR_OF_DAY);
142 syncTaskStartTimeMin = calendar.get(Calendar.MINUTE);
143 syncTaskStartTimeSec = calendar.get(Calendar.SECOND);
145 LOG.info(AaiUiMsgs.SYNC_START_TIME);
147 } catch (Exception exc) {
148 this.setConfigOkForPeriodicSync(false);
149 String message = "Invalid configuration for synchronizer parameter:"
150 + " 'synchronizer.syncTask.startTimestamp'";
151 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
154 scrollContextTimeToLiveInMinutes =
155 Integer.parseInt(props.getProperty("synchronizer.scrollContextTimeToLiveInMinutes", "5"));
156 numScrollContextItemsToRetrievePerRequest = Integer.parseInt(
157 props.getProperty("synchronizer.numScrollContextItemsToRetrievePerRequest", "5000"));
159 resolverProgressLogFrequencyInMs = Long
160 .parseLong(props.getProperty("synchronizer.resolver.progressLogFrequencyInMs", "60000"));
161 resolverQueueMonitorFrequencyInMs = Long
162 .parseLong(props.getProperty("synchronizer.resolver.queueMonitorFrequencyInMs", "1000"));
164 indexIntegrityValidatorEnabled = Boolean
165 .parseBoolean(props.getProperty("synchronizer.indexIntegrityValidator.enabled", "false"));
166 indexIntegrityValidatorFrequencyInMs = Long.parseLong(
167 props.getProperty("synchronizer.indexIntegrityValidatorFrequencyInMs", "300000"));
169 displayVerboseQueueManagerStats = Boolean
170 .parseBoolean(props.getProperty("synchronizer.resolver.displayVerboseQueueManagerStats"));
172 resourceNotFoundErrorsSupressed =
173 Boolean.parseBoolean(props.getProperty("synchronizer.suppressResourceNotFoundErrors"));
175 nodesOnlyModifierEnabled =
176 Boolean.parseBoolean(props.getProperty("synchronizer.applyNodesOnlyModifier"));
178 autosuggestSynchronizationEnabled = Boolean
179 .parseBoolean(props.getProperty("synchronizer.autosuggestSynchronizationEnabled", "true"));
181 if (LOG.isDebugEnabled()) {
182 LOG.debug(AaiUiMsgs.DEBUG_GENERIC, this.toString());
186 public boolean isNodesOnlyModifierEnabled() {
187 return nodesOnlyModifierEnabled;
190 public void setNodesOnlyModifierEnabled(boolean nodesOnlyModifierEnabled) {
191 this.nodesOnlyModifierEnabled = nodesOnlyModifierEnabled;
194 public int getSyncTaskInitialDelayInMs() {
195 return syncTaskInitialDelayInMs;
198 public void setSyncTaskInitialDelayInMs(int syncTaskInitialDelayInMs) {
199 this.syncTaskInitialDelayInMs = syncTaskInitialDelayInMs;
202 public boolean isDisplayVerboseQueueManagerStats() {
203 return displayVerboseQueueManagerStats;
206 public void setDisplayVerboseQueueManagerStats(boolean displayVerboseQueueManagerStats) {
207 this.displayVerboseQueueManagerStats = displayVerboseQueueManagerStats;
210 private int syncTaskInitialDelayInMs;
212 private int syncTaskFrequencyInMs;
214 private int scrollContextTimeToLiveInMinutes;
216 private int numScrollContextItemsToRetrievePerRequest;
218 private long resolverProgressLogFrequencyInMs;
220 private long resolverQueueMonitorFrequencyInMs;
222 private boolean indexIntegrityValidatorEnabled;
224 private long indexIntegrityValidatorFrequencyInMs;
226 private int syncTaskFrequencyInDay;
228 private String syncTaskStartTime;
230 private int syncTaskStartTimeHr = 5; // for default sync start time
232 private int syncTaskStartTimeMin;
234 private int syncTaskStartTimeSec;
236 private String syncTaskStartTimeTimeZone;
238 private boolean displayVerboseQueueManagerStats;
240 private boolean resourceNotFoundErrorsSupressed;
242 private boolean nodesOnlyModifierEnabled;
244 private boolean autosuggestSynchronizationEnabled;
246 private boolean configOkForStartupSync = true;
248 private boolean configOkForPeriodicSync = true;
250 public boolean isResourceNotFoundErrorsSupressed() {
251 return resourceNotFoundErrorsSupressed;
254 public void setResourceNotFoundErrorsSupressed(boolean resourceNotFoundErrorsSupressed) {
255 this.resourceNotFoundErrorsSupressed = resourceNotFoundErrorsSupressed;
258 public int getScrollContextTimeToLiveInMinutes() {
259 return scrollContextTimeToLiveInMinutes;
262 public void setScrollContextTimeToLiveInMinutes(int scrollContextTimeToLiveInMinutes) {
263 this.scrollContextTimeToLiveInMinutes = scrollContextTimeToLiveInMinutes;
266 public int getNumScrollContextItemsToRetrievePerRequest() {
267 return numScrollContextItemsToRetrievePerRequest;
270 public void setNumScrollContextItemsToRetrievePerRequest(
271 int numScrollContextItemsToRetrievePerRequest) {
272 this.numScrollContextItemsToRetrievePerRequest = numScrollContextItemsToRetrievePerRequest;
275 public int getSyncTaskFrequencyInDay() {
276 return syncTaskFrequencyInDay;
279 public void setSyncTaskFrequencyInDay(int syncTaskFrequencyInDay) {
280 this.syncTaskFrequencyInDay = syncTaskFrequencyInDay;
283 public String getSyncTaskStartTime() {
284 return syncTaskStartTime;
287 public void setSyncTaskStartTime(String syncTaskStartTime) {
288 this.syncTaskStartTime = syncTaskStartTime;
291 public int getSyncTaskStartTimeHr() {
292 return syncTaskStartTimeHr;
295 public void setSyncTaskStartTimeHr(int syncTaskStartTimeHr) {
296 this.syncTaskStartTimeHr = syncTaskStartTimeHr;
299 public int getSyncTaskStartTimeMin() {
300 return syncTaskStartTimeMin;
303 public void setSyncTaskStartTimeMin(int syncTaskStartTimeMin) {
304 this.syncTaskStartTimeMin = syncTaskStartTimeMin;
307 public int getSyncTaskStartTimeSec() {
308 return syncTaskStartTimeSec;
311 public void setSyncTaskStartTimeSec(int syncTaskStartTimeSec) {
312 this.syncTaskStartTimeSec = syncTaskStartTimeSec;
315 public String getSyncTaskStartTimeTimeZone() {
316 return syncTaskStartTimeTimeZone;
319 public void setSyncTaskStartTimeTimeZone(String syncTaskStartTimeTimeZone) {
320 this.syncTaskStartTimeTimeZone = syncTaskStartTimeTimeZone;
323 public int getSyncTaskFrequencyInMs() {
324 return syncTaskFrequencyInMs;
327 public void setSyncTaskFrequencyInMs(int syncTaskFrequencyInMs) {
328 this.syncTaskFrequencyInMs = syncTaskFrequencyInMs;
331 public long getResolverProgressLogFrequencyInMs() {
332 return resolverProgressLogFrequencyInMs;
335 public void setResolverProgressLogFrequencyInMs(long resolverProgressLogFrequencyInMs) {
336 this.resolverProgressLogFrequencyInMs = resolverProgressLogFrequencyInMs;
339 public long getResolverQueueMonitorFrequencyInMs() {
340 return resolverQueueMonitorFrequencyInMs;
343 public void setResolverQueueMonitorFrequencyInMs(long resolverQueueMonitorFrequencyInMs) {
344 this.resolverQueueMonitorFrequencyInMs = resolverQueueMonitorFrequencyInMs;
347 public boolean isIndexIntegrityValidatorEnabled() {
348 return indexIntegrityValidatorEnabled;
351 public void setIndexIntegrityValidatorEnabled(boolean indexIntegrityValidatorEnabled) {
352 this.indexIntegrityValidatorEnabled = indexIntegrityValidatorEnabled;
355 public long getIndexIntegrityValidatorFrequencyInMs() {
356 return indexIntegrityValidatorFrequencyInMs;
359 public void setIndexIntegrityValidatorFrequencyInMs(long indexIntegrityValidatorFrequencyInMs) {
360 this.indexIntegrityValidatorFrequencyInMs = indexIntegrityValidatorFrequencyInMs;
363 public boolean isConfigOkForStartupSync() {
364 return configOkForStartupSync;
367 public void setConfigOkForStartupSync(boolean configOkForStartupSync) {
368 this.configOkForStartupSync = configOkForStartupSync;
371 public boolean isConfigOkForPeriodicSync() {
372 return configOkForPeriodicSync;
375 public void setConfigOkForPeriodicSync(boolean configOkForPeriodicSync) {
376 this.configOkForPeriodicSync = configOkForPeriodicSync;
379 public boolean isConfigDisabledForInitialSync() {
380 return syncTaskInitialDelayInMs == SynchronizerConstants.DELAY_NO_STARTUP_SYNC_IN_MS;
383 public boolean isAutosuggestSynchronizationEnabled() {
384 return autosuggestSynchronizationEnabled;
387 public void setAutosuggestSynchronizationEnabled(boolean autosuggestSynchronizationEnabled) {
388 this.autosuggestSynchronizationEnabled = autosuggestSynchronizationEnabled;
391 public Calendar getTargetSyncTime() {
393 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
394 Calendar targetSyncTime = Calendar.getInstance(tz);
396 targetSyncTime.set(Calendar.HOUR_OF_DAY, getSyncTaskStartTimeHr());
397 targetSyncTime.set(Calendar.MINUTE, getSyncTaskStartTimeMin());
398 targetSyncTime.set(Calendar.SECOND, getSyncTaskStartTimeSec());
400 return targetSyncTime;
404 public long getDefaultInitialSyncDelayInMs(Calendar timeNow) {
406 int taskFrequencyInDays = getSyncTaskFrequencyInDay();
408 long nextSyncTimeInMs = getNextSyncTime(getTargetSyncTime(), timeNow.getTimeInMillis(),
409 taskFrequencyInDays * 86400);
412 * If the the current time is after the scheduled start time, then delay
413 * by the initial task delay configuration value
415 long delayUntilNextSyncInMs = Math.max(getSyncTaskInitialDelayInMs(),
416 nextSyncTimeInMs - timeNow.getTimeInMillis());
418 return delayUntilNextSyncInMs;
422 public long getNextSyncTime(Calendar syncTime, int taskFrequencyInSeconds) {
424 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
425 Calendar timeNow = Calendar.getInstance(tz);
427 return getNextSyncTime(syncTime, timeNow.getTimeInMillis(), taskFrequencyInSeconds);
431 * Gets the first sync time.
437 * @param taskFrequencyInMs
439 * @return the first sync time
441 public long getNextSyncTime(Calendar syncTime, long timeNowInMs, int taskFrequencyInSeconds) {
442 if (taskFrequencyInSeconds == 0) {
444 } else if (timeNowInMs > syncTime.getTimeInMillis()) {
447 * If current time is after the scheduled sync start time, then
448 * we'll skip ahead to the next sync time period
451 syncTime.add(Calendar.SECOND, taskFrequencyInSeconds);
454 return syncTime.getTimeInMillis();
457 * @return the instance
459 public static SynchronizerConfiguration getInstance() {
464 * @param instance the instance to set
466 public static void setInstance(SynchronizerConfiguration instance) {
467 SynchronizerConfiguration.instance = instance;
473 public static Logger getLog() {
478 * @return the configFile
480 public static String getConfigFile() {
485 * @return the depthModifier
487 public static String getDepthModifier() {
488 return DEPTH_MODIFIER;
492 * @return the depthAllModifier
494 public static String getDepthAllModifier() {
495 return DEPTH_ALL_MODIFIER;
499 * @return the depthAndNodesOnlyModifier
501 public static String getDepthAndNodesOnlyModifier() {
502 return DEPTH_AND_NODES_ONLY_MODIFIER;
506 * @return the nodesOnlyModifier
508 public static String getNodesOnlyModifier() {
509 return NODES_ONLY_MODIFIER;
513 * @see java.lang.Object#toString()
516 public String toString() {
517 return "SynchronizerConfiguration [syncTaskInitialDelayInMs=" + syncTaskInitialDelayInMs
518 + ", syncTaskFrequencyInMs=" + syncTaskFrequencyInMs + ", scrollContextTimeToLiveInMinutes="
519 + scrollContextTimeToLiveInMinutes + ", numScrollContextItemsToRetrievePerRequest="
520 + numScrollContextItemsToRetrievePerRequest + ", resolverProgressLogFrequencyInMs="
521 + resolverProgressLogFrequencyInMs + ", resolverQueueMonitorFrequencyInMs="
522 + resolverQueueMonitorFrequencyInMs + ", indexIntegrityValidatorEnabled="
523 + indexIntegrityValidatorEnabled + ", indexIntegrityValidatorFrequencyInMs="
524 + indexIntegrityValidatorFrequencyInMs + ", ssyncTaskFrequencyInDay="
525 + syncTaskFrequencyInDay + ", syncTaskStartTime=" + syncTaskStartTime
526 + ", syncTaskStartTimeHr=" + syncTaskStartTimeHr + ", syncTaskStartTimeMin="
527 + syncTaskStartTimeMin + ", syncTaskStartTimeSec=" + syncTaskStartTimeSec
528 + ", syncTaskStartTimeTimeZone=" + syncTaskStartTimeTimeZone
529 + ", displayVerboseQueueManagerStats=" + displayVerboseQueueManagerStats
530 + ", resourceNotFoundErrorsSupressed=" + resourceNotFoundErrorsSupressed
531 + ", nodesOnlyModifierEnabled=" + nodesOnlyModifierEnabled + ", configOKForStartupSync="
532 + configOkForStartupSync + ", configOKForPeriodicSync=" + configOkForPeriodicSync
533 + ", autosuggestSynchronizationEnabled=" + autosuggestSynchronizationEnabled + "]";