/******************************************************************************* * 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.filesystems.impl; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.impl.XModelImpl; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.util.ModelFeatureFactory; import org.jboss.tools.common.model.util.XModelObjectUtil; public class FileSystemsRenameListener { static Contribution contribution; static { try { if(Platform.getBundle("org.jboss.tools.jst.web") != null) { //$NON-NLS-1$ contribution = (Contribution)ModelFeatureFactory.getInstance().createFeatureInstance("org.jboss.tools.jst.web.project.FileSystemsRenameListenerContribution"); //$NON-NLS-1$ } } catch (ClassCastException e) { ModelPlugin.getPluginLog().logError(e); } } XModelObject fileSystems; public interface Contribution { public void pathRenamed(FileSystemsRenameListener listener, String oldPath, String newPath); } public FileSystemsRenameListener(XModelObject fileSystems) { this.fileSystems = fileSystems; } public XModelObject getFileSystems() { return fileSystems; } public void checkFileSystemRename(IResourceChangeEvent event) { String[] r = processDelta(event.getDelta()); if(r.length == 0) return; pathRenamed(r[0], r[1]); } private String[] processDelta(IResourceDelta delta) { if(delta == null) return new String[0]; String[] r = extractRename(delta); if(r != null) return r; IResourceDelta[] cs = delta.getAffectedChildren(); if(delta.getKind() == IResourceDelta.CHANGED) { if(cs != null && cs.length > 0) { for (int i = 0; i < cs.length; i++) { r = processDelta(cs[i]); if(r != null) return r; } } } return new String[0]; } private String[] extractRename(IResourceDelta delta) { if(delta.getKind() != 4) return null; IResourceDelta[] cs = delta.getAffectedChildren(); if(cs == null || cs.length != 2) return null; String[] r = extractRename(cs[0], cs[1]); if(r == null) r = extractRename(cs[1], cs[0]); return r; } private String[] extractRename(IResourceDelta d1, IResourceDelta d2) { if(d1.getKind() != 1 || d2.getKind() != 2) return null; IPath from = d1.getMovedFromPath(); IPath to = d2.getMovedToPath(); if(from == null || to == null) return null; IPath f = getLocation(from); IPath t = getLocation(to); if(f != null && t != null) { from = f; to = t; } return new String[]{from.toString(), to.toString()}; } private IPath getLocation(IPath path) { if(path.segmentCount() > 1) { IFolder folder = ModelPlugin.getWorkspace().getRoot().getFolder(path); return folder == null ? null : folder.getLocation(); } else { IProject project = ModelPlugin.getWorkspace().getRoot().getProject(path.segments()[0]); return project == null ? null : project.getLocation(); } } private void pathRenamed(String oldPath, String newPath) { String ws = XModelConstants.getWorkspace(fileSystems.getModel()); ws = ws.replace('\\', '/'); if(!ws.toLowerCase().startsWith(oldPath.toLowerCase())) { // now ignore return; } if(contribution != null) contribution.pathRenamed(this, oldPath, newPath); ws = newPath + ws.substring(oldPath.length()); fileSystems.getModel().getProperties().setProperty(XModelConstants.WORKSPACE, ws); //now just recreate folder file systems XModelObject[] fs = fileSystems.getChildren(XModelObjectConstants.ENT_FILE_SYSTEM_FOLDER); for (int i = 0; i < fs.length; i++) { String s = XModelObjectUtil.getExpandedValue(fs[i], XModelObjectConstants.ATTR_NAME_LOCATION, null); s = s.replace('\\', '/'); // String name = fs[i].getAttributeValue(XModelObjectConstants.ATTR_NAME); XModelObject ns = fs[i].copy(0); /// ns.setAttributeValue(XModelObjectConstants.ATTR_NAME_LOCATION, newPath); fs[i].removeFromParent(); fileSystems.addChild(ns); ((XModelImpl)fileSystems.getModel()).fireStructureChanged(ns); } fileSystems.setModified(true); fileSystems.getModel().save(); } }