From 4386d55053c48d4590c5f2b684597e982e837af8 Mon Sep 17 00:00:00 2001 From: Walter Medvedeo Date: Thu, 12 Sep 2013 14:04:02 +0200 Subject: [PATCH] Project packages calculation method, was refactored from ExplorerService (kie-wb-common) to ProjectService in order to provide this feature to other services. --- .../project/service/ProjectService.java | 9 ++ guvnor-project/guvnor-project-backend/pom.xml | 11 ++- .../backend/server/ProjectServiceImpl.java | 87 ++++++++++++++++++- 3 files changed, 97 insertions(+), 10 deletions(-) diff --git a/guvnor-project/guvnor-project-api/src/main/java/org/guvnor/common/services/project/service/ProjectService.java b/guvnor-project/guvnor-project-api/src/main/java/org/guvnor/common/services/project/service/ProjectService.java index d123186bdd..063d90826d 100644 --- a/guvnor-project/guvnor-project-api/src/main/java/org/guvnor/common/services/project/service/ProjectService.java +++ b/guvnor-project/guvnor-project-api/src/main/java/org/guvnor/common/services/project/service/ProjectService.java @@ -27,6 +27,8 @@ import org.uberfire.backend.repositories.Repository; import org.uberfire.backend.vfs.Path; +import java.util.Set; + /** * */ @@ -52,6 +54,13 @@ public interface ProjectService extends SupportsRead, */ org.guvnor.common.services.project.model.Package resolvePackage( final Path resource ); + /** + * Given a Project resolves the calculation of all the packages for this project. + * @param project + * @return Collection containing all the packages for the project. + */ + Set resolvePackages( final Project project ); + /** * Return true if the file is the Project's pom.xml file * @param resource diff --git a/guvnor-project/guvnor-project-backend/pom.xml b/guvnor-project/guvnor-project-backend/pom.xml index 936286c890..48abfaa30d 100644 --- a/guvnor-project/guvnor-project-backend/pom.xml +++ b/guvnor-project/guvnor-project-backend/pom.xml @@ -43,6 +43,11 @@ guvnor-m2repo-editor-api + + org.guvnor + guvnor-services-backend + + javax.enterprise cdi-api @@ -103,12 +108,6 @@ test - - org.guvnor - guvnor-services-backend - test - - diff --git a/guvnor-project/guvnor-project-backend/src/main/java/org/guvnor/common/services/project/backend/server/ProjectServiceImpl.java b/guvnor-project/guvnor-project-backend/src/main/java/org/guvnor/common/services/project/backend/server/ProjectServiceImpl.java index 13a59169d7..76e13a7919 100644 --- a/guvnor-project/guvnor-project-backend/src/main/java/org/guvnor/common/services/project/backend/server/ProjectServiceImpl.java +++ b/guvnor-project/guvnor-project-backend/src/main/java/org/guvnor/common/services/project/backend/server/ProjectServiceImpl.java @@ -16,10 +16,7 @@ package org.guvnor.common.services.project.backend.server; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; +import java.util.*; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.inject.Inject; @@ -28,6 +25,7 @@ import org.apache.commons.lang.StringUtils; import org.guvnor.common.services.backend.exceptions.ExceptionUtilities; import org.guvnor.common.services.project.backend.server.utils.IdentifierUtils; +import org.guvnor.common.services.backend.file.LinkedMetaInfFolderFilter; import org.guvnor.common.services.project.events.NewPackageEvent; import org.guvnor.common.services.project.events.NewProjectEvent; import org.guvnor.common.services.project.model.POM; @@ -44,6 +42,7 @@ import org.jboss.errai.bus.server.annotations.Service; import org.kie.commons.io.IOService; import org.kie.commons.java.nio.base.options.CommentedOption; +import org.kie.commons.java.nio.file.DirectoryStream; import org.kie.commons.java.nio.file.Files; import org.uberfire.backend.repositories.Repository; import org.uberfire.backend.server.config.ConfigGroup; @@ -71,6 +70,8 @@ public class ProjectServiceImpl private static final String MAIN_RESOURCES_PATH = "src/main/resources"; private static final String TEST_RESOURCES_PATH = "src/test/resources"; + private static String[] sourcePaths = { MAIN_SRC_PATH, MAIN_RESOURCES_PATH, TEST_SRC_PATH, TEST_RESOURCES_PATH }; + private IOService ioService; private Paths paths; @@ -218,6 +219,84 @@ public Package resolvePackage( final Path resource ) { } } + @Override + public Set resolvePackages( final Project project ) { + final Set packages = new HashSet(); + final Set packageNames = new HashSet(); + if ( project == null ) { + return packages; + } + //Build a set of all package names across /src/main/java, /src/main/resources, /src/test/java and /src/test/resources paths + //It is possible (if the project was not created within the workbench that some packages only exist in certain paths) + final Path projectRoot = project.getRootPath(); + final org.kie.commons.java.nio.file.Path nioProjectRootPath = paths.convert( projectRoot ); + for ( String src : sourcePaths ) { + final org.kie.commons.java.nio.file.Path nioPackageRootSrcPath = nioProjectRootPath.resolve( src ); + packageNames.addAll( getPackageNames( nioProjectRootPath, + nioPackageRootSrcPath ) ); + } + + //Construct Package objects for each package name + final java.util.Set resolvedPackages = new java.util.HashSet(); + for ( String packagePathSuffix : packageNames ) { + for ( String src : sourcePaths ) { + final org.kie.commons.java.nio.file.Path nioPackagePath = nioProjectRootPath.resolve( src ).resolve( packagePathSuffix ); + if ( Files.exists( nioPackagePath ) && !resolvedPackages.contains( packagePathSuffix ) ) { + packages.add( resolvePackage( paths.convert(nioPackagePath, false) ) ); + resolvedPackages.add( packagePathSuffix ); + } + } + } + + return packages; + } + + private Set getPackageNames( final org.kie.commons.java.nio.file.Path nioProjectRootPath, + final org.kie.commons.java.nio.file.Path nioPackageSrcPath ) { + final Set packageNames = new HashSet(); + if ( !Files.exists( nioPackageSrcPath ) ) { + return packageNames; + } + packageNames.add( getPackagePathSuffix( nioProjectRootPath, + nioPackageSrcPath ) ); + final LinkedMetaInfFolderFilter metaDataFileFilter = new LinkedMetaInfFolderFilter(); + final DirectoryStream nioChildPackageSrcPaths = ioService.newDirectoryStream( nioPackageSrcPath, + metaDataFileFilter ); + for ( org.kie.commons.java.nio.file.Path nioChildPackageSrcPath : nioChildPackageSrcPaths ) { + if ( Files.isDirectory( nioChildPackageSrcPath ) ) { + packageNames.addAll( getPackageNames( nioProjectRootPath, + nioChildPackageSrcPath ) ); + } + } + return packageNames; + } + + private String getPackagePathSuffix( final org.kie.commons.java.nio.file.Path nioProjectRootPath, + final org.kie.commons.java.nio.file.Path nioPackagePath ) { + final org.kie.commons.java.nio.file.Path nioMainSrcPath = nioProjectRootPath.resolve( MAIN_SRC_PATH ); + final org.kie.commons.java.nio.file.Path nioTestSrcPath = nioProjectRootPath.resolve( TEST_SRC_PATH ); + final org.kie.commons.java.nio.file.Path nioMainResourcesPath = nioProjectRootPath.resolve( MAIN_RESOURCES_PATH ); + final org.kie.commons.java.nio.file.Path nioTestResourcesPath = nioProjectRootPath.resolve( TEST_RESOURCES_PATH ); + + String packageName = null; + org.kie.commons.java.nio.file.Path packagePath = null; + if ( nioPackagePath.startsWith( nioMainSrcPath ) ) { + packagePath = nioMainSrcPath.relativize( nioPackagePath ); + packageName = packagePath.toString(); + } else if ( nioPackagePath.startsWith( nioTestSrcPath ) ) { + packagePath = nioTestSrcPath.relativize( nioPackagePath ); + packageName = packagePath.toString(); + } else if ( nioPackagePath.startsWith( nioMainResourcesPath ) ) { + packagePath = nioMainResourcesPath.relativize( nioPackagePath ); + packageName = packagePath.toString(); + } else if ( nioPackagePath.startsWith( nioTestResourcesPath ) ) { + packagePath = nioTestResourcesPath.relativize( nioPackagePath ); + packageName = packagePath.toString(); + } + + return packageName; + } + private Package makePackage( final Project project, final Path resource ) { final Path projectRoot = project.getRootPath();