/*******************************************************************************
* 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.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
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.DeleteParticipant;
import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.slf4j.Logger;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.graph.Messages;
import hydrograph.ui.graph.utility.ResourceChangeUtil;
import hydrograph.ui.logging.factory.LogFactory;
import hydrograph.ui.project.structure.CustomMessages;
/**
* JobDeleteParticipant- If any of the .job, .xml and .properties file is deleted in Project explorer, then the corresponding
* other files will also get deleted.
*
* Author: Bitwise
*
*/
public class JobDeleteParticipant extends DeleteParticipant{
private IFile modifiedResource;
private boolean flag;
private IFile jobIFile = null;
private IFile xmlIFile = null;
private static final Logger LOGGER = LogFactory.INSTANCE.getLogger(JobDeleteParticipant.class);
@Override
protected boolean initialize(Object element) {
this.modifiedResource = (IFile)element;
IProject[] iProjects=ResourcesPlugin.getWorkspace().getRoot().getProjects();
for(IProject iProject:iProjects){
if(StringUtils.equals(iProject.getName(),modifiedResource.getFullPath().segment(0))) {
if (StringUtils.equalsIgnoreCase(Messages.PROPERTIES_EXT, modifiedResource.getFileExtension())) {
return deleteCorrospondingXmlAndJobFileifUserDeletePropertyFile(iProject);
}
else if (StringUtils.equalsIgnoreCase(Messages.JOB_EXT, modifiedResource.getFileExtension())) {
return deleteCorrospondingXmlAndPropertyFileifUserDeleteJobFile(iProject);
}
else if (StringUtils.equalsIgnoreCase(Messages.XML_EXT, modifiedResource.getFileExtension())) {
return deleteCorrospondingJobAndPropertyFileifUserDeleteXmlFile(iProject);
}
}
}
return true;
}
private boolean deleteCorrospondingJobAndPropertyFileifUserDeleteXmlFile(IProject iProject) {
if (modifiedResource.getProjectRelativePath()!=null && StringUtils.equalsIgnoreCase(modifiedResource.getProjectRelativePath().segment(0),
CustomMessages.ProjectSupport_JOBS)) {
IFile propertyFileName = null;
IFolder jobsFolder = iProject.getFolder(CustomMessages.ProjectSupport_JOBS);
IFolder propertiesFolder = iProject.getFolder(Messages.PARAM);
if (jobsFolder != null) {
jobIFile=jobsFolder.getFile(modifiedResource.getFullPath().removeFirstSegments(2).removeFileExtension().addFileExtension(Constants.JOB_EXTENSION_FOR_IPATH));
}
if (propertiesFolder != null) {
propertyFileName = propertiesFolder.getFile(modifiedResource.getFullPath().removeFileExtension()
.addFileExtension(Constants.PROPERTIES).toFile().getName());
}
String message = getErrorMessageIfUserDeleteXmlRelatedFiles(jobIFile, propertyFileName);
showErrorMessage(jobIFile, propertyFileName, Messages.bind(message, modifiedResource.getName()));
} else {
flag = true;
}
return flag;
}
private boolean deleteCorrospondingXmlAndPropertyFileifUserDeleteJobFile(IProject iProject) {
if (modifiedResource.getProjectRelativePath()!=null && StringUtils.equalsIgnoreCase(modifiedResource.getProjectRelativePath().segment(0),
CustomMessages.ProjectSupport_JOBS)) {
IFile propertyFileName = null;
IFolder jobsFolder = iProject.getFolder(CustomMessages.ProjectSupport_JOBS);
IFolder propertiesFolder = iProject.getFolder(Messages.PARAM);
if (jobsFolder != null) {
xmlIFile=jobsFolder.getFile(modifiedResource.getFullPath().removeFirstSegments(2).removeFileExtension().addFileExtension(Constants.XML_EXTENSION_FOR_IPATH));
}
if (propertiesFolder != null) {
propertyFileName = propertiesFolder.getFile(modifiedResource.getFullPath().removeFileExtension()
.addFileExtension(Constants.PROPERTIES).toFile().getName());
}
String message = getErrorMessageIfUserDeleteJobRelatedFiles(propertyFileName, xmlIFile);
showErrorMessage(xmlIFile, propertyFileName, Messages.bind(message, modifiedResource.getName()));
} else {
flag = true;
}
return flag;
}
private boolean deleteCorrospondingXmlAndJobFileifUserDeletePropertyFile(IProject iProject) {
if (StringUtils.equalsIgnoreCase(modifiedResource.getParent().getName(), Messages.PARAM)) {
IFolder jobsFolder = iProject.getFolder(CustomMessages.ProjectSupport_JOBS);
if (jobsFolder != null) {
setJobFileAndXmlFile(jobsFolder);
}
String message = getErrorMessageIfUserDeletePropertyRelatedFiles(jobIFile, xmlIFile);
showErrorMessage(jobIFile, xmlIFile, Messages.bind(message, modifiedResource.getName()));
}
return flag;
}
private void setJobFileAndXmlFile(IFolder jobsFolder) {
try {
IResource[] members = jobsFolder.members();
if (members != null) {
for (IResource jobFolderMember : members) {
if ((IFolder.class).isAssignableFrom(jobFolderMember.getClass())) {
setJobFileAndXmlFile((IFolder) jobFolderMember);
} else if ((IFile.class).isAssignableFrom(jobFolderMember.getClass())) {
String file = jobFolderMember.getFullPath().lastSegment();
if (StringUtils.equalsIgnoreCase(modifiedResource.getName().replace(Constants.PROPERTIES_EXTENSION,
Constants.JOB_EXTENSION), file)) {
jobIFile = jobsFolder.getFile(modifiedResource.getName()
.replace(Constants.PROPERTIES_EXTENSION, Constants.JOB_EXTENSION));
} else if (StringUtils.equalsIgnoreCase(modifiedResource.getName().replace(Constants.PROPERTIES_EXTENSION,
Constants.XML_EXTENSION), file)) {
xmlIFile = jobsFolder.getFile(modifiedResource.getName()
.replace(Constants.PROPERTIES_EXTENSION, Constants.XML_EXTENSION));
}
}
}
}
} catch (CoreException coreException) {
LOGGER.error("Error while setting job file and xml file for dependent deletion", coreException);
}
}
private String getErrorMessageIfUserDeletePropertyRelatedFiles(IFile jobFileName, IFile xmlFileName) {
String message = "";
if (jobFileName != null && xmlFileName != null) {
if ((jobFileName.exists()) && (!xmlFileName.exists())) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_PROPERTY_RELATED_JOB_RESOURCE;
} else if (!jobFileName.exists() && xmlFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_PROPERTY_RELATED_XML_RESOURCE;
} else if (jobFileName.exists() && xmlFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_PROPERTY_RELATED_RESOURCE;
}
}
return message;
}
private String getErrorMessageIfUserDeleteJobRelatedFiles(IFile propertyFileName, IFile xmlFileName) {
String message = "";
if (propertyFileName != null && xmlFileName != null) {
if ((propertyFileName.exists()) && (!xmlFileName.exists())) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_JOB_RELATED_PROPERTY_RESOURCE;
} else if (!propertyFileName.exists() && xmlFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_JOB_RELATED_XML_RESOURCE;
} else if (propertyFileName.exists() && xmlFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_JOB_RELATED_RESOURCE;
}
}
return message;
}
private String getErrorMessageIfUserDeleteXmlRelatedFiles(IFile jobFileName, IFile propertyFileName) {
String message = "";
if (jobFileName != null && propertyFileName != null) {
if ((jobFileName.exists()) && (!propertyFileName.exists())) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_XML_RELATED_JOB_RESOURCE;
} else if (!jobFileName.exists() && propertyFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_XML_RELATED__PROPERTY_RESOURCE;
} else if (jobFileName.exists() && propertyFileName.exists()) {
message = Messages.SHOW_ERROR_MESSAGE_ON_DELETING_XML_RELATED_RESOURCE;
}
}
return message;
}
private void showErrorMessage(IFile fileName1, IFile fileName2, String errorMessage) {
if ((fileName1 != null && fileName1.exists()) || (fileName2 != null && fileName2.exists())) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
int returnCode = openErrorMessageBox(errorMessage);
if (returnCode == SWT.YES) {
flag = true;
}
}
});
}
}
private int openErrorMessageBox(String message) {
MessageBox messageBox = new MessageBox(Display.getDefault().getActiveShell(), SWT.ERROR | SWT.YES | SWT.NO);
messageBox.setText(Constants.ERROR);
messageBox.setMessage(message);
return messageBox.open();
}
@Override
public String getName() {
return "Job File Deleting Participant";
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
return new RefactoringStatus();
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
final HashMap<IFile,DeleteResourceChange> changes= new HashMap<IFile,DeleteResourceChange>();
if(modifiedResource.getParent()!=null)
{
List<IResource> iResources=new ArrayList<IResource>();
if ((modifiedResource.getProjectRelativePath()!=null && StringUtils.equalsIgnoreCase(modifiedResource.getProjectRelativePath().segment(0), 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
+ getJobsFolderMembers(iResources,modifiedResource.getProject().getFolder(CustomMessages.ProjectSupport_JOBS).members()).size());
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()))) {
getDeleteChanges(changes, resource);
}
}
}
}
}
if (changes.isEmpty()) {
return null;
}
CompositeChange result= new CompositeChange("Delete Job Related Files");
for (Iterator<DeleteResourceChange> iter= changes.values().iterator(); iter.hasNext();) {
result.add((Change) iter.next());
}
return result;
}
private List<IResource> getJobsFolderMembers(List<IResource> iResourcesList, IResource[] iResources)
throws CoreException {
for (IResource iResource : iResources) {
if ((IFolder.class).isAssignableFrom(iResource.getClass())) {
getJobsFolderMembers(iResourcesList, ((IFolder) iResource).members());
} else {
iResourcesList.add(iResource);
}
}
return iResourcesList;
}
private void getDeleteChanges(final HashMap<IFile, DeleteResourceChange> changes, IResource resource) {
DeleteResourceChange change = (DeleteResourceChange) changes.get((IFile)resource);
if (change == null) {
change= new DeleteResourceChange(resource.getFullPath(), true,true);
changes.put((IFile)resource, change);
}
}
}