org.eclipse.scada.da.ui.connection.views.FolderObserver.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.scada.da.ui.connection.views.FolderObserver.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2013 TH4 SYSTEMS GmbH 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:
 *     TH4 SYSTEMS GmbH - initial API and implementation
 *******************************************************************************/
package org.eclipse.scada.da.ui.connection.views;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IDisposeListener;
import org.eclipse.core.databinding.observable.IStaleListener;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
import org.eclipse.core.databinding.observable.set.WritableSet;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.scada.da.client.FolderListener;
import org.eclipse.scada.da.core.Location;
import org.eclipse.scada.da.core.browser.Entry;
import org.eclipse.scada.da.ui.connection.internal.FolderEntryWrapper;
import org.eclipse.swt.widgets.Display;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class FolderObserver implements FolderListener, IObservableSet {

    private final static Logger logger = LoggerFactory.getLogger(FolderObserver.class);

    private final Map<String, FolderEntryWrapper> entries = new HashMap<String, FolderEntryWrapper>();

    private FolderEntryWrapper parent;

    protected WritableSet data;

    public FolderObserver() {
        this.data = new WritableSet(SWTObservables.getRealm(Display.getDefault()));
    }

    protected void setFolderManager(final FolderEntryWrapper parent) {
        if (this.parent != null) {
            this.parent.getFolderManager().removeFolderListener(this, this.parent.getLocation());
        }

        this.parent = parent;

        if (parent == null) {
            this.data.clear();
        } else {
            parent.getFolderManager().addFolderListener(this, parent.getLocation());
        }
    }

    @Override
    public synchronized void dispose() {
        logger.debug("Disposed");

        if (this.parent != null) {
            this.parent.getFolderManager().removeFolderListener(this, this.parent.getLocation());
        }
        this.data.dispose();
    }

    @Override
    public synchronized void folderChanged(final Collection<Entry> added, final Collection<String> removed,
            final boolean full) {
        if (this.data.isDisposed()) {
            logger.debug("Folder already disposed");
            return;
        }

        this.data.getRealm().asyncExec(new Runnable() {

            @Override
            public void run() {
                handleChange(added, removed, full);
            }
        });
    }

    private synchronized void handleChange(final Collection<Entry> added, final Collection<String> removed,
            final boolean full) {
        if (this.data.isDisposed()) {
            logger.debug("Folder already disposed");
            return;
        }

        this.data.setStale(true);

        try {
            if (full) {
                this.data.clear();
            }

            if (removed != null) {
                for (final String name : removed) {
                    final FolderEntryWrapper entry = this.entries.remove(name);
                    if (entry != null) {
                        this.data.remove(entry);
                    }
                }
            }
            if (added != null) {
                for (final Entry entry : added) {
                    final FolderEntryWrapper newEntry;
                    newEntry = new FolderEntryWrapper(this.parent, entry,
                            new Location(this.parent.getLocation(), entry.getName()));

                    final FolderEntryWrapper oldEntry = this.entries.put(entry.getName(), newEntry);
                    if (oldEntry != null) {
                        this.data.remove(oldEntry);
                    }
                    this.data.add(newEntry);
                }
            }
        } finally {
            this.data.setStale(false);
        }
    }

    @Override
    public void addChangeListener(final IChangeListener listener) {
        this.data.addChangeListener(listener);
    }

    @Override
    public void removeChangeListener(final IChangeListener listener) {
        this.data.removeChangeListener(listener);
    }

    @Override
    public void addStaleListener(final IStaleListener listener) {
        this.data.addStaleListener(listener);
    }

    @Override
    public void removeStaleListener(final IStaleListener listener) {
        this.data.removeStaleListener(listener);
    }

    @Override
    public void addDisposeListener(final IDisposeListener listener) {
        this.data.addDisposeListener(listener);
    }

    @Override
    public void removeDisposeListener(final IDisposeListener listener) {
        this.data.removeDisposeListener(listener);
    }

    @Override
    public void addSetChangeListener(final ISetChangeListener listener) {
        this.data.addSetChangeListener(listener);
    }

    @Override
    public void removeSetChangeListener(final ISetChangeListener listener) {
        this.data.removeSetChangeListener(listener);
    }

    @Override
    public boolean isDisposed() {
        return this.data.isDisposed();
    }

    @Override
    public boolean contains(final Object o) {
        return this.data.contains(o);
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean containsAll(final Collection c) {
        return this.data.containsAll(c);
    }

    @Override
    public boolean isEmpty() {
        return this.data.isEmpty();
    }

    @SuppressWarnings("rawtypes")
    @Override
    public Iterator iterator() {
        return this.data.iterator();
    }

    @Override
    public boolean add(final Object o) {
        return this.data.add(o);
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean addAll(final Collection c) {
        return this.data.addAll(c);
    }

    @Override
    public int size() {
        return this.data.size();
    }

    @Override
    public Object[] toArray() {
        return this.data.toArray();
    }

    @Override
    public Object[] toArray(final Object[] a) {
        return this.data.toArray(a);
    }

    @Override
    public boolean remove(final Object o) {
        return this.data.remove(o);
    }

    @Override
    public String toString() {
        return this.data.toString();
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean removeAll(final Collection c) {
        return this.data.removeAll(c);
    }

    @Override
    public Realm getRealm() {
        return this.data.getRealm();
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean retainAll(final Collection c) {
        return this.data.retainAll(c);
    }

    @Override
    public boolean isStale() {
        return this.data.isStale();
    }

    public void setStale(final boolean stale) {
        this.data.setStale(stale);
    }

    @Override
    public void clear() {
        this.data.clear();
    }

    @Override
    public Object getElementType() {
        return this.data.getElementType();
    }

}