eu.numberfour.n4js.external.ProjectStateChangeListener.java Source code

Java tutorial

Introduction

Here is the source code for eu.numberfour.n4js.external.ProjectStateChangeListener.java

Source

/**
 * Copyright (c) 2016 NumberFour AG.
 * 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:
 *   NumberFour AG - Initial API and implementation
 */
package eu.numberfour.n4js.external;

import static com.google.common.collect.Sets.newLinkedHashSet;
import static org.eclipse.core.resources.IResourceDelta.ADDED;
import static org.eclipse.core.resources.IResourceDelta.CHANGED;
import static org.eclipse.core.resources.IResourceDelta.OPEN;
import static org.eclipse.core.resources.IResourceDelta.REMOVED;

import java.util.Collection;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.CoreException;

import com.google.common.collect.Iterables;
import com.google.inject.Inject;

/**
 * Resource change listener implementation for listening project open/close event and running the
 * {@link ExternalLibraryBuilderHelper external library build helper} according to the changes. Also got notified if
 * new workspace project is being created or an existing, accessible project is being deleted.
 */
public class ProjectStateChangeListener implements IResourceChangeListener {

    private static final Logger LOGGER = Logger.getLogger(ProjectStateChangeListener.class);

    @Inject
    private ExternalLibraryWorkspace externalLibraryWorkspace;

    @Inject
    private ExternalLibraryBuildJobProvider buildJobProvider;

    @Override
    public void resourceChanged(final IResourceChangeEvent event) {

        if (null == event || null == event.getDelta()) {
            return;
        }

        final Collection<IProject> toClean = newLinkedHashSet();
        final Collection<IProject> toBuild = newLinkedHashSet();

        try {
            event.getDelta().accept(delta -> {

                final IResource resource = delta.getResource();
                if (resource instanceof IProject) {

                    final IProject project = (IProject) resource;
                    final IProject externalProject = externalLibraryWorkspace.getProject(project.getName());
                    if (null != externalProject && externalProject.exists()) {

                        if (CHANGED == delta.getKind() && (delta.getFlags() & OPEN) != 0) {

                            // Workspace project close/open
                            if (project.isOpen()) {
                                toClean.add(externalProject);
                            } else {
                                toBuild.add(externalProject);
                            }

                        } else if (REMOVED == delta.getKind()) {

                            // Workspace project deletion
                            toBuild.add(externalProject);

                        } else if (ADDED == delta.getKind()) {

                            // Workspace project creation
                            toClean.add(externalProject);

                        }
                    }
                }

                return true;
            });

            if (!toClean.isEmpty() || !toBuild.isEmpty()) {
                LOGGER.info("Received project open/close change.");
                LOGGER.info("Opened projects: " + Iterables.toString(toClean));
                LOGGER.info("Closed projects: " + Iterables.toString(toBuild));

                buildJobProvider.createBuildJob(toBuild, toClean).schedule();
            }

        } catch (final CoreException e) {
            LOGGER.error("Error while visiting resource change event.", e);
        }
    }

}