/* * Copyright 2016 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. * 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.indexing; import java.io.File; import java.net.URI; import java.net.URL; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import org.apache.lucene.analysis.Analyzer; import org.drools.core.beliefsystem.abductive.Abducible; import org.guvnor.structure.backend.config.Removed; import org.junit.Before; import org.junit.Test; import org.kie.api.runtime.KieSession; import org.kie.internal.KieInternalServices; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.workbench.common.screens.javaeditor.type.JavaResourceTypeDefinition; import org.kie.workbench.common.services.datamodeller.annotations.AnnotationValuesAnnotation; import org.kie.workbench.common.services.refactoring.backend.server.BaseIndexingTest; import org.kie.workbench.common.services.refactoring.backend.server.TestIndexer; import org.kie.workbench.common.services.refactoring.backend.server.query.NamedQuery; import org.kie.workbench.common.services.refactoring.backend.server.query.response.DefaultResponseBuilder; import org.kie.workbench.common.services.refactoring.backend.server.query.response.ResponseBuilder; import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindAllChangeImpactQuery; import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindResourceReferencesQuery; import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRow; import org.kie.workbench.common.services.refactoring.service.ResourceType; import org.kie.workbench.common.services.refactoring.service.impact.QueryOperationRequest; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.Path; import org.uberfire.java.nio.fs.jgit.JGitFileSystem; import org.uberfire.java.nio.fs.jgit.util.JGitUtil; import static org.junit.Assert.*; /** * This annotation is used by the {{@link #testReferenceQueryInfrastructure()} method. */ @AnnotationValuesAnnotation public class ImpactAnalysisJavaFileTest extends BaseIndexingTest<JavaResourceTypeDefinition> { protected Set<NamedQuery> getQueries() { return new HashSet<NamedQuery>() { { add(new FindResourceReferencesQuery() { @Override public ResponseBuilder getResponseBuilder() { return new DefaultResponseBuilder(ioService()); } }); add(new FindAllChangeImpactQuery() { @Override public ResponseBuilder getResponseBuilder() { return new DefaultResponseBuilder(ioService()); } }); } }; } /** * This field is used by the {{@link #testReferenceQueryInfrastructure()} method. */ @Removed private JavaFileIndexer impactAnalysisTestField; /** * This method is used by the {{@link #testReferenceQueryInfrastructure()} method. */ @Abducible private KieInternalServices impactAnalysisTestMethod( KieSession ksession, StatefulKnowledgeSession otherKsession ) { return null; } @Before public void setupForThisTest() throws Exception { // setup IOService ioService = ioService(); JGitFileSystem gitFs = (JGitFileSystem) basePath.getFileSystem(); // Get this class location String fileName = this.getClass().getSimpleName() + ".java"; String fileLoc = getLocationOfTestClass(fileName); // Add this class to the repository/index Path path = basePath.resolve(fileName); String javaSourceText = loadText(fileLoc); ioService.write(path, javaSourceText); // Get test java file indexer class location fileName = TestJavaFileIndexer.class.getSimpleName() + ".java"; fileLoc = getLocationOfTestClass(fileName); // create new branch String randomBranchName = UUID.randomUUID().toString(); randomBranchName = randomBranchName.substring(0, randomBranchName.indexOf("-")); JGitUtil.createBranch(gitFs.gitRepo(), "master", randomBranchName); // Add this class to the repository/index final Path branchedBasePath = gitFs.provider().getPath( URI.create( "git://" + randomBranchName + "@" + getRepositoryName() + "/_someDir" + seed ) ); path = branchedBasePath.resolve(fileName); javaSourceText = loadText(fileLoc); ioService.write(path, javaSourceText); // wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index Thread.sleep(5000); } @Test public void testReferenceQueryInfrastructure() throws Exception { Class referencedClass = AnnotationValuesAnnotation.class; QueryOperationRequest queryOpRequest = QueryOperationRequest .references( referencedClass.getName(), ResourceType.JAVA ) .inAllProjects() .onAllBranches(); testQueryOperationRequest( queryOpRequest ); queryOpRequest = QueryOperationRequest .references( referencedClass.getName(), ResourceType.JAVA ) .inProject( TEST_PROJECT_NAME ) .onAllBranches(); testQueryOperationRequest( queryOpRequest ); queryOpRequest = QueryOperationRequest .references( referencedClass.getName(), ResourceType.JAVA ) .inProjectRootPathURI( TEST_PROJECT_ROOT ) .onAllBranches(); testQueryOperationRequest( queryOpRequest ); queryOpRequest = QueryOperationRequest .references( referencedClass.getName(), ResourceType.JAVA ) .inAllProjects() .onBranch( "master" ); testQueryOperationRequest( queryOpRequest ); } private void testQueryOperationRequest( QueryOperationRequest queryOpRequest ) { List<RefactoringPageRow> response = service.queryToList( queryOpRequest ); assertNotNull( "Null PageResonse", response ); assertNotNull( "Null PageRefactoringRow list", response ); assertEquals( "Objects referencing " + AnnotationValuesAnnotation.class.getName(), 1, response.size() ); for ( RefactoringPageRow row : response ) { org.uberfire.backend.vfs.Path rowPath = (org.uberfire.backend.vfs.Path) row.getValue(); logger.debug( rowPath.toURI() ); } Object pageRowValue = response.get( 0 ).getValue(); assertTrue( "Expected a " + org.uberfire.backend.vfs.Path.class.getName() + ", not a " + pageRowValue.getClass().getSimpleName(), org.uberfire.backend.vfs.Path.class.isAssignableFrom( pageRowValue.getClass() ) ); String fileName = ( (org.uberfire.backend.vfs.Path) pageRowValue ).getFileName(); assertTrue( "File does not end with '.java'", fileName.endsWith( ".java" ) ); assertEquals( "File name", this.getClass().getSimpleName(), fileName.subSequence( 0, fileName.indexOf( ".java" ) ) ); } private String getLocationOfTestClass( String fileName ) throws Exception { URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation(); String loc = url.toURI().toString(); loc = loc.replace("target/test-classes/", "src/test/java/"); String pkgName = this.getClass().getPackage().getName(); loc = loc + pkgName.replaceAll("\\.", "/") + "/" + fileName; loc = loc.replaceAll("/", File.separator); loc = loc.replace("file:", ""); return loc; } @Override protected TestIndexer<JavaResourceTypeDefinition> getIndexer() { return new TestJavaFileIndexer(); } @Override public Map<String, Analyzer> getAnalyzers() { return Collections.emptyMap(); } @Override protected JavaResourceTypeDefinition getResourceTypeDefinition() { return new JavaResourceTypeDefinition(); } @Override protected String getRepositoryName() { return this.getClass().getSimpleName(); } }