Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2012 JBoss Inc
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 package org.kie.workbench.common.screens.datamodeller.backend.server;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 
 public class DataModelerServiceImpl implements DataModelerService {
 
     private static final Logger logger = LoggerFactory.getLoggerDataModelerServiceImpl.class );
 
     private static final String MAIN_JAVA_PATH = "src/main/java";
     private static final String MAIN_RESOURCES_PATH = "src/main/resources";
     private static final String TEST_JAVA_PATH = "src/test/java";
     private static final String TEST_RESOURCES_PATH = "src/test/resources";
 
     private static final String DEFAULT_GUVNOR_PKG = "defaultpkg";
 
     @Inject
     @Named("ioStrategy")
 
     @Inject
     private Paths paths;
 
     @Inject
 
     @Inject
 
     @Inject
 
     public DataModelerServiceImpl() {
     }
 
     @Override
     public Path createModelPath context,
                              String fileName ) {
 
         //TODO remove this method if the model file is no longer created
         return context;
     }
 
    @Override
    public DataModelTO loadModelProject project ) {
        if ( .isDebugEnabled() ) {
            .debug"Loading data model from path: " + project.getRootPath() );
        }
        Long startTime = System.currentTimeMillis();
        DataModel dataModel = null;
        Path projectPath = null;
        try {
            projectPath = project.getRootPath();
            if ( .isDebugEnabled() ) {
                .debug"Current project path is: " + projectPath );
            }
            ProjectDataModelOracle projectDataModelOracle = .getProjectDataModelprojectPath );
            DataModelOracleDriver driver = DataModelOracleDriver.getInstance();
            dataModel = driver.loadModelprojectDataModelOracle );
            //Objects read from persistent .java format are tagged as PERSISTENT objects
            DataModelTO dataModelTO = DataModelerServiceHelper.getInstance().domain2TodataModel.true );
            Long endTime = System.currentTimeMillis();
            if ( .isDebugEnabled() ) {
                .debug"Time elapsed when loading " + projectPath.getFileName() + ": " + ( endTime - startTime ) + " ms" );
            }
            return dataModelTO;
        } catch ( Exception e ) {
            .error"Data model couldn't be loaded, path: " + projectPath + ", projectPath: " + projectPath + "."e );
            throw new ServiceException"Data model couldn't be loaded, path: " + projectPath + ", projectPath: " + projectPath + "."e );
        }
    }
    @Override
    public GenerationResult saveModelDataModelTO dataModel,
                                       final Project project ) {
        Path projectPath = project.getRootPath();
        try {
            Long startTime = System.currentTimeMillis();
            //calculate the java sources path
            //ensure java sources directory exists.
            org.kie.commons.java.nio.file.Path javaPath = ensureProjectJavaPath.convertprojectPath ) );
            //convert to domain model
            DataModel dataModelDomain = DataModelerServiceHelper.getInstance().to2DomaindataModel );
            //optimization remove unmodified data objects from the model in order to skip generation for unmodified objects.
            removeUnmodifiedObjectsdataModelDomaindataModel );
            //clean the files that needs to be deleted prior to model generation.
            List<PathdeleteableFiles = calculateDeleteableFilesdataModeljavaPath );
            cleanupFilesdeleteableFiles );
            //invalidate ProjectDataModelOracle for this project.
            .firenew InvalidateDMOProjectCacheEventprojectPath ) );
            DataModelOracleDriver driver = DataModelOracleDriver.getInstance();
            javaPath = ensureProjectJavaPath.convertprojectPath ) );
            List<FileChangeDescriptordriverChanges = driver.generateModeldataModelDomainjavaPath );
            notifyFileChangesdeleteableFilesdriverChanges );
            cleanupEmptyDirsjavaPath );
            //after file cleaning we must ensure again that the java path exists
            javaPath = ensureProjectJavaPath.convertprojectPath ) );
            Long endTime = System.currentTimeMillis();
            if ( .isDebugEnabled() ) {
                .debug"Time elapsed when saving " + projectPath.getFileName() + ": " + ( endTime - startTime ) + " ms" );
            }
            GenerationResult result = new GenerationResult();
            result.setGenerationTimeendTime - startTime );
            result.setObjectFingerPrints( DataModelerServiceHelper.getInstance().claculateFingerPrintsdataModel ) );
            return result;
        } catch ( Exception e ) {
            .error"An error was produced during data model generation, dataModel: " + dataModel + ", path: " + projectPathe );
            throw new ServiceException"Data model: " + dataModel.getParentProjectName() + ", couldn't be generated due to the following error. " + e );
        }
    }
    @Override
        List<PropertyTypeTOtypes = new ArrayList<PropertyTypeTO>();
        for ( PropertyType baseType : PropertyTypeFactoryImpl.getInstance().getBasePropertyTypes() ) {
            types.addnew PropertyTypeTObaseType.getName(), baseType.getClassName() ) );
        }
        return types;
    }
    @Override
    public Map<StringBooleanevaluateIdentifiersString[] identifiers ) {
        Map<StringBooleanresult = new HashMap<StringBoolean>( identifiers.length );
        if ( identifiers != null && identifiers.length > 0 ) {
            for ( String s : identifiers ) {
                result.puts, ValidationUtils.isJavaIdentifiers ) );
            }
        }
        return result;
    }
    @Override
        Map<StringAnnotationDefinitionTOannotations = new HashMap<StringAnnotationDefinitionTO>();
        List<AnnotationDefinitionannotationDefinitions = DataModelOracleDriver.getInstance().getConfiguredAnnotations();
        AnnotationDefinitionTO annotationDefinitionTO;
        DataModelerServiceHelper serviceHelper = DataModelerServiceHelper.getInstance();
        for ( AnnotationDefinition annotationDefinition : annotationDefinitions ) {
            annotationDefinitionTO = serviceHelper.domain2ToannotationDefinition );
            annotations.putannotationDefinitionTO.getClassName(), annotationDefinitionTO );
        }
        return annotations;
    }
    private void notifyFileChangesList<PathdeleteableFiles,
                                    List<FileChangeDescriptordriverChanges ) {
        Set<ResourceChangebatchChanges = new HashSet<ResourceChange>();
        for ( Path deleteableFile : deleteableFiles ) {
            batchChanges.addnew ResourceChange.deleteableFile ) );
        }
        for ( FileChangeDescriptor driverChange : driverChanges ) {
            switch ( driverChange.getAction() ) {
                case .:
                    .debug"Notifying file created: " + driverChange.getPath() );
                    batchChanges.addnew ResourceChange..convertdriverChange.getPath() ) ) );
                    break;
                case .:
                    .debug"Notifying file deleted: " + driverChange.getPath() );
                    batchChanges.addnew ResourceChange..convertdriverChange.getPath() ) ) );
                    break;
                case .:
                    .debug"Notifying file updated: " + driverChange.getPath() );
                    batchChanges.addnew ResourceChange..convertdriverChange.getPath() ) ) );
                    break;
            }
        }
        if ( batchChanges.size() > 0 ) {
            .firenew ResourceBatchChangesEventbatchChanges ) );
        }
    }
    private List<PathcalculateDeleteableFilesDataModelTO dataModel,
                                                 org.kie.commons.java.nio.file.Path javaPath ) {
        List<DataObjectTOcurrentObjects = dataModel.getDataObjects();
        List<DataObjectTOdeletedObjects = dataModel.getDeletedDataObjects();
        List<PathdeleteableFiles = new ArrayList<Path>();
        org.kie.commons.java.nio.file.Path filePath;
        //process deleted persistent objects.
        for ( DataObjectTO dataObject : deletedObjects ) {
            if ( dataObject.isPersistent() ) {
                filePath = calculateFilePathdataObject.getOriginalClassName(), javaPath );
                if ( dataModel.getDataObjectByClassNamedataObject.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 {
                    deleteableFiles.add.convertfilePath ) );
                }
            }
        }
        //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 = calculateFilePathdataObject.getOriginalClassName(), javaPath );
                if ( dataModel.getDataObjectByClassNamedataObject.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 {
                    deleteableFiles.add.convertfilePath ) );
                }
            }
        }
        return deleteableFiles;
    }
    private void removeUnmodifiedObjectsDataModel dataModelDomain,
                                          DataModelTO dataModelTO ) throws Exception {
        String newFingerPrint;
        for ( DataObjectTO dataObject : dataModelTO.getDataObjects() ) {
            newFingerPrint = DataModelerServiceHelper.getInstance().calculateFingerPrintdataObject.getStringId() );
            if ( newFingerPrint.equalsdataObject.getFingerPrint() ) ) {
                ..println"XXXXXXXXXXXXXXXXXXX the class : " + dataObject.getClassName() + " wasn't modified" );
                dataModelDomain.removeDataObjectdataObject.getClassName() );
            }
        }
    }
    private void cleanupFilesList<PathdeleteableFiles ) {
        for ( Path filePath : deleteableFiles ) {
            .deleteIfExists.convertfilePath ) );
        }
    }

    
This auxiliary method deletes the files that belongs to data objects that was removed in memory.
    private List<ResourceChangecleanupFilesDataModelTO dataModel,
                                               org.kie.commons.java.nio.file.Path javaPath ) {
        List<DataObjectTOcurrentObjects = dataModel.getDataObjects();
        List<DataObjectTOdeletedObjects = dataModel.getDeletedDataObjects();
        List<ResourceChangefileChanges = new ArrayList<ResourceChange>();
        org.kie.commons.java.nio.file.Path filePath;
        //process deleted persistent objects.
        for ( DataObjectTO dataObject : deletedObjects ) {
            if ( dataObject.isPersistent() ) {
                filePath = calculateFilePathdataObject.getOriginalClassName(), javaPath );
                if ( dataModel.getDataObjectByClassNamedataObject.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.addnew ResourceChange..convertfilePath ) ) );
                    .deletefilePath );
                }
            }
        }
        //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 = calculateFilePathdataObject.getOriginalClassName(), javaPath );
                if ( dataModel.getDataObjectByClassNamedataObject.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.addnew ResourceChange..convertfilePath ) ) );
                    .deletefilePath );
                }
            }
        }
        return fileChanges;
    }
    private void cleanupEmptyDirsorg.kie.commons.java.nio.file.Path pojectPath ) {
        FileUtils fileUtils = FileUtils.getInstance();
        List<StringdeleteableFiles = new ArrayList<String>();
        deleteableFiles.add".gitignore" );
        fileUtils.cleanEmptyDirectoriespojectPathfalsedeleteableFiles );
    }
        org.kie.commons.java.nio.file.Path javaPath = projectPath.resolve"src" ).resolve"main" ).resolve"java" );
        if ( .existsjavaPath ) ) {
            return javaPath;
        }
        return null;
    }
        org.kie.commons.java.nio.file.Path javaPath = projectPath.resolve"src" );
        if ( !.existsjavaPath ) ) {
            javaPath = .createDirectoryjavaPath );
        }
        javaPath = javaPath.resolve"main" );
        if ( !.existsjavaPath ) ) {
            javaPath = .createDirectoryjavaPath );
        }
        javaPath = javaPath.resolve"java" );
        if ( !.existsjavaPath ) ) {
            javaPath = .createDirectoryjavaPath );
        }
        return javaPath;
    }

    
Given a className calculates the path to the java file allocating the corresponding pojo.
    private org.kie.commons.java.nio.file.Path calculateFilePathString className,
                                                                  org.kie.commons.java.nio.file.Path javaPath ) {
        String name = NamingUtils.getInstance().extractClassNameclassName );
        String packageName = NamingUtils.getInstance().extractPackageNameclassName );
        org.kie.commons.java.nio.file.Path filePath = javaPath;
        if ( packageName != null ) {
            List<StringpackageNameTokens = NamingUtils.getInstance().tokenizePackageNamepackageName );
            for ( String token : packageNameTokens ) {
                filePath = filePath.resolvetoken );
            }
        }
        filePath = filePath.resolvename + ".java" );
        return filePath;
    }
New to GrepCode? Check out our FAQ X