/* * 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. * * 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.refactoring.backend.server.impact; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.enterprise.inject.Instance; import org.junit.Ignore; import org.junit.Test; import org.kie.test.objects.Person; 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.drl.TestDrlFileIndexer; import org.kie.workbench.common.services.refactoring.backend.server.drl.TestDrlFileTypeDefinition; import org.kie.workbench.common.services.refactoring.backend.server.indexing.PackageDescrIndexVisitor; 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.PartType; import org.kie.workbench.common.services.refactoring.service.impact.QueryOperationRequest; import org.uberfire.java.nio.file.Path; /** * This test is focused on making sure that the {@link PackageDescrIndexVisitor} is able to find and collect the data that it needs to. * </p> * Eventually, when other changes have also been made to drools-compiler, it may be important to make sure that the * overlap of the {@link PackageDescrIndexVisitor} logic and the drools-compiler logic completely, complimentary and uniquely covers * retrieving information about compiled rules. * </p> * By "uniquely covers", I mean that there are a few cases in which references to parts/resources can be retrieved either via compilation * or via the {@link PackageDescrIndexVisitor} visitor logic -- it's important that only one of the two retrieve that informaiton * (clarity of code, maintenance, etc.. ). * </p> * HOWEVER, there is definitely information that can ONLY be retrieved via the {@link PackageDescrIndexVisitor} logic, and not * via the drools-compiler logic! * </p> * Ignored at the moment: can be turned on/finished when the drools-compiler logic has also been added */ @Ignore public class PackageDescrIndexVisitorIndexingTest extends BaseIndexingTest<TestDrlFileTypeDefinition> { 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() ); } } ); }}; } private int drlIdGen = 0; @Test public void allPackageDescrIndexVisitorMethodsTest() throws IOException, InterruptedException { //Add test files Path path = basePath.resolve( getUniqueDrlFileName() ); String accFunctionName = "testAcc"; String accFunctionClass = "org.kie.test.objects.TestAccumulator"; String entryPointName = "testEntryPoint"; String entryPointAnno = "testAnno"; String windowName = "TestWindow"; String funcDeclName = "myFunction"; String rule1Name = "ruleOne"; String rule2Name = "windowRule"; String rule3Name = "condBranchRule"; String drlSource = "package org.kie.indexing;\n" + "import org.kie.test.objects.*;\n" + "import accumulate " + accFunctionClass + " " + accFunctionName + "\n\n" + // 3 "declare entry-point '" + entryPointName + "' @" + entryPointAnno + " end\n\n" + // 5 "declare enum Workload\n" + // this info (local reference) can *not* be retrieved via compilation! " LIGHT( 4 ),\n" + " MEDIUM( 8 ),\n" + " HEAVY( 12 );\n" + " hours : int\n" + "end\n\n" + // 12 "declare TestWork\n" + " load : WorkLoad\n" + " num : int = 111\n" + " pers : Person \n" + "end\n\n" + // NOTE: it looks like Window.pattern object type name resolution requires compile time information // (Trace why this test fails, to see why.. ) "declare window " + windowName + "\n" + "Person( name == 'mark' )\n" + " over window:length( 10 )\n" + " from entry-point " + entryPointName +"\n" + "end\n\n" + // 18 "function String " + funcDeclName + "(Cheese cheese) {\n" + " return 'Hello' cheese.type\n" + "}\n\n" + "rule EnumRule\n" + "when\n" + " TestWork( WorkLoad.LIGHT, $h : load.hours )\n" + // Workload.LIGHT reference info must be retrieved via compilation! "then\n" + " list.add( $h );\n" + "end\n" + "rule " + rule1Name + "\n" + "when\n" + " Person( name == \"mark\", cheese.(price == 10, type.(length == 10) ) )\n" + "then\n" + "end\n\n" + // 28 "rule " + rule2Name + "\n" + "when\n" + " accumulate( Person( name == 'mark' ) from window TestWindow, $cnt : " + accFunctionName +"(1) )\n" + "then\n" + " // there has been $cnt RHT ticks over the last 10 ticks\n" + "end\n\n" + // 35 "rule " + rule3Name + "\n" + "when\n" + " $customer : Customer( age > 60 )\n" + " if ( type == Golden ) do[giveDiscount]\n" + " $car : Car ( owner == $customer )\n" + "then\n" + " modify($car) { setFreeParking( true ) }\n" + "then[giveDiscount]\n" + " modify($customer) { setDiscount( 0.1 ) }\n" + "end\n"; ioService().write( path, drlSource ); path = basePath.resolve( getUniqueDrlFileName() ); drlSource = loadText("accumulate.drl"); ioService().write( path, drlSource ); Thread.sleep( 5000 ); //wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index String className = Person.class.getName(); QueryOperationRequest refOpRequest = QueryOperationRequest.referencesPart(className, "setName(String)", PartType.METHOD ) .inAllProjects() .onAllBranches(); List<RefactoringPageRow> response = service.queryToList(refOpRequest); assertNotNull("Null PageResonse", response); assertNotNull("Null PageRefactoringRow list", response ); assertEquals("Objects referencing " + className, 1, response.size() ); 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", className, fileName.subSequence(0, fileName.indexOf(".java"))); } private String getUniqueDrlFileName() { return "drl" + drlIdGen++ + ".drl"; } @Override protected TestIndexer<TestDrlFileTypeDefinition> getIndexer() { return new TestDrlFileIndexer(); } @Override protected TestDrlFileTypeDefinition getResourceTypeDefinition() { return new TestDrlFileTypeDefinition(); } @Override protected String getRepositoryName() { return this.getClass().getSimpleName(); } }