/******************************************************************************* * 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.jsf.model.handlers.bean; import java.text.MessageFormat; import java.util.Properties; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.*; import org.eclipse.jdt.ui.refactoring.RenameSupport; import org.eclipse.swt.widgets.Display; import org.jboss.tools.common.log.LogHelper; import org.jboss.tools.common.meta.action.impl.*; import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.undo.*; import org.jboss.tools.jsf.JSFModelPlugin; import org.jboss.tools.jsf.messages.JSFUIMessages; import org.jboss.tools.jsf.model.helpers.bean.ManagedBeanHelper; public class RenameManagedBeanHandler extends AbstractHandler { boolean isLight = false; public boolean isEnabled(XModelObject object) { if(isLight) return false; if(object == null || !object.isObjectEditable()) return false; if(ManagedBeanHelper.getType(object) == null) return false; return true; } public void executeHandler(XModelObject object, Properties p) throws XModelException { if (!isEnabled(object)) return; XUndoManager undo = object.getModel().getUndoManager(); XTransactionUndo u = new XTransactionUndo(MessageFormat.format(JSFUIMessages.RenameManagedBeanHandler_Rename, DefaultCreateHandler.title(object, false)), XTransactionUndo.EDIT); undo.addUndoable(u); try { transaction(object, p); } catch (XModelException e) { undo.rollbackTransactionInProgress(); throw e; } finally { u.commit(); } } protected void transaction(XModelObject object, Properties p) throws XModelException { IType type = ManagedBeanHelper.getType(object); if(type != null && !type.isBinary()) { RenameManagedBeanClassRunnable r = new RenameManagedBeanClassRunnable(object, type); Display.getDefault().syncExec(r); } } class RenameManagedBeanClassRunnable implements Runnable { XModelObject object; IType type; public RenameManagedBeanClassRunnable(XModelObject object, IType type) { this.object = object; this.type = type; } public void run() { try { runInternal(); } catch (CoreException e) { LogHelper.logError(JSFModelPlugin.PLUGIN_ID, e); } } public void runInternal() throws CoreException { RenameSupport renameSupport = RenameSupport.create(type, null, RenameSupport.UPDATE_REFERENCES); if (!renameSupport.preCheck().isOK()) return; IElementChangedListener listener = new JavaElementChangedListener(object, type); JavaCore.addElementChangedListener(listener); try { renameSupport.openDialog(ModelPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell()); } finally { JavaCore.removeElementChangedListener(listener); } } } private void renameClass(XModelObject object, String qualifiedName) throws XModelException { object.getModel().changeObjectAttribute(object, "managed-bean-class", qualifiedName); //$NON-NLS-1$ } private class JavaElementChangedListener implements IElementChangedListener { private IType type; private XModelObject object; public JavaElementChangedListener(XModelObject object, IType type) { this.type = type; this.object = object; } public void elementChanged(ElementChangedEvent event) { IJavaElementDelta delta = event.getDelta(); IJavaElement fromElement = getMovedFromElement(delta); if (type.getCompilationUnit().equals(fromElement)) { try { IJavaElement toElement = getMovedToElement(delta); if (toElement instanceof ICompilationUnit) { String packageName = toElement.getParent().getElementName(); String className = toElement.getElementName(); if(className.endsWith(".java")) className = className.substring(0, className.length() - 5); //$NON-NLS-1$ if(packageName.length() > 0) className = packageName + "." + className; //$NON-NLS-1$ try { renameClass(object, className); } catch (XModelException e) { throw new RuntimeException(e); } } } finally { JavaCore.removeElementChangedListener(this); } } } private IJavaElement getMovedFromElement(IJavaElementDelta delta) { IJavaElement element = delta.getMovedFromElement(); if (element == null) { IJavaElementDelta deltas[] = delta.getAffectedChildren(); for (int i = 0; i < deltas.length && element == null; i++) element = getMovedFromElement(deltas[i]); } return element; } private IJavaElement getMovedToElement(IJavaElementDelta delta) { IJavaElement element = delta.getMovedToElement(); if (element == null) { IJavaElementDelta deltas[] = delta.getAffectedChildren(); for (int i = 0; i < deltas.length && element == null; i++) element = getMovedToElement(deltas[i]); } return element; } } }