/*
* 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.
* 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.stunner.bpmn.backend.service.indexing;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Package;
import org.junit.Test;
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.FindResourcesQuery;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueResourceIndexTerm;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRequest;
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.ResourceType;
import org.kie.workbench.common.services.refactoring.service.impact.QueryOperationRequest;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.kie.workbench.common.stunner.bpmn.backend.query.FindBpmnProcessIdsQuery;
import org.kie.workbench.common.stunner.bpmn.resource.BPMNDefinitionSetResourceType;
import org.uberfire.java.nio.file.Path;
import org.uberfire.paging.PageResponse;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
public class BpmnFileIndexerTest extends BaseIndexingTest<BPMNDefinitionSetResourceType> {
private final static List<String> PROCESS_IDS = Arrays.asList(new String[]{"hiring", "ParentProcess", "SubProcess", "multiple-rule-tasks", "org.jbpm.signal", "org.jbpm.broken"});
private final static String[] BPMN_FILES = {
"callActivity.bpmn",
"callActivityByName.bpmn",
"callActivityCalledSubProcess.bpmn",
"hiring.bpmn",
"multipleRuleTasksWithDataInput.bpmn",
"signal.bpmn",
"brokenSignal.bpmn",
};
private static final String DEPLOYMENT_ID = "org.kjar:test:1.0";
protected Set<NamedQuery> getQueries() {
return new HashSet<NamedQuery>() {{
add(new FindResourcesQuery() {
@Override
public ResponseBuilder getResponseBuilder() {
return new DefaultResponseBuilder(ioService());
}
});
add(new FindAllChangeImpactQuery() {
@Override
public ResponseBuilder getResponseBuilder() {
return new DefaultResponseBuilder(ioService());
}
});
add(new FindBpmnProcessIdsQuery() {
@Override
public ResponseBuilder getResponseBuilder() {
return new FindBpmnProcessIdsQuery.BpmnProcessIdsResponseBuilder(ioService());
}
});
}};
}
private static final long WAIT_TIME_MILLIS = 2000;
private static final int MAX_WAIT_TIMES = 8;
@Test
public void testBpmnIndexing() throws Exception {
List<Path> pathList = new ArrayList<>();
for (int i = 0; i < BPMN_FILES.length; ++i) {
String bpmnFile = BPMN_FILES[i];
if (bpmnFile.endsWith("bpmn")) {
Path path = basePath.resolve(bpmnFile);
pathList.add(path);
String bpmnStr = loadText(bpmnFile);
ioService().write(path,
bpmnStr);
}
}
Path[] paths = pathList.toArray(new Path[pathList.size()]);
{
PageResponse<RefactoringPageRow> response = null;
try {
for (int i = 0; i < MAX_WAIT_TIMES; i++) {
Thread.sleep(WAIT_TIME_MILLIS);
response = queryBPMN2Resources();
if (response != null && response.getPageRowList() != null && response.getPageRowList().size() >= paths.length) {
break;
}
}
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
assertNotNull(response);
assertEquals(paths.length,
response.getPageRowList().size());
}
{
QueryOperationRequest request = QueryOperationRequest
.referencesSharedPart("*",
PartType.RULEFLOW_GROUP,
ValueIndexTerm.TermSearchType.WILDCARD)
.inAllProjects().onAllBranches();
try {
final List<RefactoringPageRow> response = service.queryToList(request);
assertNotNull(response);
assertEquals(1,
response.size());
assertResponseContains(response,
paths[4]);
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
}
{
QueryOperationRequest request = QueryOperationRequest
.referencesSharedPart("MySignal",
PartType.SIGNAL)
.inAllProjects().onAllBranches();
try {
final List<RefactoringPageRow> response = service.queryToList(request);
assertNotNull(response);
assertEquals(1,
response.size());
assertResponseContains(response,
paths[5]);
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
}
{
QueryOperationRequest request = QueryOperationRequest
.referencesSharedPart("BrokenSignal",
PartType.SIGNAL)
.inAllProjects().onAllBranches();
try {
final List<RefactoringPageRow> response = service.queryToList(request);
assertNotNull(response);
assertEquals(1,
response.size());
assertResponseContains(response,
paths[6]);
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
}
{
QueryOperationRequest request = QueryOperationRequest
.referencesSharedPart("name",
PartType.GLOBAL)
.inAllProjects().onAllBranches();
try {
final List<RefactoringPageRow> response = service.queryToList(request);
assertNotNull(response);
assertEquals(2,
response.size());
assertResponseContains(response,
paths[5]);
assertResponseContains(response,
paths[6]);
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
}
{
final Set<ValueIndexTerm> queryTerms = new HashSet<ValueIndexTerm>() {{
add(new ValueResourceIndexTerm("*",
ResourceType.BPMN2,
ValueIndexTerm.TermSearchType.WILDCARD));
}};
try {
List<RefactoringPageRow> response = service.query(
FindBpmnProcessIdsQuery.NAME,
queryTerms);
assertNotNull(response);
assertEquals(paths.length,
response.size());
for (String expectedId : PROCESS_IDS) {
boolean foundId = false;
for (RefactoringPageRow row : response) {
Map<String, org.uberfire.backend.vfs.Path> mapRow = (Map<String, org.uberfire.backend.vfs.Path>) row.getValue();
for (String rKey : mapRow.keySet()) {
assertTrue(PROCESS_IDS.contains(rKey));
foundId = true;
}
}
if (!foundId) {
fail("Process with ID <" + expectedId + " not found in results for " + FindBpmnProcessIdsQuery.NAME);
}
}
} catch (IllegalArgumentException e) {
fail("Exception thrown: " + e.getMessage());
}
}
}
private PageResponse<RefactoringPageRow> queryBPMN2Resources() throws IllegalArgumentException {
final RefactoringPageRequest request = new RefactoringPageRequest(FindResourcesQuery.NAME,
new HashSet<ValueIndexTerm>() {{
add(new ValueResourceIndexTerm("*",
ResourceType.BPMN2,
ValueIndexTerm.TermSearchType.WILDCARD));
}},
0,
10);
return service.query(request);
}
@Override
protected KieProjectService getProjectService() {
final org.uberfire.backend.vfs.Path mockRoot = mock(org.uberfire.backend.vfs.Path.class);
when(mockRoot.toURI()).thenReturn(TEST_PROJECT_ROOT);
final KieProject mockProject = mock(KieProject.class);
when(mockProject.getRootPath()).thenReturn(mockRoot);
when(mockProject.getProjectName()).thenReturn(TEST_PROJECT_NAME);
POM mockPom = mock(POM.class);
when(mockProject.getPom()).thenReturn(mockPom);
GAV mockGAV = mock(GAV.class);
when(mockPom.getGav()).thenReturn(mockGAV);
when(mockGAV.toString()).thenReturn(DEPLOYMENT_ID);
final Package mockPackage = mock(Package.class);
when(mockPackage.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
final KieProjectService mockProjectService = mock(KieProjectService.class);
when(mockProjectService.resolveProject(any(org.uberfire.backend.vfs.Path.class))).thenReturn(mockProject);
when(mockProjectService.resolvePackage(any(org.uberfire.backend.vfs.Path.class))).thenReturn(mockPackage);
return mockProjectService;
}
@Override
protected TestIndexer getIndexer() {
return new TestBpmnFileIndexer();
}
@Override
protected BPMNDefinitionSetResourceType getResourceTypeDefinition() {
return new BPMNDefinitionSetResourceType();
}
@Override
protected String getRepositoryName() {
return this.getClass().getSimpleName();
}
}