/*
* 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 );
}
}