/******************************************************************************* * 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.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.ltk.core.refactoring.Change; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; import org.osgi.service.prefs.BackingStoreException; /** * @author Alexey Kazakov */ public class SeamJavaPackageRenameChange extends SeamProjectChange { protected static String[] PACKAGE_NAME_PROPERTIES = { ISeamFacetDataModelProperties.ENTITY_BEAN_PACKAGE_NAME, ISeamFacetDataModelProperties.SESSION_BEAN_PACKAGE_NAME, ISeamFacetDataModelProperties.TEST_CASES_PACKAGE_NAME }; protected static String[] SOURCE_NAME_PROPERTIES = { ISeamFacetDataModelProperties.ENTITY_BEAN_SOURCE_FOLDER, ISeamFacetDataModelProperties.SESSION_BEAN_SOURCE_FOLDER, ISeamFacetDataModelProperties.TEST_SOURCE_FOLDER }; private IPackageFragmentRoot source; private String newName; private String oldName; private List<Integer> relevantPropertyIndexes = new ArrayList<Integer>(); /** * @param project */ public SeamJavaPackageRenameChange(IProject project, IPackageFragmentRoot source, String newName, String oldName) { super(project); this.source = source; this.newName = newName; this.oldName = oldName; IEclipsePreferences ps = getSeamPreferences(); for (int i = 0; i < PACKAGE_NAME_PROPERTIES.length; i++) { String name = ps.get(PACKAGE_NAME_PROPERTIES[i], null); if(name!=null && (oldName.equals(name) || name.startsWith(oldName + "."))) { relevantPropertyIndexes.add(new Integer(i)); } } findPreferences(ps); } private void findPreferences(IEclipsePreferences ps){ for (Integer index: relevantPropertyIndexes) { String sourceFolderProperty = ps.get(SOURCE_NAME_PROPERTIES[index], null); if(!source.getResource().getFullPath().toString().equals(sourceFolderProperty)) { continue; } String packageProperty = PACKAGE_NAME_PROPERTIES[index]; String name = ps.get(packageProperty, null); if(name==null) { continue; } if(oldName.equals(name)) { preferences.put(packageProperty, newName); } else if(name.startsWith(oldName + ".")) { preferences.put(packageProperty, newName + name.substring(oldName.length())); } } } /* (non-Javadoc) * @see org.jboss.tools.seam.internal.core.refactoring.SeamProjectChange#isRelevant() */ @Override public boolean isRelevant() { return !relevantPropertyIndexes.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); 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 SeamJavaPackageRenameChange(project, source, oldName, newName); } finally { pm.done(); } } }