/*
 * Copyright (c) 2007-2009, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 *    Victor Roldan Betancort - maintenance
 */
package org.eclipse.net4j.util.container;

import org.eclipse.net4j.util.event.INotifier;
import org.eclipse.net4j.util.io.IORuntimeException;

import java.util.Collection;

/**
 * Contains a number of elements and notifies about element addition and removal.
 * <p>
 * A container can fire the following events:
 * <ul>
 * <li> {@link IContainerEvent} after the addition and/or removal of elements.
 * </ul>
 *
 * @author Eike Stepper
 * @apiviz.landmark
 * @apiviz.composedOf {@link java.lang.Object} - - elements
 * @apiviz.uses {@link IContainerEvent} - - fires
 */
public interface IContainer<E> extends INotifier
{
  public boolean isEmpty();

  public E[] getElements();

  /**
   * A {@link IContainer container} with additional methods to add or remove elements.
   *
   * @author Eike Stepper
   * @since 2.0
   */
  public interface Modifiable<E> extends IContainer<E>
  {
    public boolean addElement(E element);

    public boolean addAllElements(Collection<E> elements);

    public boolean removeElement(E element);

    public boolean removeAllElements(Collection<E> elements);
  }

  /**
   * A {@link IContainer container} with additional methods to add or remove elements.
   *
   * @author Eike Stepper
   * @since 3.5
   */
  public interface Persistable<E> extends IContainer<E>
  {
    public Persistence<E> getPersistence();

    public void setPersistence(Persistence<E> persistence);

    public void load() throws IORuntimeException;

    public void save() throws IORuntimeException;
  }

  /**
   * @author Eike Stepper
   * @since 3.5
   */
  public interface Persistence<E>
  {
    public Collection<E> loadElements() throws IORuntimeException;

    public void saveElements(Collection<E> elements) throws IORuntimeException;
  }
}
