org.drools.workbench.screens.dtablexls.backend.server.indexing.IndexDecisionTableXLSAttributeNameAndValueTest.java Source code

Java tutorial

Introduction

Here is the source code for org.drools.workbench.screens.dtablexls.backend.server.indexing.IndexDecisionTableXLSAttributeNameAndValueTest.java

Source

/*
 * Copyright 2014 JBoss, by Red Hat, Inc
 *
 * 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.drools.workbench.screens.dtablexls.backend.server.indexing;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopScoreDocCollector;
import org.drools.workbench.screens.dtablexls.type.DecisionTableXLSResourceTypeDefinition;
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.indexing.RuleAttributeNameAnalyzer;
import org.kie.workbench.common.services.refactoring.model.index.terms.RuleAttributeIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.RuleAttributeValueIndexTerm;
import org.uberfire.ext.metadata.backend.lucene.index.LuceneIndex;
import org.uberfire.ext.metadata.backend.lucene.util.KObjectUtil;
import org.uberfire.ext.metadata.engine.Index;
import org.uberfire.ext.metadata.model.KObject;
import org.uberfire.java.nio.file.Path;

import static org.apache.lucene.util.Version.*;
import static org.junit.Assert.*;

public class IndexDecisionTableXLSAttributeNameAndValueTest
        extends BaseIndexingTest<DecisionTableXLSResourceTypeDefinition> {

    @Test
    public void testIndexDecisionTableXLSAttributeNameAndValue() throws IOException, InterruptedException {
        //Add test files
        final Path path1 = loadXLSFile(basePath, "dtable1.xls");
        final Path path2 = loadXLSFile(basePath, "dtable2.xls");

        Thread.sleep(5000); //wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index

        final Index index = getConfig().getIndexManager()
                .get(org.uberfire.ext.metadata.io.KObjectUtil.toKCluster(basePath.getFileSystem()));

        //This simply checks whether there is a Rule Attribute "ruleflow-group" and a Rule Attribute Value "myRuleflowGroup"
        //The specific query does not check that the Rule Attribute Value corresponds to the Rule Attribute, so it is possible
        //that the value relates to a different Rule Attribute.
        {
            final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher();
            final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);

            final BooleanQuery query = new BooleanQuery();
            query.add(new TermQuery(new Term(RuleAttributeIndexTerm.TERM, "ruleflow-group")),
                    BooleanClause.Occur.MUST);
            query.add(new TermQuery(new Term(RuleAttributeValueIndexTerm.TERM, "myruleflowgroup")),
                    BooleanClause.Occur.MUST);
            searcher.search(query, collector);
            final ScoreDoc[] hits = collector.topDocs().scoreDocs;

            assertEquals(1, hits.length);
            final List<KObject> results = new ArrayList<KObject>();
            for (int i = 0; i < hits.length; i++) {
                results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc)));
            }
            assertContains(results, path1);

            ((LuceneIndex) index).nrtRelease(searcher);

        }
    }

    @Override
    protected TestIndexer getIndexer() {
        return new TestDecisionTableXLSFileIndexer();
    }

    @Override
    public Map<String, Analyzer> getAnalyzers() {
        return new HashMap<String, Analyzer>() {
            {
                put(RuleAttributeIndexTerm.TERM, new RuleAttributeNameAnalyzer(LUCENE_40));
            }
        };
    }

    @Override
    protected DecisionTableXLSResourceTypeDefinition getResourceTypeDefinition() {
        return new DecisionTableXLSResourceTypeDefinition();
    }

    @Override
    protected String getRepositoryName() {
        return this.getClass().getSimpleName();
    }

    private Path loadXLSFile(final Path basePath, final String fileName) throws IOException {
        final Path path = basePath.resolve(fileName);
        final InputStream is = this.getClass().getResourceAsStream(fileName);
        final OutputStream os = ioService().newOutputStream(path);
        IOUtils.copy(is, os);
        os.flush();
        os.close();
        return path;
    }

}