org.eclipse.reqcycle.traceability.table.model.TableController.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.reqcycle.traceability.table.model.TableController.java

Source

/*******************************************************************************
 * Copyright (c) 2012 Original authors 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:
 *     Original authors and others - initial API and implementation
 ******************************************************************************/
package org.eclipse.reqcycle.traceability.table.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.Callable;

import javax.inject.Inject;
import javax.inject.Named;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.reqcycle.traceability.engine.ITraceabilityEngine;
import org.eclipse.reqcycle.traceability.engine.ITraceabilityEngine.DIRECTION;
import org.eclipse.reqcycle.traceability.engine.Request;
import org.eclipse.reqcycle.traceability.engine.Request.DEPTH;
import org.eclipse.reqcycle.traceability.exceptions.EngineException;
import org.eclipse.reqcycle.traceability.model.Link;
import org.eclipse.reqcycle.traceability.model.Pair;
import org.eclipse.reqcycle.traceability.model.scopes.CompositeScope;
import org.eclipse.reqcycle.traceability.model.scopes.Scopes;
import org.eclipse.reqcycle.traceability.storage.IStorageProvider;
import org.eclipse.reqcycle.traceability.storage.ITraceabilityStorage;
import org.eclipse.reqcycle.traceability.table.providers.TraceabilityLazyContentProvider;
import org.eclipse.reqcycle.traceability.types.scopes.ConfigurationScope;
import org.eclipse.reqcycle.uri.model.Reachable;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;

public class TableController {

    private static final String RDF_FILE = "./.traceability.rdf"; //$NON-NLS-1$

    @Inject
    @Named("RDF")
    protected IStorageProvider provider;

    @Inject
    protected ITraceabilityEngine engine;

    protected TableViewer viewer;

    protected Callable<Iterable<?>> callable;

    public TableController(TableViewer viewer) {
        this.viewer = viewer;
    }

    public void displayAllLinks() {
        callable = new Callable<Iterable<?>>() {

            @Override
            public Iterable<?> call() throws Exception {
                return getLinksFromEngine();
            }
        };
        refreshViewerData();
    }

    public void displayExplicitLinks(final IProject project) {
        callable = new Callable<Iterable<?>>() {

            @Override
            public Iterable<?> call() throws Exception {
                return getLinksFromProject(project);
            }
        };
        refreshViewerData();
    }

    protected Iterable<Link> getLinksFromEngine() {
        return new Iterable<Link>() {

            @Override
            public Iterator<Link> iterator() {
                Request request = new Request();
                CompositeScope scope = new CompositeScope();
                scope.add(Scopes.getWorkspaceScope());
                scope.add(new ConfigurationScope());
                request.setScope(scope);
                request.setDepth(DEPTH.INFINITE);
                try {
                    Iterator<Pair<Link, Reachable>> traceability = engine.getTraceability(request);
                    return Iterators.transform(traceability, new Function<Pair<Link, Reachable>, Link>() {

                        @Override
                        public Link apply(Pair<Link, Reachable> arg0) {
                            return arg0.getFirst();
                        }
                    });
                } catch (EngineException e) {
                }
                return new ArrayList<Link>().iterator();
            }
        };
    }

    protected Iterable<Link> getLinksFromProject(final IProject project) {
        IFile file = project.getFile(new Path(RDF_FILE));
        if (file != null && file.exists()) {
            // get the storage for the file path
            String uri = file.getLocationURI().getPath();
            ITraceabilityStorage storage = provider.getStorage(uri);
            Iterable<Pair<Link, Reachable>> allTraceabilityLinks = storage.getAllTraceability(DIRECTION.DOWNWARD);

            return Iterables.transform(allTraceabilityLinks, new Function<Pair<Link, Reachable>, Link>() {

                @Override
                public Link apply(Pair<Link, Reachable> arg0) {
                    return new TransverseLink(arg0.getFirst(), project);
                }
            });
        }
        return Lists.newArrayList();
    }

    public void deleteTraceabilityLinks(Iterator<TransverseLink> links) {
        ITraceabilityStorage storage = null;
        IProject project = null;
        try {
            while (links.hasNext()) {
                TransverseLink link = links.next();
                if (storage == null) {
                    project = link.getProject();
                    storage = getStorage(project, provider);
                    storage.startTransaction();
                }
                Reachable source = Iterables.get(link.getSources(), 0);
                Reachable target = Iterables.get(link.getTargets(), 0);
                if (storage != null)
                    storage.removeUpwardRelationShip(link.getKind(), null, target, source);
            }
            if (storage != null) {
                storage.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
            storage.rollback();
        } finally {
            storage.save();
            refreshViewerData();
            IFile file = project.getFile(new Path(RDF_FILE));
            try {
                file.refreshLocal(0, new NullProgressMonitor());
            } catch (CoreException e) {
                //DO NOTHING
            }
        }
    }

    protected static ITraceabilityStorage getStorage(IProject project, IStorageProvider provider) {
        IFile file = project.getFile(new Path(RDF_FILE));
        if (file != null && file.exists()) {
            String uri = file.getLocationURI().getPath();
            return provider.getStorage(uri);
        }
        return null;
    }

    /**
     * Refreshes the viewer's data.
     */
    public void refreshViewerData() {
        Predicate<Object> filter = new Predicate<Object>() {

            @Override
            public boolean apply(Object arg0) {
                ViewerFilter[] filters = TableController.this.viewer.getFilters();
                for (int i = 0; i < filters.length; i++) {
                    ViewerFilter filter = filters[i];
                    if (!filter.select(viewer, null, arg0)) {
                        return false;
                    }
                }
                return true;
            }
        };
        Iterable<?> input;
        try {
            input = callable.call();
            Iterable<?> filtered = Iterables.filter(input, filter);
            viewer.setItemCount(Iterables.size(filtered));
            viewer.setInput(filtered);
            viewer.refresh();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void refreshViewerVisuals() {
        TraceabilityLazyContentProvider<?> contentProvider = (TraceabilityLazyContentProvider<?>) viewer
                .getContentProvider();
        viewer.setItemCount(Iterables.size((Iterable<?>) viewer.getInput()));
        contentProvider.clearCache();
        viewer.refresh();
    }

}