/*
* Copyright (c) 2014, IETR/INSA of Rennes
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the IETR/INSA of Rennes nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package net.sf.orcc.ui.refactoring;
import java.util.Collections;
import net.sf.orcc.util.OrccUtil;
import org.eclipse.core.resources.IFile;
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.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.eclipse.ltk.core.refactoring.resource.RenameResourceChange;
/**
* This class contribute to perform all updates needed when user trigger the
* Rename refactoring on a network file (xdf).
*
* @author Antoine Lorence
*
*/
public class NetworkRenameParticipant extends RenameParticipant {
private final ChangesFactory factory;
private IFile originalNetworkFile;
private IFile originalDiagramFile;
private String originalFilename;
private String originalBasename;
private String newFilename;
private String newBasename;
public NetworkRenameParticipant() {
super();
factory = new ChangesFactory();
}
ChangesFactory getChangesFactory() {
return factory;
}
@Override
protected boolean initialize(Object element) {
factory.clearConfiguration();
factory.resetResults();
if (element instanceof IFile) {
originalNetworkFile = (IFile) element;
originalFilename = originalNetworkFile.getFullPath().toFile()
.getName();
originalBasename = originalFilename.substring(0,
originalFilename.lastIndexOf("."
+ OrccUtil.NETWORK_SUFFIX));
newFilename = getArguments().getNewName();
int idx = newFilename.lastIndexOf("." + OrccUtil.NETWORK_SUFFIX);
if(idx == -1) {
newBasename = newFilename;
} else {
newBasename = newFilename.substring(0, idx);
}
final IPath diagPath = originalNetworkFile.getFullPath()
.removeFileExtension()
.addFileExtension(OrccUtil.DIAGRAM_SUFFIX);
originalDiagramFile = OrccUtil.workspaceRoot().getFile(diagPath);
return true;
}
return false;
}
@Override
public String getName() {
return "Network rename participant";
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
if (!newFilename.endsWith('.' + OrccUtil.NETWORK_SUFFIX)) {
return RefactoringStatus
.createErrorStatus("The new name must have the suffix ."
+ OrccUtil.NETWORK_SUFFIX);
}
return new RefactoringStatus(); }
@Override
public Change createPreChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
factory.clearConfiguration();
factory.resetResults();
registerThisNetworkUpdate();
registerThisDiagramUpdate();
return factory.getAllChanges(
Collections.singleton(originalNetworkFile),
"Pre-rename updates");
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
factory.clearConfiguration();
factory.resetResults();
registerOtherNetworksUpdates();
registerOtherDiagramsUpdates();
CompositeChange changes = (CompositeChange) factory.getAllChanges(
originalNetworkFile.getProject(), "Post-rename updates");
if (changes == null) {
changes = new CompositeChange("Post-rename updates");
}
if (originalDiagramFile.exists()) {
changes.add(new RenameResourceChange(originalDiagramFile
.getFullPath(), newBasename + '.' + OrccUtil.DIAGRAM_SUFFIX));
}
return changes;
}
public void registerThisNetworkUpdate() {
factory.addSpecificFileReplacement(originalNetworkFile, "<XDF name=\"" + originalBasename + "\">",
"<XDF name=\"" + newBasename + "\">");
}
public void registerThisDiagramUpdate() {
if (originalDiagramFile.exists()) {
factory.addSpecificFileReplacement(originalDiagramFile, originalFilename
+ "#/", newFilename + "#/");
factory.addSpecificFileReplacement(originalDiagramFile, "name=\""
+ originalBasename + "\"", "name=\"" + newBasename + "\"");
}
}
public void registerOtherNetworksUpdates() {
final IPath newFilePath = originalNetworkFile.getFullPath()
.removeLastSegments(1).append(newFilename);
final String oldQualifiedName = OrccUtil
.getQualifiedName(originalNetworkFile);
final String newQualifiedName = OrccUtil.getQualifiedName(OrccUtil
.workspaceRoot().getFile(newFilePath));
factory.addReplacement(OrccUtil.NETWORK_SUFFIX, "<Class name=\""
+ oldQualifiedName + "\"/>", "<Class name=\""
+ newQualifiedName + "\"/>");
}
public void registerOtherDiagramsUpdates() {
final String originalRefinement = originalNetworkFile.getFullPath().toString();
final String newRefinement = originalNetworkFile.getFullPath().removeLastSegments(1)
.append(newFilename).toString();
factory.addReplacement(OrccUtil.DIAGRAM_SUFFIX,
"key=\"refinement\" value=\"" + originalRefinement + "\"",
"key=\"refinement\" value=\"" + newRefinement + "\"");
}
}