Initial commit
This commit is contained in:
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
7
.idea/encodings.xml
generated
Normal file
7
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
14
.idea/misc.xml
generated
Normal file
14
.idea/misc.xml
generated
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="22" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
25
pom.xml
Normal file
25
pom.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>cz.jzitnik</groupId>
|
||||
<artifactId>MeitSort</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>22</maven.compiler.source>
|
||||
<maven.compiler.target>22</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.sun.mail</groupId>
|
||||
<artifactId>jakarta.mail</artifactId>
|
||||
<version>2.0.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
33
src/main/java/cz/jzitnik/GlobalContext.java
Normal file
33
src/main/java/cz/jzitnik/GlobalContext.java
Normal file
@ -0,0 +1,33 @@
|
||||
package cz.jzitnik;
|
||||
|
||||
import cz.jzitnik.utils.mail.MailSender;
|
||||
import jakarta.mail.Message;
|
||||
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
public class GlobalContext {
|
||||
private final BlockingQueue<Message> blockingQueue = new LinkedBlockingQueue<>();
|
||||
private final MailSender mailSender;
|
||||
private boolean waitingForMessage = false;
|
||||
|
||||
public GlobalContext(MailSender mailSender) {
|
||||
this.mailSender = mailSender;
|
||||
}
|
||||
|
||||
public BlockingQueue<Message> getBlockingQueue() {
|
||||
return blockingQueue;
|
||||
}
|
||||
|
||||
public boolean isWaitingForMessage() {
|
||||
return waitingForMessage;
|
||||
}
|
||||
|
||||
public void setWaitingForMessage(boolean waitingForMessage) {
|
||||
this.waitingForMessage = waitingForMessage;
|
||||
}
|
||||
|
||||
public MailSender getMailSender() {
|
||||
return mailSender;
|
||||
}
|
||||
}
|
||||
56
src/main/java/cz/jzitnik/Main.java
Normal file
56
src/main/java/cz/jzitnik/Main.java
Normal file
@ -0,0 +1,56 @@
|
||||
package cz.jzitnik;
|
||||
|
||||
import cz.jzitnik.algs.BubbleSort;
|
||||
import cz.jzitnik.utils.SortingAlgorithm;
|
||||
import cz.jzitnik.utils.mail.MailContextPool;
|
||||
import cz.jzitnik.utils.mail.MailSender;
|
||||
import cz.jzitnik.utils.mail.read.MailReadHandler;
|
||||
import cz.jzitnik.utils.mail.read.MailReader;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.PasswordAuthentication;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
|
||||
public class Main {
|
||||
private static MailContextPool getMailContextPool() {
|
||||
Properties loginProps = new Properties();
|
||||
|
||||
loginProps.put("mail.smtp.auth", "true");
|
||||
loginProps.put("mail.smtp.starttls.enable", "true");
|
||||
loginProps.put("mail.smtp.host", "smtppro.zoho.eu");
|
||||
loginProps.put("mail.smtp.port", "587");
|
||||
|
||||
loginProps.put("mail.store.protocol", "imaps");
|
||||
loginProps.put("mail.imaps.host", "imappro.zoho.eu");
|
||||
loginProps.put("mail.imaps.port", "993");
|
||||
loginProps.put("mail.imaps.ssl.enable", "true");
|
||||
|
||||
return new MailContextPool(
|
||||
loginProps,
|
||||
new PasswordAuthentication("klindkubak@zohomail.eu", System.getenv("MEIT_PASSWORD"))
|
||||
);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws MessagingException, InterruptedException, IOException {
|
||||
MailContextPool mailContextPool = getMailContextPool();
|
||||
|
||||
GlobalContext globalContext = new GlobalContext(
|
||||
new MailSender(mailContextPool)
|
||||
);
|
||||
|
||||
MailReader mailReader = new MailReader(mailContextPool, 1000, new MailReadHandler(globalContext));
|
||||
Thread thread = new Thread(mailReader);
|
||||
thread.start();
|
||||
|
||||
SortingAlgorithm sortingAlgorithm = new BubbleSort(globalContext, "klindkubak@zohomail.eu", "sefljulie@zohomail.eu");
|
||||
|
||||
int[] arr = {3, 2, 1};
|
||||
int[] newArr = sortingAlgorithm.sort(arr);
|
||||
|
||||
System.out.println(Arrays.toString(newArr));
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
}
|
||||
28
src/main/java/cz/jzitnik/algs/BubbleSort.java
Normal file
28
src/main/java/cz/jzitnik/algs/BubbleSort.java
Normal file
@ -0,0 +1,28 @@
|
||||
package cz.jzitnik.algs;
|
||||
|
||||
import cz.jzitnik.GlobalContext;
|
||||
import cz.jzitnik.utils.SortingAlgorithm;
|
||||
import jakarta.mail.MessagingException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class BubbleSort extends SortingAlgorithm {
|
||||
public BubbleSort(GlobalContext globalContext, String from, String recipient) {
|
||||
super(globalContext, from, recipient);
|
||||
}
|
||||
|
||||
public int[] sort(int[] arr) throws MessagingException, InterruptedException, IOException {
|
||||
int n = arr.length;
|
||||
for (int i = 0; i < n - 1; i++) {
|
||||
for (int j = 0; j < n - 1 - i; j++) {
|
||||
if (compare(arr[j], arr[j + 1]) == ResponseAnswer.FIRST) {
|
||||
int temp = arr[j];
|
||||
arr[j] = arr[j + 1];
|
||||
arr[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
96
src/main/java/cz/jzitnik/utils/SortingAlgorithm.java
Normal file
96
src/main/java/cz/jzitnik/utils/SortingAlgorithm.java
Normal file
@ -0,0 +1,96 @@
|
||||
package cz.jzitnik.utils;
|
||||
|
||||
import cz.jzitnik.GlobalContext;
|
||||
import cz.jzitnik.utils.mail.MailSender;
|
||||
import jakarta.mail.BodyPart;
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.Multipart;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
|
||||
import java.awt.geom.RectangularShape;
|
||||
import java.io.IOException;
|
||||
|
||||
public abstract class SortingAlgorithm {
|
||||
private final GlobalContext globalContext;
|
||||
private final String from;
|
||||
private final String recipient;
|
||||
|
||||
protected enum ResponseAnswer {
|
||||
FIRST,
|
||||
SECOND,
|
||||
SAME,
|
||||
}
|
||||
|
||||
public SortingAlgorithm(GlobalContext globalContext, String from, String recipient) {
|
||||
this.globalContext = globalContext;
|
||||
this.from = from;
|
||||
this.recipient = recipient;
|
||||
}
|
||||
|
||||
protected ResponseAnswer compare(int x, int y) throws MessagingException, InterruptedException, IOException {
|
||||
System.out.println("Sending email");
|
||||
MailSender mailSender = globalContext.getMailSender();
|
||||
|
||||
mailSender.sendMessage(
|
||||
new InternetAddress(from),
|
||||
InternetAddress.parse(recipient),
|
||||
"Porovnání dvou čísel",
|
||||
"Které číslo je větší? " + x + " nebo " + y + "? Pokud první odpovězte na email s textem PRVNI, pokud druhé tak DRUHE a pokud se rovnají odpovězte ROVNO."
|
||||
);
|
||||
|
||||
globalContext.setWaitingForMessage(true);
|
||||
|
||||
System.out.println("Waiting for response");
|
||||
|
||||
Message answer = globalContext.getBlockingQueue().take();
|
||||
globalContext.setWaitingForMessage(false);
|
||||
|
||||
String answ = getTextFromMessage(answer).trim();
|
||||
|
||||
if (answ.startsWith("PRVNI")) {
|
||||
return ResponseAnswer.FIRST;
|
||||
}
|
||||
|
||||
if (answ.startsWith("DRUHE")) {
|
||||
return ResponseAnswer.SECOND;
|
||||
}
|
||||
|
||||
if (answ.startsWith("ROVNO")) {
|
||||
return ResponseAnswer.SAME;
|
||||
}
|
||||
|
||||
return ResponseAnswer.FIRST;
|
||||
}
|
||||
|
||||
public abstract int[] sort(int[] arr) throws MessagingException, InterruptedException, IOException;
|
||||
|
||||
|
||||
private String getTextFromMessage(Message message) throws MessagingException, IOException {
|
||||
Object content = message.getContent();
|
||||
if (content instanceof String) {
|
||||
// Plain text email
|
||||
return (String) content;
|
||||
} else if (content instanceof Multipart) {
|
||||
Multipart multipart = (Multipart) content;
|
||||
return getTextFromMultipart(multipart);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private String getTextFromMultipart(Multipart multipart) throws MessagingException, IOException {
|
||||
for (int i = 0; i < multipart.getCount(); i++) {
|
||||
BodyPart part = multipart.getBodyPart(i);
|
||||
if (part.isMimeType("text/plain")) {
|
||||
return (String) part.getContent();
|
||||
} else if (part.getContent() instanceof Multipart) {
|
||||
// Nested multipart
|
||||
String result = getTextFromMultipart((Multipart) part.getContent());
|
||||
if (!result.isEmpty()) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
35
src/main/java/cz/jzitnik/utils/mail/MailContextPool.java
Normal file
35
src/main/java/cz/jzitnik/utils/mail/MailContextPool.java
Normal file
@ -0,0 +1,35 @@
|
||||
package cz.jzitnik.utils.mail;
|
||||
|
||||
import jakarta.mail.PasswordAuthentication;
|
||||
import jakarta.mail.Session;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public class MailContextPool {
|
||||
private final Session session;
|
||||
private final PasswordAuthentication passwordAuthentication;
|
||||
private final Properties props;
|
||||
|
||||
public MailContextPool(Properties properties, PasswordAuthentication passwordAuthentication) {
|
||||
session = Session.getInstance(properties,
|
||||
new jakarta.mail.Authenticator() {
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return passwordAuthentication;
|
||||
}
|
||||
});
|
||||
this.passwordAuthentication = passwordAuthentication;
|
||||
props = properties;
|
||||
}
|
||||
|
||||
public Session getSession() {
|
||||
return session;
|
||||
}
|
||||
|
||||
public PasswordAuthentication getPasswordAuthentication() {
|
||||
return passwordAuthentication;
|
||||
}
|
||||
|
||||
public Properties getProps() {
|
||||
return props;
|
||||
}
|
||||
}
|
||||
22
src/main/java/cz/jzitnik/utils/mail/MailSender.java
Normal file
22
src/main/java/cz/jzitnik/utils/mail/MailSender.java
Normal file
@ -0,0 +1,22 @@
|
||||
package cz.jzitnik.utils.mail;
|
||||
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.Transport;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
|
||||
public record MailSender(MailContextPool mailContextPool) {
|
||||
public void sendMessage(InternetAddress from, InternetAddress[] to, String subject, String text) throws MessagingException {
|
||||
Message message = new MimeMessage(mailContextPool.getSession());
|
||||
message.setFrom(from);
|
||||
message.setRecipients(
|
||||
Message.RecipientType.TO,
|
||||
to
|
||||
);
|
||||
message.setSubject(subject);
|
||||
message.setText(text);
|
||||
|
||||
Transport.send(message);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package cz.jzitnik.utils.mail.read;
|
||||
|
||||
import cz.jzitnik.GlobalContext;
|
||||
import jakarta.mail.Message;
|
||||
|
||||
public class MailReadHandler implements MailReader.OnNewEmailListener {
|
||||
private final GlobalContext globalContext;
|
||||
|
||||
public MailReadHandler(GlobalContext globalContext) {
|
||||
this.globalContext = globalContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewEmail(Message message) {
|
||||
if (!globalContext.isWaitingForMessage()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
globalContext.getBlockingQueue().put(message);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
77
src/main/java/cz/jzitnik/utils/mail/read/MailReader.java
Normal file
77
src/main/java/cz/jzitnik/utils/mail/read/MailReader.java
Normal file
@ -0,0 +1,77 @@
|
||||
package cz.jzitnik.utils.mail.read;
|
||||
|
||||
import cz.jzitnik.utils.mail.MailContextPool;
|
||||
import jakarta.mail.*;
|
||||
import java.util.*;
|
||||
|
||||
public class MailReader implements Runnable {
|
||||
|
||||
private final MailContextPool pool;
|
||||
private final String username;
|
||||
private final String password;
|
||||
private final long checkIntervalMs;
|
||||
private final OnNewEmailListener listener;
|
||||
|
||||
private int lastMessageCount = 0;
|
||||
|
||||
public interface OnNewEmailListener {
|
||||
void onNewEmail(Message message);
|
||||
}
|
||||
|
||||
public MailReader(MailContextPool mailContextPool, long checkIntervalMs, OnNewEmailListener listener) {
|
||||
this.pool = mailContextPool;
|
||||
this.username = mailContextPool.getPasswordAuthentication().getUserName();
|
||||
this.password = mailContextPool.getPasswordAuthentication().getPassword();
|
||||
this.checkIntervalMs = checkIntervalMs;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
Store store = null;
|
||||
Folder inbox = null;
|
||||
|
||||
try {
|
||||
store = pool.getSession().getStore("imaps");
|
||||
store.connect(pool.getProps().getProperty("mail.imaps.host"), username, password);
|
||||
|
||||
inbox = store.getFolder("INBOX");
|
||||
inbox.open(Folder.READ_ONLY);
|
||||
|
||||
System.out.println("[EmailChecker] Connected and monitoring inbox...");
|
||||
|
||||
while (true) {
|
||||
Message[] messages = inbox.getMessages();
|
||||
int messageCount = messages.length;
|
||||
|
||||
if (messageCount > lastMessageCount) {
|
||||
for (int i = lastMessageCount; i < messageCount; i++) {
|
||||
Message newMessage = messages[i];
|
||||
listener.onNewEmail(newMessage);
|
||||
}
|
||||
lastMessageCount = messageCount;
|
||||
}
|
||||
|
||||
Thread.sleep(checkIntervalMs);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
System.err.println("[EmailChecker] Error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
|
||||
// Wait before retrying connection
|
||||
try {
|
||||
Thread.sleep(30_000); // wait 30 seconds before reconnecting
|
||||
} catch (InterruptedException ignored) {
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
if (inbox != null && inbox.isOpen()) inbox.close(false);
|
||||
if (store != null && store.isConnected()) store.close();
|
||||
} catch (MessagingException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user