/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.services.datamodel.backend.server; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.function.Predicate; import javax.enterprise.event.Event; import javax.enterprise.inject.Instance; import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle; import org.drools.workbench.models.datamodel.oracle.TypeSource; import org.guvnor.ala.pipeline.ConfigExecutor; import org.guvnor.ala.registry.PipelineRegistry; import org.guvnor.ala.registry.local.InMemoryPipelineRegistry; import org.guvnor.common.services.backend.file.FileDiscoveryService; import org.guvnor.common.services.backend.file.FileDiscoveryServiceImpl; import org.guvnor.common.services.backend.metadata.MetadataServerSideService; import org.guvnor.common.services.backend.metadata.MetadataServiceImpl; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.backend.util.CommentedOptionFactoryImpl; import org.guvnor.common.services.project.backend.server.POMServiceImpl; import org.guvnor.common.services.project.backend.server.ProjectConfigurationContentHandler; import org.guvnor.common.services.project.backend.server.ProjectRepositoriesContentHandler; import org.guvnor.common.services.project.backend.server.ProjectRepositoryResolverImpl; import org.guvnor.common.services.project.backend.server.ProjectResourcePathResolver; import org.guvnor.common.services.project.backend.server.utils.POMContentHandler; import org.guvnor.common.services.project.builder.events.InvalidateDMOProjectCacheEvent; import org.guvnor.common.services.project.builder.service.BuildService; import org.guvnor.common.services.project.builder.service.BuildValidationHelper; import org.guvnor.common.services.project.builder.service.PostBuildHandler; import org.guvnor.common.services.project.events.NewPackageEvent; import org.guvnor.common.services.project.events.NewProjectEvent; import org.guvnor.common.services.project.events.RenameProjectEvent; import org.guvnor.common.services.project.service.POMService; import org.guvnor.common.services.project.service.ProjectRepositoriesService; import org.guvnor.common.services.project.service.ProjectRepositoryResolver; import org.guvnor.common.services.shared.metadata.MetadataService; import org.guvnor.m2repo.backend.server.M2RepoServiceImpl; import org.guvnor.structure.backend.backcompat.BackwardCompatibleUtil; import org.guvnor.structure.backend.config.ConfigGroupMarshaller; import org.guvnor.structure.backend.config.ConfigurationFactoryImpl; import org.guvnor.structure.backend.config.ConfigurationServiceImpl; import org.guvnor.structure.backend.config.DefaultPasswordServiceImpl; import org.guvnor.structure.repositories.Repository; import org.guvnor.structure.repositories.impl.git.GitRepository; import org.guvnor.structure.security.RepositoryAction; import org.guvnor.structure.server.config.ConfigurationFactory; import org.guvnor.structure.server.config.ConfigurationService; import org.guvnor.structure.server.config.PasswordService; import org.jboss.errai.security.shared.api.Group; import org.jboss.errai.security.shared.api.Role; import org.jboss.errai.security.shared.api.identity.User; import org.jboss.errai.security.shared.api.identity.UserImpl; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.services.backend.builder.ala.BuildPipelineInitializer; import org.kie.workbench.common.services.backend.builder.ala.BuildPipelineInvoker; import org.kie.workbench.common.services.backend.builder.ala.LocalBuildConfigExecutor; import org.kie.workbench.common.services.backend.builder.ala.LocalBuildExecConfigExecutor; import org.kie.workbench.common.services.backend.builder.ala.LocalProjectConfigExecutor; import org.kie.workbench.common.services.backend.builder.ala.LocalSourceConfigExecutor; import org.kie.workbench.common.services.backend.builder.core.BuildHelper; import org.kie.workbench.common.services.backend.builder.core.DeploymentVerifier; import org.kie.workbench.common.services.backend.builder.core.LRUBuilderCache; import org.kie.workbench.common.services.backend.builder.core.LRUPomModelCache; import org.kie.workbench.common.services.backend.builder.core.LRUProjectDependenciesClassLoaderCache; import org.kie.workbench.common.services.backend.builder.service.BuildInfoService; import org.kie.workbench.common.services.backend.builder.service.BuildServiceHelper; import org.kie.workbench.common.services.backend.builder.service.BuildServiceImpl; import org.kie.workbench.common.services.backend.dependencies.DependencyServiceImpl; import org.kie.workbench.common.services.backend.kmodule.KModuleContentHandler; import org.kie.workbench.common.services.backend.kmodule.KModuleServiceImpl; import org.kie.workbench.common.services.backend.project.KieProjectRepositoriesServiceImpl; import org.kie.workbench.common.services.backend.project.KieProjectServiceImpl; import org.kie.workbench.common.services.backend.project.KieResourceResolver; import org.kie.workbench.common.services.backend.project.ProjectImportsServiceImpl; import org.kie.workbench.common.services.backend.project.ProjectSaver; import org.kie.workbench.common.services.backend.whitelist.PackageNameSearchProvider; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListLoader; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListSaver; import org.kie.workbench.common.services.backend.whitelist.PackageNameWhiteListServiceImpl; import org.kie.workbench.common.services.datamodel.backend.server.cache.LRUDataModelOracleCache; import org.kie.workbench.common.services.datamodel.backend.server.cache.LRUProjectDataModelOracleCache; import org.kie.workbench.common.services.datamodel.backend.server.cache.ProjectDataModelOracleBuilderProvider; import org.kie.workbench.common.services.datamodel.backend.server.service.DataModelService; import org.kie.workbench.common.services.shared.dependencies.DependencyService; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.kie.workbench.common.services.shared.project.ProjectImportsService; import org.kie.workbench.common.services.shared.whitelist.PackageNameWhiteListService; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.backend.server.io.ConfigIOServiceProducer; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; import org.uberfire.io.impl.IOServiceDotFileImpl; import org.uberfire.java.nio.file.FileSystemNotFoundException; import org.uberfire.java.nio.fs.file.SimpleFileSystemProvider; import org.uberfire.mocks.EventSourceMock; import org.uberfire.rpc.SessionInfo; import org.uberfire.rpc.impl.SessionInfoImpl; import org.uberfire.security.ResourceType; import org.uberfire.security.authz.AuthorizationManager; import org.uberfire.security.authz.PermissionManager; import org.uberfire.security.authz.PermissionTypeRegistry; import org.uberfire.security.impl.authz.DefaultAuthorizationManager; import org.uberfire.security.impl.authz.DefaultPermissionManager; import org.uberfire.security.impl.authz.DefaultPermissionTypeRegistry; import org.uberfire.security.impl.authz.DotNamedPermissionType; import static org.junit.Assert.*; import static org.kie.workbench.common.services.datamodel.backend.server.ProjectDataModelOracleTestUtils.*; import static org.mockito.Mockito.*; @RunWith( MockitoJUnitRunner.class ) public class DataModelServiceConstructorTest { private SimpleFileSystemProvider fs = new SimpleFileSystemProvider(); private ResourceType REPOSITORY_TYPE = Repository.RESOURCE_TYPE; @Mock private Instance<ProjectResourcePathResolver > resourcePathResolversInstance; private class HackedKModuleServiceImpl extends KModuleServiceImpl { public HackedKModuleServiceImpl(IOService ioService, KieProjectServiceImpl projectService, MetadataService metadataService, KModuleContentHandler moduleContentHandler) { super(ioService, projectService, metadataService, moduleContentHandler); } @Override public void setProjectService(KieProjectService projectService) { super.setProjectService(projectService); } } private class HackedLRUProjectDependenciesClassLoaderCache extends LRUProjectDependenciesClassLoaderCache { @Override public void setBuildInfoService(BuildInfoService buildInfoService) { super.setBuildInfoService(buildInfoService); } } private class HackedKieProjectServiceImpl extends KieProjectServiceImpl { public HackedKieProjectServiceImpl(IOService ioService, ProjectSaver projectSaver, POMService pomService, ConfigurationService configurationService, ConfigurationFactory configurationFactory, Event<NewProjectEvent> newProjectEvent, Event<NewPackageEvent> newPackageEvent, Event<RenameProjectEvent> renameProjectEvent, Event<InvalidateDMOProjectCacheEvent> invalidateDMOCache, SessionInfo sessionInfo, AuthorizationManager authorizationManager, BackwardCompatibleUtil backward, CommentedOptionFactory commentedOptionFactory, KieResourceResolver resourceResolver, ProjectRepositoryResolver repositoryResolver) { super(ioService, projectSaver, pomService, configurationService, configurationFactory, newProjectEvent, newPackageEvent, renameProjectEvent, invalidateDMOCache, sessionInfo, authorizationManager, backward, commentedOptionFactory, resourceResolver, repositoryResolver ); } @Override public void setProjectSaver(ProjectSaver projectSaver) { super.setProjectSaver(projectSaver); } } @Test public void testConstructor() throws IllegalArgumentException, FileSystemNotFoundException, SecurityException, URISyntaxException { final URL packageUrl = this.getClass().getResource("/DataModelServiceConstructorTest/src/main/java/t1p1"); IOService ioService = new IOServiceDotFileImpl(); Collection<Role> roles = new ArrayList<>(); Collection<Group> groups = new ArrayList<>(); User user = new UserImpl("admin", roles, groups); SessionInfo sessionInfo = new SessionInfoImpl("admin", user); Instance<User> userInstance = mock( Instance.class ); when( userInstance.get() ).thenReturn( user ); ConfigIOServiceProducer cfiosProducer = new ConfigIOServiceProducer(); cfiosProducer.setup(); IOService configIOService = cfiosProducer.configIOService(); MetadataService metadataService = new MetadataServiceImpl(ioService, configIOService, sessionInfo); POMContentHandler pomContentHandler = new POMContentHandler(); M2RepoServiceImpl m2RepoService = new M2RepoServiceImpl(); POMService pomService = new POMServiceImpl(ioService, pomContentHandler, m2RepoService, metadataService); KModuleContentHandler moduleContentHandler = new KModuleContentHandler(); PasswordService secureService = new DefaultPasswordServiceImpl(); ConfigurationFactory configurationFactory = new ConfigurationFactoryImpl(secureService); org.guvnor.structure.repositories.Repository systemRepository = new GitRepository("system"); ConfigGroupMarshaller marshaller = new ConfigGroupMarshaller(); ConfigurationService configurationService = new ConfigurationServiceImpl(systemRepository, marshaller, user, ioService, new EventSourceMock<>(), new EventSourceMock<>(), new EventSourceMock<>(), fs.getFileSystem(packageUrl.toURI())); CommentedOptionFactory commentedOptionFactory = new CommentedOptionFactoryImpl(sessionInfo); BackwardCompatibleUtil backward = new BackwardCompatibleUtil(configurationFactory); ProjectConfigurationContentHandler projectConfigurationContentHandler = new ProjectConfigurationContentHandler(); ProjectImportsService projectImportsService = new ProjectImportsServiceImpl(ioService, projectConfigurationContentHandler); Event<NewProjectEvent> newProjectEvent = new EventSourceMock<>(); Event<NewPackageEvent> newPackageEvent = new EventSourceMock<>(); Event<RenameProjectEvent> renameProjectEvent = new EventSourceMock<>(); Event<InvalidateDMOProjectCacheEvent> invalidateDMOCache = new EventSourceMock<>(); PermissionTypeRegistry permissionTypeRegistry = new DefaultPermissionTypeRegistry(); DotNamedPermissionType permissionType = new DotNamedPermissionType(REPOSITORY_TYPE.getName()); permissionType.createPermission(REPOSITORY_TYPE, RepositoryAction.READ, true); permissionType.createPermission(REPOSITORY_TYPE, RepositoryAction.CREATE, true); permissionType.createPermission(REPOSITORY_TYPE, RepositoryAction.UPDATE, true); permissionType.createPermission(REPOSITORY_TYPE, RepositoryAction.DELETE, true); permissionTypeRegistry.register(permissionType); PermissionManager permissionManager = new DefaultPermissionManager(); AuthorizationManager authorizationManager = new DefaultAuthorizationManager(permissionManager); ProjectRepositoryResolver repositoryResolver = new ProjectRepositoryResolverImpl(ioService, null, null); FileDiscoveryService fileDiscoveryService = new FileDiscoveryServiceImpl(); HackedKieProjectServiceImpl projectService = null; HackedKModuleServiceImpl kModuleService = new HackedKModuleServiceImpl(ioService, projectService, metadataService, moduleContentHandler); KieResourceResolver resourceResolver = new KieResourceResolver(ioService, pomService, configurationService, commentedOptionFactory, backward, kModuleService, resourcePathResolversInstance ) { @Override protected void addSecurityGroups(final KieProject project) { //Do nothing. This test demonstrating DMO usage without WELD does not use permissions. } }; ProjectSaver projectSaver = null; projectService = new HackedKieProjectServiceImpl(ioService, projectSaver, pomService, configurationService, configurationFactory, newProjectEvent, newPackageEvent, renameProjectEvent, invalidateDMOCache, sessionInfo, authorizationManager, backward, commentedOptionFactory, resourceResolver, repositoryResolver); ProjectRepositoriesContentHandler contentHandler = new ProjectRepositoriesContentHandler(); ProjectRepositoriesService projectRepositoriesService = new KieProjectRepositoriesServiceImpl(ioService, repositoryResolver, resourceResolver, contentHandler, commentedOptionFactory); DependencyService dependencyService = new DependencyServiceImpl(); PackageNameSearchProvider packageNameSearchProvider = new PackageNameSearchProvider(dependencyService); PackageNameWhiteListLoader loader = new PackageNameWhiteListLoader(packageNameSearchProvider, ioService); MetadataServerSideService serverSideMetdataService = new MetadataServiceImpl(ioService, configIOService, sessionInfo); PackageNameWhiteListSaver saver = new PackageNameWhiteListSaver(ioService, serverSideMetdataService, commentedOptionFactory); PackageNameWhiteListService packageNameWhiteListService = new PackageNameWhiteListServiceImpl(ioService, projectService, loader, saver); projectSaver = new ProjectSaver(ioService, pomService, kModuleService, newProjectEvent, newPackageEvent, resourceResolver, projectImportsService, projectRepositoriesService, packageNameWhiteListService, commentedOptionFactory, sessionInfo); projectService.setProjectSaver(projectSaver); kModuleService.setProjectService(projectService); ProjectImportsService importsService = new ProjectImportsServiceImpl(ioService, projectConfigurationContentHandler); Instance<BuildValidationHelper> buildValidationHelperBeans = null; Instance<Predicate<String>> classFilterBeans = null; HackedLRUProjectDependenciesClassLoaderCache dependenciesClassLoaderCache = new HackedLRUProjectDependenciesClassLoaderCache(); LRUPomModelCache pomModelCache = new LRUPomModelCache(); LRUBuilderCache builderCache = new LRUBuilderCache(ioService, projectService, importsService, buildValidationHelperBeans, dependenciesClassLoaderCache, pomModelCache, packageNameWhiteListService, classFilterBeans ); Instance< PostBuildHandler > handlerInstance = mock( Instance.class ); Iterator<PostBuildHandler> mockIterator = mock( Iterator.class ); when( handlerInstance.iterator() ).thenReturn( mockIterator ); when ( mockIterator.hasNext() ).thenReturn( false ); DeploymentVerifier deploymentVerifier = new DeploymentVerifier( repositoryResolver, projectRepositoriesService ); BuildHelper buildHelper = new BuildHelper( pomService, m2RepoService, projectService, deploymentVerifier, builderCache, handlerInstance, userInstance ); PipelineRegistry pipelineRegistry = new InMemoryPipelineRegistry(); BuildPipelineInitializer pipelineInitializer = new BuildPipelineInitializer( pipelineRegistry, getConfigExecutors( projectService, buildHelper ) ); BuildPipelineInvoker pipelineInvoker = new BuildPipelineInvoker( pipelineInitializer.getExecutor(), pipelineRegistry ); BuildServiceHelper buildServiceHelper = new BuildServiceHelper( pipelineInvoker, deploymentVerifier ); BuildService buildService = new BuildServiceImpl( projectService, buildServiceHelper, builderCache ); BuildInfoService buildInfoService = new BuildInfoService( buildService, builderCache ); ProjectDataModelOracleBuilderProvider builderProvider = new ProjectDataModelOracleBuilderProvider(packageNameWhiteListService, importsService); LRUProjectDataModelOracleCache cacheProjects = new LRUProjectDataModelOracleCache(builderProvider, projectService, buildInfoService ); dependenciesClassLoaderCache.setBuildInfoService( buildInfoService ); LRUDataModelOracleCache cachePackages = new LRUDataModelOracleCache(ioService, fileDiscoveryService, cacheProjects, projectService, buildInfoService ); DataModelService dataModelService = new DataModelServiceImpl(cachePackages, cacheProjects, projectService); final org.uberfire.java.nio.file.Path nioPackagePath = fs.getPath(packageUrl.toURI()); final Path packagePath = Paths.convert(nioPackagePath); final ProjectDataModelOracle oracle = dataModelService.getProjectDataModel(packagePath); assertNotNull(oracle); assertEquals(4, oracle.getProjectModelFields().size()); assertContains("t1p1.Bean1", oracle.getProjectModelFields().keySet()); assertContains("t1p1.DRLBean", oracle.getProjectModelFields().keySet()); assertContains("t1p2.Bean2", oracle.getProjectModelFields().keySet()); assertContains("java.lang.String", oracle.getProjectModelFields().keySet()); assertEquals(TypeSource.JAVA_PROJECT, oracle.getProjectTypeSources().get("t1p1.Bean1")); assertEquals(TypeSource.DECLARED, oracle.getProjectTypeSources().get("t1p1.DRLBean")); assertEquals(TypeSource.JAVA_PROJECT, oracle.getProjectTypeSources().get("t1p2.Bean2")); assertEquals(TypeSource.JAVA_PROJECT, oracle.getProjectTypeSources().get("java.lang.String")); } private Collection< ConfigExecutor > getConfigExecutors( KieProjectService projectService, BuildHelper buildHelper ) { Collection< ConfigExecutor > configs = new ArrayList<>( ); configs.add( new LocalSourceConfigExecutor() ); configs.add( new LocalProjectConfigExecutor( projectService ) ); configs.add( new LocalBuildConfigExecutor() ); configs.add( new LocalBuildExecConfigExecutor( buildHelper ) ); return configs; } }