Package org.objectstyle.wolips.jdt.classpath

Source Code of org.objectstyle.wolips.jdt.classpath.WOFrameworkResourceListener

package org.objectstyle.wolips.jdt.classpath;

import java.util.ArrayList;
import java.util.List;

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.resources.IResourceDelta;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.objectstyle.wolips.jdt.JdtPlugin;
import org.objectstyle.wolips.jdt.ProjectFrameworkAdapter;
import org.objectstyle.wolips.jdt.classpath.model.EclipseProjectFramework;

public class WOFrameworkResourceListener implements IResourceChangeListener {
  protected synchronized void woFrameworkChanged(String frameworkName) throws CoreException {
    JdtPlugin.getDefault().invalidateFrameworkModel();
    IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
    List<IJavaProject> javaProjects = new ArrayList<IJavaProject>(projects.length);
    for (int i = 0; i < projects.length; i++) {
      if (projects[i].isAccessible()) {
        javaProjects.add(JavaCore.create(projects[i]));
      }
    }
    IClasspathContainer[] containers = new IClasspathContainer[javaProjects.size()];
    IJavaProject[] javaProjectsArray = javaProjects.toArray(new IJavaProject[javaProjects.size()]);
   
    IPath containerPath = new Path(JavaCore.getClasspathContainerInitializer(WOFrameworkClasspathContainer.ID) + "/" + frameworkName);
    // Just invalidate the containerPath for all projects. It will get lazily initialized as needed in the background.
    JavaCore.setClasspathContainer(containerPath, javaProjectsArray, containers, null);
  }

  public void resourceChanged(IResourceChangeEvent event) {
    // don't bother looking at delta if selection not applicable
    IResourceDelta delta = event.getDelta();
    if (delta != null) {
      IResourceDelta[] resourceDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED | IResourceDelta.ADDED | IResourceDelta.REMOVED);
      for (int i = 0; i < resourceDeltas.length; ++i) {
        IResourceDelta resourceDelta = resourceDeltas[i];
        //System.out.println("WOFrameworkContainerInitializer.resourceChanged: " + resourceDelta);
        IResource resource = resourceDelta.getResource();
        if (resource instanceof IProject) {
          if ((resourceDelta.getFlags() & IResourceDelta.OPEN) != 0) {
            final IProject project = (IProject) resource;
            if (project.isOpen()) {
              final ProjectFrameworkAdapter projectFrameworkAdapter = (ProjectFrameworkAdapter) project.getAdapter(ProjectFrameworkAdapter.class);
              if (projectFrameworkAdapter != null) {
                new WorkspaceJob("Initialize WOLips Project") {
                 
                  @Override
                  public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
                    projectFrameworkAdapter.initializeProject();
                    return Status.OK_STATUS;
                  }
                }.schedule();
              }
            }
            try {
              woFrameworkChanged(EclipseProjectFramework.frameworkNameForProject(project));
            } catch (CoreException e) {
              e.printStackTrace();
            }
          } else if (resourceDelta.getKind() == IResourceDelta.REMOVED) {
            IProject project = (IProject) resource;
            //System.out.println("WOFrameworkContainerInitializer.resourceChanged: removed " + project);
            try {
              woFrameworkChanged(EclipseProjectFramework.frameworkNameForProject(project));
            } catch (CoreException e) {
              e.printStackTrace();
            }
          } else if (resourceDelta.getKind() == IResourceDelta.ADDED) {
            IProject project = (IProject) resource;
            //System.out.println("WOFrameworkContainerInitializer.resourceChanged: added " + project);
            try {
              woFrameworkChanged(EclipseProjectFramework.frameworkNameForProject(project));
            } catch (CoreException e) {
              e.printStackTrace();
            }
          }
        }
      }
    }
  }
}
TOP

Related Classes of org.objectstyle.wolips.jdt.classpath.WOFrameworkResourceListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.