/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.refactoring;
import java.util.*;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.internal.corext.refactoring.changes.TextChangeCompatibility;
import org.eclipse.ltk.core.refactoring.*;
import org.eclipse.text.edits.ReplaceEdit;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
public class RefactoringHelper {
/**
* Builds text file change for a file prisented by fileObject,
* based on pairs oldText - newText stored in replacements,
* and adds the new change to parentChange
* @param fileObject
* @param replacements - pairs oldText - newText
* @param parentChange - parent change for builded text file change
*/
public static void addChanges(XModelObject fileObject, Properties replacements, CompositeChange parentChange) {
if(replacements == null || replacements.size() == 0) return;
IFile f = (IFile)EclipseResourceUtil.getResource(fileObject);
if(f == null) return;
String body = ((FileAnyImpl)fileObject).getAsText();
if(body == null || replacements.size() == 0) return;
ReplaceEdit[] edits = RefactoringHelper.getEdits(replacements, body);
if(edits != null && edits.length > 0) {
TextFileChange change = new TextFileChange("TextFileChange", f); //$NON-NLS-1$
for (int j = 0; j < edits.length; j++) {
TextChangeCompatibility.addTextEdit(change, "Update Reference", edits[j]);
}
parentChange.add(change);
}
}
/**
* Builds array of replace edits, for given body,
* based on pairs oldText - newText stored in replacements
* @param replacements - pairs oldText - newText
* @param body
* @return
*/
public static ReplaceEdit[] getEdits(Properties replacements, String body) {
ArrayList<ReplaceEdit> l = new ArrayList<ReplaceEdit>();
String[] bs = (String[])replacements.keySet().toArray(new String[0]);
for (int i = 0; i < bs.length; i++) {
String b = bs[i];
int length = b.length();
String e = replacements.getProperty(b);
int pos = 0;
while(true) {
pos = body.indexOf(b, pos);
if(pos < 0) break;
ReplaceEdit edit = new ReplaceEdit(pos, length, e);
l.add(edit);
pos += length;
}
}
return l.toArray(new ReplaceEdit[0]);
}
}