/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package hydrograph.ui.graph.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
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;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.graph.Messages;
import hydrograph.ui.graph.utility.ResourceChangeUtil;
import hydrograph.ui.project.structure.CustomMessages;
/**The Class Rename Job Participant
* @author Bitwise
*
*/
public class RenameJobParticipant extends RenameParticipant {
private static final String DEBUG = "_debug";
private IFile modifiedResource;
@Override
protected boolean initialize(Object element) {
this.modifiedResource = (IFile) element;
if (modifiedResource.getParent() != null && modifiedResource.getParent().getParent() instanceof IProject) {
if (StringUtils.equalsIgnoreCase(Messages.PROPERTIES_EXT, modifiedResource.getFileExtension())) {
if (!StringUtils.equalsIgnoreCase(modifiedResource.getParent().getName(), Messages.PARAM)) {
return false;
}
}
}
return true;
}
@Override
public String getName() {
return "Job File Renaming Participant";
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
String newName = getArguments().getNewName();
String newExt = newName.substring(newName.lastIndexOf(".")+1);
if("job".equals(modifiedResource.getFileExtension())) {
if(!("job".equals(newExt))) {
return RefactoringStatus.createFatalErrorStatus("Changing extension of job file is not allowed");
}
}
else if("job".equals(newExt)) {
return RefactoringStatus.createFatalErrorStatus("Changing extension to .job not allowed." +
"Please create a new job file.");
}
else if(CustomMessages.ProjectSupport_JOBS.equals(modifiedResource.getFullPath().segment(1))
&& !newExt.matches("job|xml")) {
return RefactoringStatus.createFatalErrorStatus("Only .job and .xml files can be stored in this folder" );
}
else if(modifiedResource.getFileExtension().matches("xml|properties")
|| (newExt.matches("xml|properties"))){
if(ResourceChangeUtil.isGeneratedFile(modifiedResource.getName()
,modifiedResource.getProject())) {
return RefactoringStatus.createFatalErrorStatus(
".xml or .properties file cannot be renamed. " +
"Rename the .job file to rename the xml and properties file");
}
else if(ResourceChangeUtil.isGeneratedFile(newName,modifiedResource.getProject())) {
return RefactoringStatus.createFatalErrorStatus("Generated file with same name exists.Please choose a different name");
}
else if(("properties".equals(modifiedResource.getFileExtension())
|| "properties".equals(newExt))
&& !modifiedResource.getFullPath().segment(1).equals(CustomMessages.ProjectSupport_PARAM)) {
return RefactoringStatus.createFatalErrorStatus("properties file can only be saved in param folder.");
}
}
return new RefactoringStatus();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
final HashMap<IFile,RenameResourceChange> changes= new HashMap<IFile,RenameResourceChange>();
final String newName = ResourceChangeUtil.removeExtension(getArguments().getNewName());
if (modifiedResource.getParent() != null) {
if (!StringUtils.equalsIgnoreCase(modifiedResource.getParent().getName(),CustomMessages.ProjectSupport_JOBS)) {
List<IResource> memberList = new ArrayList<IResource>(modifiedResource.getProject()
.getFolder(modifiedResource.getParent().getName()).members().length);
ResourceChangeUtil.addMembersToList(memberList,modifiedResource.getProject().getFolder(modifiedResource.getParent().getName()));
final String fileName = ResourceChangeUtil.removeExtension(modifiedResource.getName());
for (IResource resource : memberList) {
if (Pattern.matches(fileName + Constants.EXTENSION, resource.getName())) {
if((StringUtils.equalsIgnoreCase(Messages.XML_EXT,resource.getFileExtension())
||StringUtils.equalsIgnoreCase(Messages.JOB_EXT,resource.getFileExtension()))
&&!(StringUtils.equalsIgnoreCase(modifiedResource.getName(),resource.getName())))
{
getRenameChanges(changes, newName, resource);
}
}
}
}
else if(StringUtils.equalsIgnoreCase(modifiedResource.getParent().getName(),CustomMessages.ProjectSupport_JOBS)||
StringUtils.equalsIgnoreCase(modifiedResource.getParent().getName(),CustomMessages.ProjectSupport_PARAM))
{
List<IResource> memberList = new ArrayList<IResource>(modifiedResource.getProject()
.getFolder(CustomMessages.ProjectSupport_PARAM).members().length
+ modifiedResource.getProject().getFolder(CustomMessages.ProjectSupport_JOBS).members().length);
ResourceChangeUtil.addMembersToList(memberList,modifiedResource.getProject().getFolder(CustomMessages.ProjectSupport_JOBS));
ResourceChangeUtil.addMembersToList(memberList,modifiedResource.getProject().getFolder(CustomMessages.ProjectSupport_PARAM));
final String fileName = ResourceChangeUtil.removeExtension(modifiedResource.getName());
for (IResource resource : memberList) {
if (Pattern.matches(fileName + Constants.EXTENSION, resource.getName())) {
if ((StringUtils.equalsIgnoreCase(Messages.XML_EXT, resource.getFileExtension())
|| StringUtils.equalsIgnoreCase(Messages.PROPERTIES_EXT, resource.getFileExtension())
|| StringUtils.equalsIgnoreCase(Messages.JOB_EXT, resource.getFileExtension()))
&& !(StringUtils.equalsIgnoreCase(modifiedResource.getName(),resource.getName()))) {
getRenameChanges(changes, newName, resource);
};
}
}
}
}
if (changes.isEmpty()) {
return null;
}
CompositeChange result= new CompositeChange("Rename Job Related Files");
for (Iterator<RenameResourceChange> iter= changes.values().iterator(); iter.hasNext();) {
result.add((Change) iter.next());
}
return result;
}
private void getRenameChanges(final HashMap<IFile, RenameResourceChange> changes, String newName,
IResource resource) {
RenameResourceChange change = (RenameResourceChange) changes.get((IFile) resource);
if (change == null) {
String fileName = ResourceChangeUtil.removeExtension(resource.getName());
if(fileName.endsWith(DEBUG)){
newName = newName.concat(DEBUG);
}
change = new RenameResourceChange(resource.getFullPath(),
newName + "." + resource.getFileExtension());
changes.put((IFile) resource, change);
}
}
}