/* * Written by Red Hat Consulting. * * * 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 com.rhc.drools.reference; import java.util.HashSet; import java.util.Set; import org.drools.KnowledgeBase; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Uses a list of classpath resources to construct a KnowledgeBase. This is the simplest way to build a KBase. * * Note the creation of the KnowledgeBase is lazy */ public class ClasspathKnowledgeBaseBuilder implements KnowledgeBaseBuilder { private static Logger logger = LoggerFactory.getLogger( ClasspathKnowledgeBaseBuilder.class ); private Set<String> knowledgeResources; private KnowledgeBase kBase; public ClasspathKnowledgeBaseBuilder( Set<String> knowledgeResources ) { this.knowledgeResources = knowledgeResources; } public ClasspathKnowledgeBaseBuilder() { } @Override public KnowledgeBase getKnowledgeBase() { if ( kBase == null ) { buildKnowledgeBase(); } return kBase; } @Override public void buildKnowledgeBase() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); long startTime = System.currentTimeMillis(); logger.debug( "Building Knowledge Base..." ); if ( knowledgeResources != null ) { for ( String resourceFile : knowledgeResources ) { ResourceType resourceType = ResourceType.determineResourceType( resourceFile ); if ( resourceType != null ) { logger.debug( String.format( "Adding %s to kBuilder", resourceFile ) ); kbuilder.add( ResourceFactory.newClassPathResource( resourceFile, getClass() ), resourceType ); } else { logger.warn( String .format( "Classpath resource %s does not have an file extension supported by Drools ResourceType defaults. See Drools source for details: https://github.com/droolsjbpm/droolsjbpm-knowledge/blob/5.4.x/knowledge-api/src/main/java/org/drools/builder/ResourceType.java", resourceFile ) ); } } } if ( kbuilder.hasErrors() ) { logger.error( kbuilder.getErrors().toString() ); } kBase = kbuilder.newKnowledgeBase(); logger.debug( "Building Knowledge Base took " + ( System.currentTimeMillis() - startTime ) + " ms" ); } public void setKnowledgeResources( Set<String> knowledgeResources ) { this.knowledgeResources = knowledgeResources; } public void addKnowledgeResource( String resourceFile ) { if ( this.knowledgeResources == null ) { this.knowledgeResources = new HashSet<String>(); } this.knowledgeResources.add( resourceFile ); } }