/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ltk.internal.core.refactoring.resource;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.IPath;
import org.eclipse.ltk.core.refactoring.RefactoringContribution;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import org.eclipse.ltk.core.refactoring.resource.MoveResourcesDescriptor;
/**
* Refactoring contribution for the move resources refactoring.
*
* @since 3.4
*/
public final class MoveResourcesRefactoringContribution extends RefactoringContribution {
/**
* Key used for the number of resource to be moved
*/
private static final String ATTRIBUTE_NUMBER_OF_RESOURCES= "resources"; //$NON-NLS-1$
/**
* Key prefix used for the path of the resources to be moved.
* <p>
* The element arguments are simply distinguished by appending a number to
* the argument name, e.g. element1. The indices of this argument are one-based.
* </p>
*/
private static final String ATTRIBUTE_ELEMENT= "element"; //$NON-NLS-1$
/**
* Key used for the new resource name
*/
private static final String ATTRIBUTE_DESTINATION= "destination"; //$NON-NLS-1$
/**
* Key used for the 'update references' property
*/
private static final String ATTRIBUTE_UPDATE_REFERENCES= "updateReferences"; //$NON-NLS-1$
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.RefactoringContribution#retrieveArgumentMap(org.eclipse.ltk.core.refactoring.RefactoringDescriptor)
*/
public Map retrieveArgumentMap(final RefactoringDescriptor descriptor) {
HashMap map= new HashMap();
if (descriptor instanceof MoveResourcesDescriptor) {
MoveResourcesDescriptor moveDescriptor= (MoveResourcesDescriptor) descriptor;
IPath[] paths= moveDescriptor.getResourcePathsToMove();
String project= moveDescriptor.getProject();
IPath destinationPath= moveDescriptor.getDestinationPath();
map.put(ATTRIBUTE_NUMBER_OF_RESOURCES, String.valueOf(paths.length));
for (int i= 0; i < paths.length; i++) {
map.put(ATTRIBUTE_ELEMENT + (i + 1), ResourceProcessors.resourcePathToHandle(project, paths[i]));
}
map.put(ATTRIBUTE_DESTINATION, ResourceProcessors.resourcePathToHandle(project, destinationPath));
map.put(ATTRIBUTE_UPDATE_REFERENCES, moveDescriptor.isUpdateReferences() ? "true" : "false"); //$NON-NLS-1$//$NON-NLS-2$
return map;
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.RefactoringContribution#createDescriptor()
*/
public RefactoringDescriptor createDescriptor() {
return new MoveResourcesDescriptor();
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.RefactoringContribution#createDescriptor(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.Map, int)
*/
public RefactoringDescriptor createDescriptor(String id, String project, String description, String comment, Map arguments, int flags) {
try {
int numResources= Integer.parseInt((String) arguments.get(ATTRIBUTE_NUMBER_OF_RESOURCES));
if (numResources < 0 || numResources > 100000) {
throw new IllegalArgumentException("Can not restore MoveResourceDescriptor from map, number of moved elements invalid"); //$NON-NLS-1$
}
IPath[] resourcePaths= new IPath[numResources];
for (int i= 0; i < numResources; i++) {
String resource= (String) arguments.get(ATTRIBUTE_ELEMENT + String.valueOf(i + 1));
if (resource == null) {
throw new IllegalArgumentException("Can not restore MoveResourceDescriptor from map, resource missing"); //$NON-NLS-1$
}
resourcePaths[i]= ResourceProcessors.handleToResourcePath(project, resource);
}
String destination= (String) arguments.get(ATTRIBUTE_DESTINATION);
if (destination == null) {
throw new IllegalArgumentException("Can not restore MoveResourceDescriptor from map, destination missing"); //$NON-NLS-1$
}
IPath destPath= ResourceProcessors.handleToResourcePath(project, destination);
boolean updateReferences= "true".equals(arguments.get(ATTRIBUTE_UPDATE_REFERENCES)); //$NON-NLS-1$
MoveResourcesDescriptor descriptor= new MoveResourcesDescriptor();
descriptor.setProject(project);
descriptor.setDescription(description);
descriptor.setComment(comment);
descriptor.setFlags(flags);
descriptor.setResourcePathsToMove(resourcePaths);
descriptor.setDestinationPath(destPath);
descriptor.setUpdateReferences(updateReferences);
return descriptor;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Can not restore MoveResourceDescriptor from map"); //$NON-NLS-1$
}
}
}