org.jboss.tools.jst.web.kb.WebKbPlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.jst.web.kb.WebKbPlugin.java

Source

/******************************************************************************* 
 * Copyright (c) 2009-2014 Red Hat, Inc. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 ******************************************************************************/
package org.jboss.tools.jst.web.kb;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

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.ISaveContext;
import org.eclipse.core.resources.ISaveParticipant;
import org.eclipse.core.resources.ISavedState;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.jboss.tools.common.EclipseUtil;
import org.jboss.tools.common.log.BaseUIPlugin;
import org.jboss.tools.jst.web.WebModelPlugin;
import org.jboss.tools.jst.web.kb.internal.KbBuilder;
import org.jboss.tools.jst.web.kb.internal.KbProject;
import org.jboss.tools.jst.web.kb.internal.RemoteFileManager;
import org.osgi.framework.BundleContext;

/**
 * The activator class controls the plug-in life cycle
 */
public class WebKbPlugin extends BaseUIPlugin {

    // The plug-in ID
    public static final String PLUGIN_ID = "org.jboss.tools.jst.web.kb"; //$NON-NLS-1$

    public static final String CA_KB_IMAGE_PATH = "icons/ca/el.gif"; //$NON-NLS-1$

    // The shared instance
    private static WebKbPlugin plugin;

    /**
     * The constructor
     */
    public WebKbPlugin() {
        plugin = this;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext context) throws Exception {
        super.start(context);
        ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener);

        final RemoteFileManager remoteFileManager = RemoteFileManager.getInstance();
        ISavedState lastState = ResourcesPlugin.getWorkspace().addSaveParticipant(PLUGIN_ID,
                new ISaveParticipant() {

                    public void saving(ISaveContext context) throws CoreException {
                        switch (context.getKind()) {
                        case ISaveContext.SNAPSHOT:
                        case ISaveContext.FULL_SAVE:
                            IProject[] ps = ResourcesPlugin.getWorkspace().getRoot().getProjects();
                            for (IProject p : ps) {
                                KbProject sp = (KbProject) KbProjectFactory.getKbProject(p, false, true);
                                if (sp != null && sp.getModificationsSinceLastStore() > 0) {
                                    //                        sp.printModifications();
                                    try {
                                        sp.store();
                                    } catch (IOException e) {
                                        WebKbPlugin.getDefault().logError(e);
                                    }
                                }
                            }
                            remoteFileManager.savingState(context);
                            break;
                        case ISaveContext.PROJECT_SAVE:
                            KbProject sp = (KbProject) KbProjectFactory.getKbProject(context.getProject(), false,
                                    true);
                            try {
                                if (sp != null && sp.getModificationsSinceLastStore() > 0) {
                                    sp.store();
                                }
                            } catch (IOException e) {
                                WebKbPlugin.getDefault().logError(e);
                            }
                            break;
                        }

                        cleanObsoleteFiles();
                    }

                    public void rollback(ISaveContext context) {
                        remoteFileManager.rollback(context);
                    }

                    public void prepareToSave(ISaveContext context) throws CoreException {
                    }

                    public void doneSaving(ISaveContext context) {
                        remoteFileManager.doneSaving(context);
                    }
                });

        remoteFileManager.setLastSavedState(lastState);
    }

    private void cleanObsoleteFiles() {
        IProject[] ps = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        Set<String> projectNames = new HashSet<String>();
        for (IProject p : ps) {
            projectNames.add(p.getName());
        }
        WebKbPlugin plugin = WebKbPlugin.getDefault();
        if (plugin != null) {
            IPath path = plugin.getStateLocation();
            File file = new File(path.toFile(), "projects"); //$NON-NLS-1$
            if (!file.isDirectory())
                return;
            File[] fs = file.listFiles();
            if (fs != null)
                for (File f : fs) {
                    String name = f.getName();
                    if (name.endsWith(".xml")) { //$NON-NLS-1$
                        name = name.substring(0, name.length() - 4);
                        if (!projectNames.contains(name)) {
                            f.delete();
                        }
                    }
                }
        }
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext context) throws Exception {
        ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
        super.stop(context);
    }

    IResourceChangeListener resourceChangeListener = new RCL();

    class RCL implements IResourceChangeListener {

        public void resourceChanged(IResourceChangeEvent event) {
            if (event.getType() == IResourceChangeEvent.PRE_DELETE
                    || event.getType() == IResourceChangeEvent.PRE_CLOSE) {
                IResource r = event.getResource();
                if (r instanceof IProject) {
                    KbProject n = (KbProject) KbProjectFactory.getKbProject((IProject) r, false, true);
                    if (n != null) {
                        n.dispose();
                    }
                }
            } else if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
                IResourceDelta[] cs = event.getDelta().getAffectedChildren(IResourceDelta.CHANGED);
                for (IResourceDelta c : cs) {
                    if ((c.getFlags() & IResourceDelta.OPEN) != 0 && c.getResource() instanceof IProject) {
                        IProject p = (IProject) c.getResource();
                        KbProjectFactory.getKbProject(p, true, true);
                    }
                }
            }
        }
    }

    /**
     * Returns the shared instance
     *
     * @return the shared instance
     */
    public static WebKbPlugin getDefault() {
        return plugin;
    }

    public static void enableKB(IProject project, IProgressMonitor monitor) {
        try {
            WebModelPlugin.addNatureToProjectWithValidationSupport(project, KbBuilder.BUILDER_ID,
                    IKbProject.NATURE_ID);
        } catch (CoreException e) {
            getDefault().logError(e);
        }
    }

    public static void disableKB(IProject project) {
        try {
            EclipseUtil.removeNatureFromProject(project, IKbProject.NATURE_ID);
        } catch (CoreException e) {
            getDefault().logError(e);
        }
    }

    public static ImageDescriptor getImageDescriptor(Class<?> baseClass, String imageName) {
        return ImageDescriptor.createFromFile(baseClass, imageName);
    }

    public static Image getImage(Class<?> baseClass, String imageName) {
        ImageRegistry registry = getDefault().getImageRegistry();
        Image result = registry.get(imageName);
        if (result == null || result.isDisposed()) {
            result = ImageDescriptor.createFromFile(baseClass, imageName).createImage();
            if (result != null) {
                registry.put(imageName, result);
            }
        }
        return result;
    }
}