/*
- * Sone - ListNotification.java - Copyright © 2010 David Roden
+ * Sone - ListNotification.java - Copyright © 2010–2013 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
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;
*/
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 = Collections.synchronizedList(new ArrayList<T>());
+ private final List<T> elements = new CopyOnWriteArrayList<T>();
/**
* Creates a new list notification.
* 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<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);
}
//
//
/**
+ * Returns the current list of elements.
+ *
+ * @return The current list of elements
+ */
+ public List<T> getElements() {
+ return new ArrayList<T>(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
* The element to remove
*/
public void remove(T element) {
- elements.remove(element);
+ while (elements.remove(element)) {
+ /* do nothing, just remove all instances of the element. */
+ }
if (elements.isEmpty()) {
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;
+ }
+ 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;
+ }
+
}