Merge "Sonar Fixes - CadiAuthFilter.java"
[music.git] / src / main / java / org / onap / music / main / CronJobManager.java
index fb4a2ac..0d7d923 100644 (file)
@@ -4,6 +4,8 @@
  * ===================================================================
  *  Copyright (c) 2017 AT&T Intellectual Property
  * ===================================================================
+ *  Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
  *  You may obtain a copy of the License at
  * ============LICENSE_END=============================================
  * ====================================================================
  */
+
 package org.onap.music.main;
 
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.annotation.WebListener;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Iterator;
+import org.onap.music.authentication.CachingUtil;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
 
-@WebListener
-public class CronJobManager implements ServletContextListener {
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
 
-    private ScheduledExecutorService scheduler;
+@Component
+public class CronJobManager {
 
-    @Override
-    public void contextInitialized(ServletContextEvent event) {
-        scheduler = Executors.newSingleThreadScheduledExecutor();
-        scheduler.scheduleAtFixedRate(new CachingUtil(), 0, 24, TimeUnit.HOURS);
-    }
+    private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CronJobManager.class);
+
+    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
 
-    @Override
-    public void contextDestroyed(ServletContextEvent event) {
-        scheduler.shutdownNow();
+
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void scheduleTaskWithFixedRate() {
+        logger.info("Executing cronjob to cleanup locks..", dateTimeFormatter.format(LocalDateTime.now()) );
+        deleteLocksFromDB();
     }
 
+    public void deleteLocksFromDB() {
+        PreparedQueryObject pQuery = new PreparedQueryObject();
+        String consistency = MusicUtil.EVENTUAL;
+        pQuery.appendQueryString("CREATE TABLE IF NOT EXISTS admin.locks ( lock_id text PRIMARY KEY, ctime text)");
+        try {
+            ResultType result = MusicCore.nonKeyRelatedPut(pQuery, consistency);
+            if ( result.equals(ResultType.FAILURE)) {
+                logger.error(EELFLoggerDelegate.errorLogger,"Error creating Admin.locks table.",AppMessages.QUERYERROR,ErrorSeverity.CRITICAL, ErrorTypes.QUERYERROR);
+            }
+        } catch (MusicServiceException e1) {
+            logger.error(EELFLoggerDelegate.errorLogger,e1,AppMessages.QUERYERROR,ErrorSeverity.CRITICAL, ErrorTypes.QUERYERROR);
+        }
+
+        pQuery = new PreparedQueryObject();
+        pQuery.appendQueryString(
+                        "select * from admin.locks");
+            try {
+                ResultSet rs = MusicCore.get(pQuery);
+                Iterator<Row> it = rs.iterator();
+                StringBuilder deleteKeys = new StringBuilder();
+                Boolean expiredKeys = false;
+                while (it.hasNext()) {
+                    Row row = it.next();
+                    String id = row.getString("lock_id");
+                    long ctime = Long.parseLong(row.getString("ctime"));
+                    if(System.currentTimeMillis() >= ctime + 24 * 60 * 60 * 1000) {
+                        expiredKeys = true;
+                        String new_id = id.substring(1);
+                        try {
+                            MusicCore.deleteLock(new_id);
+                        } catch (MusicLockingException e) {
+                            logger.info(EELFLoggerDelegate.applicationLogger,
+                                     e.getMessage());
+                        }
+                        deleteKeys.append("'").append(id).append("'").append(",");
+                    }
+                }
+                if(expiredKeys) {
+                    deleteKeys.deleteCharAt(deleteKeys.length()-1);
+                    CachingUtil.deleteKeysFromDB(deleteKeys.toString());
+               }
+            } catch (MusicServiceException e) {
+                logger.error(EELFLoggerDelegate.errorLogger,e,AppMessages.CACHEERROR,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+            }
+    }
 }