/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.generator;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.openflexo.foundation.CodeType;
import org.openflexo.foundation.cg.templates.CGTemplate;
import org.openflexo.foundation.cg.templates.CGTemplateFile;
import org.openflexo.foundation.cg.templates.CGTemplateFile.TemplateFileContentEditor;
import org.openflexo.foundation.cg.templates.action.AddCustomTemplateRepository;
import org.openflexo.foundation.cg.templates.action.EditCustomTemplateFile;
import org.openflexo.foundation.cg.templates.action.RedefineCustomTemplateFile;
import org.openflexo.foundation.cg.templates.action.SaveCustomTemplateFile;
import org.openflexo.foundation.cg.utils.TemplateRepositoryType;
import org.openflexo.foundation.dm.FlexoExecutionModelRepository;
import org.openflexo.foundation.dm.eo.EOPrototypeRepository;
import org.openflexo.foundation.ie.IETabComponent;
import org.openflexo.foundation.ie.action.AddTab;
import org.openflexo.foundation.ie.action.DropIEElement;
import org.openflexo.foundation.ie.cl.FlexoComponentFolder;
import org.openflexo.foundation.ie.cl.OperationComponentDefinition;
import org.openflexo.foundation.ie.cl.action.AddComponent;
import org.openflexo.foundation.ie.cl.action.AddComponent.ComponentType;
import org.openflexo.foundation.ie.util.WidgetType;
import org.openflexo.foundation.ie.widget.IEBlocWidget;
import org.openflexo.foundation.ie.widget.IEHTMLTableWidget;
import org.openflexo.foundation.ie.widget.IESequenceTab;
import org.openflexo.foundation.rm.FlexoMemoryResource;
import org.openflexo.foundation.rm.FlexoResource;
import org.openflexo.foundation.rm.FlexoResourceData;
import org.openflexo.foundation.rm.FlexoResourceManager;
import org.openflexo.foundation.rm.FlexoResourceManager.BackwardSynchronizationHook;
import org.openflexo.foundation.rm.FlexoStorageResource;
import org.openflexo.foundation.rm.StorageResourceData;
import org.openflexo.foundation.rm.cg.GenerationStatus;
import org.openflexo.foundation.utils.FlexoProjectFile;
import org.openflexo.foundation.wkf.WKFElementType;
import org.openflexo.foundation.wkf.action.AddSubProcess;
import org.openflexo.foundation.wkf.action.DropWKFElement;
import org.openflexo.foundation.wkf.action.OpenOperationLevel;
import org.openflexo.foundation.wkf.action.SetAndOpenOperationComponent;
import org.openflexo.foundation.wkf.node.ActivityNode;
import org.openflexo.foundation.wkf.node.OperationNode;
import org.openflexo.foundation.wkf.node.SubProcessNode;
import org.openflexo.foundation.wkf.utils.OperationAssociatedWithComponentSuccessfully;
import org.openflexo.generator.action.GenerateSourceCode;
import org.openflexo.generator.action.SynchronizeRepositoryCodeGeneration;
import org.openflexo.generator.action.WriteModifiedGeneratedFiles;
import org.openflexo.generator.exception.TemplateNotFoundException;
import org.openflexo.logging.FlexoLoggingManager;
import org.openflexo.toolbox.FileUtils;
public class TestCG extends CGTestCase {
public TestCG() {
super(TEST_CG);
}
public TestCG(String testName) {
super(testName);
}
protected static final Logger logger = Logger.getLogger(TestCG.class.getPackage().getName());
private static final String TEST_CG = "TestCG";
private static DebugBackwardSynchronizationHook _bsHook;
public static Test suite() {
final TestSuite suite = new TestSuite("TestSuite for TestCG");
suite.addTest(new TestCG("test0CreateProject"));
suite.addTest(new TestCG("test1CheckResources"));
suite.addTest(new TestCG("test2CreateSubProcessAndCheckResources"));
suite.addTest(new TestCG("test3CreateSubProcessNodeAndCheckResources"));
suite.addTest(new TestCG("test4CreateOperationAndCheckResources"));
suite.addTest(new TestCG("test5EditOperationComponent1"));
suite.addTest(new TestCG("test6CreateOperationComponent2"));
suite.addTest(new TestCG("test7CreateOperationComponent3"));
suite.addTest(new TestCG("test8CreateSubProcessNodeAndCheckResources"));
suite.addTest(new TestCG("test9InitializeCodeGeneration"));
suite.addTest(new TestCG("test10ValidateProject"));
suite.addTest(new TestCG("test11SynchronizeCodeGeneration"));
suite.addTest(new TestCG("test12CheckAllGeneratedResourcesDependancies"));
suite.addTest(new TestCG("test13CheckGeneratedResourcesStatus"));
suite.addTest(new TestCG("test14CheckOptimisticDependancyCheckingWithDataModel"));
suite.addTest(new TestCG("test15CheckOptimisticDependancyCheckingWithProcesses"));
suite.addTest(new TestCG("test16CheckOptimisticDependancyCheckingWithComponents"));
suite.addTest(new TestCG("test17CheckResourceDynamicDependancyRebuilding"));
suite.addTest(new TestCG("test18CheckTemplateDependancies"));
return suite;
}
/**
* Creates a new empty project in a temp directory
*/
public void test0CreateProject() {
log("test0CreateProject");
FlexoLoggingManager.forceInitialize(-1, true, null, Level.INFO, null);
createProject(TEST_CG);
_bsHook = new DebugBackwardSynchronizationHook();
FlexoResourceManager.setBackwardSynchronizationHook(_bsHook);
}
/**
* Check that resources and dependencies were correctly built
*/
public void test1CheckResources() {
log("test1CheckResources");
assertNotNull(_rmResource = _project.getFlexoRMResource());
assertNotNull(_wkfResource = _project.getFlexoWorkflowResource());
assertNotNull(_dmResource = _project.getFlexoDMResource());
assertNotNull(_dkvResource = _project.getFlexoDKVResource());
assertNotNull(_clResource = _project.getFlexoComponentLibraryResource());
assertNotNull(_menuResource = _project.getFlexoNavigationMenuResource());
assertNotNull(_rootProcessResource = _project.getFlexoProcessResource(_projectIdentifier));
assertNotNull(_executionModelResource = _project.getEOModelResource(FlexoExecutionModelRepository.EXECUTION_MODEL_DIR.getName()));
assertNotNull(_eoPrototypesResource = _project.getEOModelResource(EOPrototypeRepository.EOPROTOTYPE_REPOSITORY_DIR.getName()));
for (FlexoResource<? extends FlexoResourceData> resource : _project) {
if (resource != _rmResource && !(resource instanceof FlexoMemoryResource)) {
assertSynchonized(resource, _rmResource);
}
}
assertSynchonized(_dmResource, _executionModelResource);
assertSynchonized(_dmResource, _eoPrototypesResource);
assertSynchonized(_wkfResource, _rootProcessResource);
assertDepends(_rootProcessResource, _dmResource);
assertNotDepends(_rootProcessResource, _clResource);
logger.info("Resources are WELL created and DEPENDANCIES checked");
for (FlexoResource resource : _project.getResources().values()) {
if (resource instanceof FlexoStorageResource) {
assertNotModified((FlexoStorageResource) resource);
}
}
logger.info("Resources are marked as NOT MODIFIED");
}
/**
* Add a new sub-process and check resource dependancies
*/
public void test2CreateSubProcessAndCheckResources() {
log("test2CreateSubProcessAndCheckResources");
AddSubProcess action = AddSubProcess.actionType.makeNewAction(_rootProcessResource.getFlexoProcess(), null, _editor);
action.setParentProcess(_rootProcessResource.getFlexoProcess());
action.setNewProcessName(TEST_SUB_PROCESS);
action.doAction();
logger.info("SubProcess " + action.getNewProcess().getName() + " successfully created");
defineStatusColumn(_rootProcessResource.getFlexoProcess());
_subProcessResource = _project.getFlexoProcessResource(TEST_SUB_PROCESS);
assertNotNull(_subProcessResource);
assertSynchonized(_subProcessResource, _rmResource);
assertSynchonized(_subProcessResource, _wkfResource);
assertDepends(_subProcessResource, _dmResource);
assertNotDepends(_subProcessResource, _clResource);
for (FlexoResource<? extends FlexoResourceData> resource : _project) {
if (resource == _rmResource) {
assertModified(_rmResource);
} else if (resource == _dmResource) {
assertModified(_dmResource);
} else if (resource == _wkfResource) {
assertModified(_wkfResource);
} else if (resource == _rootProcessResource) {
assertModified(_rootProcessResource);
} else if (resource == _subProcessResource) {
assertModified(_subProcessResource);
} else if (resource instanceof FlexoStorageResource) {
assertNotModified((FlexoStorageResource) resource);
}
}
}
/**
* Add a new sub-process node, check dependancies
*/
public void test3CreateSubProcessNodeAndCheckResources() {
log("test3CreateSubProcessNodeAndCheckResources");
DropWKFElement action = DropWKFElement.actionType.makeNewAction(_rootProcessResource.getFlexoProcess().getActivityPetriGraph(),
null, _editor);
action.setElementType(WKFElementType.MULTIPLE_INSTANCE_PARALLEL_SUB_PROCESS_NODE);
action.setParameter(DropWKFElement.SUB_PROCESS, _subProcessResource.getFlexoProcess());
action.setLocation(100, 100);
action.doAction();
assertTrue(action.hasActionExecutionSucceeded());
_subProcessNode = (SubProcessNode) action.getObject();
_subProcessNode.setName(TEST_SUB_PROCESS_NODE);
defineStatusColumn(_subProcessResource.getFlexoProcess());
logger.info("SubProcessNode " + _subProcessNode.getName() + " successfully created");
assertDepends(_rootProcessResource, _subProcessResource);
saveProject();
}
/**
* Open operation level, drop a new operation, and associate it a new operation component
*/
public void test4CreateOperationAndCheckResources() {
log("test4CreateOperationAndCheckResources");
OpenOperationLevel openOperationLevel = OpenOperationLevel.actionType.makeNewAction(_subProcessNode, null, _editor);
openOperationLevel.doAction();
DropWKFElement dropOperation = DropWKFElement.actionType.makeNewAction(_subProcessNode.getOperationPetriGraph(), null, _editor);
dropOperation.setElementType(WKFElementType.NORMAL_OPERATION);
dropOperation.setLocation(100, 100);
dropOperation.doAction();
assertTrue(dropOperation.hasActionExecutionSucceeded());
_operationNode = (OperationNode) dropOperation.getObject();
_operationNode.setName(TEST_OPERATION_NODE_1);
logger.info("OperationNode " + _operationNode.getName() + " successfully created");
SetAndOpenOperationComponent setOperationComponent = SetAndOpenOperationComponent.actionType.makeNewAction(_operationNode, null,
_editor);
setOperationComponent.setNewComponentName(OPERATION_COMPONENT_1);
setOperationComponent.doAction();
assertTrue(setOperationComponent.hasActionExecutionSucceeded());
_operationComponentResource1 = _project.getFlexoOperationComponentResource(OPERATION_COMPONENT_1);
assertNotNull(_operationComponentResource1);
assertSynchonized(_operationComponentResource1, _rmResource);
assertSynchonized(_operationComponentResource1, _clResource);
assertDepends(_operationComponentResource1, _dmResource);
assertDepends(_rootProcessResource, _operationComponentResource1);
saveProject();
}
/**
* Edit this new component by adding 3 blocks
*/
public void test5EditOperationComponent1() {
log("test5EditOperationComponent1");
_operationComponent1 = _operationComponentResource1.getIEOperationComponent();
assertNotNull(_operationComponent1);
// Insert a new bloc at index 0, name it Bloc1
DropIEElement dropBloc1 = DropIEElement.createBlocInComponent(_operationComponent1, 0, _editor);
assertTrue(dropBloc1.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc1 = (IEBlocWidget) dropBloc1.getDroppedWidget();
assertNotNull(bloc1);
bloc1.setTitle("Bloc1");
// Insert a new bloc at index 1, name it Bloc2
DropIEElement dropBloc2 = DropIEElement.createBlocInComponent(_operationComponent1, 1, _editor);
assertTrue(dropBloc2.doAction().hasActionExecutionSucceeded());
_bloc2 = (IEBlocWidget) dropBloc2.getDroppedWidget();
assertNotNull(_bloc2);
_bloc2.setTitle("Bloc2");
// Insert a new bloc at index 1, name it Bloc3
// This bloc is therefore placed between Bloc1 and Bloc2
DropIEElement dropBloc3 = DropIEElement.createBlocInComponent(_operationComponent1, 1, _editor);
assertTrue(dropBloc3.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc3 = (IEBlocWidget) dropBloc3.getDroppedWidget();
assertNotNull(bloc3);
bloc3.setTitle("Bloc3");
// Drop a table in the bloc2
DropIEElement dropTable = DropIEElement.createTableInBloc(_bloc2, _editor);
assertTrue(dropTable.doAction().hasActionExecutionSucceeded());
IEHTMLTableWidget table = (IEHTMLTableWidget) dropTable.getDroppedWidget();
assertNotNull(table);
// Drop a label in the table, at cell (0,0) at position 0
DropIEElement dropLabel = DropIEElement.insertWidgetInTable(table, WidgetType.LABEL, 0, 0, 0, _editor);
assertTrue(dropLabel.doAction().hasActionExecutionSucceeded());
// Drop a TextField in the table, at cell (0,1) at position 0
DropIEElement dropTF = DropIEElement.insertWidgetInTable(table, WidgetType.TEXTFIELD, 0, 1, 0, _editor);
assertTrue(dropTF.doAction().hasActionExecutionSucceeded());
// Now, drop a TabsContainer
DropIEElement dropTabs = DropIEElement.createTabsInComponent(_operationComponent1, 3, _editor);
assertTrue(dropTabs.doAction().hasActionExecutionSucceeded());
IESequenceTab tabs = (IESequenceTab) dropTabs.getDroppedWidget();
FlexoComponentFolder rootFolder = _project.getFlexoComponentLibrary().getRootFolder();
// Put Tab1 inside
AddTab addTab1 = AddTab.actionType.makeNewAction(tabs, null, _editor);
addTab1.setFolder(rootFolder);
addTab1.setTabTitle("Tab1Title");
addTab1.setTabName(TAB_COMPONENT1);
addTab1.setTabContainer(tabs);
assertTrue(addTab1.doAction().hasActionExecutionSucceeded());
_tab1 = addTab1.getTabDef();
// Put Tab2 inside
AddTab addTab2 = AddTab.actionType.makeNewAction(tabs, null, _editor);
addTab2.setFolder(rootFolder);
addTab2.setTabTitle("Tab2Title");
addTab2.setTabName(TAB_COMPONENT2);
addTab2.setTabContainer(tabs);
assertTrue(addTab2.doAction().hasActionExecutionSucceeded());
_tab2 = addTab2.getTabDef();
assertModified(_operationComponentResource1);
// Save project
saveProject();
}
/**
* Creates a new operation component 2
*/
public void test6CreateOperationComponent2() {
log("test6CreateOperationComponent2");
AddComponent addComponent = AddComponent.actionType.makeNewAction(_project.getFlexoComponentLibrary(), null, _editor);
addComponent.setNewComponentName(OPERATION_COMPONENT_2);
addComponent.setComponentType(AddComponent.ComponentType.OPERATION_COMPONENT);
addComponent.doAction();
assertTrue(addComponent.hasActionExecutionSucceeded());
_operationComponentResource2 = _project.getFlexoOperationComponentResource(OPERATION_COMPONENT_2);
assertNotNull(_operationComponentResource2);
assertSynchonized(_operationComponentResource2, _rmResource);
assertSynchonized(_operationComponentResource2, _clResource);
assertDepends(_operationComponentResource2, _dmResource);
_operationComponent2 = _operationComponentResource2.getIEOperationComponent();
assertNotNull(_operationComponent2);
// Insert a new bloc at index 0, name it Bloc1
DropIEElement dropBloc1 = DropIEElement.createBlocInComponent(_operationComponent2, 0, _editor);
assertTrue(dropBloc1.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc1 = (IEBlocWidget) dropBloc1.getDroppedWidget();
assertNotNull(bloc1);
bloc1.setTitle("NewBloc");
// Now, drop a TabsContainer
DropIEElement dropTabs = DropIEElement.createTabsInComponent(_operationComponent2, 1, _editor);
assertTrue(dropTabs.doAction().hasActionExecutionSucceeded());
IESequenceTab tabs = (IESequenceTab) dropTabs.getDroppedWidget();
FlexoComponentFolder rootFolder = _project.getFlexoComponentLibrary().getRootFolder();
// Put Tab1 inside
AddTab addTab1 = AddTab.actionType.makeNewAction(tabs, null, _editor);
addTab1.setFolder(rootFolder);
addTab1.setTabTitle("Tab1Title");
addTab1.setTabDef(_tab1);
addTab1.setTabContainer(tabs);
assertTrue(addTab1.doAction().hasActionExecutionSucceeded());
saveProject();
}
/**
* Creates a new operation component 3
*/
public void test7CreateOperationComponent3() {
log("test7CreateOperationComponent3");
AddComponent addComponent = AddComponent.actionType.makeNewAction(_project.getFlexoComponentLibrary(), null, _editor);
addComponent.setNewComponentName(OPERATION_COMPONENT_3);
addComponent.setComponentType(AddComponent.ComponentType.OPERATION_COMPONENT);
addComponent.doAction();
assertTrue(addComponent.hasActionExecutionSucceeded());
_operationComponentResource3 = _project.getFlexoOperationComponentResource(OPERATION_COMPONENT_3);
assertNotNull(_operationComponentResource3);
assertSynchonized(_operationComponentResource3, _rmResource);
assertSynchonized(_operationComponentResource3, _clResource);
assertDepends(_operationComponentResource3, _dmResource);
_operationComponent3 = _operationComponentResource3.getIEOperationComponent();
assertNotNull(_operationComponent3);
// Insert a new bloc at index 0, name it Bloc1
DropIEElement dropBloc1 = DropIEElement.createBlocInComponent(_operationComponent3, 0, _editor);
assertTrue(dropBloc1.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc1 = (IEBlocWidget) dropBloc1.getDroppedWidget();
assertNotNull(bloc1);
bloc1.setTitle("NewBloc");
// Now, drop a TabsContainer
DropIEElement dropTabs = DropIEElement.createTabsInComponent(_operationComponent3, 1, _editor);
assertTrue(dropTabs.doAction().hasActionExecutionSucceeded());
IESequenceTab tabs = (IESequenceTab) dropTabs.getDroppedWidget();
FlexoComponentFolder rootFolder = _project.getFlexoComponentLibrary().getRootFolder();
// Put Tab2 inside
AddTab addTab2 = AddTab.actionType.makeNewAction(tabs, null, _editor);
addTab2.setFolder(rootFolder);
addTab2.setTabTitle("Tab2Title");
addTab2.setTabDef(_tab2);
addTab2.setTabContainer(tabs);
assertTrue(addTab2.doAction().hasActionExecutionSucceeded());
saveProject();
}
/**
* Add a new sub-process node, check dependancies
*/
public void test8CreateSubProcessNodeAndCheckResources() {
log("test8CreateSubProcessNodeAndCheckResources");
DropWKFElement addActivity = DropWKFElement.actionType.makeNewAction(_subProcessResource.getFlexoProcess().getActivityPetriGraph(),
null, _editor);
addActivity.setElementType(WKFElementType.NORMAL_ACTIVITY);
addActivity.setLocation(100, 100);
addActivity.doAction();
assertTrue(addActivity.hasActionExecutionSucceeded());
ActivityNode activityNode = (ActivityNode) addActivity.getObject();
activityNode.setName(TEST_ACTIVITY_IN_SUB_PROCESS);
logger.info("ActivityNode " + activityNode.getName() + " successfully created");
OpenOperationLevel openOperationLevel = OpenOperationLevel.actionType.makeNewAction(activityNode, null, _editor);
openOperationLevel.doAction();
DropWKFElement dropOperation2 = DropWKFElement.actionType.makeNewAction(activityNode.getOperationPetriGraph(), null, _editor);
dropOperation2.setElementType(WKFElementType.NORMAL_OPERATION);
dropOperation2.setLocation(10, 50);
dropOperation2.doAction();
assertTrue(dropOperation2.hasActionExecutionSucceeded());
OperationNode operationNode2 = (OperationNode) dropOperation2.getObject();
operationNode2.setName(TEST_OPERATION_NODE_2);
logger.info("OperationNode " + operationNode2.getName() + " successfully created");
SetAndOpenOperationComponent setOperationComponent2 = SetAndOpenOperationComponent.actionType.makeNewAction(operationNode2, null,
_editor);
setOperationComponent2.setNewComponentName(OPERATION_COMPONENT_2);
setOperationComponent2.doAction();
assertTrue(setOperationComponent2.hasActionExecutionSucceeded());
DropWKFElement dropOperation3 = DropWKFElement.actionType.makeNewAction(activityNode.getOperationPetriGraph(), null, _editor);
dropOperation3.setElementType(WKFElementType.NORMAL_OPERATION);
dropOperation3.setLocation(100, 50);
dropOperation3.doAction();
assertTrue(dropOperation3.hasActionExecutionSucceeded());
OperationNode operationNode3 = (OperationNode) dropOperation3.getObject();
operationNode3.setName(TEST_OPERATION_NODE_3);
logger.info("OperationNode " + operationNode3.getName() + " successfully created");
SetAndOpenOperationComponent setOperationComponent3 = SetAndOpenOperationComponent.actionType.makeNewAction(operationNode3, null,
_editor);
setOperationComponent3.setNewComponentName(OPERATION_COMPONENT_3);
setOperationComponent3.doAction();
assertTrue(setOperationComponent3.hasActionExecutionSucceeded());
saveProject();
}
/**
* Reload project, Initialize code generation
*/
public void test9InitializeCodeGeneration() {
log("test9InitializeCodeGeneration");
reloadProject(true);
// Save RM for eventual back-synchro to be saved
saveProject();
logger.info("Done. Now check that no other back-synchro");
// Let eventual dependancies back-synchronize together
reloadProject(true); // This time, all must be not modified
for (FlexoStorageResource<? extends StorageResourceData> resource : _project.getStorageResources()) {
assertNotModified(resource);
}
File directory = new File(_projectDirectory.getParentFile(), "GeneratedCodeFor" + _project.getProjectName());
directory.mkdirs();
createDefaultGCRepository();
codeRepository.setTargetType(CodeType.PROTOTYPE);
}
/**
* Reload project, Initialize code generation
*/
public void test10ValidateProject() {
log("test10ValidateProject");
assertProjectIsValid(codeRepository);
// rootFolder.setComponentPrefix("TST");
// To fix errors we need another process and operation on which we will bind the menu
AddSubProcess process = AddSubProcess.actionType.makeNewAction(_project.getFlexoWorkflow(), null, _editor);
process.setNewProcessName("Process context free");
process.doAction();
defineStatusColumn(process.getNewProcess());
DropWKFElement addActivity = DropWKFElement.actionType
.makeNewAction(process.getNewProcess().getActivityPetriGraph(), null, _editor);
addActivity.setElementType(WKFElementType.NORMAL_ACTIVITY);
addActivity.setLocation(100, 100);
addActivity.doAction();
assertTrue(addActivity.hasActionExecutionSucceeded());
ActivityNode activityNode = (ActivityNode) addActivity.getObject();
logger.info("ActivityNode " + activityNode.getName() + " successfully created");
OpenOperationLevel openOperationLevel = OpenOperationLevel.actionType.makeNewAction(activityNode, null, _editor);
openOperationLevel.doAction();
DropWKFElement dropOperation2 = DropWKFElement.actionType.makeNewAction(activityNode.getOperationPetriGraph(), null, _editor);
dropOperation2.setElementType(WKFElementType.NORMAL_OPERATION);
dropOperation2.setLocation(10, 50);
dropOperation2.doAction();
assertTrue(dropOperation2.hasActionExecutionSucceeded());
OperationNode operationNodeForMenu = (OperationNode) dropOperation2.getObject();
operationNodeForMenu.setName("OperationNodeForMenu");
// We also need to set a screen on the operation node
AddComponent addComponent = AddComponent.actionType.makeNewAction(_project.getFlexoComponentLibrary(), null, _editor);
addComponent.setComponentType(ComponentType.OPERATION_COMPONENT);
addComponent.setNewComponentName("DummyComponentForMenu");
addComponent.doAction();
assertTrue(addComponent.hasActionExecutionSucceeded());
try {
operationNodeForMenu.setOperationComponent((OperationComponentDefinition) addComponent.getNewComponent());
} catch (OperationAssociatedWithComponentSuccessfully e) {
// Normal
}
logger.info("OperationNode " + operationNodeForMenu.getName() + " successfully created");
_project.getFlexoNavigationMenu().getRootMenu().setProcess(operationNodeForMenu.getProcess());
_project.getFlexoNavigationMenu().getRootMenu().setOperation(operationNodeForMenu);
// now we have to define tabs for operations
associateTabWithOperations();
// Project should be without errors now
assertProjectIsValid(codeRepository);
}
/**
* Reload project, Initialize code generation
*/
public void test11SynchronizeCodeGeneration() {
log("test11SynchronizeCodeGeneration");
// Synchronize code generation
SynchronizeRepositoryCodeGeneration synchronizeCodeGeneration = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, _editor);
// Do it even if validation failed
synchronizeCodeGeneration.setContinueAfterValidation(true);
synchronizeCodeGeneration.doAction();
if (!synchronizeCodeGeneration.hasActionExecutionSucceeded()) {
fail("Synchronization action failed. Action execution status: " + synchronizeCodeGeneration.getExecutionStatus().name());
}
// Write generated files to disk
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
if (!writeToDisk.hasActionExecutionSucceeded()) {
fail("Writing to disk has failed. Action execution status: " + writeToDisk.getExecutionStatus().name());
}
saveProject();
}
/**
* Reload project, check all dependancies
*/
public void test12CheckAllGeneratedResourcesDependancies() {
log("test12CheckAllGeneratedResourcesDependancies");
reloadProject(true);
reloadGeneratedResources();
assertDepends(operationComponent1JavaResource, _dmResource);
assertDepends(operationComponent1JavaResource, _operationComponentResource1);
assertDepends(operationComponent1JavaResource, _tab1ComponentResource);
assertDepends(operationComponent1JavaResource, _tab2ComponentResource);
assertDepends(operationComponent1JavaResource, _rootProcessResource);
assertDepends(operationComponent1APIResource, _dmResource);
assertDepends(operationComponent1APIResource, _operationComponentResource1);
assertDepends(operationComponent1APIResource, _tab1ComponentResource);
assertDepends(operationComponent1APIResource, _tab2ComponentResource);
assertDepends(operationComponent1APIResource, _rootProcessResource);
assertDepends(operationComponent1WOResource, _dmResource);
assertDepends(operationComponent1WOResource, _operationComponentResource1);
assertDepends(operationComponent1WOResource, _tab1ComponentResource);
assertDepends(operationComponent1WOResource, _tab2ComponentResource);
assertDepends(operationComponent1WOResource, _rootProcessResource);
assertDepends(operationComponent2JavaResource, _dmResource);
assertDepends(operationComponent2JavaResource, _operationComponentResource2);
assertDepends(operationComponent2JavaResource, _tab1ComponentResource);
assertDepends(operationComponent2JavaResource, _subProcessResource);
assertDepends(operationComponent2APIResource, _dmResource);
assertDepends(operationComponent2APIResource, _operationComponentResource2);
assertDepends(operationComponent2APIResource, _tab1ComponentResource);
assertDepends(operationComponent2APIResource, _subProcessResource);
assertDepends(operationComponent2WOResource, _dmResource);
assertDepends(operationComponent2WOResource, _operationComponentResource2);
assertDepends(operationComponent2WOResource, _tab1ComponentResource);
assertDepends(operationComponent2WOResource, _subProcessResource);
assertDepends(operationComponent3JavaResource, _dmResource);
assertDepends(operationComponent3JavaResource, _operationComponentResource3);
assertDepends(operationComponent3JavaResource, _tab2ComponentResource);
assertDepends(operationComponent3JavaResource, _subProcessResource);
assertDepends(operationComponent3APIResource, _dmResource);
assertDepends(operationComponent3APIResource, _operationComponentResource3);
assertDepends(operationComponent3APIResource, _tab2ComponentResource);
assertDepends(operationComponent3APIResource, _subProcessResource);
assertDepends(operationComponent3WOResource, _dmResource);
assertDepends(operationComponent3WOResource, _operationComponentResource3);
assertDepends(operationComponent3WOResource, _tab2ComponentResource);
assertDepends(operationComponent3WOResource, _subProcessResource);
assertDepends(tabComponent1JavaResource, _dmResource);
assertDepends(tabComponent1JavaResource, _tab1ComponentResource);
assertDepends(tabComponent1JavaResource, _rootProcessResource);
assertDepends(tabComponent1JavaResource, _subProcessResource);
assertDepends(tabComponent1APIResource, _dmResource);
assertDepends(tabComponent1APIResource, _tab1ComponentResource);
assertDepends(tabComponent1APIResource, _rootProcessResource);
assertDepends(tabComponent1APIResource, _subProcessResource);
assertDepends(tabComponent1WOResource, _dmResource);
assertDepends(tabComponent1WOResource, _tab1ComponentResource);
assertDepends(tabComponent1WOResource, _rootProcessResource);
assertDepends(tabComponent1WOResource, _subProcessResource);
assertDepends(tabComponent2JavaResource, _dmResource);
assertDepends(tabComponent2JavaResource, _tab2ComponentResource);
assertDepends(tabComponent2JavaResource, _rootProcessResource);
assertDepends(tabComponent2JavaResource, _subProcessResource);
assertDepends(tabComponent2APIResource, _dmResource);
assertDepends(tabComponent2APIResource, _tab2ComponentResource);
assertDepends(tabComponent2APIResource, _rootProcessResource);
assertDepends(tabComponent2APIResource, _subProcessResource);
assertDepends(tabComponent2WOResource, _dmResource);
assertDepends(tabComponent2WOResource, _tab2ComponentResource);
assertDepends(tabComponent2WOResource, _rootProcessResource);
assertDepends(tabComponent2WOResource, _subProcessResource);
}
/**
* Reload project, check all resources status
*/
public void test13CheckGeneratedResourcesStatus() {
log("test13CheckGeneratedResourcesStatus");
logger.info("Synchronize code generation again");
// Synchronize code generation again
codeRepository.connect();
SynchronizeRepositoryCodeGeneration synchronizeCodeGeneration = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, _editor);
synchronizeCodeGeneration.setContinueAfterValidation(true);
synchronizeCodeGeneration.doAction();
logger.info("Code generation is now synchronized");
// after a synchronize : all files must normally be up-to-date
// but : build.properties and Application.conf.PROD depends on the war name (this is really a deploiement parameter, and it IS NOT a
// model attribute)
// so we can admit that those files needs to be regenerate since the code repository has changed.
checkThatAllFilesAreUpToDate();
// Except(GenerationStatus.GenerationModified,buildPropertiesResource.getCGFile(),appConfProdResource.getCGFile());
}
/**
* Reload project, perform some optimistic dependancy checking woth data model
*/
public void test14CheckOptimisticDependancyCheckingWithDataModel() {
log("test14CheckOptimisticDependancyCheckingWithDataModel");
// Now we force the DataModel to be changed
// Normally most of resources depending on it should be marked as changed
// But because of optimist dependancy checking none will be affected
logger.info("'Touch' DataModel");
_project.getDataModel().setChanged();
checkThatAllFilesAreUpToDate();
saveProject();
// Now we force component entity for Operation2 to be changed
_operationComponent2.getComponentDMEntity().setChanged();
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent2JavaResource.getCGFile(),
operationComponent2APIResource.getCGFile(), operationComponent2WOResource.getCGFile(), cstJavaResource.getCGFile(),
rootProcessJSCopy.getCGFile(), subProcessJSCopy.getCGFile());
// Write generated files to disk
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(writeToDisk.doAction().hasActionExecutionSucceeded());
// And save project
saveProject();
logger.info("'Touch' DMEntity for Tab1");
// Now we force component entity for Tab1 to be changed
_tab1.getComponentDMEntity().setChanged();
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(),
operationComponent2JavaResource.getCGFile(), operationComponent2APIResource.getCGFile(),
operationComponent2WOResource.getCGFile(), tabComponent1JavaResource.getCGFile(), tabComponent1APIResource.getCGFile(),
tabComponent1WOResource.getCGFile(), cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(),
subProcessJSCopy.getCGFile());
// Write generated files to disk
writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
// And save project
saveProject();
}
/**
* Perform some optimitic dependancy while editing processes
*/
public void test15CheckOptimisticDependancyCheckingWithProcesses() {
log("test15CheckOptimisticDependancyCheckingWithProcesses");
// Now we force the SubProcess to be changed
// Normally most of resources depending on it should be marked as changed
// But because of optimist dependancy checking none will be affected
logger.info("'Touch' SubProcess ");
_subProcessResource.getFlexoProcess().setChanged();
// try {
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(),
subProcessJSCopy.getCGFile(), subProcessScreenshotCopyOfCopy.getCGFile(),
activityInSubProcessScreenshotCopyOfCopy.getCGFile(), operationNode2ScreenshotCopyOfCopy.getCGFile(),
operationNode3ScreenshotCopyOfCopy.getCGFile());
/*}
catch (AssertionFailedError hop) {
saveProject();
System.exit(0);
}*/
saveProject();
// Now we force Operation2 to be changed
OperationNode operationNode2 = _subProcessResource.getFlexoProcess().getActivityPetriGraph()
.getOperationNodeNamed(TEST_OPERATION_NODE_2);
operationNode2.setChanged();
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent2JavaResource.getCGFile(),
operationComponent2APIResource.getCGFile(), operationComponent2WOResource.getCGFile(),
tabComponent1JavaResource.getCGFile(), tabComponent1APIResource.getCGFile(), tabComponent1WOResource.getCGFile(),
cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(), subProcessJSCopy.getCGFile(),
subProcessScreenshotCopyOfCopy.getCGFile(), activityInSubProcessScreenshotCopyOfCopy.getCGFile(),
operationNode2ScreenshotCopyOfCopy.getCGFile(), operationNode3ScreenshotCopyOfCopy.getCGFile());
// Run generators for required files
GenerateSourceCode generateRequiredCode = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequiredCode.doAction().hasActionExecutionSucceeded());
// Write generated files to disk
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(writeToDisk.doAction().hasActionExecutionSucceeded());
// And save project
saveProject();
// Now we force Operation1 to be changed
_operationNode.setChanged();
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(),
tabComponent1JavaResource.getCGFile(), tabComponent1APIResource.getCGFile(), tabComponent1WOResource.getCGFile(),
tabComponent2JavaResource.getCGFile(), tabComponent2APIResource.getCGFile(), tabComponent2WOResource.getCGFile(),
cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(), rootProcessScreenshotCopyOfCopy.getCGFile(),
subProcessNodeScreenshotInRootProcessCopyOfCopy.getCGFile(), operationNode1ScreenshotCopyOfCopy.getCGFile());
assertTrue(operationComponent1JavaResource.getCGFile().needsMemoryGeneration());
assertTrue(operationComponent1APIResource.getCGFile().needsMemoryGeneration());
assertTrue(operationComponent1WOResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent1JavaResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent1APIResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent1WOResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent2JavaResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent2APIResource.getCGFile().needsMemoryGeneration());
assertTrue(tabComponent2WOResource.getCGFile().needsMemoryGeneration());
assertTrue(cstJavaResource.getCGFile().needsMemoryGeneration());
// Run generators for required files
generateRequiredCode = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequiredCode.doAction().hasActionExecutionSucceeded());
assertFalse(operationComponent1JavaResource.getCGFile().needsMemoryGeneration());
assertFalse(operationComponent1APIResource.getCGFile().needsMemoryGeneration());
assertFalse(operationComponent1WOResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent1JavaResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent1APIResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent1WOResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent2JavaResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent2APIResource.getCGFile().needsMemoryGeneration());
assertFalse(tabComponent2WOResource.getCGFile().needsMemoryGeneration());
// Write generated files to disk
writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(writeToDisk.doAction().hasActionExecutionSucceeded());
// And save project
saveProject();
}
/**
* Perform some optimitic dependancy checking while editing components Btw, if you find some errors in here or you modify some stuffs
* here, please report them also in TestRoundtrip.test2
*/
public void test16CheckOptimisticDependancyCheckingWithComponents() {
log("test16CheckOptimisticDependancyCheckingWithComponents");
_operationComponent1 = _operationComponentResource1.getIEOperationComponent();
assertNotNull(_operationComponent1);
// On component 1, insert a new bloc at index 3, name it Bloc4
DropIEElement dropBloc4 = DropIEElement.createBlocInComponent(_operationComponent1, 0, _editor);
assertTrue(dropBloc4.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc4 = (IEBlocWidget) dropBloc4.getDroppedWidget();
assertNotNull(bloc4);
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(), cstJavaResource.getCGFile(),
rootProcessJSCopy.getCGFile(), operationComponent1ScreenshotCopyOfCopy.getCGFile());
// Generate content
GenerateSourceCode generateRequiredCode = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequiredCode.doAction().hasActionExecutionSucceeded());
// Write generated files to disk
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
checkThatAllFilesAreUpToDate();
bloc4.setTitle("Bloc4");
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(), cstJavaResource.getCGFile(),
rootProcessJSCopy.getCGFile(), operationComponent1ScreenshotCopyOfCopy.getCGFile());
generateRequiredCode = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequiredCode.doAction().hasActionExecutionSucceeded());
// Write generated files to disk
writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
// And save project
saveProject();
IETabComponent tab2 = _tab2ComponentResource.getTabComponent();
assertNotNull(tab2);
// Insert a new bloc at index 0, name it "BlocInTab2"
DropIEElement dropBlocInTab2 = DropIEElement.createBlocInComponent(tab2, 0, _editor);
assertTrue(dropBlocInTab2.doAction().hasActionExecutionSucceeded());
IEBlocWidget bloc = (IEBlocWidget) dropBlocInTab2.getDroppedWidget();
assertNotNull(bloc);
bloc.setTitle("BlocInTab2");
// Drop a table in the bloc2
DropIEElement dropTable = DropIEElement.createTableInBloc(bloc, _editor);
assertTrue(dropTable.doAction().hasActionExecutionSucceeded());
IEHTMLTableWidget table = (IEHTMLTableWidget) dropTable.getDroppedWidget();
assertNotNull(table);
// Drop a label in the table, at cell (0,0) at position 0
DropIEElement dropLabel = DropIEElement.insertWidgetInTable(table, WidgetType.LABEL, 0, 0, 0, _editor);
assertTrue(dropLabel.doAction().hasActionExecutionSucceeded());
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, tabComponent2JavaResource.getCGFile(),
tabComponent2APIResource.getCGFile(), tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(),
operationComponent3JavaResource.getCGFile(), operationComponent3APIResource.getCGFile(),
operationComponent3WOResource.getCGFile(), cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(),
subProcessJSCopy.getCGFile(), operationComponent1ScreenshotCopyOfCopy.getCGFile(),
operationComponent3ScreenshotCopyOfCopy.getCGFile(), tabComponent2ScreenshotCopyOfCopy.getCGFile());
generateRequiredCode = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequiredCode.doAction().hasActionExecutionSucceeded());
// Write generated files to disk
writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
checkThatAllFilesAreUpToDate();
// And save project
saveProject();
logger.info("Before modifying");
logger.info("_tab2ComponentResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(_tab2ComponentResource.getLastUpdate()));
logger.info("tabComponent2JavaResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(tabComponent2JavaResource.getLastUpdate()));
// Now we change again bloc name
bloc.setTitle("BlocInTab2");
// Naturally those resources are changed
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, tabComponent2JavaResource.getCGFile(),
tabComponent2APIResource.getCGFile(), tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(),
operationComponent3JavaResource.getCGFile(), operationComponent3APIResource.getCGFile(),
operationComponent3WOResource.getCGFile(), cstJavaResource.getCGFile(), rootProcessJSCopy.getCGFile(),
subProcessJSCopy.getCGFile(), operationComponent1ScreenshotCopyOfCopy.getCGFile(),
operationComponent3ScreenshotCopyOfCopy.getCGFile(), tabComponent2ScreenshotCopyOfCopy.getCGFile());
logger.info("After modifying");
logger.info("_tab2ComponentResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(_tab2ComponentResource.getLastUpdate()));
logger.info("tabComponent2JavaResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(tabComponent2JavaResource.getLastUpdate()));
log("OK, trying to save and reload project");
// But now we don't write it on disk, just save project
saveProject();
// And reload it
reloadProject(true);
reloadGeneratedResources();
// And resynchronize code generation
codeRepository.connect();
SynchronizeRepositoryCodeGeneration synchronizeCodeGeneration = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, _editor);
synchronizeCodeGeneration.setContinueAfterValidation(true);
synchronizeCodeGeneration.doAction();
logger.info("After code synchro");
logger.info("_tab2ComponentResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(_tab2ComponentResource.getLastUpdate()));
logger.info("tabComponent2JavaResource update="
+ new SimpleDateFormat("dd/MM HH:mm:ss SSS").format(tabComponent2JavaResource.getLastUpdate()));
// The same resources must be in the 'modified' state except for the ones that have been cleared because the backsynchronization
// mechanism has not caused an update in resource dependancy tree (The
// We test here the persistance of 'Modified' status
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, tabComponent2JavaResource.getCGFile(),
tabComponent2APIResource.getCGFile(), tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile(),
operationComponent3JavaResource.getCGFile(), operationComponent3APIResource.getCGFile(),
operationComponent3WOResource.getCGFile(), tabComponent2ScreenshotCopyOfCopy.getCGFile());
}
/**
* Check that dynamic dependancies rebuilding is working
*/
public void test17CheckResourceDynamicDependancyRebuilding() {
log("test17CheckResourceDynamicDependancyRebuilding");
// Add operation TEST_OPERATION_NODE_4 in root process using OperationComponent2
DropWKFElement dropOperation = DropWKFElement.actionType.makeNewAction(_subProcessNode.getOperationPetriGraph(), null, _editor);
dropOperation.setElementType(WKFElementType.NORMAL_OPERATION);
dropOperation.setLocation(100, 50);
dropOperation.doAction();
assertTrue(dropOperation.hasActionExecutionSucceeded());
OperationNode operationNode4 = (OperationNode) dropOperation.getObject();
operationNode4.setName(TEST_OPERATION_NODE_4);
logger.info("OperationNode " + operationNode4.getName() + " successfully created");
SetAndOpenOperationComponent setOperationComponent = SetAndOpenOperationComponent.actionType.makeNewAction(operationNode4, null,
_editor);
setOperationComponent.setNewComponentName(OPERATION_COMPONENT_2);
setOperationComponent.doAction();
assertTrue(setOperationComponent.hasActionExecutionSucceeded());
assertNotDepends(operationComponent2JavaResource, _rootProcessResource);
assertNotDepends(operationComponent2APIResource, _rootProcessResource);
assertNotDepends(operationComponent2WOResource, _rootProcessResource);
// associate a tab with operationNode4
operationNode4.setTabComponent(_tab1);
// And resynchronize code generation
SynchronizeRepositoryCodeGeneration synchronizeCodeGeneration = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, _editor);
synchronizeCodeGeneration.setContinueAfterValidation(true);
synchronizeCodeGeneration.doAction();
assertTrue(synchronizeCodeGeneration.hasActionExecutionSucceeded());
// Now, as Operation2 is used in root process, it should depend on it
assertDepends(operationComponent2JavaResource, _rootProcessResource);
assertDepends(operationComponent2APIResource, _rootProcessResource);
assertDepends(operationComponent2WOResource, _rootProcessResource);
// Write generated files to disk
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
saveProject();
}
/**
* Check that dynamic dependancies rebuilding is working
*/
public void test18CheckTemplateDependancies() {
log("test18CheckTemplateDependancies");
CGTemplate labelHTMLTemplate = null;
try {
labelHTMLTemplate = projectGenerator.getTemplateLocator().templateWithName("Label.html.vm");
} catch (TemplateNotFoundException e) {
e.printStackTrace();
fail();
}
assertTrue(labelHTMLTemplate.isApplicationTemplate());
checkDependingOnTemplate(labelHTMLTemplate, tabComponent2JavaResource.getCGFile(), tabComponent2APIResource.getCGFile(),
tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile());
AddCustomTemplateRepository addCustomTemplateRepository = AddCustomTemplateRepository.actionType.makeNewAction(_project
.getGeneratedCode().getTemplates(), null, _editor);
addCustomTemplateRepository.setNewCustomTemplatesRepositoryName("MyCustomTemplates");
addCustomTemplateRepository.setNewCustomTemplatesRepositoryDirectory(new FlexoProjectFile(_project, "MyCustomTemplates"));
addCustomTemplateRepository.setRepositoryType(TemplateRepositoryType.Code);
assertTrue(addCustomTemplateRepository.doAction().hasActionExecutionSucceeded());
RedefineCustomTemplateFile redefineTemplate = RedefineCustomTemplateFile.actionType.makeNewAction(labelHTMLTemplate, null, _editor);
redefineTemplate.setRepository(addCustomTemplateRepository.getNewCustomTemplatesRepository());
redefineTemplate.setTarget(CodeType.PROTOTYPE);
assertTrue(redefineTemplate.doAction().hasActionExecutionSucceeded());
CGTemplateFile newLabelHTMLTemplate = redefineTemplate.getNewTemplateFile();
codeRepository.setPreferredTemplateRepository(addCustomTemplateRepository.getNewCustomTemplatesRepository());
// Resynchronize code generation
codeRepository.connect();
SynchronizeRepositoryCodeGeneration synchronizeCodeGeneration = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, _editor);
synchronizeCodeGeneration.setContinueAfterValidation(true);
synchronizeCodeGeneration.doAction();
CGTemplate newTabelHTMLTemplate2 = null;
try {
newTabelHTMLTemplate2 = projectGenerator.getTemplateLocator().templateWithName("Label.html.vm");
} catch (TemplateNotFoundException e) {
e.printStackTrace();
fail();
}
assertTrue(newTabelHTMLTemplate2.isCustomTemplate());
assertTrue(newTabelHTMLTemplate2 == newLabelHTMLTemplate);
// Suppose that this template has changed
newLabelHTMLTemplate.setChanged();
// In this case, all those file must be marked as modified
checkThatAllFilesAreUpToDateExcept(GenerationStatus.GenerationModified, tabComponent2JavaResource.getCGFile(),
tabComponent2APIResource.getCGFile(), tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile());
checkDependingOnTemplate(newLabelHTMLTemplate, tabComponent2JavaResource.getCGFile(), tabComponent2APIResource.getCGFile(),
tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile());
// Generate required files
logger.info("Generate required file");
GenerateSourceCode generateRequired = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequired.doAction().hasActionExecutionSucceeded());
logger.info("Generate required file DONE");
// Write generated files to disk
logger.info("Write required file");
WriteModifiedGeneratedFiles writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
writeToDisk.doAction();
logger.info("Write required file DONE");
checkThatAllFilesAreUpToDate();
final String ADDED_STRING = "DenisEstBete";
EditCustomTemplateFile editTemplate = EditCustomTemplateFile.actionType.makeNewAction(newLabelHTMLTemplate, null, _editor);
editTemplate.setTemplateFileContentEditor(new TemplateFileContentEditor() {
@Override
public String getEditedContent() {
return "<VALUE>" + ADDED_STRING;
}
@Override
public void setEditedContent(String content) {
}
});
editTemplate.doAction();
SaveCustomTemplateFile saveTemplate = SaveCustomTemplateFile.actionType.makeNewAction(newLabelHTMLTemplate, null, _editor);
saveTemplate.doAction();
checkDependingOnTemplate(newLabelHTMLTemplate, tabComponent2JavaResource.getCGFile(), tabComponent2APIResource.getCGFile(),
tabComponent2WOResource.getCGFile(), operationComponent1JavaResource.getCGFile(),
operationComponent1APIResource.getCGFile(), operationComponent1WOResource.getCGFile());
waitForVelocityRefresh();
// Generate required files
logger.info("Generate required file");
generateRequired = GenerateSourceCode.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(generateRequired.doAction().hasActionExecutionSucceeded());
logger.info("Generate required file DONE");
// Write generated files to disk
logger.info("Write required file");
writeToDisk = WriteModifiedGeneratedFiles.actionType.makeNewAction(codeRepository, null, _editor);
assertTrue(writeToDisk.doAction().hasActionExecutionSucceeded());
logger.info("Write required file DONE");
try {
File tab2_html = new File(tabComponent2WOResource.getFile(), TAB_COMPONENT2 + ".html");
assertTrue(FileUtils.fileContents(tab2_html).indexOf(ADDED_STRING) > 0);
File operation1_html = new File(operationComponent1WOResource.getFile(), OPERATION_COMPONENT_1 + ".html");
assertTrue(FileUtils.fileContents(operation1_html).indexOf(ADDED_STRING) > 0);
} catch (IOException e) {
e.printStackTrace();
fail();
}
// The last test must call this to stop the RM checking
_project.close();
FileUtils.deleteDir(_project.getProjectDirectory());
if (_bsHook != null) {
_bsHook.clear();
}
FlexoResourceManager.setBackwardSynchronizationHook(null);
resetVariables();
}
private class DebugBackwardSynchronizationHook implements BackwardSynchronizationHook {
private class BackSynchroEntry {
protected FlexoResource resource1;
protected FlexoResource resource2;
protected BackSynchroEntry(FlexoResource aResource1, FlexoResource aResource2) {
resource1 = aResource1;
resource2 = aResource2;
}
protected boolean backSynchroConcerns(FlexoResource aResource1, FlexoResource aResource2) {
return resource1 == aResource1 && resource2 == aResource2;
}
}
private Vector<BackSynchroEntry> entries;
protected DebugBackwardSynchronizationHook() {
entries = new Vector<BackSynchroEntry>();
clear();
}
protected void clear() {
entries.clear();
}
@Override
public void notifyBackwardSynchronization(FlexoResource resource1, FlexoResource resource2) {
System.out.println("Resource " + resource1 + " is to be back-synchronized with " + resource2);
// (new Exception()).printStackTrace();
entries.add(new BackSynchroEntry(resource1, resource2));
}
protected void assertBackSynchronizationHasBeenPerformed(FlexoResource aResource1, FlexoResource aResource2) {
for (BackSynchroEntry entry : entries) {
if (entry.backSynchroConcerns(aResource1, aResource2)) {
return;
}
}
fail("RESOURCE synchonization problem: " + aResource1 + " MUST have been back-synchronized with " + aResource2);
}
protected void assertNoBackSynchronization() {
assertBackSynchronizationCount(0);
}
protected void assertBackSynchronizationCount(int count) {
assertEquals(getBackSynchronizationCount(), count);
}
protected int getBackSynchronizationCount() {
return entries.size();
}
}
}