🎨 Replace list notification with Kotlin version
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 17 Nov 2019 20:34:41 +0000 (21:34 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sun, 17 Nov 2019 20:34:41 +0000 (21:34 +0100)
src/main/java/net/pterodactylus/sone/notify/ListNotification.java [deleted file]
src/main/kotlin/net/pterodactylus/sone/notify/ListNotification.kt [new file with mode: 0644]

diff --git a/src/main/java/net/pterodactylus/sone/notify/ListNotification.java b/src/main/java/net/pterodactylus/sone/notify/ListNotification.java
deleted file mode 100644 (file)
index 0c9e504..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Sone - ListNotification.java - Copyright Â© 2010–2019 David Roden
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package net.pterodactylus.sone.notify;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import net.pterodactylus.util.notify.TemplateNotification;
-import net.pterodactylus.util.template.Template;
-
-/**
- * Notification that maintains a list of new elements.
- *
- * @param <T>
- *            The type of the items
- */
-public class ListNotification<T> extends TemplateNotification {
-
-       /** The key under which to store the elements in the template. */
-       private final String key;
-
-       /** The list of new elements. */
-       private final List<T> elements = new CopyOnWriteArrayList<>();
-
-       /**
-        * Creates a new list notification.
-        *
-        * @param id
-        *            The ID of the notification
-        * @param key
-        *            The key under which to store the elements in the template
-        * @param template
-        *            The template to render
-        */
-       public ListNotification(String id, String key, Template template) {
-               this(id, key, template, true);
-       }
-
-       /**
-        * Creates a new list notification.
-        *
-        * @param id
-        *            The ID of the notification
-        * @param key
-        *            The key under which to store the elements in the template
-        * @param template
-        *            The template to render
-        * @param dismissable
-        *            {@code true} if this notification should be dismissable by the
-        *            user, {@code false} otherwise
-        */
-       public ListNotification(String id, String key, Template template, boolean dismissable) {
-               super(id, System.currentTimeMillis(), System.currentTimeMillis(), dismissable, template);
-               this.key = key;
-               template.getInitialContext().set(key, elements);
-       }
-
-       /**
-        * Creates a new list notification that copies its ID and the template from
-        * the given list notification.
-        *
-        * @param listNotification
-        *            The list notification to copy
-        */
-       public ListNotification(ListNotification<T> listNotification) {
-               super(listNotification.getId(), listNotification.getCreatedTime(), listNotification.getLastUpdatedTime(), listNotification.isDismissable(), new Template());
-               this.key = listNotification.key;
-               getTemplate().add(listNotification.getTemplate());
-               getTemplate().getInitialContext().set(key, elements);
-       }
-
-       //
-       // ACTIONS
-       //
-
-       /**
-        * Returns the current list of elements.
-        *
-        * @return The current list of elements
-        */
-       public List<T> getElements() {
-               return new ArrayList<>(elements);
-       }
-
-       /**
-        * Sets the elements to show in this notification. This method will not call
-        * {@link #touch()}.
-        *
-        * @param elements
-        *            The elements to show
-        */
-       public void setElements(Collection<? extends T> elements) {
-               this.elements.clear();
-               this.elements.addAll(elements);
-               touch();
-       }
-
-       /**
-        * Returns whether there are any new elements.
-        *
-        * @return {@code true} if there are no new elements, {@code false} if there
-        *         are new elements
-        */
-       public boolean isEmpty() {
-               return elements.isEmpty();
-       }
-
-       /**
-        * Adds a discovered element.
-        *
-        * @param element
-        *            The new element
-        */
-       public void add(T element) {
-               if (!elements.contains(element)) {
-                       elements.add(element);
-                       touch();
-               }
-       }
-
-       /**
-        * Removes the given element from the list of new elements.
-        *
-        * @param element
-        *            The element to remove
-        */
-       public void remove(T element) {
-               while (elements.remove(element)) {
-                       /* do nothing, just remove all instances of the element. */
-               }
-               if (elements.isEmpty()) {
-                       dismiss();
-               }
-               touch();
-       }
-
-       //
-       // ABSTRACTNOTIFICATION METHODS
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public void dismiss() {
-               super.dismiss();
-               elements.clear();
-       }
-
-       //
-       // OBJECT METHODS
-       //
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public int hashCode() {
-               int hashCode = super.hashCode();
-               for (T element : elements) {
-                       hashCode ^= element.hashCode();
-               }
-               return hashCode;
-       }
-
-       /**
-        * {@inheritDoc}
-        */
-       @Override
-       public boolean equals(Object object) {
-               if (!(object instanceof ListNotification)) {
-                       return false;
-               }
-               ListNotification<?> listNotification = (ListNotification<?>) object;
-               if (!super.equals(listNotification)) {
-                       return false;
-               }
-               if (!key.equals(listNotification.key)) {
-                       return false;
-               }
-               return elements.equals(listNotification.elements);
-       }
-
-}
diff --git a/src/main/kotlin/net/pterodactylus/sone/notify/ListNotification.kt b/src/main/kotlin/net/pterodactylus/sone/notify/ListNotification.kt
new file mode 100644 (file)
index 0000000..dccc430
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Sone - ListNotification.java - Copyright Â© 2010–2019 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.notify
+
+import net.pterodactylus.util.notify.*
+import net.pterodactylus.util.template.*
+import java.lang.System.*
+import java.util.concurrent.*
+
+/**
+ * Notification that maintains a list of elements.
+ *
+ * @param <T>
+ * The type of the items
+ */
+class ListNotification<T> : TemplateNotification {
+
+       private val key: String
+       private val realElements = CopyOnWriteArrayList<T>()
+
+       val elements: List<T> get() = realElements.toList()
+
+       val isEmpty
+               get() = elements.isEmpty()
+
+       @JvmOverloads
+       constructor(id: String, key: String, template: Template, dismissable: Boolean = true) : super(id, currentTimeMillis(), currentTimeMillis(), dismissable, template) {
+               this.key = key
+               template.initialContext.set(key, elements)
+       }
+
+       constructor(listNotification: ListNotification<T>) : super(listNotification.id, listNotification.createdTime, listNotification.lastUpdatedTime, listNotification.isDismissable, Template()) {
+               this.key = listNotification.key
+               template.add(listNotification.template)
+               template.initialContext.set(key, elements)
+       }
+
+       fun setElements(elements: Collection<T>) {
+               realElements.clear()
+               realElements.addAll(elements)
+               touch()
+       }
+
+       fun add(element: T) {
+               if (element !in realElements) {
+                       realElements.add(element)
+                       touch()
+               }
+       }
+
+       fun remove(element: T) {
+               while (realElements.remove(element)) {
+                       /* do nothing, just remove all instances of the element. */
+               }
+               if (realElements.isEmpty()) {
+                       dismiss()
+               }
+               touch()
+       }
+
+       override fun dismiss() {
+               super.dismiss()
+               realElements.clear()
+       }
+
+       override fun hashCode() =
+                       realElements.fold(super.hashCode()) { hash, element -> hash xor element.hashCode() }
+
+       override fun equals(other: Any?): Boolean {
+               if (other !is ListNotification<*>) {
+                       return false
+               }
+               val listNotification = other as ListNotification<*>?
+               if (!super.equals(listNotification)) {
+                       return false
+               }
+               return (key == listNotification.key) && (realElements == listNotification.realElements)
+       }
+
+}