/******************************************************************************* * Copyright (c) 2012 VMWare, Inc. * All rights reserved. This program and the accompanying materials * are 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: * VMWare, Inc. - initial API and implementation *******************************************************************************/ package org.grails.ide.eclipse.refactoring.rename.type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor; import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring; import org.grails.ide.eclipse.editor.groovy.elements.GrailsWorkspaceCore; import org.grails.ide.eclipse.refactoring.rename.type.GrailsTypeRenameParticipant.IGrailsTypeRenameConfigurer; /** * @author Kris De Volder * @since 2.7 */ @SuppressWarnings("restriction") public class GrailsTypeRenameRefactoring extends ProcessorBasedRefactoring implements ITypeRenaming { private static final boolean DEFAULT_UPDATE_SERVICE_REFS = true; private static final boolean DEFAULT_UPDATE_GSPS = true; private ExtraRenamingsComputer extraRenamingsComputer; private ITypeRenaming[] chosenAdditionalRenamings; private boolean updateServiceRefs = DEFAULT_UPDATE_SERVICE_REFS; private boolean updateGSPs = DEFAULT_UPDATE_GSPS; public GrailsTypeRenameRefactoring(IType target) { super(new RenameTypeProcessor(target)); setNewName(target.getElementName()); setChosenAdditionalRenamings(getExtraRenamingsComputer().getExtraRenamings(new NullProgressMonitor())); } public void setChosenAdditionalRenamings(Collection<ITypeRenaming> extraRenamings) { setChosenAdditionalRenamings(extraRenamings.toArray(new ITypeRenaming[extraRenamings.size()])); } public void setNewName(String newName) { this.getProcessor().setNewElementName(newName); extraRenamingsComputer = null; updateAdditionalRenamings(); } private void updateAdditionalRenamings() { Collection<ITypeRenaming> newRenamings = getExtraRenamingsComputer().getExtraRenamings(new NullProgressMonitor()); ITypeRenaming[] oldChosenRenamings = getChosenAdditionalRenamings(); if (oldChosenRenamings!=null) { HashSet<IType> oldChosenTargets = new HashSet<IType>(); for (ITypeRenaming or : oldChosenRenamings) { oldChosenTargets.add(or.getTarget()); } List<ITypeRenaming> newChosenRenamings = new ArrayList<ITypeRenaming>(); for (ITypeRenaming nr : newRenamings) { if (oldChosenTargets.contains(nr.getTarget())) { newChosenRenamings.add(nr); } } final ITypeRenaming[] newChosenRenamingsArr = newChosenRenamings.toArray(new ITypeRenaming[newChosenRenamings.size()]); setChosenAdditionalRenamings(newChosenRenamingsArr); } } @Override public RenameTypeProcessor getProcessor() { return (RenameTypeProcessor) super.getProcessor(); } public ExtraRenamingsComputer getExtraRenamingsComputer() { if (extraRenamingsComputer==null) { extraRenamingsComputer = ExtraRenamingsComputer.create(this); } return extraRenamingsComputer; } public IType getTarget() { return getProcessor().getType(); } public String getNewName() { return getProcessor().getNewElementName(); } public void setChosenAdditionalRenamings(ITypeRenaming[] chosen) { chosenAdditionalRenamings = chosen; } public ITypeRenaming[] getChosenAdditionalRenamings() { return chosenAdditionalRenamings; } public IGrailsTypeRenameConfigurer getRenameConfigurer() { return new ConfigureFromGrailsTypeRenameRefactoring(this); } /** * @return whether the option to update auto-wired service fields is enabled. */ public boolean getUpdateServiceRefs() { return updateServiceRefs; } /** * @return whether the option to update GSP files is enabled. */ public boolean getUpdateGSPs() { return updateGSPs; } public void setUpdateServiceRefs(boolean doUpdate) { updateServiceRefs = doUpdate; } public void setUpdateGSPs(boolean newValue) { updateGSPs = newValue; } /** * @return true if at least one Service class is being renamed by this refactoring. */ public boolean isServiceRenaming() { final ITypeRenaming[] extras = getChosenAdditionalRenamings(); ArrayList<ITypeRenaming> renamings = new ArrayList<ITypeRenaming>(); renamings.add(this); if (extras!=null) { renamings.addAll(Arrays.asList(extras)); } for (ITypeRenaming r : renamings) { IType target = r.getTarget(); if (GrailsWorkspaceCore.isServiceClass(target)) { return true; } } return false; } /** * @return whether preview forcing should be enabled for this refactoring. */ public boolean shouldForcePreview() { return getUpdateGSPs() || getUpdateServiceRefs() && isServiceRenaming(); } }