OSDN Git Service

feat: add manualUpdate feature.
[delesterandomselector/DelesteRandomSelector.git] / src / com / ranfa / lib / ManualUpdateThreadImpl.java
1 package com.ranfa.lib;
2
3 import java.util.ArrayList;
4 import java.util.concurrent.CompletableFuture;
5 import java.util.concurrent.ExecutionException;
6 import java.util.concurrent.Executor;
7 import java.util.concurrent.Executors;
8 import java.util.function.BiConsumer;
9
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12
13 public class ManualUpdateThreadImpl implements Runnable {
14
15         //Declare flag
16         private static boolean flag = true;
17
18         //Declare Executor service
19         private Executor executor = Executors.newWorkStealingPool();
20         private BiConsumer<ArrayList<Song>, ArrayList<Song>> updateConsumer = (list1, list2) -> {
21                 this.logger.info("Checking database updates...");
22                 if(list1.size() > list2.size()) {
23                         long time = System.currentTimeMillis();
24                         this.logger.info("{} Update detected.", (list1.size() - list2.size()));
25                         Scraping.writeToJson(list1);
26                         this.logger.info("Update completed in {} ms", (System.currentTimeMillis() - time));
27                         this.logger.info("Updated database size: {}", list1.size());
28                 } else {
29                         this.logger.info("database is up-to-date.");
30                 }
31         };
32
33         //Declare logger
34         private Logger logger = LoggerFactory.getLogger(ManualUpdateThreadImpl.class);
35
36         public ManualUpdateThreadImpl() {
37                 this.logger.info("ManualUpdateThread is now available.");
38         }
39
40         @Override
41         public void run() {
42                 if (flag) {
43                         flag = false;
44                 }
45                 this.logger.info("Checking database updates...");
46                 CompletableFuture<ArrayList<Song>> webData = CompletableFuture.supplyAsync(Scraping::getWholeData, this.executor);
47                 CompletableFuture<ArrayList<Song>> localData = CompletableFuture.supplyAsync(Scraping::getFromJson, this.executor);
48                 try {
49                         this.updateConsumer.accept(webData.get(), localData.get());
50                 } catch (InterruptedException | ExecutionException e) {
51                         this.logger.warn("Update failed.", e);
52                 }
53                 flag = true;
54         }
55
56         public boolean getFlag() {
57                 return flag;
58         }
59 }