org.jboss.tools.common.model.handlers.RemoveModelNatureHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.model.handlers.RemoveModelNatureHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.common.model.handlers;

import java.io.*;
import java.text.MessageFormat;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.jboss.tools.common.model.markers.ResourceMarkers;
import org.eclipse.jdt.core.*;
import org.jboss.tools.common.meta.action.SignificanceMessageFactory;
import org.jboss.tools.common.meta.action.SpecialWizard;
import org.jboss.tools.common.meta.action.XAction;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.meta.action.impl.AbstractHandler;
import org.jboss.tools.common.meta.action.impl.XActionImpl;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.project.IModelNature;
import org.jboss.tools.common.model.project.ModelNatureExtension;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.util.FileUtil;

public class RemoveModelNatureHandler extends AbstractHandler {
    public static String PARAM_CONTRIBUTION = "contribution"; //$NON-NLS-1$

    public boolean isEnabled(XModelObject object) {
        if (object == null)
            return false;
        String nature = getNatureDisplayName(object);
        if (nature == null)
            return false;
        XActionImpl i = (XActionImpl) action;
        i.setDisplayName(MessageFormat.format("Remove {0} Capabilities", nature));
        return true;
    }

    private String getNatureDisplayName(XModelObject object) {
        IProject p = EclipseResourceUtil.getProject(object);
        ModelNatureExtension[] es = ModelNatureExtension.getInstances();
        for (ModelNatureExtension ext : es) {
            String name = ext.getName();
            if (p != null && p.isAccessible())
                try {
                    if (p.hasNature(name)) {
                        return ext.getDisplayName();
                    }
                } catch (CoreException e) {

                }
        }
        return null;
    }

    private String getNature(XModelObject object) {
        IProject p = EclipseResourceUtil.getProject(object);
        ModelNatureExtension[] es = ModelNatureExtension.getInstances();
        for (ModelNatureExtension ext : es) {
            String name = ext.getName();
            if (p != null && p.isAccessible())
                try {
                    if (p.hasNature(name)) {
                        return ext.getName();
                    }
                } catch (CoreException e) {

                }
        }
        return null;
    }

    public void executeHandler(XModelObject object, Properties p) throws XModelException {
        IProject project = EclipseResourceUtil.getProject(object);
        String nature = (p == null) ? null : p.getProperty("nature"); //$NON-NLS-1$
        if (nature == null)
            nature = getNature(object);
        if (project == null || nature == null)
            return;

        boolean unregisterWTP = false;

        ServiceDialog dialog = object.getModel().getService();
        Properties pd = new Properties();
        String message = MessageFormat.format("Remove {0} Capabilities from project {1}?",
                getNatureDisplayName(object), project.getName());
        //SignificanceMessageFactory.getInstance().getMessage(action, object, null) + "?";
        pd.setProperty(ServiceDialog.DIALOG_MESSAGE, message);
        String checkBoxMessage = "Remove Dynamic Web Project Capabilities";
        pd.setProperty(ServiceDialog.CHECKBOX_MESSAGE, checkBoxMessage);
        pd.put(ServiceDialog.CHECKED, Boolean.FALSE);
        if (!dialog.openConfirm(pd))
            return;

        SpecialWizard contribution = p == null ? null : (SpecialWizard) p.get(PARAM_CONTRIBUTION);
        if (contribution != null) {
            contribution.setObject(object.getModel());
            contribution.execute();
        }
        Boolean b = (Boolean) pd.get(ServiceDialog.CHECKED);
        unregisterWTP = b.booleanValue();

        try {
            IProjectDescription d = project.getDescription();
            String[] ns = d.getNatureIds();
            String[] ns2 = removeNature(ns, nature);
            if (unregisterWTP)
                ns2 = new String[] { JavaCore.NATURE_ID };
            if (ns.length == ns2.length)
                return;
            if (unregisterWTP) {
                unregisterFromServer(object);
                clearClassPath(project);
            }
            d.setNatureIds(ns2);
            project.setDescription(d, IResource.FORCE, null);
            if (EclipseResourceUtil.getModelNature(project) != null)
                return;
            String projectLocation = project.getLocation().toString();
            removeFiles(projectLocation, XModelConstants.getWorkspace(object.getModel()));
            if (unregisterWTP) {
                File f = new File(projectLocation + "/.settings"); //$NON-NLS-1$
                if (f.isDirectory())
                    FileUtil.remove(f);
            }
            clear(object.getModel().getByPath("FileSystems/WEB-INF")); //$NON-NLS-1$
            project.refreshLocal(IResource.DEPTH_INFINITE, null);
        } catch (CoreException e) {
            throw new XModelException(e);
        }
    }

    private void removeFiles(String location, String workspace) {
        File f = new File(location + XModelObjectConstants.SEPARATOR + IModelNature.PROJECT_FILE);
        if (f.exists())
            f.delete();
    }

    public boolean getSignificantFlag(XModelObject object) {
        return false;
    }

    public String[] removeNature(String[] natures, String nature) {
        ArrayList<String> l = new ArrayList<String>();
        for (int i = 0; i < natures.length; i++)
            if (!natures[i].equals(nature))
                l.add(natures[i]);
        return l.toArray(new String[0]);
    }

    ///MarkerClearer
    public static void clear(XModelObject o) {
        if (o == null || o.getFileType() == XModelObject.NONE)
            return;
        if (o.getFileType() == XModelObject.FILE) {
            ResourceMarkers markers = new ResourceMarkers(ResourceMarkers.JST_WEB_PROBLEM,
                    ResourceMarkers.OLD_JST_WEB_PROBLEM);
            markers.setModelObject(o);
            markers.update();
        } else {
            XModelObject[] os = o.getChildren();
            for (int i = 0; i < os.length; i++)
                clear(os[i]);
        }
    }

    // Remove Dynamic Web Project Capabilities

    void clearClassPath(IProject project) throws XModelException {
        IJavaProject javaProject = JavaCore.create(project);
        ArrayList<IClasspathEntry> newClassPath = new ArrayList<IClasspathEntry>(getRawClassPath(javaProject));
        Iterator<IClasspathEntry> iterator = newClassPath.iterator();
        while (iterator.hasNext()) {
            IClasspathEntry entry = iterator.next();
            if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
                if (entry.getPath().toString().indexOf(".jst.") >= 0) { //$NON-NLS-1$
                    iterator.remove();
                    continue;
                }
            }
            if (project.getFullPath().equals(entry.getPath()))
                iterator.remove();
        }
        IClasspathEntry[] entries = newClassPath.toArray(new IClasspathEntry[newClassPath.size()]);
        if (entries.length != 0) {
            try {
                javaProject.setRawClasspath(entries, new NullProgressMonitor());
            } catch (JavaModelException e) {
                throw new XModelException(e);
            }
        }
    }

    private List<IClasspathEntry> getRawClassPath(IJavaProject javaProject) throws XModelException {
        try {
            return Arrays.asList(javaProject.getRawClasspath());
        } catch (JavaModelException e) {
            throw new XModelException(e);
        }
    }

    void unregisterFromServer(XModelObject object) {
        XModelObject fs = FileSystemsHelper.getFileSystems(object.getModel());
        XAction action = XActionInvoker.getAction("Registration.UnregisterInServerXML", fs); //$NON-NLS-1$
        if (action != null) {
            Properties runningProperties = new Properties();
            runningProperties.setProperty("unregisterFromAllServers", XModelObjectConstants.TRUE); //$NON-NLS-1$
            runningProperties.setProperty("showResult", XModelObjectConstants.FALSE); //$NON-NLS-1$
            XActionInvoker.invoke("Registration.UnregisterInServerXML", fs, runningProperties); //$NON-NLS-1$
        }
    }

}