/******************************************************************************* * Copyright (c) 2007 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core.refactoring; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.ltk.core.refactoring.Change; import org.jboss.tools.seam.core.SeamCorePlugin; import org.osgi.service.prefs.BackingStoreException; /** * @author Viacheslav Kabanovich */ public class SeamProjectRenameChange extends SeamProjectChange { protected String newName; protected String oldName; private List<String> relevantProjectNameProperties = new ArrayList<String>(); private List<String> relevantSourceFolderProperties = new ArrayList<String>(); /** * @param project * @param newName * @param oldName */ public SeamProjectRenameChange(IProject project, String newName, String oldName) { super(project); this.newName = newName; this.oldName = oldName; IEclipsePreferences ps = getSeamPreferences(); for (int i = 0; i < PROJECT_NAME_PROPERTIES.length; i++) { if(oldName.equals(ps.get(PROJECT_NAME_PROPERTIES[i], null))) { relevantProjectNameProperties.add(PROJECT_NAME_PROPERTIES[i]); } } for (int i = 0; i < FOLDER_PROPERTIES.length; i++) { if(ps.get(FOLDER_PROPERTIES[i], "").startsWith("/" + oldName + "/")) { relevantSourceFolderProperties.add(FOLDER_PROPERTIES[i]); } } findPreferences(ps); } private void findPreferences(IEclipsePreferences ps){ for (String property: relevantProjectNameProperties) { if(oldName.equals(ps.get(property, null))) { preferences.put(property, newName); } } String oldPrefix = "/" + oldName + "/"; for (String property: relevantSourceFolderProperties) { String oldProperty = ps.get(property, ""); if(oldProperty.startsWith(oldPrefix) && oldProperty.length()>oldPrefix.length()) { preferences.put(property, "/" + newName + "/" + oldProperty.substring(oldPrefix.length())); } } } /* * (non-Javadoc) * @see org.jboss.tools.seam.internal.core.refactoring.SeamProjectChange#isRelevant() */ @Override public boolean isRelevant() { return !relevantProjectNameProperties.isEmpty() || !relevantSourceFolderProperties.isEmpty(); } /* * (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor) */ @Override public Change perform(IProgressMonitor pm) throws CoreException { if(!isRelevant()) { return null; } try { pm.beginTask(getName(), 1); if(project.getName().equals(oldName)) { IResource newProject = ResourcesPlugin.getWorkspace().getRoot().findMember(newName); if(!project.exists() && (newProject instanceof IProject) && newProject.exists()) { project = (IProject)newProject; } } IEclipsePreferences ps = getSeamPreferences(); for(String key : preferences.keySet()){ ps.put(key, preferences.get(key)); } try { ps.flush(); } catch (BackingStoreException e) { SeamCorePlugin.getPluginLog().logError(e); } return new SeamProjectRenameChange(project, oldName, newName); } finally { pm.done(); } } }