/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.runtime.web.vaadin.databinding.values;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.list.IListChangeListener;
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
import org.eclipse.core.databinding.observable.set.SetChangeEvent;

// TODO: Auto-generated Javadoc
/**
 * The Class SetToListAdapter.
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class SetToListAdapter extends WritableList implements
		IVaadinObservableList, IListChangeListener {

	/** The set. */
	private final IObservableSet set;
	
	/** The source. */
	private final Object source;

	/** The set listener. */
	private ISetChangeListener setListener = new ISetChangeListener() {
		public void handleSetChange(SetChangeEvent event) {
			List originalList = new ArrayList(wrappedList);
			for (Object addedElement : event.diff.getAdditions()) {
				if (!wrappedList.contains(addedElement)) {
					wrappedList.add(addedElement);
				}
			}
			for (Object removedElement : event.diff.getRemovals()) {
				wrappedList.remove(removedElement);
			}
			fireListChange(Diffs.computeListDiff(originalList, wrappedList));
		}
	};

	/**
	 * Instantiates a new sets the to list adapter.
	 *
	 * @param set
	 *            the set
	 * @param source
	 *            the source
	 */
	public SetToListAdapter(IObservableSet set, Object source) {
		super(set.getRealm(), new ArrayList(), set.getElementType());
		this.set = set;
		this.source = source;
		wrappedList.addAll(set);
		this.set.addSetChangeListener(setListener);
		this.addListChangeListener(this);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.core.databinding.observable.list.ObservableList#dispose()
	 */
	public synchronized void dispose() {
		super.dispose();

		this.removeListChangeListener(this);

		if (set != null && setListener != null) {
			set.removeSetChangeListener(setListener);
			setListener = null;
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.runtime.web.vaadin.databinding.values.IVaadinObservableList#getSource()
	 */
	@Override
	public Object getSource() {
		return source;
	}

	/**
	 * Observes changes of this instance of the list and transforms it to
	 * changes for the set. Set listeners are beeing detached during update.
	 *
	 * @param event
	 *            the event
	 */
	@Override
	public void handleListChange(ListChangeEvent event) {

		try {
			Set<Object> addons = new HashSet<Object>();
			Set<Object> removals = new HashSet<Object>();

			set.removeSetChangeListener(setListener);
			ListDiffEntry[] differences = event.diff.getDifferences();
			for (int i = 0; i < differences.length; i++) {
				ListDiffEntry entry = differences[i];
				Object element = entry.getElement();
				if (entry.isAddition()) {
					addons.add(element);
				} else {
					removals.add(element);
				}
			}

			// remove double entries
			addons.removeAll(removals);

			set.addAll(addons);
			set.removeAll(removals);
		} finally {
			set.addSetChangeListener(setListener);
		}
	}

}
