summaryrefslogtreecommitdiff
path: root/graphs/java/observer
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/java/observer')
-rw-r--r--graphs/java/observer/.gitignore38
-rw-r--r--graphs/java/observer/pom.xml133
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java21
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java55
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java15
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java55
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java11
7 files changed, 328 insertions, 0 deletions
diff --git a/graphs/java/observer/.gitignore b/graphs/java/observer/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/graphs/java/observer/.gitignore
@@ -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 \ No newline at end of file
diff --git a/graphs/java/observer/pom.xml b/graphs/java/observer/pom.xml
new file mode 100644
index 0000000..5755011
--- /dev/null
+++ b/graphs/java/observer/pom.xml
@@ -0,0 +1,133 @@
+<?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>fr.epita.assistants</groupId>
+ <artifactId>observer</artifactId>
+ <version>1.0</version>
+
+ <properties>
+ <versions.java>21</versions.java>
+ <versions.junit>5.9.1</versions.junit>
+ <versions.maven-compiler-plugin>3.13.0</versions.maven-compiler-plugin>
+ <versions.maven-surefire-plugin>3.5.0</versions.maven-surefire-plugin>
+ <versions.maven-jar-plugin>3.1.1</versions.maven-jar-plugin>
+ <versions.maven-install-plugin>3.1.0</versions.maven-install-plugin>
+
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+ <surefire.reportsDirectory>${project.build.directory}/surefire-reports</surefire.reportsDirectory>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter</artifactId>
+ <version>${versions.junit}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.surefire</groupId>
+ <artifactId>surefire-junit-platform</artifactId>
+ <version>${versions.maven-surefire-plugin}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-compat</artifactId>
+ <version>3.9.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>3.9.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-monitor</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>3.0.24</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-filtering</artifactId>
+ <version>3.3.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-interpolation</artifactId>
+ <version>1.13</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-profile</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact-manager</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-registry</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-repository-metadata</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>classworlds</groupId>
+ <artifactId>classworlds</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-commons</artifactId>
+ <version>1.9.3</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${versions.maven-compiler-plugin}</version>
+ <configuration>
+ <source>${versions.java}</source>
+ <target>${versions.java}</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>${versions.maven-install-plugin}</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${versions.maven-surefire-plugin}</version>
+ <configuration>
+ <reportsDirectory>${surefire.reportsDirectory}</reportsDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java
new file mode 100644
index 0000000..87c5538
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java
@@ -0,0 +1,21 @@
+package fr.epita.assistants.observer;
+
+import java.util.Set;
+
+public class Lifeguard implements Observable.Observer<Swimmer> {
+ String name;
+
+ public Lifeguard(String name) {
+ this.name = name;
+ System.out.println(name + " begins to keep an eye on the swimmers.");
+ }
+
+ @Override
+ public void onEvent(Swimmer event) {
+ if (event.getStatus() == SwimmerStatus.TOO_FAR)
+ System.out.println(name + ": " + event.getName() + "! You are too far, come back!");
+ else if (event.getStatus() == SwimmerStatus.DROWNING) {
+ System.out.println(name + ": I will save you " + event.getName() + "!");
+ }
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java
new file mode 100644
index 0000000..1739739
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java
@@ -0,0 +1,55 @@
+package fr.epita.assistants.observer;
+
+import java.util.Set;
+
+/**
+ * Observer interface.
+ *
+ * @param <EVENT_T> Type of observed events
+ */
+public interface Observable<EVENT_T> {
+
+ /**
+ * Get all registered observers.
+ *
+ * @return The set of observers
+ */
+ Set<Observer<EVENT_T>> getObservers();
+
+ /**
+ * Register observers.
+ *
+ * @param observers Observers to register
+ */
+ void register(final Observer<EVENT_T>... observers);
+
+ /**
+ * Unregister the given observer.
+ *
+ * @param observer The observer to deactivate
+ */
+ void unregister(final Observer<EVENT_T> observer);
+
+ /**
+ * Notify all registered observers of the given event.
+ *
+ * @param event The event to notify observers with.
+ */
+ void fire(final EVENT_T event);
+
+ /**
+ * Sub interface for observers.
+ *
+ * @param <EVENT_T> The type of observed events
+ */
+ @FunctionalInterface
+ interface Observer<EVENT_T> {
+
+ /**
+ * Notification callback.
+ *
+ * @param event The event being sent
+ */
+ void onEvent(final EVENT_T event);
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java
new file mode 100644
index 0000000..81247ac
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java
@@ -0,0 +1,15 @@
+package fr.epita.assistants.observer;
+
+public class Person implements Observable.Observer<Swimmer> {
+ String name;
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void onEvent(Swimmer event) {
+ if (event.getStatus() == SwimmerStatus.WAVING)
+ System.out.println(name + ": Waves back at " + event.getName() + ".");
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java
new file mode 100644
index 0000000..2ce803a
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java
@@ -0,0 +1,55 @@
+package fr.epita.assistants.observer;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Swimmer implements Observable<Swimmer> {
+ Set<Observer<Swimmer>> observers = new HashSet<>();
+ String name;
+ SwimmerStatus status = SwimmerStatus.OK;
+
+ public Swimmer(String name) {
+ this.name = name;
+ System.out.println(this.name + " goes into the sea.");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public SwimmerStatus getStatus() {
+ return status;
+ }
+
+ @Override
+ public Set<Observer<Swimmer>> getObservers() {
+ return observers;
+ }
+
+ public void setStatus(SwimmerStatus status) {
+ this.status = status;
+ if (status == SwimmerStatus.DROWNING) {
+ System.out.println(name + ": I'm drowning, help!!");
+ }
+ else if (status == SwimmerStatus.WAVING)
+ System.out.println(name + ": Waves towards the shore.");
+ fire(this);
+ }
+
+ @Override
+ public void register(Observer<Swimmer>... observers) {
+ this.observers.addAll(Arrays.asList(observers));
+ }
+
+ @Override
+ public void unregister(Observer<Swimmer> observer) {
+ this.observers.remove(observer);
+ }
+
+ @Override
+ public void fire(Swimmer event) {
+ for (Observer<Swimmer> o : this.observers)
+ o.onEvent(event);
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java
new file mode 100644
index 0000000..71856c6
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java
@@ -0,0 +1,11 @@
+package fr.epita.assistants.observer;
+
+/**
+ * Status of a swimmer.
+ */
+public enum SwimmerStatus {
+ OK,
+ DROWNING,
+ TOO_FAR,
+ WAVING
+}