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;
35 import java.util.regex.PatternSyntaxException;
37 import org.onap.aai.sparky.logging.AaiUiMsgs;
38 import org.onap.aai.sparky.util.ConfigHelper;
39 import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants;
40 import org.onap.aai.cl.api.Logger;
41 import org.onap.aai.cl.eelf.LoggerFactory;
45 * The Class SynchronizerConfiguration.
47 public class SynchronizerConfiguration {
49 private static final Logger LOG = LoggerFactory.getInstance().getLogger(SynchronizerConfiguration.class);
51 public static final String CONFIG_FILE =
52 TierSupportUiConstants.DYNAMIC_CONFIG_APP_LOCATION + "synchronizer.properties";
54 private static SynchronizerConfiguration instance;
56 public static final String DEPTH_MODIFIER = "?depth=0";
57 public static final String DEPTH_ALL_MODIFIER = "?depth=all";
58 public static final String DEPTH_AND_NODES_ONLY_MODIFIER = "?depth=0&nodes-only";
59 public static final String NODES_ONLY_MODIFIER = "?nodes-only";
61 public static SynchronizerConfiguration getConfig() throws Exception {
63 if (instance == null) {
64 instance = new SynchronizerConfiguration();
71 * Instantiates a new synchronizer configuration.
73 public SynchronizerConfiguration() throws NumberFormatException,PatternSyntaxException,Exception {
74 Properties props = ConfigHelper.loadConfigFromExplicitPath(CONFIG_FILE);
78 public SynchronizerConfiguration(Properties props) throws NumberFormatException, PatternSyntaxException, Exception {
84 * @throws Exception the exception
86 protected void initialize(Properties props) throws NumberFormatException, PatternSyntaxException, Exception {
88 // parse config for startup sync
90 syncTaskInitialDelayInMs =
91 Integer.parseInt(props.getProperty("synchronizer.syncTask.initialDelayInMs",
92 SynchronizerConstants.DEFAULT_INITIAL_DELAY_IN_MS));
93 if (syncTaskInitialDelayInMs < 0) {
94 throw new NumberFormatException("Error. Sync Task Delay has to be positive");
96 } catch (NumberFormatException exc) {
97 this.setConfigOkForStartupSync(false);
98 syncTaskInitialDelayInMs = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
99 String message = "Invalid configuration for synchronizer parameter:"
100 + " 'synchronizer.syncTask.initialDelayInMs'";
101 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
104 // parse config for periodic sync
106 syncTaskFrequencyInDay =
107 Integer.parseInt(props.getProperty("synchronizer.syncTask.taskFrequencyInDay",
108 SynchronizerConstants.DEFAULT_TASK_FREQUENCY_IN_DAY));
109 if (syncTaskFrequencyInDay < 0) {
110 throw new NumberFormatException("Error. Sync Task Frequency has to be positive");
112 } catch (NumberFormatException exc) {
113 this.setConfigOkForPeriodicSync(false);
114 syncTaskFrequencyInDay = SynchronizerConstants.DEFAULT_CONFIG_ERROR_INT_VALUE;
115 String message = "Invalid configuration for synchronizer parameter:"
116 + " 'synchronizer.syncTask.taskFrequencyInDay'";
117 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
121 syncTaskStartTime = props.getProperty("synchronizer.syncTask.startTimestamp",
122 SynchronizerConstants.DEFAULT_START_TIMESTAMP); // Default 05:00:00 UTC
123 Pattern pattern = Pattern.compile(SynchronizerConstants.TIMESTAMP24HOURS_PATTERN);
124 Matcher matcher = pattern.matcher(syncTaskStartTime);
125 if (!matcher.matches()) {
126 throw new PatternSyntaxException("Pattern Mismatch","The erroneous pattern is not available",-1);
129 List<String> timestampVal = Arrays.asList(syncTaskStartTime.split(" "));
131 if (timestampVal.size() == SynchronizerConstants.COMPONENTS_IN_TIMESTAMP) {
132 // Need both time and timezone offset
133 syncTaskStartTimeTimeZone = timestampVal
134 .get(SynchronizerConstants.IDX_TIMEZONE_IN_TIMESTAMP).replaceAll("UTC", "GMT");
136 String time = timestampVal.get(SynchronizerConstants.IDX_TIME_IN_TIMESTAMP);
137 DateFormat format = new SimpleDateFormat("HH:mm:ss");
138 Date date = format.parse(time);
139 Calendar calendar = Calendar.getInstance();
140 calendar.setTime(date);
142 syncTaskStartTimeHr = calendar.get(Calendar.HOUR_OF_DAY);
143 syncTaskStartTimeMin = calendar.get(Calendar.MINUTE);
144 syncTaskStartTimeSec = calendar.get(Calendar.SECOND);
146 LOG.info(AaiUiMsgs.SYNC_START_TIME);
148 } catch (Exception exc) {
149 this.setConfigOkForPeriodicSync(false);
150 String message = "Invalid configuration for synchronizer parameter:"
151 + " 'synchronizer.syncTask.startTimestamp'";
152 LOG.error(AaiUiMsgs.SYNC_INVALID_CONFIG_PARAM, message);
155 scrollContextTimeToLiveInMinutes =
156 Integer.parseInt(props.getProperty("synchronizer.scrollContextTimeToLiveInMinutes", "5"));
157 numScrollContextItemsToRetrievePerRequest = Integer.parseInt(
158 props.getProperty("synchronizer.numScrollContextItemsToRetrievePerRequest", "5000"));
160 resolverProgressLogFrequencyInMs = Long
161 .parseLong(props.getProperty("synchronizer.resolver.progressLogFrequencyInMs", "60000"));
162 resolverQueueMonitorFrequencyInMs = Long
163 .parseLong(props.getProperty("synchronizer.resolver.queueMonitorFrequencyInMs", "1000"));
165 indexIntegrityValidatorEnabled = Boolean
166 .parseBoolean(props.getProperty("synchronizer.indexIntegrityValidator.enabled", "false"));
167 indexIntegrityValidatorFrequencyInMs = Long.parseLong(
168 props.getProperty("synchronizer.indexIntegrityValidatorFrequencyInMs", "300000"));
170 displayVerboseQueueManagerStats = Boolean
171 .parseBoolean(props.getProperty("synchronizer.resolver.displayVerboseQueueManagerStats"));
173 resourceNotFoundErrorsSupressed =
174 Boolean.parseBoolean(props.getProperty("synchronizer.suppressResourceNotFoundErrors"));
176 nodesOnlyModifierEnabled =
177 Boolean.parseBoolean(props.getProperty("synchronizer.applyNodesOnlyModifier"));
179 autosuggestSynchronizationEnabled = Boolean
180 .parseBoolean(props.getProperty("synchronizer.autosuggestSynchronizationEnabled", "true"));
182 if (LOG.isDebugEnabled()) {
183 LOG.debug(AaiUiMsgs.DEBUG_GENERIC, this.toString());
187 public boolean isNodesOnlyModifierEnabled() {
188 return nodesOnlyModifierEnabled;
191 public void setNodesOnlyModifierEnabled(boolean nodesOnlyModifierEnabled) {
192 this.nodesOnlyModifierEnabled = nodesOnlyModifierEnabled;
195 public int getSyncTaskInitialDelayInMs() {
196 return syncTaskInitialDelayInMs;
199 public void setSyncTaskInitialDelayInMs(int syncTaskInitialDelayInMs) {
200 this.syncTaskInitialDelayInMs = syncTaskInitialDelayInMs;
203 public boolean isDisplayVerboseQueueManagerStats() {
204 return displayVerboseQueueManagerStats;
207 public void setDisplayVerboseQueueManagerStats(boolean displayVerboseQueueManagerStats) {
208 this.displayVerboseQueueManagerStats = displayVerboseQueueManagerStats;
211 private int syncTaskInitialDelayInMs;
213 private int syncTaskFrequencyInMs;
215 private int scrollContextTimeToLiveInMinutes;
217 private int numScrollContextItemsToRetrievePerRequest;
219 private long resolverProgressLogFrequencyInMs;
221 private long resolverQueueMonitorFrequencyInMs;
223 private boolean indexIntegrityValidatorEnabled;
225 private long indexIntegrityValidatorFrequencyInMs;
227 private int syncTaskFrequencyInDay;
229 private String syncTaskStartTime;
231 private int syncTaskStartTimeHr = 5; // for default sync start time
233 private int syncTaskStartTimeMin;
235 private int syncTaskStartTimeSec;
237 private String syncTaskStartTimeTimeZone;
239 private boolean displayVerboseQueueManagerStats;
241 private boolean resourceNotFoundErrorsSupressed;
243 private boolean nodesOnlyModifierEnabled;
245 private boolean autosuggestSynchronizationEnabled;
247 private boolean configOkForStartupSync = true;
249 private boolean configOkForPeriodicSync = true;
251 public boolean isResourceNotFoundErrorsSupressed() {
252 return resourceNotFoundErrorsSupressed;
255 public void setResourceNotFoundErrorsSupressed(boolean resourceNotFoundErrorsSupressed) {
256 this.resourceNotFoundErrorsSupressed = resourceNotFoundErrorsSupressed;
259 public int getScrollContextTimeToLiveInMinutes() {
260 return scrollContextTimeToLiveInMinutes;
263 public void setScrollContextTimeToLiveInMinutes(int scrollContextTimeToLiveInMinutes) {
264 this.scrollContextTimeToLiveInMinutes = scrollContextTimeToLiveInMinutes;
267 public int getNumScrollContextItemsToRetrievePerRequest() {
268 return numScrollContextItemsToRetrievePerRequest;
271 public void setNumScrollContextItemsToRetrievePerRequest(
272 int numScrollContextItemsToRetrievePerRequest) {
273 this.numScrollContextItemsToRetrievePerRequest = numScrollContextItemsToRetrievePerRequest;
276 public int getSyncTaskFrequencyInDay() {
277 return syncTaskFrequencyInDay;
280 public void setSyncTaskFrequencyInDay(int syncTaskFrequencyInDay) {
281 this.syncTaskFrequencyInDay = syncTaskFrequencyInDay;
284 public String getSyncTaskStartTime() {
285 return syncTaskStartTime;
288 public void setSyncTaskStartTime(String syncTaskStartTime) {
289 this.syncTaskStartTime = syncTaskStartTime;
292 public int getSyncTaskStartTimeHr() {
293 return syncTaskStartTimeHr;
296 public void setSyncTaskStartTimeHr(int syncTaskStartTimeHr) {
297 this.syncTaskStartTimeHr = syncTaskStartTimeHr;
300 public int getSyncTaskStartTimeMin() {
301 return syncTaskStartTimeMin;
304 public void setSyncTaskStartTimeMin(int syncTaskStartTimeMin) {
305 this.syncTaskStartTimeMin = syncTaskStartTimeMin;
308 public int getSyncTaskStartTimeSec() {
309 return syncTaskStartTimeSec;
312 public void setSyncTaskStartTimeSec(int syncTaskStartTimeSec) {
313 this.syncTaskStartTimeSec = syncTaskStartTimeSec;
316 public String getSyncTaskStartTimeTimeZone() {
317 return syncTaskStartTimeTimeZone;
320 public void setSyncTaskStartTimeTimeZone(String syncTaskStartTimeTimeZone) {
321 this.syncTaskStartTimeTimeZone = syncTaskStartTimeTimeZone;
324 public int getSyncTaskFrequencyInMs() {
325 return syncTaskFrequencyInMs;
328 public void setSyncTaskFrequencyInMs(int syncTaskFrequencyInMs) {
329 this.syncTaskFrequencyInMs = syncTaskFrequencyInMs;
332 public long getResolverProgressLogFrequencyInMs() {
333 return resolverProgressLogFrequencyInMs;
336 public void setResolverProgressLogFrequencyInMs(long resolverProgressLogFrequencyInMs) {
337 this.resolverProgressLogFrequencyInMs = resolverProgressLogFrequencyInMs;
340 public long getResolverQueueMonitorFrequencyInMs() {
341 return resolverQueueMonitorFrequencyInMs;
344 public void setResolverQueueMonitorFrequencyInMs(long resolverQueueMonitorFrequencyInMs) {
345 this.resolverQueueMonitorFrequencyInMs = resolverQueueMonitorFrequencyInMs;
348 public boolean isIndexIntegrityValidatorEnabled() {
349 return indexIntegrityValidatorEnabled;
352 public void setIndexIntegrityValidatorEnabled(boolean indexIntegrityValidatorEnabled) {
353 this.indexIntegrityValidatorEnabled = indexIntegrityValidatorEnabled;
356 public long getIndexIntegrityValidatorFrequencyInMs() {
357 return indexIntegrityValidatorFrequencyInMs;
360 public void setIndexIntegrityValidatorFrequencyInMs(long indexIntegrityValidatorFrequencyInMs) {
361 this.indexIntegrityValidatorFrequencyInMs = indexIntegrityValidatorFrequencyInMs;
364 public boolean isConfigOkForStartupSync() {
365 return configOkForStartupSync;
368 public void setConfigOkForStartupSync(boolean configOkForStartupSync) {
369 this.configOkForStartupSync = configOkForStartupSync;
372 public boolean isConfigOkForPeriodicSync() {
373 return configOkForPeriodicSync;
376 public void setConfigOkForPeriodicSync(boolean configOkForPeriodicSync) {
377 this.configOkForPeriodicSync = configOkForPeriodicSync;
380 public boolean isConfigDisabledForInitialSync() {
381 return syncTaskInitialDelayInMs == SynchronizerConstants.DELAY_NO_STARTUP_SYNC_IN_MS;
384 public boolean isAutosuggestSynchronizationEnabled() {
385 return autosuggestSynchronizationEnabled;
388 public void setAutosuggestSynchronizationEnabled(boolean autosuggestSynchronizationEnabled) {
389 this.autosuggestSynchronizationEnabled = autosuggestSynchronizationEnabled;
392 public Calendar getTargetSyncTime() {
394 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
395 Calendar targetSyncTime = Calendar.getInstance(tz);
397 targetSyncTime.set(Calendar.HOUR_OF_DAY, getSyncTaskStartTimeHr());
398 targetSyncTime.set(Calendar.MINUTE, getSyncTaskStartTimeMin());
399 targetSyncTime.set(Calendar.SECOND, getSyncTaskStartTimeSec());
401 return targetSyncTime;
405 public long getDefaultInitialSyncDelayInMs(Calendar timeNow) {
407 int taskFrequencyInDays = getSyncTaskFrequencyInDay();
409 long nextSyncTimeInMs = getNextSyncTime(getTargetSyncTime(), timeNow.getTimeInMillis(),
410 taskFrequencyInDays * 86400);
413 * If the the current time is after the scheduled start time, then delay
414 * by the initial task delay configuration value
416 long delayUntilNextSyncInMs = Math.max(getSyncTaskInitialDelayInMs(),
417 nextSyncTimeInMs - timeNow.getTimeInMillis());
419 return delayUntilNextSyncInMs;
423 public long getNextSyncTime(Calendar syncTime, int taskFrequencyInSeconds) {
425 TimeZone tz = TimeZone.getTimeZone(getSyncTaskStartTimeTimeZone());
426 Calendar timeNow = Calendar.getInstance(tz);
428 return getNextSyncTime(syncTime, timeNow.getTimeInMillis(), taskFrequencyInSeconds);
432 * Gets the first sync time.
438 * @param taskFrequencyInMs
440 * @return the first sync time
442 public long getNextSyncTime(Calendar syncTime, long timeNowInMs, int taskFrequencyInSeconds) {
443 if (taskFrequencyInSeconds == 0) {
445 } else if (timeNowInMs > syncTime.getTimeInMillis()) {
448 * If current time is after the scheduled sync start time, then
449 * we'll skip ahead to the next sync time period
452 syncTime.add(Calendar.SECOND, taskFrequencyInSeconds);
455 return syncTime.getTimeInMillis();
458 * @return the instance
460 public static SynchronizerConfiguration getInstance() {
465 * @param instance the instance to set
467 public static void setInstance(SynchronizerConfiguration instance) {
468 SynchronizerConfiguration.instance = instance;
474 public static Logger getLog() {
479 * @return the configFile
481 public static String getConfigFile() {
486 * @return the depthModifier
488 public static String getDepthModifier() {
489 return DEPTH_MODIFIER;
493 * @return the depthAllModifier
495 public static String getDepthAllModifier() {
496 return DEPTH_ALL_MODIFIER;
500 * @return the depthAndNodesOnlyModifier
502 public static String getDepthAndNodesOnlyModifier() {
503 return DEPTH_AND_NODES_ONLY_MODIFIER;
507 * @return the nodesOnlyModifier
509 public static String getNodesOnlyModifier() {
510 return NODES_ONLY_MODIFIER;
514 * @see java.lang.Object#toString()
517 public String toString() {
518 return "SynchronizerConfiguration [syncTaskInitialDelayInMs=" + syncTaskInitialDelayInMs
519 + ", syncTaskFrequencyInMs=" + syncTaskFrequencyInMs + ", scrollContextTimeToLiveInMinutes="
520 + scrollContextTimeToLiveInMinutes + ", numScrollContextItemsToRetrievePerRequest="
521 + numScrollContextItemsToRetrievePerRequest + ", resolverProgressLogFrequencyInMs="
522 + resolverProgressLogFrequencyInMs + ", resolverQueueMonitorFrequencyInMs="
523 + resolverQueueMonitorFrequencyInMs + ", indexIntegrityValidatorEnabled="
524 + indexIntegrityValidatorEnabled + ", indexIntegrityValidatorFrequencyInMs="
525 + indexIntegrityValidatorFrequencyInMs + ", ssyncTaskFrequencyInDay="
526 + syncTaskFrequencyInDay + ", syncTaskStartTime=" + syncTaskStartTime
527 + ", syncTaskStartTimeHr=" + syncTaskStartTimeHr + ", syncTaskStartTimeMin="
528 + syncTaskStartTimeMin + ", syncTaskStartTimeSec=" + syncTaskStartTimeSec
529 + ", syncTaskStartTimeTimeZone=" + syncTaskStartTimeTimeZone
530 + ", displayVerboseQueueManagerStats=" + displayVerboseQueueManagerStats
531 + ", resourceNotFoundErrorsSupressed=" + resourceNotFoundErrorsSupressed
532 + ", nodesOnlyModifierEnabled=" + nodesOnlyModifierEnabled + ", configOKForStartupSync="
533 + configOkForStartupSync + ", configOKForPeriodicSync=" + configOkForPeriodicSync
534 + ", autosuggestSynchronizationEnabled=" + autosuggestSynchronizationEnabled + "]";