/******************************************************************************* * Copyright (c) 2010 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.jsf.ui.el.refactoring; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.RenameParticipant; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.text.edits.TextEdit; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.jsf.ui.JsfUIMessages; import org.jboss.tools.jst.web.kb.refactoring.SearchUtil; import org.jboss.tools.jst.web.kb.refactoring.SearchUtil.FileResult; import org.jboss.tools.jst.web.kb.refactoring.SearchUtil.SearchResult; public class MessagesFileRenameParticipant extends RenameParticipant { private static final String PROPERTIES_EXT = "properties"; //private RefactoringStatus status; private CompositeChange rootChange; private IFile file; private String newName=null; @Override protected boolean initialize(Object element) { if(element instanceof IFile){ rootChange = new CompositeChange(JsfUIMessages.MESSAGES_FILE_RENAME_PARTICIPANT_UPDATE_MESSAGE_BUNDLE_REFERENCES); file = (IFile)element; String ext = file.getFileExtension(); if(PROPERTIES_EXT.equals(ext)){ newName = getArguments().getNewName(); return true; } } return false; } private String getQualifiedName(IPath path){ IJavaProject javaProject = EclipseResourceUtil.getJavaProject(file.getProject()); // searching java, xml and property files in source folders if(javaProject != null){ for(IResource resource : EclipseResourceUtil.getJavaSourceRoots(file.getProject())){ IPath javaSource = resource.getFullPath(); if(javaSource.segmentCount() == javaSource.matchingFirstSegments(path)){ IPath relativePath = path.removeFirstSegments(javaSource.segmentCount()); String pathString = relativePath.toString(); pathString = pathString.replace(".properties",""); pathString = pathString.replace("/","."); return pathString; } } } return ""; } @Override public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException { RefactoringStatus status = new RefactoringStatus(); if(newName != null){ if(!newName.endsWith(".properties")){ status.addFatalError(JsfUIMessages.MESSAGES_FILE_RENAME_PARTICIPANT_FILE_NAME_SHOULD_BE_WITH_THE_SAME_EXTENSION); return status; } IPath path = file.getFullPath(); newName = newName.replace(".properties",""); String oldName = getQualifiedName(path); String fileName = file.getName().replace(".properties",""); newName = oldName.replace(fileName,newName); SearchUtil su = new SearchUtil(SearchUtil.XML_FILES, oldName); SearchResult result = su.searchInNodeAttribute(file.getProject(), ":loadBundle", "basename"); if(result.getEntries().size() == 0) return status; for(FileResult fr : result.getEntries()){ TextFileChange fileChange = new TextFileChange(fr.getFile().getName(), fr.getFile()); MultiTextEdit root = new MultiTextEdit(); fileChange.setEdit(root); rootChange.add(fileChange); for(int position : fr.getPositions()){ TextEdit edit = new ReplaceEdit(position, oldName.length(), newName); fileChange.addEdit(edit); } } } return status; } @Override public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { return rootChange; } @Override public String getName() { if(file != null) return file.getName(); return null; } }