/*******************************************************************************
* 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$
}
}
}