X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fnotify%2FListNotification.java;h=f1343adb006cbb7e09447ed10fbdff7b74586700;hp=64c2ecbac0240a19f0bff32d1ef431e5fd7bf612;hb=a47643aed43d118ca68044f95451bb5374cdb332;hpb=2889127f645d17c4ae0a650e935d1481d9cbd727 diff --git a/src/main/java/net/pterodactylus/sone/notify/ListNotification.java b/src/main/java/net/pterodactylus/sone/notify/ListNotification.java index 64c2ecb..f1343ad 100644 --- a/src/main/java/net/pterodactylus/sone/notify/ListNotification.java +++ b/src/main/java/net/pterodactylus/sone/notify/ListNotification.java @@ -1,5 +1,5 @@ /* - * Sone - ListNotification.java - Copyright © 2010 David Roden + * Sone - ListNotification.java - Copyright © 2010–2012 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 @@ -18,8 +18,9 @@ package net.pterodactylus.sone.notify; import java.util.ArrayList; -import java.util.Collections; +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; @@ -33,8 +34,11 @@ import net.pterodactylus.util.template.Template; */ 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 = Collections.synchronizedList(new ArrayList()); + private final List elements = new CopyOnWriteArrayList(); /** * Creates a new list notification. @@ -47,8 +51,40 @@ public class ListNotification extends TemplateNotification { * The template to render */ public ListNotification(String id, String key, Template template) { - super(id, template); - template.set(key, elements); + 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); } // @@ -56,6 +92,28 @@ public class ListNotification extends TemplateNotification { // /** + * 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 @@ -84,6 +142,9 @@ public class ListNotification extends TemplateNotification { */ public void remove(T element) { elements.remove(element); + if (elements.isEmpty()) { + dismiss(); + } touch(); } @@ -100,4 +161,46 @@ public class ListNotification extends TemplateNotification { 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; + } + if (elements.size() != listNotification.elements.size()) { + return false; + } + for (int index = 0; index < elements.size(); ++index) { + if (!elements.get(index).equals(listNotification.elements.get(index))) { + return false; + } + } + return true; + } + }