package org.openflexo.foundation.reuse;
import java.io.File;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoTestCase;
import org.openflexo.foundation.action.ImportProject;
import org.openflexo.foundation.action.RemoveImportedProject;
import org.openflexo.foundation.resource.FlexoResourceCenterService;
import org.openflexo.foundation.resource.LocalResourceCenterImplementation;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.rm.FlexoProject.FlexoProjectReferenceLoader;
import org.openflexo.foundation.rm.FlexoProjectReference;
import org.openflexo.foundation.rm.ProjectData;
import org.openflexo.foundation.rm.SaveResourceException;
import org.openflexo.foundation.utils.ProjectLoadingCancelledException;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.FlexoWorkflow;
import org.openflexo.foundation.wkf.action.AddRole;
import org.openflexo.foundation.wkf.node.SubProcessNode;
import org.openflexo.model.exceptions.ModelDefinitionException;
import org.openflexo.model.factory.ModelFactory;
import org.openflexo.toolbox.FileUtils;
public class TestProjectReuse extends FlexoTestCase {
private static final String SUB_PROCESS_NAME = "My Sub Process";
private static final String SUB_PROCESS_NODE_NAME = "A Sub Process Node";
private static final String ROLE_NAME = "My role";
private FlexoResourceCenterService resourceCenter;
private File rootProjectDirectory;
private File importedProjectDirectory;
private FlexoEditor rootEditor;
private FlexoProject rootProject;
private FlexoEditor importedProjectEditor;
private FlexoProject importedProject;
class ProjectReferenceLoader implements FlexoProjectReferenceLoader {
@Override
public FlexoProject loadProject(FlexoProjectReference reference, boolean silentlyOnly) {
if (importedProject == null) {
importedProject = reloadProject(importedProjectDirectory, resourceCenter, this).getProject();
}
return importedProject;
}
}
public void testProjectDataClassValidity() throws ModelDefinitionException {
ModelFactory factory = new ModelFactory(ProjectData.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
resourceCenter = getNewResourceCenter("TestImport");
rootEditor = createProject("RootTestImport", resourceCenter);
rootProject = rootEditor.getProject();
importedProjectEditor = createProject("ImportedProject", resourceCenter);
importedProject = importedProjectEditor.getProject();
rootProjectDirectory = rootProject.getProjectDirectory();
importedProjectDirectory = importedProject.getProjectDirectory();
}
@Override
protected void tearDown() throws Exception {
if (resourceCenter != null && resourceCenter.getOpenFlexoResourceCenter() instanceof LocalResourceCenterImplementation) {
FileUtils.deleteDir(((LocalResourceCenterImplementation) resourceCenter.getOpenFlexoResourceCenter()).getLocalDirectory());
}
if (rootProject != null) {
rootProject.close();
FileUtils.deleteDir(rootProject.getProjectDirectory());
}
if (importedProject != null) {
importedProject.close();
FileUtils.deleteDir(importedProject.getProjectDirectory());
}
super.tearDown();
}
public void testImportProject() throws SaveResourceException, ProjectLoadingCancelledException {
ImportProject importProject = ImportProject.actionType.makeNewAction(rootProject, null, rootEditor);
importProject.setProjectToImport(importedProject);
importProject.doAction();
assertTrue("Import project action failed", importProject.hasActionExecutionSucceeded());
ImportProject importProjectThatShouldFail = ImportProject.actionType.makeNewAction(rootProject, null, rootEditor);
importProjectThatShouldFail.setProjectToImport(importedProject);
importProjectThatShouldFail.doAction();
assertFalse("Import project action succeeded while it should have failed",
importProjectThatShouldFail.hasActionExecutionSucceeded());
importedProject.save();
rootProject.save();
rootProject.close();
importedProject.close();
importedProject = null;
rootEditor = reloadProject(rootProjectDirectory, resourceCenter, new ProjectReferenceLoader());
rootProject = rootEditor.getProject();
assertEquals(1, rootProject.getProjectData().getImportedProjects().size());
importProjectThatShouldFail = ImportProject.actionType.makeNewAction(rootProject, null, rootEditor);
importProjectThatShouldFail
.setProjectToImport(reloadProject(importedProjectDirectory, resourceCenter, new ProjectReferenceLoader()).getProject());
importProjectThatShouldFail.doAction();
assertFalse("Import project action succeeded while it should have failed",
importProjectThatShouldFail.hasActionExecutionSucceeded());
FlexoProjectReference importedProjectReference = rootProject.getProjectData().getImportedProjects().get(0);
FlexoWorkflow workflow = importedProjectReference.getWorkflow();
assertNotNull(workflow);
FlexoWorkflow resourceWorkflow = rootProject.getImportedWorkflow(importedProjectReference, false);
assertNotNull(resourceWorkflow);
assertSame(resourceWorkflow, workflow);
importedProjectReference.getReferredProject(true);
assertNotNull(rootProject.getProjectData(false));
assertNotNull(importedProject); // Imported project should be automatically re-assigned a new value with the project reference
// loader
assertSame(importedProject.getWorkflow(), importedProjectReference.getWorkflow());
assertNotSame(importedProject.getWorkflow(), workflow);
assertEquals(1, rootProject.getProjectData().getImportedProjects().size());
assertEquals(importedProject, importedProjectReference.getReferredProject());
}
public void testReuseProcess() throws SaveResourceException {
AddRole addRole = AddRole.actionType.makeNewAction(importedProject.getFlexoWorkflow(true), null, importedProjectEditor);
addRole.setNewRoleName(ROLE_NAME);
addRole.doAction();
assertTrue(addRole.hasActionExecutionSucceeded());
assertNotNull(addRole.getNewRole());
assertEquals(addRole.getNewRole(), importedProject.getWorkflow().getRoleList().roleWithName(ROLE_NAME));
ImportProject importProject = ImportProject.actionType.makeNewAction(rootProject, null, rootEditor);
importProject.setProjectToImport(importedProject);
importProject.doAction();
assertTrue("Import project action failed", importProject.hasActionExecutionSucceeded());
FlexoProcess subProcess = createSubProcess(SUB_PROCESS_NAME, null, importedProjectEditor);
SubProcessNode subProcessNode = instanciateLoopSubProcess(subProcess, rootProject.getRootProcess(), 400, 200, rootEditor);
subProcessNode.setName(SUB_PROCESS_NODE_NAME);
subProcessNode.setRole(importedProject.getWorkflow().getRoleList().roleWithName(ROLE_NAME));
assertDepends(rootProject.getRootProcess().getFlexoResource(), subProcess.getFlexoResource());
importedProject.save();
rootProject.save();
rootProject.close();
importedProject.close();
importedProject = null;
rootEditor = reloadProject(rootProjectDirectory, resourceCenter, new ProjectReferenceLoader());
rootProject = rootEditor.getProject();
rootProject.getProjectData().getImportedProjects().get(0).getReferredProject(true);
assertNotNull(importedProject); // Imported project should be automatically re-assigned a new value with the project reference
// loader
subProcess = importedProject.getWorkflow().getLocalFlexoProcessWithName(SUB_PROCESS_NAME);
subProcessNode = rootProject.getRootProcess().getActivityPetriGraph().getSubProcessNodeNamed(SUB_PROCESS_NODE_NAME);
assertNotNull(subProcessNode);
assertNotNull(subProcessNode.getSubProcess());
assertNotNull(subProcessNode.getRole());
assertEquals(importedProject.getWorkflow().getRoleList().roleWithName(ROLE_NAME), subProcessNode.getRole());
assertEquals(subProcessNode.getSubProcess(), subProcess);
assertEquals(subProcessNode.getSubProcess().getProject(), subProcess.getProject());
assertEquals(importedProject, subProcessNode.getSubProcess().getProject());
assertDepends(rootProject.getRootProcess().getFlexoResource(), subProcess.getFlexoResource());
RemoveImportedProject remove = RemoveImportedProject.actionType.makeNewAction(rootProject, null, rootEditor);
remove.setProjectToRemoveURI(importedProject.getURI());
remove.doAction();
assertTrue(remove.hasActionExecutionSucceeded());
assertNull(subProcessNode.getRole());
assertNull(subProcessNode.getSubProcess());
assertNull(subProcessNode.getSubProcessReference());
}
}