/*******************************************************************************
* 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.jsf.model.handlers.refactoring;
import java.util.ArrayList;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.jsf.messages.JSFUIMessages;
import org.jboss.tools.jsf.model.ReferenceGroupImpl;
import org.jboss.tools.jsf.model.handlers.RenameViewSupport;
import org.jboss.tools.jsf.model.helpers.JSFProcessHelper;
import org.jboss.tools.jsf.model.helpers.JSFProcessStructureHelper;
import org.jboss.tools.jsf.model.pv.JSFProjectTreeConstants;
import org.jboss.tools.jsf.model.pv.JSFProjectsTree;
import org.jboss.tools.common.model.refactoring.RefactoringHelper;
import org.jboss.tools.jst.web.model.pv.WebProjectNode;
public class JSFRenameFolderFacesConfigChange extends CompositeChange {
XModelObject object;
String newName;
XModelObject[] fs;
String oldPath;
String newPath;
Properties replacements = new Properties();
public JSFRenameFolderFacesConfigChange(XModelObject object, String newName) {
super(JSFUIMessages.FACES_CONFIG_CHANGES);
this.object = object;
this.newName = newName;
replacements.clear();
oldPath = object.getAttributeValue("name"); //$NON-NLS-1$
newPath = newName;
oldPath = "/" + oldPath + "/"; //$NON-NLS-1$ //$NON-NLS-2$
newPath = "/" + newPath + "/"; //$NON-NLS-1$ //$NON-NLS-2$
XModelObject parent = object.getParent();
while(parent != null && parent.getFileType() == XModelObject.FOLDER) {
oldPath = "/" + parent.getAttributeValue("name") + oldPath; //$NON-NLS-1$ //$NON-NLS-2$
newPath = "/" + parent.getAttributeValue("name") + newPath; //$NON-NLS-1$ //$NON-NLS-2$
parent = parent.getParent();
}
replacements.setProperty(">" + oldPath, ">" + newPath); //$NON-NLS-1$ //$NON-NLS-2$
addChanges();
}
private void addChanges() {
if(object == null) return;
XModelObject root = JSFProjectsTree.getProjectsRoot(object.getModel());
XModelObject conf = (root == null) ? null : root.getChildByPath(JSFProjectTreeConstants.CONFIGURATION);
fs = (conf == null) ? new XModelObject[0] : ((WebProjectNode)conf).getTreeChildren();
addChanges(fs);
}
private void addChanges(XModelObject[] objects) {
for (int i = 0; i < objects.length; i++) {
int c = getChildren().length;
RefactoringHelper.addChanges(objects[i], replacements, this);
if(c == getChildren().length) {
XModelObject[] gs = findGroups(objects[i]);
if(gs.length > 0) {
add(new JSFRenamePathDiagramChange(objects[i], gs));
}
}
}
}
public Change perform(IProgressMonitor pm) throws CoreException {
XModelObject parent = object.getParent();
if(parent instanceof FolderImpl) {
((FolderImpl)parent).update();
}
for (int i = 0; i < fs.length; i++) {
performChangeInFile(fs[i]);
}
for (int i = 0; i < fs.length; i++) {
if(fs[i].isModified()) {
XActionInvoker.invoke("SaveActions.Save", fs[i], null); //$NON-NLS-1$
}
}
return null;
}
private void performChangeInFile(XModelObject f) throws XModelException {
XModelObject[] gs = findGroups(f);
if(gs.length == 0) return;
JSFProcessHelper h = JSFProcessHelper.getHelper(JSFProcessStructureHelper.instance.getProcess(f));
h.addUpdateLock(this);
try {
for (int j = 0; j < gs.length; j++) {
String op = gs[j].getAttributeValue("path"); //$NON-NLS-1$
String np = newPath + op.substring(oldPath.length());
RenameViewSupport.replace((ReferenceGroupImpl)gs[j], op, np);
}
} finally {
h.removeUpdateLock(this);
h.updateProcess();
}
}
XModelObject[] findGroups(XModelObject f) {
XModelObject process = JSFProcessStructureHelper.instance.getProcess(f);
if(process == null) return new XModelObject[0];
XModelObject[] gs = JSFProcessStructureHelper.instance.getGroups(process);
ArrayList<XModelObject> list = new ArrayList<XModelObject>();
for (int i = 0; i < gs.length; i++) {
String path = gs[i].getAttributeValue("path"); //$NON-NLS-1$
if(path != null && path.startsWith(oldPath)) list.add(gs[i]);
}
return list.toArray(new XModelObject[0]);
}
}