/******************************************************************************* * Copyright (c) 2009 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.el.refactoring; import java.util.ArrayList; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IJavaElement; 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.RefactoringParticipant; import org.eclipse.ltk.core.refactoring.participants.RenameProcessor; import org.eclipse.osgi.util.NLS; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.text.edits.TextEdit; import org.jboss.tools.common.el.core.ElCoreMessages; import org.jboss.tools.common.el.core.model.ELInvocationExpression; import org.jboss.tools.common.el.core.model.ELPropertyInvocation; import org.jboss.tools.common.el.core.resolver.ELResolver; import org.jboss.tools.common.el.core.resolver.IRelevanceCheck; import org.jboss.tools.common.model.project.ProjectHome; import org.jboss.tools.jst.web.kb.refactoring.RefactorSearcher; /** * @author Daniel Azarov */ public abstract class ELRenameProcessor extends RenameProcessor { protected static final String JAVA_EXT = "java"; //$NON-NLS-1$ protected static final String XML_EXT = "xml"; //$NON-NLS-1$ protected static final String XHTML_EXT = "xhtml"; //$NON-NLS-1$ protected static final String JSP_EXT = "jsp"; //$NON-NLS-1$ protected static final String PROPERTIES_EXT = "properties"; //$NON-NLS-1$ protected static final RefactoringParticipant[] EMPTY_REF_PARTICIPANT = new RefactoringParticipant[0]; protected static final String SEAM_PROPERTIES_FILE = "seam.properties"; //$NON-NLS-1$ protected RefactoringStatus status; protected CompositeChange rootChange; protected TextFileChange lastChange; protected IFile declarationFile=null; private ArrayList<String> keys = new ArrayList<String>(); private String newName; private String oldName; private ELSearcher searcher = null; public ELRenameProcessor(IFile file, String oldName){ searcher = new ELSearcher(file, oldName); } protected RefactorSearcher getSearcher(){ return searcher; } public void setNewName(String newName){ this.newName = newName; } protected String getNewName(){ return newName; } protected void setOldName(String oldName){ this.oldName = oldName; } public String getOldName(){ return oldName; } // lets collect all changes for the same files in one MultiTextEdit protected TextFileChange getChange(IFile file){ if(lastChange != null && lastChange.getFile().equals(file)) return lastChange; for(int i=0; i < rootChange.getChildren().length; i++){ TextFileChange change = (TextFileChange)rootChange.getChildren()[i]; if(change.getFile().equals(file)){ lastChange = change; return lastChange; } } lastChange = new TextFileChange(file.getName(), file); MultiTextEdit root = new MultiTextEdit(); lastChange.setEdit(root); rootChange.add(lastChange); return lastChange; } private void change(IFile file, int offset, int length, String text){ String key = file.getFullPath().toString()+" "+offset; if(!keys.contains(key)){ TextFileChange change = getChange(file); TextEdit edit = new ReplaceEdit(offset, length, text); change.addEdit(edit); keys.add(key); } } public class ELSearcher extends RefactorSearcher{ public ELSearcher(IFile file, String oldName){ super(file, oldName); } public void setJavaElement(IJavaElement javaElement) { this.javaElement = javaElement; } ArrayList<String> keys = new ArrayList<String>(); @Override protected IProject[] getProjects() { return new IProject[]{baseFile.getProject()}; } protected IRelevanceCheck[] getRelevanceChecks(ELResolver[] resolvers) { if(resolvers == null) return new IRelevanceCheck[0]; IRelevanceCheck[] result = new IRelevanceCheck[resolvers.length]; IRelevanceCheck check = new IRelevanceCheck() { public boolean isRelevant(String content) { if(content == null) return true; return content.indexOf(oldName) >= 0; } }; for (int i = 0; i < result.length; i++) result[i] = check; return result; } @Override protected void match(IFile file, int offset, int length) { if(isFileReadOnly(file)){ status.addFatalError(NLS.bind(ElCoreMessages.EL_RENAME_PROCESSOR_ERROR_READ_ONLY_FILE, file.getFullPath().toString())); }else change(file, offset, length, newName); } @Override protected void outOfSynch(IResource resource) { status.addWarning(NLS.bind(ElCoreMessages.EL_RENAME_PROCESSOR_OUT_OF_SYNC_PROJECT, resource.getFullPath().toString())); } protected ELInvocationExpression findComponentReference(ELInvocationExpression invocationExpression){ ELInvocationExpression invExp = invocationExpression; while(invExp != null){ if(invExp instanceof ELPropertyInvocation){ if(((ELPropertyInvocation)invExp).getQualifiedName() != null && ((ELPropertyInvocation)invExp).getQualifiedName().equals(propertyName)) return invExp; else invExp = invExp.getLeft(); }else{ invExp = invExp.getLeft(); } } return null; } } }