package org.flowerplatform.web.tests.listener; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.flowerplatform.common.CommonPlugin; import org.flowerplatform.common.util.Pair; import org.flowerplatform.communication.channel.CommunicationChannel; import org.flowerplatform.communication.service.ServiceInvocationContext; import org.flowerplatform.web.communication.RecordingTestWebCommunicationChannel; import org.flowerplatform.web.database.DatabaseOperation; import org.flowerplatform.web.database.DatabaseOperationWrapper; import org.flowerplatform.web.entity.WorkingDirectory; import org.flowerplatform.web.projects.remote.FileManagerService; import org.flowerplatform.web.projects.remote.ProjectsService; import org.hibernate.Query; import org.junit.BeforeClass; import org.junit.Test; public class DeleteListenerTest { private static final CommunicationChannel communicationChannel = new RecordingTestWebCommunicationChannel(); private File fileSearched; public static File organization; public static ServiceInvocationContext context; public File getFileSearched() { return fileSearched; } public void setFileSearched(File fileSearched) { this.fileSearched = fileSearched; } private void searchFileInDir(File dir, String fileName) { File[] files = dir.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { searchFileInDir(f, fileName); } } } if (fileName.toLowerCase().equals(dir.getName().toLowerCase())) { setFileSearched(dir); } } @SuppressWarnings("unchecked") public List<WorkingDirectory> getWorkingDirectoriesForOrganizationName(final String organizationName) { return (List<WorkingDirectory>) new DatabaseOperationWrapper(new DatabaseOperation() { @Override public void run() { Query q = wrapper.createQuery(String.format( "SELECT e from WorkingDirectory e where e.organization.name = '%s'", organizationName)); wrapper.setOperationResult(q.list()); } }).getOperationResult(); } public WorkingDirectory getWorkingDirectory(final String organizationName, final String pathFromOrganization) { return (WorkingDirectory) new DatabaseOperationWrapper(new DatabaseOperation() { @Override public void run() { Query q = wrapper.createQuery(String .format("SELECT e from WorkingDirectory e where e.organization.name = '%s' and e.pathFromOrganization = '%s' ", organizationName, pathFromOrganization)); wrapper.setOperationResult(q.uniqueResult()); } }).getOperationResult(); } @BeforeClass public static void setUp() { File workspaceRoot = CommonPlugin.getInstance().getWorkspaceRoot(); String pathOfWorkspaceRoot = workspaceRoot.getPath(); organization = new File(pathOfWorkspaceRoot + "/" + SetUpTestEnviroment.FOLDER_TO_BE_COPIED_FOR_DELETE); context = new ServiceInvocationContext(communicationChannel); SetUpTestEnviroment.populateWorkspace(context, SetUpTestEnviroment.EVENT_DELETE); } @Test public void deleteProject() { String projectToBeDeletedName = "Project24"; searchFileInDir(organization, projectToBeDeletedName); File projectToBeDeleted = getFileSearched(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot wsRoot = workspace.getRoot(); String workingDirectoryName = "WorkingDirectory16"; searchFileInDir(organization, workingDirectoryName); File workingDirectory = getFileSearched(); // check if the maps are ok Map<File, List<File>> workingDirectoryToProjectsMapBeforeDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); int numberOfWorkingDirectoriesBeforeDelete = workingDirectoryToProjectsMapBeforeDelete.size(); int numberOfProjectsInWorkingDirectory = workingDirectoryToProjectsMapBeforeDelete.get(workingDirectory).size(); int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeDelete.size(); assertEquals(true, workingDirectoryToProjectsMapBeforeDelete.get(workingDirectory).contains(projectToBeDeleted)); assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeDelete.get(projectToBeDeleted)); // check if projectWrapper exists String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeDeleted); String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR); IProject projectWrapper = wsRoot.getProject(projectWrapperName); assertEquals(true, projectWrapper.exists()); // delete the project FileManagerService.getInstance().testDeleteFile(context, projectToBeDeleted); // check if the maps are up to date Map<File, List<File>> workingDirectoryToProjectsMapAfterDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapAfterDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); assertEquals(false, workingDirectoryToProjectsMapAfterDelete.get(workingDirectory).contains(projectToBeDeleted)); assertEquals(null, projectToWorkingDirectoryAndIProjectMapAfterDelete.get(projectToBeDeleted)); assertEquals(false, projectToWorkingDirectoryAndIProjectMapAfterDelete.isEmpty()); assertEquals(false, workingDirectoryToProjectsMapAfterDelete.isEmpty()); assertEquals(numberOfWorkingDirectoriesBeforeDelete, workingDirectoryToProjectsMapAfterDelete.size()); assertEquals(numberOfProjectsInWorkingDirectory - 1, workingDirectoryToProjectsMapAfterDelete.get(workingDirectory).size()); assertEquals(numberOfProjects - 1, projectToWorkingDirectoryAndIProjectMapAfterDelete.size()); // check if projectWrapper was deleted assertEquals(false, projectWrapper.exists()); } @Test public void deletePathToProject() { String projectToBeDeletedName = "Folder39"; searchFileInDir(organization, projectToBeDeletedName); File folderToBeDeleted = getFileSearched(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot wsRoot = workspace.getRoot(); String[] deletedProjectsNames = { "Project42", "Project43", "Project45" }; String[] notDeletedProjectsNames = { "Project40", "Project41" }; List<File> deletedProjects = new ArrayList<File>(); List<File> notDeletedProjects = new ArrayList<File>(); for (String deletedProjectName : deletedProjectsNames) { searchFileInDir(organization, deletedProjectName); deletedProjects.add(getFileSearched()); } for (String notDeletedProjectName : notDeletedProjectsNames) { searchFileInDir(organization, notDeletedProjectName); notDeletedProjects.add(getFileSearched()); } // check if the maps are ok String workingDirectoryName = "WorkingDirectory15"; searchFileInDir(organization, workingDirectoryName); File workingDirectory = getFileSearched(); Map<File, List<File>> workingDirectoryToProjectsMapBeforeDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); int numberOfWorkingDirectoriesBeforeDelete = workingDirectoryToProjectsMapBeforeDelete.size(); int numberOfProjectsInWorkingDirectory = workingDirectoryToProjectsMapBeforeDelete.get(workingDirectory).size(); int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeDelete.size(); for (File projectToBeDeleted : deletedProjects) { assertEquals(true, workingDirectoryToProjectsMapBeforeDelete.get(workingDirectory).contains(projectToBeDeleted)); assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeDelete.get(projectToBeDeleted)); String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeDeleted); String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR); IProject projectWrapper = wsRoot.getProject(projectWrapperName); assertEquals(true, projectWrapper.exists()); } // delete the path/to FileManagerService.getInstance().testDeleteFile(context, folderToBeDeleted); Map<File, List<File>> workingDirectoryToProjectsMapAfterDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapAfterDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); assertEquals(numberOfWorkingDirectoriesBeforeDelete, workingDirectoryToProjectsMapAfterDelete.size()); assertEquals(numberOfProjectsInWorkingDirectory - 3, workingDirectoryToProjectsMapAfterDelete.get(workingDirectory).size()); assertEquals(numberOfProjects - 3, projectToWorkingDirectoryAndIProjectMapAfterDelete.size()); assertEquals(false, projectToWorkingDirectoryAndIProjectMapAfterDelete.isEmpty()); assertEquals(false, workingDirectoryToProjectsMapAfterDelete.isEmpty()); for (File projectToBeDeleted : deletedProjects) { assertEquals(false, workingDirectoryToProjectsMapAfterDelete.get(workingDirectory).contains(projectToBeDeleted)); assertEquals(null, projectToWorkingDirectoryAndIProjectMapAfterDelete.get(projectToBeDeleted)); String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeDeleted); String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR); IProject projectWrapper = wsRoot.getProject(projectWrapperName); assertEquals(false, projectWrapper.exists()); } for (File projectNotToBeDeleted : notDeletedProjects) { assertEquals(true, workingDirectoryToProjectsMapAfterDelete.get(workingDirectory).contains(projectNotToBeDeleted)); assertNotNull(projectToWorkingDirectoryAndIProjectMapAfterDelete.get(projectNotToBeDeleted)); String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectNotToBeDeleted); String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR); IProject projectWrapper = wsRoot.getProject(projectWrapperName); assertEquals(true, projectWrapper.exists()); } } @Test public void deleteWorkingDirectory() { String workingDirectoryToBeDeletedName = "WorkingDirectory10"; searchFileInDir(organization, workingDirectoryToBeDeletedName); File workingDirectoryToBeDeleted = getFileSearched(); // check database List<WorkingDirectory> workDirs = getWorkingDirectoriesForOrganizationName(organization.getName()); int workDirsNumber; String relativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization( workingDirectoryToBeDeleted); WorkingDirectory workDir = getWorkingDirectory(organization.getName(), relativeNameFromOrg.substring(0, relativeNameFromOrg.length() - 1)); if (workDirs.isEmpty()) { workDirsNumber = 0; } else { workDirsNumber = workDirs.size(); } assertNotSame(0, workDirsNumber); assertEquals(true, workDirs.contains(workDir)); // check maps before delete String[] deletedProjectsNames = { "Project49", "Project50", "Project53", "Project54", "Project55", "Project58", "Project59" }; List<File> deletedProjects = new ArrayList<File>(); for (String deletedProjectName : deletedProjectsNames) { searchFileInDir(organization, deletedProjectName); deletedProjects.add(getFileSearched()); } Map<File, List<File>> workingDirectoryToProjectsMapBeforeDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); int numberOfWorkingDirectoriesBeforeDelete = workingDirectoryToProjectsMapBeforeDelete.size(); int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeDelete.size(); for (File projectToBeDeleted : deletedProjects) { assertEquals( true, workingDirectoryToProjectsMapBeforeDelete.get(workingDirectoryToBeDeleted).contains( projectToBeDeleted)); assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeDelete.get(projectToBeDeleted)); } assertNotNull(workingDirectoryToProjectsMapBeforeDelete.get(workingDirectoryToBeDeleted)); FileManagerService.getInstance().testDeleteFile(context, workingDirectoryToBeDeleted); // check maps after delete Map<File, List<File>> workingDirectoryToProjectsMapAfterDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapAfterDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); assertEquals(numberOfWorkingDirectoriesBeforeDelete - 1, workingDirectoryToProjectsMapAfterDelete.size()); assertEquals(numberOfProjects - 6, projectToWorkingDirectoryAndIProjectMapAfterDelete.size()); assertEquals(null, workingDirectoryToProjectsMapBeforeDelete.get(workingDirectoryToBeDeleted)); // check database workDirs = getWorkingDirectoriesForOrganizationName(organization.getName()); assertEquals(false, workDirs.contains(workDir)); assertEquals(workDirsNumber - 1, workDirs.size()); if (workDirs.isEmpty()) { workDirsNumber = 0; } else { workDirsNumber = workDirs.size(); } assertNotSame(0, workDirsNumber); } @Test public void deletePathToWorkingDirectory() { String projectToBeDeletedName = "Folder11"; searchFileInDir(organization, projectToBeDeletedName); File folderToBeDeleted = getFileSearched(); String[] deletedProjectsNames = { "Project70", "Project73", "Project76", "Project69", "Project75", "Project82", "Project83", "Project84", "Project85", "Project87", "Project88" }; String[] deletedWorkingDirectoriesNames = { "WorkingDirectory66", "WorkingDirectory67" }; List<File> deletedProjects = new ArrayList<File>(); List<File> deletedWorkingDirectories = new ArrayList<File>(); for (String deletedProjectName : deletedProjectsNames) { searchFileInDir(organization, deletedProjectName); deletedProjects.add(getFileSearched()); } for (String deletedWDName : deletedWorkingDirectoriesNames) { searchFileInDir(organization, deletedWDName); deletedWorkingDirectories.add(getFileSearched()); } // Check database List<WorkingDirectory> workDirs = getWorkingDirectoriesForOrganizationName(organization.getName()); int workDirsNumber; if (workDirs.isEmpty()) { workDirsNumber = 0; } else { workDirsNumber = workDirs.size(); } assertNotSame(0, workDirsNumber); for (File workingDirectoryToBeDeleted : deletedWorkingDirectories) { String relativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization( workingDirectoryToBeDeleted); WorkingDirectory workDir = getWorkingDirectory(organization.getName(), relativeNameFromOrg.substring(0, relativeNameFromOrg.length() - 1)); assertEquals(true, workDirs.contains(workDir)); } // check maps Map<File, List<File>> workingDirectoryToProjectsMapBeforeDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); int numberOfWorkingDirectoriesBeforeDelete = workingDirectoryToProjectsMapBeforeDelete.size(); int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeDelete.size(); for (File projectToBeDeleted : deletedProjects) { assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeDelete.get(projectToBeDeleted)); } for (File workingDirectoryToBeDeleted : deletedWorkingDirectories) { assertEquals(true, workingDirectoryToProjectsMapBeforeDelete.containsKey(workingDirectoryToBeDeleted)); assertNotNull(workingDirectoryToProjectsMapBeforeDelete.get(workingDirectoryToBeDeleted)); } FileManagerService.getInstance().testDeleteFile(context, folderToBeDeleted); // check maps after delete Map<File, List<File>> workingDirectoryToProjectsMapAfterDelete = ProjectsService.getInstance() .getWorkingDirectoryToProjectsMap(); Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapAfterDelete = ProjectsService .getInstance().getProjectToWorkingDirectoryAndIProjectMap(); assertEquals(numberOfWorkingDirectoriesBeforeDelete - 2, workingDirectoryToProjectsMapAfterDelete.size()); assertEquals(numberOfProjects - 11, projectToWorkingDirectoryAndIProjectMapAfterDelete.size()); for (File workingDirectoryToBeDeleted : deletedWorkingDirectories) { assertEquals(false, workingDirectoryToProjectsMapBeforeDelete.containsKey(workingDirectoryToBeDeleted)); } for (File projectToBeDeleted : deletedProjects) { assertEquals(false, projectToWorkingDirectoryAndIProjectMapBeforeDelete.containsKey(projectToBeDeleted)); } // check database after delete workDirs = getWorkingDirectoriesForOrganizationName(organization.getName()); for (File workingDirectoryToBeDeleted : deletedWorkingDirectories) { String relativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization( workingDirectoryToBeDeleted); WorkingDirectory workDir = getWorkingDirectory(organization.getName(), relativeNameFromOrg.substring(0, relativeNameFromOrg.length() - 1)); assertEquals(false, workDirs.contains(workDir)); } assertEquals(workDirsNumber - 2, workDirs.size()); if (workDirs.isEmpty()) { workDirsNumber = 0; } else { workDirsNumber = workDirs.size(); } assertNotSame(0, workDirsNumber); } }