com.svcdelivery.liquibase.eclipse.internal.ui.ChangeSetTable.java Source code

Java tutorial

Introduction

Here is the source code for com.svcdelivery.liquibase.eclipse.internal.ui.ChangeSetTable.java

Source

/**
 * Copyright 2012 Nick Wilson
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.svcdelivery.liquibase.eclipse.internal.ui;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TableColumn;

import com.svcdelivery.liquibase.eclipse.api.ChangeSetItem;

/**
 * @author nick
 */
public class ChangeSetTable extends Composite implements ChangeLogListener {

    /**
     * The table viewer.
     */
    private TableViewer tv;

    /**
     * A list of listeners for completion events.
     */
    private List<CompleteListener> listeners;

    /**
     * Tree items.
     */
    private List<ChangeSetTreeItem> items;

    /**
     * Selected item.
     */
    private ChangeSetTreeItem selected;

    /**
     * True if all entries complete.
     */
    private boolean complete;

    /**
     * The change log cache.
     */
    private ChangeLogCache cache;

    /**
     * @param parent
     *            The parent composite.
     * @param style
     *            The composite style.
     */
    public ChangeSetTable(final Composite parent, final int style) {
        super(parent, style);
        setLayout(new FillLayout());
        listeners = new ArrayList<CompleteListener>();
        tv = new TableViewer(this);
        final TableViewerColumn changeSetCV = new TableViewerColumn(tv, SWT.NONE);
        final TableColumn changeSetC = changeSetCV.getColumn();
        changeSetC.setText("Change Set");
        changeSetC.setWidth(250);
        final TableViewerColumn changeDateCV = new TableViewerColumn(tv, SWT.NONE);
        final TableColumn changeDateC = changeDateCV.getColumn();
        changeDateC.setText("Date");
        changeDateC.setWidth(150);
        final TableViewerColumn changeFileCV = new TableViewerColumn(tv, SWT.NONE);
        final TableColumn changeFileC = changeFileCV.getColumn();
        changeFileC.setText("File");
        changeFileC.setWidth(250);

        final TableViewerColumn statusCV = new TableViewerColumn(tv, SWT.NONE);
        final TableColumn statusC = statusCV.getColumn();
        statusC.setText("Status");
        statusC.setWidth(100);
        tv.setContentProvider(new CollectionContentProvider());
        tv.setLabelProvider(new ChangeSetLabelProvider());
        cache = Activator.getDefault().getChangeLogCache();
        cache.addChangeLogListener(this);
    }

    @Override
    public void dispose() {
        cache.removeChangeLogListener(this);
        super.dispose();
    }

    /**
     * @param input
     *            The input object.
     */
    public final void setInput(final ChangeSetTreeItem input) {
        selected = input;
        LiquibaseDataSourceScriptLoader loader = new LiquibaseDataSourceScriptLoader() {

            @Override
            public void complete(final List<ChangeSetItem> ranChangeSets) {
                ChangeSetItem toRollback = selected.getChangeSet();
                int index = ranChangeSets.indexOf(toRollback);
                if (index != -1) {
                    final List<ChangeSetItem> rollbackList = ranChangeSets.subList(index, ranChangeSets.size());
                    items = new ArrayList<ChangeSetTreeItem>(rollbackList.size());
                    for (ChangeSetItem set : rollbackList) {
                        ChangeSetTreeItem item = new ChangeSetTreeItem();
                        item.setChangeSet(set);
                        String filename = set.getChangeLog();
                        System.out.println("Filename=" + filename);
                        System.out.println("cache=" + cache.toString());
                        // FIXME convert to cache name?
                        IFile file = cache.getFile(filename);
                        if (file != null) {
                            item.setChangeLogFile(file);
                        }
                        item.setProfile(selected.getProfile());
                        items.add(item);
                    }
                    Display.getDefault().syncExec(new Runnable() {

                        @Override
                        public void run() {
                            tv.setInput(items);
                        }
                    });
                    checkComplete();
                }
            }

        };
        loader.loadScripts(selected.getProfile());
    }

    /**
     * Checks if items are complete.
     */
    private void checkComplete() {
        boolean ok = true;
        for (ChangeSetTreeItem item : items) {
            if (item.getChangeLogFile() == null) {
                ok = false;
            }
        }
        complete = ok;
        notifyListeners();
    }

    /**
     * Notify listeners of complete state.
     */
    private void notifyListeners() {
        for (CompleteListener listener : listeners) {
            notifyListener(listener);
        }
    }

    /**
     * @param listener
     *            The listener to notify.
     */
    private void notifyListener(final CompleteListener listener) {
        listener.complete(complete, selected);
    }

    /**
     * @param listener
     *            the listener.
     */
    public final void addCompletelistener(final CompleteListener listener) {
        listeners.add(listener);
        notifyListener(listener);
    }

    public List<ChangeSetTreeItem> getRollbackList() {
        return items;
    }

    @Override
    public void changeLogUpdated(IFile file) {
        final Set<ChangeSetTreeItem> toUpdate = new HashSet<ChangeSetTreeItem>();
        for (ChangeSetTreeItem item : items) {
            ChangeSetItem set = item.getChangeSet();
            if (set != null) {
                String changelog = set.getChangeLog();
                IFile changelogFile = Activator.getDefault().getChangeLogCache().getFile(changelog);
                if (file.equals(changelogFile)) {
                    item.setChangeLogFile(file);
                    toUpdate.add(item);
                }
            }
        }
        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                tv.update(toUpdate.toArray(), null);
            }
        });
        checkComplete();
    }

    @Override
    public void changeLogRemoved(IFile file) {
        final Set<ChangeSetTreeItem> toUpdate = new HashSet<ChangeSetTreeItem>();
        for (ChangeSetTreeItem item : items) {
            if (file.equals(item.getChangeLogFile())) {
                item.setChangeLogFile(null);
                toUpdate.add(item);
            }
        }
        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                tv.update(toUpdate.toArray(), null);
            }
        });
        checkComplete();
    }

}