diff --git a/kie-wb-common-screens/kie-wb-common-data-modeller/kie-wb-common-data-modeller-backend/src/main/java/org/kie/workbench/common/screens/datamodeller/backend/server/DataModelerServiceImpl.java b/kie-wb-common-screens/kie-wb-common-data-modeller/kie-wb-common-data-modeller-backend/src/main/java/org/kie/workbench/common/screens/datamodeller/backend/server/DataModelerServiceImpl.java index efe317bde32..38abc23ff34 100644 --- a/kie-wb-common-screens/kie-wb-common-data-modeller/kie-wb-common-data-modeller-backend/src/main/java/org/kie/workbench/common/screens/datamodeller/backend/server/DataModelerServiceImpl.java +++ b/kie-wb-common-screens/kie-wb-common-data-modeller/kie-wb-common-data-modeller-backend/src/main/java/org/kie/workbench/common/screens/datamodeller/backend/server/DataModelerServiceImpl.java @@ -16,10 +16,25 @@ package org.kie.workbench.common.screens.datamodeller.backend.server; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Event; +import javax.inject.Inject; +import javax.inject.Named; + import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle; import org.guvnor.common.services.project.model.Project; import org.jboss.errai.bus.server.annotations.Service; -import org.kie.workbench.common.screens.datamodeller.model.*; +import org.kie.workbench.common.screens.datamodeller.model.AnnotationDefinitionTO; +import org.kie.workbench.common.screens.datamodeller.model.DataModelTO; +import org.kie.workbench.common.screens.datamodeller.model.DataObjectTO; +import org.kie.workbench.common.screens.datamodeller.model.GenerationResult; +import org.kie.workbench.common.screens.datamodeller.model.PropertyTypeTO; import org.kie.workbench.common.screens.datamodeller.service.DataModelerService; import org.kie.workbench.common.screens.datamodeller.service.ServiceException; import org.kie.workbench.common.services.datamodel.backend.server.service.DataModelService; @@ -39,15 +54,11 @@ import org.uberfire.java.nio.base.options.CommentedOption; import org.uberfire.rpc.SessionInfo; import org.uberfire.security.Identity; -import org.uberfire.workbench.events.ChangeType; +import org.uberfire.workbench.events.ResourceAdded; import org.uberfire.workbench.events.ResourceBatchChangesEvent; import org.uberfire.workbench.events.ResourceChange; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; -import javax.inject.Named; -import java.util.*; +import org.uberfire.workbench.events.ResourceDeleted; +import org.uberfire.workbench.events.ResourceUpdated; @Service @ApplicationScoped @@ -127,19 +138,18 @@ public DataModelTO loadModel( Project project ) { } } - @Override public GenerationResult saveModel( DataModelTO dataModel, final Project project ) { - return saveModel(dataModel, project, false); + return saveModel( dataModel, project, false ); } @Override public GenerationResult saveModel( DataModelTO dataModel, final Project project, - final boolean overwrite) { + final boolean overwrite ) { Path projectPath = project.getRootPath(); Long startTime = System.currentTimeMillis(); @@ -149,14 +159,14 @@ public GenerationResult saveModel( DataModelTO dataModel, //ensure java sources directory exists. org.uberfire.java.nio.file.Path javaPath = ensureProjectJavaPath( paths.convert( projectPath ) ); - if (overwrite) { - mergeWithExistingModel(dataModel, project); + if ( overwrite ) { + mergeWithExistingModel( dataModel, project ); } //convert to domain model DataModel dataModelDomain = DataModelerServiceHelper.getInstance().to2Domain( dataModel ); - if (!overwrite) { + if ( !overwrite ) { //optimization remove unmodified data objects from the model in order to skip generation for unmodified objects. removeUnmodifiedObjects( dataModelDomain, dataModel ); } @@ -166,20 +176,20 @@ public GenerationResult saveModel( DataModelTO dataModel, //Start IOService bath processing. IOService batch processing causes a blocking operation on the file system //to it must be treated carefully. - CommentedOption option = makeCommentedOption("Data modeller generated action."); + CommentedOption option = makeCommentedOption( "Data modeller generated action." ); ioService.startBatch(); onBatch = true; //delete removed data objects - cleanupFiles(deleteableFiles, option); + cleanupFiles( deleteableFiles, option ); javaPath = ensureProjectJavaPath( paths.convert( projectPath ) ); DataModelOracleDriver driver = DataModelOracleDriver.getInstance(); - generationListener.setCurrentProject(project); - generationListener.setOption(option); + generationListener.setCurrentProject( project ); + generationListener.setOption( option ); generationListener.init(); - driver.generateModel( dataModelDomain, generationListener); + driver.generateModel( dataModelDomain, generationListener ); onBatch = false; ioService.endBatch(); @@ -196,36 +206,37 @@ public GenerationResult saveModel( DataModelTO dataModel, } catch ( Exception e ) { logger.error( "An error was produced during data model generation, dataModel: " + dataModel + ", path: " + projectPath, e ); - if (onBatch) { + if ( onBatch ) { try { - logger.warn("IOService batch method is still on, trying to end batch processing."); + logger.warn( "IOService batch method is still on, trying to end batch processing." ); ioService.endBatch(); - logger.warn("IOService batch method is was successfully finished. The user will still get the exception, but the batch processing was finished."); - } catch (Exception ex) { - logger.error("An error was produced when the IOService.endBatch processing was executed.", ex); + logger.warn( "IOService batch method is was successfully finished. The user will still get the exception, but the batch processing was finished." ); + } catch ( Exception ex ) { + logger.error( "An error was produced when the IOService.endBatch processing was executed.", ex ); } } throw new ServiceException( "Data model: " + dataModel.getParentProjectName() + ", couldn't be generated due to the following error. " + e ); } } - private void mergeWithExistingModel(DataModelTO dataModel, Project project) { + private void mergeWithExistingModel( DataModelTO dataModel, + Project project ) { Map deletedObjects = new HashMap(); Map currentObjects = new HashMap(); - DataModelTO reloadedModel = loadModel(project); + DataModelTO reloadedModel = loadModel( project ); - for (DataObjectTO dataObject : dataModel.getDataObjects()) { - currentObjects.put(dataObject.getClassName(), dataObject); + for ( DataObjectTO dataObject : dataModel.getDataObjects() ) { + currentObjects.put( dataObject.getClassName(), dataObject ); } - for (DataObjectTO dataObject : dataModel.getDeletedDataObjects()) { - deletedObjects.put(dataObject.getClassName(), dataObject); + for ( DataObjectTO dataObject : dataModel.getDeletedDataObjects() ) { + deletedObjects.put( dataObject.getClassName(), dataObject ); } - for (DataObjectTO reloadedDataObject : reloadedModel.getDataObjects() ) { - if (!currentObjects.containsKey(reloadedDataObject.getClassName()) && !deletedObjects.containsKey(reloadedDataObject.getClassName())) { - dataModel.getDeletedDataObjects().add(reloadedDataObject); + for ( DataObjectTO reloadedDataObject : reloadedModel.getDataObjects() ) { + if ( !currentObjects.containsKey( reloadedDataObject.getClassName() ) && !deletedObjects.containsKey( reloadedDataObject.getClassName() ) ) { + dataModel.getDeletedDataObjects().add( reloadedDataObject ); } } } @@ -234,10 +245,10 @@ private CommentedOption makeCommentedOption( final String commitMessage ) { final String name = identity.getName(); final Date when = new Date(); final CommentedOption option = new CommentedOption( sessionInfo.getId(), - name, - null, - commitMessage, - when ); + name, + null, + commitMessage, + when ); return option; } @@ -265,38 +276,50 @@ public Map getAnnotationDefinitions() { return annotations; } - private void notifyFileChanges( List deleteableFiles, - List driverChanges ) { + private void notifyFileChanges( final List deleteableFiles, + final List driverChanges ) { - Set batchChanges = new HashSet(); + final Map> batchChanges = new HashMap>(); - for ( Path deleteableFile : deleteableFiles ) { - batchChanges.add( new ResourceChange( ChangeType.DELETE, deleteableFile, sessionInfo ) ); + for ( final Path deleteableFile : deleteableFiles ) { + batchChanges.put( deleteableFile, new ArrayList() {{ + add( new ResourceDeleted() ); + }} ); } - for ( FileChangeDescriptor driverChange : driverChanges ) { + for ( final FileChangeDescriptor driverChange : driverChanges ) { + final Path path = paths.convert( driverChange.getPath() ); switch ( driverChange.getAction() ) { case FileChangeDescriptor.ADD: logger.debug( "Notifying file created: " + driverChange.getPath() ); - batchChanges.add( new ResourceChange( ChangeType.ADD, paths.convert( driverChange.getPath() ), sessionInfo ) ); + if ( !batchChanges.containsKey( path ) ) { + batchChanges.put( path, new ArrayList() ); + } + batchChanges.get( path ).add( new ResourceAdded() ); break; case FileChangeDescriptor.DELETE: logger.debug( "Notifying file deleted: " + driverChange.getPath() ); - batchChanges.add( new ResourceChange( ChangeType.DELETE, paths.convert( driverChange.getPath() ), sessionInfo ) ); + if ( !batchChanges.containsKey( path ) ) { + batchChanges.put( path, new ArrayList() ); + } + batchChanges.get( path ).add( new ResourceDeleted() ); break; case FileChangeDescriptor.UPDATE: logger.debug( "Notifying file updated: " + driverChange.getPath() ); - batchChanges.add( new ResourceChange( ChangeType.UPDATE, paths.convert( driverChange.getPath() ), sessionInfo ) ); + if ( !batchChanges.containsKey( path ) ) { + batchChanges.put( path, new ArrayList() ); + } + batchChanges.get( path ).add( new ResourceUpdated() ); break; } } if ( batchChanges.size() > 0 ) { - resourceBatchChangesEvent.fire( new ResourceBatchChangesEvent( batchChanges ) ); + resourceBatchChangesEvent.fire( new ResourceBatchChangesEvent( batchChanges, sessionInfo ) ); } } - private List calculateDeleteableFiles( DataModelTO dataModel, - org.uberfire.java.nio.file.Path javaPath ) { + private List calculateDeleteableFiles( final DataModelTO dataModel, + final org.uberfire.java.nio.file.Path javaPath ) { List currentObjects = dataModel.getDataObjects(); List deletedObjects = dataModel.getDeletedDataObjects(); @@ -342,8 +365,8 @@ private List calculateDeleteableFiles( DataModelTO dataModel, return deleteableFiles; } - private void removeUnmodifiedObjects( DataModel dataModelDomain, - DataModelTO dataModelTO ) throws Exception { + private void removeUnmodifiedObjects( final DataModel dataModelDomain, + final DataModelTO dataModelTO ) throws Exception { String newFingerPrint; for ( DataObjectTO dataObject : dataModelTO.getDataObjects() ) { newFingerPrint = DataModelerServiceHelper.getInstance().calculateFingerPrint( dataObject.getStringId() ); @@ -354,62 +377,11 @@ private void removeUnmodifiedObjects( DataModel dataModelDomain, } } - private void cleanupFiles( List deleteableFiles, CommentedOption option ) { + private void cleanupFiles( final List deleteableFiles, + final CommentedOption option ) { for ( Path filePath : deleteableFiles ) { - ioService.deleteIfExists( paths.convert( filePath ) , option ); - } - } - - /** - * This auxiliary method deletes the files that belongs to data objects that was removed in memory. - */ - private List cleanupFiles( DataModelTO dataModel, - org.uberfire.java.nio.file.Path javaPath ) { - - List currentObjects = dataModel.getDataObjects(); - List deletedObjects = dataModel.getDeletedDataObjects(); - List fileChanges = new ArrayList(); - org.uberfire.java.nio.file.Path filePath; - - //process deleted persistent objects. - for ( DataObjectTO dataObject : deletedObjects ) { - if ( dataObject.isPersistent() ) { - filePath = calculateFilePath( dataObject.getOriginalClassName(), javaPath ); - if ( dataModel.getDataObjectByClassName( dataObject.getOriginalClassName() ) != null ) { - //TODO check if we need to have this level of control or instead we remove this file directly. - //very particular case a persistent object was deleted in memory and a new one with the same name - //was created. At the end we will have a file update instead of a delete. - - //do nothing, the file generator will notify that the file changed. - //fileChanges.add(new FileChangeDescriptor(paths.convert(filePath), FileChangeDescriptor.UPDATE)); - } else { - fileChanges.add( new ResourceChange( ChangeType.DELETE, paths.convert( filePath ), sessionInfo ) ); - ioService.delete( filePath ); - } - } + ioService.deleteIfExists( paths.convert( filePath ), option ); } - - //process package or class name changes for persistent objects. - for ( DataObjectTO dataObject : currentObjects ) { - if ( dataObject.isPersistent() && dataObject.classNameChanged() ) { - //if the className changes the old file needs to be removed - filePath = calculateFilePath( dataObject.getOriginalClassName(), javaPath ); - - if ( dataModel.getDataObjectByClassName( dataObject.getOriginalClassName() ) != null ) { - //TODO check if we need to have this level of control or instead we remove this file directly. - //very particular case of change, a persistent object changes the name to the name of another - //object. A kind of name swapping... - - //do nothing, the file generator will notify that the file changed. - //fileChanges.add(new FileChangeDescriptor(paths.convert(filePath), FileChangeDescriptor.UPDATE)); - } else { - fileChanges.add( new ResourceChange( ChangeType.DELETE, paths.convert( filePath ), sessionInfo ) ); - ioService.delete( filePath ); - } - } - } - - return fileChanges; } private void cleanupEmptyDirs( org.uberfire.java.nio.file.Path pojectPath ) { @@ -448,7 +420,7 @@ private org.uberfire.java.nio.file.Path ensureProjectJavaPath( org.uberfire.java * Given a className calculates the path to the java file allocating the corresponding pojo. */ private org.uberfire.java.nio.file.Path calculateFilePath( String className, - org.uberfire.java.nio.file.Path javaPath ) { + org.uberfire.java.nio.file.Path javaPath ) { String name = NamingUtils.getInstance().extractClassName( className ); String packageName = NamingUtils.getInstance().extractPackageName( className ); diff --git a/kie-wb-common-screens/kie-wb-common-project-editor/kie-wb-common-project-editor-client/src/test/java/org/kie/workbench/common/screens/projecteditor/client/forms/MockBuildServiceCaller.java b/kie-wb-common-screens/kie-wb-common-project-editor/kie-wb-common-project-editor-client/src/test/java/org/kie/workbench/common/screens/projecteditor/client/forms/MockBuildServiceCaller.java index 5ec6c6ae006..c6b1ea13a7b 100644 --- a/kie-wb-common-screens/kie-wb-common-project-editor/kie-wb-common-project-editor-client/src/test/java/org/kie/workbench/common/screens/projecteditor/client/forms/MockBuildServiceCaller.java +++ b/kie-wb-common-screens/kie-wb-common-project-editor/kie-wb-common-project-editor-client/src/test/java/org/kie/workbench/common/screens/projecteditor/client/forms/MockBuildServiceCaller.java @@ -16,6 +16,8 @@ package org.kie.workbench.common.screens.projecteditor.client.forms; +import java.util.Collection; +import java.util.Map; import java.util.Set; import org.guvnor.common.services.project.builder.model.BuildResults; @@ -74,8 +76,8 @@ public IncrementalBuildResults updatePackageResource( Path resource ) { } @Override - public IncrementalBuildResults applyBatchResourceChanges( Project project, - Set changes ) { + public IncrementalBuildResults applyBatchResourceChanges( final Project project, + final Map> changes ) { return new IncrementalBuildResults(); } }; diff --git a/kie-wb-common-screens/kie-wb-common-project-explorer/kie-wb-common-project-explorer-client/src/main/java/org/kie/workbench/common/screens/explorer/client/widgets/BaseViewPresenter.java b/kie-wb-common-screens/kie-wb-common-project-explorer/kie-wb-common-project-explorer-client/src/main/java/org/kie/workbench/common/screens/explorer/client/widgets/BaseViewPresenter.java index b39a4dc045a..96d8518aeb9 100644 --- a/kie-wb-common-screens/kie-wb-common-project-explorer/kie-wb-common-project-explorer-client/src/main/java/org/kie/workbench/common/screens/explorer/client/widgets/BaseViewPresenter.java +++ b/kie-wb-common-screens/kie-wb-common-project-explorer/kie-wb-common-project-explorer-client/src/main/java/org/kie/workbench/common/screens/explorer/client/widgets/BaseViewPresenter.java @@ -521,7 +521,7 @@ public void onResourceRenamed( @Observes final ResourceRenamedEvent event ) { if ( !getView().isVisible() ) { return; } - final Path sourcePath = event.getSourcePath(); + final Path sourcePath = event.getPath(); final Path destinationPath = event.getDestinationPath(); boolean refresh = false;