From 57beeb2a70c1c0f60c6a22d73e68815982e20d6d Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Sun, 17 Nov 2019 21:34:41 +0100 Subject: [PATCH] =?utf8?q?=F0=9F=8E=A8=20Replace=20list=20notification=20w?= =?utf8?q?ith=20Kotlin=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../sone/notify/ListNotification.java | 201 --------------------- .../pterodactylus/sone/notify/ListNotification.kt | 95 ++++++++++ 2 files changed, 95 insertions(+), 201 deletions(-) delete mode 100644 src/main/java/net/pterodactylus/sone/notify/ListNotification.java create mode 100644 src/main/kotlin/net/pterodactylus/sone/notify/ListNotification.kt 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 index 0c9e504..0000000 --- a/src/main/java/net/pterodactylus/sone/notify/ListNotification.java +++ /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 . - */ - -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 - * The type of the items - */ -public class ListNotification 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 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 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 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 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 index 0000000..dccc430 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/notify/ListNotification.kt @@ -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 . + */ + +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 + * The type of the items + */ +class ListNotification : TemplateNotification { + + private val key: String + private val realElements = CopyOnWriteArrayList() + + val elements: List 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) : 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) { + 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) + } + +} -- 2.7.4