/******************************************************************************* * 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.refactoring; import java.text.MessageFormat; import java.util.*; import org.eclipse.core.runtime.*; import org.eclipse.jdt.internal.corext.refactoring.tagging.*; import org.eclipse.ltk.core.refactoring.*; import org.eclipse.ltk.core.refactoring.participants.*; import org.jboss.tools.common.model.XModelObject; public abstract class ModelRenameProcessor extends RenameProcessor implements INameUpdating, IReferenceUpdating { protected XModelObject object; protected String fNewElementName; private boolean updateReferences = true; public ModelRenameProcessor() {} public void setModelObject(XModelObject object) { this.object = object; if (object != null) { setNewElementName(object); } } protected void setNewElementName(XModelObject object) { if(object != null) { setNewElementName(object.getAttributeValue(getProcessorName())); } } protected abstract String getPropertyName(); public void setNewElementName(String newName) { fNewElementName = newName; } public String getNewElementName() { return fNewElementName; } public boolean isApplicable() throws CoreException { return true; } public String getProcessorName() { String message = MessageFormat.format("Rename {0} to {1}", getCurrentElementName(), getNewElementName()); return message; } public Object[] getElements() { return new Object[] {object}; } public String getCurrentElementName() { return object.getAttributeValue(getPropertyName()); } public String[] getAffectedProjectNatures() throws CoreException { return new String[]{}; } public Object getNewElement() { return object; } public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants shared) throws CoreException { Object[] elements= getElements(); String[] natures= getAffectedProjectNatures(); List<RefactoringParticipant> result = new ArrayList<RefactoringParticipant>(); RenameArguments arguments= new RenameArguments(getNewElementName(), getUpdateReferences()); for (int i= 0; i < elements.length; i++) { result.addAll(Arrays.asList(ParticipantManager.loadRenameParticipants(status, this, elements[i], arguments, natures, shared))); } return result.toArray(new RefactoringParticipant[result.size()]); } public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { return new RefactoringStatus(); } public RefactoringStatus checkNewElementName(String newName) throws CoreException { XModelObject c = object.getParent(); if (c == null) return RefactoringStatus.createFatalErrorStatus("Object is removed from model."); if (c.getChildByPath(newName) != null) return RefactoringStatus.createFatalErrorStatus(MessageFormat.format("Object {0} already exists.", newName)); return RefactoringStatus.create(Status.OK_STATUS); } public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { pm.beginTask("", 1); //$NON-NLS-1$ try{ return new RefactoringStatus(); } finally{ pm.done(); } } public Change createChange(IProgressMonitor pm) throws CoreException { return null; } public void setUpdateReferences(boolean update) { updateReferences = update; } public boolean getUpdateReferences() { return updateReferences; } }