package org.flowerplatform.web.tests.listener;
import static org.junit.Assert.*;
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 RenameListenerTest {
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_RENAME);
context = new ServiceInvocationContext(communicationChannel);
SetUpTestEnviroment.populateWorkspace(context, SetUpTestEnviroment.EVENT_RENAME);
}
@Test
public void renameProject() {
String projectToBeRenamedName = "Project24";
searchFileInDir(organization, projectToBeRenamedName);
File projectToBeRenamed = getFileSearched();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot wsRoot = workspace.getRoot();
String workingDirectoryName = "WorkingDirectory16";
searchFileInDir(organization, workingDirectoryName);
File workingDirectory = getFileSearched();
// check if the wrapper exists
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
// check if the maps are ok
Map<File, List<File>> workingDirectoryToProjectsMapBeforeRename = ProjectsService.getInstance()
.getWorkingDirectoryToProjectsMap();
Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeRename = ProjectsService
.getInstance().getProjectToWorkingDirectoryAndIProjectMap();
int numberOfWorkingDirectoriesBeforeRename = workingDirectoryToProjectsMapBeforeRename.size();
int numberOfProjectsInWorkingDirectory = workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).size();
int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeRename.size();
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(projectToBeRenamed));
assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeRename.get(projectToBeRenamed));
// do the rename
String renamedFileName = "NewProject24";
FileManagerService.getInstance().testRename(context, projectToBeRenamed, renamedFileName);
searchFileInDir(organization, renamedFileName);
File renamedFile = getFileSearched();
// check the 2 file states
assertEquals(false, projectToBeRenamed.exists());
assertEquals(true, renamedFile.exists());
assertEquals(false, projectWrapper.exists());
String newProjectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(renamedFile);
String newProjectWrapperName = newProjectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject newProjectWrapper = wsRoot.getProject(newProjectWrapperName);
assertEquals(true, newProjectWrapper.exists());
// check the maps
assertEquals(numberOfWorkingDirectoriesBeforeRename, workingDirectoryToProjectsMapBeforeRename.size());
assertEquals(numberOfProjectsInWorkingDirectory, workingDirectoryToProjectsMapBeforeRename
.get(workingDirectory).size());
assertEquals(numberOfProjects, projectToWorkingDirectoryAndIProjectMapBeforeRename.size());
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(renamedFile));
assertEquals(false, workingDirectoryToProjectsMapBeforeRename.get(workingDirectory)
.contains(projectToBeRenamed));
assertEquals(true, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(renamedFile));
assertEquals(false, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
assertEquals(true,
projectToWorkingDirectoryAndIProjectMapBeforeRename.get(renamedFile).b.equals(newProjectWrapper));
assertEquals(false,
projectToWorkingDirectoryAndIProjectMapBeforeRename.get(renamedFile).b.equals(projectWrapper));
}
@Test
public void renamePathToProject() {
String fileToBeRenamedName = "Folder39";
searchFileInDir(organization, fileToBeRenamedName);
File fileToBeRenamed = getFileSearched();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot wsRoot = workspace.getRoot();
// check if projects exist
String[] projectsToBeRenamedNames = { "Project42", "Project43", "Project45" };
String[] notRenamedProjectsNames = { "Project40", "Project41" };
List<File> projectsToBeRenamed = new ArrayList<File>();
List<File> notRenamedProjects = new ArrayList<File>();
for (String renamedProjectName : projectsToBeRenamedNames) {
searchFileInDir(organization, renamedProjectName);
projectsToBeRenamed.add(getFileSearched());
}
for (String notRenamedProjectName : notRenamedProjectsNames) {
searchFileInDir(organization, notRenamedProjectName);
notRenamedProjects.add(getFileSearched());
}
// check if the maps are ok
String workingDirectoryName = "WorkingDirectory15";
searchFileInDir(organization, workingDirectoryName);
File workingDirectory = getFileSearched();
Map<File, List<File>> workingDirectoryToProjectsMapBeforeRename = ProjectsService.getInstance()
.getWorkingDirectoryToProjectsMap();
Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeRename = ProjectsService
.getInstance().getProjectToWorkingDirectoryAndIProjectMap();
int numberOfWorkingDirectoriesBeforeRename = workingDirectoryToProjectsMapBeforeRename.size();
int numberOfProjectsInWorkingDirectory = workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).size();
int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeRename.size();
for (File projectToBeRenamed : projectsToBeRenamed) {
assertEquals(true,
workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(projectToBeRenamed));
assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeRename.get(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
// do the rename
String renamedFileName = "NewFolder39";
FileManagerService.getInstance().testRename(context, fileToBeRenamed, renamedFileName);
searchFileInDir(organization, renamedFileName);
File renamedFile = getFileSearched();
// check the 2 file states
assertEquals(false, fileToBeRenamed.exists());
assertEquals(true, renamedFile.exists());
// check the old projects
for (File projectToBeRenamed : projectsToBeRenamed) {
assertEquals(false,
workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(projectToBeRenamed));
assertEquals(false, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(false, projectWrapper.exists());
}
for (File notRenamedProject : notRenamedProjects) {
assertEquals(true,
workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(notRenamedProject));
assertEquals(true, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(notRenamedProject));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(notRenamedProject);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
// check the new project files
List<File> projectsRenamed = new ArrayList<File>();
for (String renamedProjectName : projectsToBeRenamedNames) {
searchFileInDir(organization, renamedProjectName);
projectsRenamed.add(getFileSearched());
}
for (File projectToBeRenamed : projectsRenamed) {
assertEquals(true,
workingDirectoryToProjectsMapBeforeRename.get(workingDirectory).contains(projectToBeRenamed));
assertEquals(true, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
// check maps
assertEquals(numberOfWorkingDirectoriesBeforeRename, workingDirectoryToProjectsMapBeforeRename.size());
assertEquals(numberOfProjectsInWorkingDirectory, workingDirectoryToProjectsMapBeforeRename
.get(workingDirectory).size());
assertEquals(numberOfProjects, projectToWorkingDirectoryAndIProjectMapBeforeRename.size());
}
@Test
public void renameWorkingDirectory() {
String workDirToBeRenamedName = "WorkingDirectory10";
searchFileInDir(organization, workDirToBeRenamedName);
File workDirToBeRenamed = getFileSearched();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot wsRoot = workspace.getRoot();
// check database
List<WorkingDirectory> workDirs = getWorkingDirectoriesForOrganizationName(organization.getName());
int workDirsNumber;
String relativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization(workDirToBeRenamed);
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 rename
String[] projectsToBeRenamedNames = { "Project49", "Project50", "Project53", "Project54", "Project55",
"Project58", "Project59" };
List<File> projectsToBeRenamed = new ArrayList<File>();
for (String renamedProjectName : projectsToBeRenamedNames) {
searchFileInDir(organization, renamedProjectName);
projectsToBeRenamed.add(getFileSearched());
}
Map<File, List<File>> workingDirectoryToProjectsMapBeforeRename = ProjectsService.getInstance()
.getWorkingDirectoryToProjectsMap();
Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeRename = ProjectsService
.getInstance().getProjectToWorkingDirectoryAndIProjectMap();
int numberOfWorkingDirectoriesBeforeRename = workingDirectoryToProjectsMapBeforeRename.size();
int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeRename.size();
for (File projectToBeRenamed : projectsToBeRenamed) {
assertEquals(true,
workingDirectoryToProjectsMapBeforeRename.get(workDirToBeRenamed).contains(projectToBeRenamed));
assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeRename.get(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
assertNotNull(workingDirectoryToProjectsMapBeforeRename.get(workDirToBeRenamed));
// make the rename
String renamedFileName = "NewWorkingDirectory10";
FileManagerService.getInstance().testRename(context, workDirToBeRenamed, renamedFileName);
searchFileInDir(organization, renamedFileName);
File renamedFile = getFileSearched();
// check the 2 file states
assertEquals(false, workDirToBeRenamed.exists());
assertEquals(true, renamedFile.exists());
// check the old projects
assertEquals(false, workingDirectoryToProjectsMapBeforeRename.containsKey(workDirToBeRenamed));
for (File projectToBeRenamed : projectsToBeRenamed) {
assertEquals(false, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(false, projectWrapper.exists());
}
// check the new ones
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.containsKey(renamedFile));
List<File> projectsRenamed = new ArrayList<File>();
for (String renamedProjectName : projectsToBeRenamedNames) {
searchFileInDir(organization, renamedProjectName);
projectsRenamed.add(getFileSearched());
}
for (File projectToBeRenamed : projectsRenamed) {
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.get(renamedFile).contains(projectToBeRenamed));
assertEquals(true, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
// check maps
assertEquals(numberOfWorkingDirectoriesBeforeRename, workingDirectoryToProjectsMapBeforeRename.size());
assertEquals(numberOfProjects, projectToWorkingDirectoryAndIProjectMapBeforeRename.size());
// check database
workDirs = getWorkingDirectoriesForOrganizationName(organization.getName());
String newRelativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization(renamedFile);
workDir = getWorkingDirectory(organization.getName(),
newRelativeNameFromOrg.substring(0, newRelativeNameFromOrg.length() - 1));
assertEquals(true, workDirs.contains(workDir));
assertEquals(workDirsNumber, workDirs.size());
}
@Test
public void renamePathToWorkingDirectory() {
String fileToBeRenamedName = "Folder11";
searchFileInDir(organization, fileToBeRenamedName);
File fileToBeRenamed = getFileSearched();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot wsRoot = workspace.getRoot();
String[] projectsToBeRenamedNames = { "Project70", "Project73", "Project76", "Project69", "Project75",
"Project82", "Project83", "Project84", "Project85", "Project87", "Project88" };
String[] workDirsToBeRenamedNames = { "WorkingDirectory66", "WorkingDirectory67" };
List<File> projectsToBeRenamed = new ArrayList<File>();
List<File> workDirsToBeRenamed = new ArrayList<File>();
for (String projectToBeRenamedName : projectsToBeRenamedNames) {
searchFileInDir(organization, projectToBeRenamedName);
projectsToBeRenamed.add(getFileSearched());
}
for (String workDirToBeRenamed : workDirsToBeRenamedNames) {
searchFileInDir(organization, workDirToBeRenamed);
workDirsToBeRenamed.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 workDirToBeRenamed : workDirsToBeRenamed) {
String relativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization(
workDirToBeRenamed);
WorkingDirectory workDir = getWorkingDirectory(organization.getName(),
relativeNameFromOrg.substring(0, relativeNameFromOrg.length() - 1));
assertEquals(true, workDirs.contains(workDir));
}
// check maps
Map<File, List<File>> workingDirectoryToProjectsMapBeforeRename = ProjectsService.getInstance()
.getWorkingDirectoryToProjectsMap();
Map<File, Pair<File, IProject>> projectToWorkingDirectoryAndIProjectMapBeforeRename = ProjectsService
.getInstance().getProjectToWorkingDirectoryAndIProjectMap();
int numberOfWorkingDirectoriesBeforeRename = workingDirectoryToProjectsMapBeforeRename.size();
int numberOfProjects = projectToWorkingDirectoryAndIProjectMapBeforeRename.size();
for (File projectToBeRenamed : projectsToBeRenamed) {
assertNotNull(projectToWorkingDirectoryAndIProjectMapBeforeRename.get(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
for (File workingDirectoryToBeRenamed : workDirsToBeRenamed) {
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.containsKey(workingDirectoryToBeRenamed));
assertNotNull(workingDirectoryToProjectsMapBeforeRename.get(workingDirectoryToBeRenamed));
}
// make the rename
String renamedFileName = "NewFolder11";
FileManagerService.getInstance().testRename(context, fileToBeRenamed, renamedFileName);
searchFileInDir(organization, renamedFileName);
File renamedFile = getFileSearched();
// check the 2 file states
assertEquals(false, fileToBeRenamed.exists());
assertEquals(true, renamedFile.exists());
// check the old projects
assertEquals(false, workingDirectoryToProjectsMapBeforeRename.containsKey(fileToBeRenamed));
for (File projectToBeRenamed : projectsToBeRenamed) {
assertEquals(false, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(false, projectWrapper.exists());
}
// check the new ones
List<File> projectsRenamed = new ArrayList<File>();
for (String renamedProjectName : projectsToBeRenamedNames) {
searchFileInDir(organization, renamedProjectName);
projectsRenamed.add(getFileSearched());
}
for (File projectToBeRenamed : projectsRenamed) {
assertEquals(true, projectToWorkingDirectoryAndIProjectMapBeforeRename.containsKey(projectToBeRenamed));
String projectPath = CommonPlugin.getInstance().getPathRelativeToWorkspaceRoot(projectToBeRenamed);
String projectWrapperName = projectPath.replace("/", ProjectsService.PROJECT_WRAPPER_NAME_SEPARATOR);
IProject projectWrapper = wsRoot.getProject(projectWrapperName);
assertEquals(true, projectWrapper.exists());
}
// check the old workdirs
for (File workingDirectoryToBeRenamed : workDirsToBeRenamed) {
assertEquals(false, workingDirectoryToProjectsMapBeforeRename.containsKey(workingDirectoryToBeRenamed));
}
// check the new ones
List<File> workDirsRenamed = new ArrayList<File>();
for (String workDirToBeRenamed : workDirsToBeRenamedNames) {
searchFileInDir(organization, workDirToBeRenamed);
workDirsRenamed.add(getFileSearched());
}
workDirs = getWorkingDirectoriesForOrganizationName(organization.getName());
for (File workingDirectoryRenamed : workDirsRenamed) {
assertEquals(true, workingDirectoryToProjectsMapBeforeRename.containsKey(workingDirectoryRenamed));
assertNotNull(workingDirectoryToProjectsMapBeforeRename.get(workingDirectoryRenamed));
// check database
String newRelativeNameFromOrg = ProjectsService.getInstance().getRelativePathFromOrganization(
workingDirectoryRenamed);
WorkingDirectory workDir = getWorkingDirectory(organization.getName(),
newRelativeNameFromOrg.substring(0, newRelativeNameFromOrg.length() - 1));
assertEquals(true, workDirs.contains(workDir));
}
assertEquals(workDirsNumber, workDirs.size());
// check maps
assertEquals(numberOfWorkingDirectoriesBeforeRename, workingDirectoryToProjectsMapBeforeRename.size());
assertEquals(numberOfProjects, projectToWorkingDirectoryAndIProjectMapBeforeRename.size());
}
}