moving to laptop
This commit is contained in:
parent
978b88e6a4
commit
8706e225f2
@ -15,7 +15,7 @@ application{
|
||||
}
|
||||
dependencies {
|
||||
implementation("org.simplejavamail:simple-java-mail:8.7.0")
|
||||
implementation("net.sourceforge.htmlunit:htmlunit:2.53.0")
|
||||
implementation("net.sourceforge.htmlunit:htmlunit:2.70.0")
|
||||
testImplementation(platform("org.junit:junit-bom:5.10.0"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import java.io.*;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class DataStore {
|
||||
public class DataStore implements AutoCloseable {
|
||||
|
||||
public static Map<Subject,Subscription> subjectSubscriptions = new ConcurrentHashMap<>();
|
||||
private static final String DATA_FILE = "subjects_data.ser";
|
||||
@ -12,9 +12,24 @@ public class DataStore {
|
||||
loadSubjectsFromFile();
|
||||
}
|
||||
|
||||
public static void notifySubject(Subject subject, SubjectEntry entry){
|
||||
subjectSubscriptions.get(subject).notifyUsers(entry);
|
||||
public static void notifySubject(Subject subject, SubjectEntry entry) {
|
||||
if (subject != null && entry != null) {
|
||||
Object subscription = subjectSubscriptions.get(subject);
|
||||
if (subscription != null) {
|
||||
((Subscription) subscription).notifyUsers(entry);
|
||||
System.out.println("Subject " + subject + " has notified " + entry);
|
||||
} else {
|
||||
System.out.println("Warning: No subscription found for subject " + subject);
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static synchronized void subscribeUserToSubject(User user, Subject subject) {
|
||||
if (user != null && subject != null && subjectSubscriptions.containsKey(subject)) {
|
||||
subjectSubscriptions.get(subject).subscribe(user);
|
||||
@ -33,6 +48,13 @@ public class DataStore {
|
||||
private static void loadSubjectsFromFile() {
|
||||
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(DATA_FILE))) {
|
||||
subjectSubscriptions = (Map<Subject, Subscription>) in.readObject();
|
||||
for (Map.Entry<Subject,Subscription> entry : subjectSubscriptions.entrySet()) {
|
||||
System.out.println("Subject " + entry.getKey() + " has notified " + entry.getValue());
|
||||
}
|
||||
System.out.println("Loaded subjects from " + DATA_FILE);
|
||||
try{
|
||||
Thread.sleep(1000);
|
||||
}catch (InterruptedException e){}
|
||||
} catch (IOException | ClassNotFoundException e) {
|
||||
System.out.println("Error loading subjects data: " + e.getMessage());
|
||||
}
|
||||
@ -46,4 +68,8 @@ public class DataStore {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
saveSubjectsToFile();
|
||||
}
|
||||
}
|
||||
|
@ -4,32 +4,108 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class DataThread implements Runnable {
|
||||
private List<SubjectEntry> allEntries = new ArrayList<>();
|
||||
private boolean running;
|
||||
Set<Subject> subjects = Subject.generateSubjects();
|
||||
private Set<Subject> subjects = Subject.generateSubjects();
|
||||
|
||||
private static final String FILE_NAME = "allEntries.dat";
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while(running){
|
||||
running = true;
|
||||
|
||||
try {
|
||||
readEntriesFromFile();
|
||||
}catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
while (running) {
|
||||
try {
|
||||
System.out.println("comparing: " + compare(ETFScraper.getEntries()));
|
||||
|
||||
Thread.sleep(20000);
|
||||
} catch (InterruptedException e) {
|
||||
System.out.println("Thread interrupted, stopping...");
|
||||
running = false;
|
||||
Thread.currentThread().interrupt();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
public void compare(List<SubjectEntry> subjectEntries) {
|
||||
for(SubjectEntry subjectEntry : subjectEntries){
|
||||
if(!allEntries.contains(subjectEntry)){
|
||||
saveEntriesToFile();
|
||||
}
|
||||
|
||||
for(Subject subject : subjects){
|
||||
if(subject.matchesTitle(subjectEntry.getTitle())){
|
||||
public boolean compare(List<SubjectEntry> subjectEntries) {
|
||||
if (subjectEntries.size() == 0) {
|
||||
System.out.println("No entries found");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (SubjectEntry subjectEntry : subjectEntries) {
|
||||
// If entry is new and not already present
|
||||
if (!allEntries.contains(subjectEntry)) {
|
||||
for (Subject subject : subjects) {
|
||||
if (subject.matchesTitle(subjectEntry.getTitle())) {
|
||||
DataStore.notifySubject(subject, subjectEntry);
|
||||
allEntries.add(subjectEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void stop(){
|
||||
public void stop() {
|
||||
running = false;
|
||||
}
|
||||
|
||||
private void saveEntriesToFile() {
|
||||
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {
|
||||
oos.writeObject(allEntries);
|
||||
|
||||
System.out.println("Entries saved to file.");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void readEntriesFromFile() throws IOException {
|
||||
File file = new File(FILE_NAME);
|
||||
|
||||
// Check if the file exists before reading
|
||||
if (!file.exists()) {
|
||||
try {
|
||||
if (file.createNewFile()) {
|
||||
System.out.println("No saved entries found. Created new file.");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.out.println("Error creating file: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
return; // Return early if file creation fails
|
||||
}
|
||||
}
|
||||
|
||||
// Check if file is empty BEFORE reading
|
||||
if (file.length() == 0) {
|
||||
System.out.println("File is empty. No entries loaded.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Now try to read from the file
|
||||
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
|
||||
allEntries = (List<SubjectEntry>) ois.readObject();
|
||||
System.out.println("Entries loaded from file.");
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("File not found, but it was already handled above.");
|
||||
} catch (IOException | ClassNotFoundException e) {
|
||||
System.out.println("Error while reading the file: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ETFScraper implements Runnable {
|
||||
private List<SubjectEntry> entries = new ArrayList<>();
|
||||
private static List<SubjectEntry> entries = new ArrayList<>();
|
||||
|
||||
private volatile boolean running = true;
|
||||
|
||||
@ -21,14 +21,16 @@ public class ETFScraper implements Runnable {
|
||||
HtmlElement element = parent.getFirstByXPath(xPath);
|
||||
return element == null ? "" : element.asNormalizedText();
|
||||
}
|
||||
List<SubjectEntry> getAllEntries() {
|
||||
return entries;
|
||||
static List<SubjectEntry> getEntries() {
|
||||
synchronized(entries) {
|
||||
return new ArrayList<>(entries);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while(running) {
|
||||
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX)) {
|
||||
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
|
||||
|
||||
webClient.getOptions().setJavaScriptEnabled(true);
|
||||
webClient.getOptions().setCssEnabled(false);
|
||||
@ -47,7 +49,7 @@ public class ETFScraper implements Runnable {
|
||||
int ul_idSelection = 1;
|
||||
for (HtmlAnchor anchor : toggles) {
|
||||
String groupName = anchor.asNormalizedText().split("\n")[0].trim();
|
||||
System.out.println("Group name: " + groupName);
|
||||
//System.out.println("Group name: " + groupName);
|
||||
HtmlPage updatedPage = anchor.click();
|
||||
webClient.waitForBackgroundJavaScript(1000);
|
||||
|
||||
@ -57,7 +59,7 @@ public class ETFScraper implements Runnable {
|
||||
HtmlElement listElement = rawElement instanceof HtmlElement ? (HtmlElement) rawElement : null;
|
||||
|
||||
if (listElement == null) {
|
||||
System.out.println("An element with id " + ul_id + " was not found");
|
||||
//System.out.println("An element with id " + ul_id + " was not found");
|
||||
ul_idSelection++;
|
||||
continue;
|
||||
}
|
||||
@ -82,7 +84,7 @@ public class ETFScraper implements Runnable {
|
||||
ul_idSelection++;
|
||||
}
|
||||
|
||||
Thread.sleep(20000);
|
||||
//Thread.sleep(20000);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
@ -31,8 +31,11 @@ public class Main {
|
||||
Thread webClientThread = new Thread(task, "WebClientThread");
|
||||
webClientThread.start();
|
||||
|
||||
DataThread data = new DataThread();
|
||||
Thread dataThread = new Thread(data, "DataThread");
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
|
||||
dataThread.start();
|
||||
try {
|
||||
while (running) {
|
||||
|
||||
@ -40,7 +43,10 @@ public class Main {
|
||||
|
||||
switch (command) {
|
||||
case "stop":
|
||||
dataThread.interrupt();
|
||||
data.stop();
|
||||
task.stop();
|
||||
webClientThread.interrupt();
|
||||
running = false;
|
||||
System.out.println("Stopping...");
|
||||
break;
|
||||
@ -65,11 +71,11 @@ public class Main {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
entries=task.getAllEntries();
|
||||
entries=task.getEntries();
|
||||
System.out.println("BBBBBBBBBBBBb");
|
||||
System.out.println(entries.size());
|
||||
|
||||
for(SubjectEntry e : task.getAllEntries()) {
|
||||
for(SubjectEntry e : task.getEntries()) {
|
||||
//System.out.println(e);
|
||||
}
|
||||
for(Subject subject : user.getSubjectSet()) {
|
||||
|
@ -56,7 +56,8 @@ public class User implements Serializable {
|
||||
public void sendNotification(SubjectEntry entry){
|
||||
|
||||
if(notificationMethod == NotificationMethod.EMAIL){
|
||||
sendEmail(entry);
|
||||
System.out.println("Sending an e-mail notification");
|
||||
// sendEmail(entry);
|
||||
} else if (notificationMethod == NotificationMethod.PUSH_NOTIFICATION) {
|
||||
pushNotification(entry);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user