/* * Copyright 2015 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.drools.compiler.kie.builder.impl; import org.drools.compiler.kproject.models.KieBaseModelImpl; import org.drools.compiler.kproject.models.KieSessionModelImpl; import org.kie.api.builder.model.KieBaseModel; import org.kie.api.builder.model.KieModuleModel; import org.kie.api.builder.model.KieSessionModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages; public abstract class AbstractKieProject implements KieProject { private static final Logger log = LoggerFactory.getLogger(KieProject.class); protected final Map<String, KieBaseModel> kBaseModels = new HashMap<String, KieBaseModel>(); private KieBaseModel defaultKieBase = null; private KieSessionModel defaultKieSession = null; private KieSessionModel defaultStatelessKieSession = null; private Map<KieBaseModel, Set<String>> includesInKieBase = new HashMap<KieBaseModel, Set<String>>(); protected final Map<String, KieSessionModel> kSessionModels = new HashMap<String, KieSessionModel>(); public ResultsImpl verify() { ResultsImpl messages = new ResultsImpl(); verify(messages); return messages; } public ResultsImpl verify(String... kBaseNames) { ResultsImpl messages = new ResultsImpl(); verify(kBaseNames, messages); return messages; } public void verify(ResultsImpl messages) { for ( KieBaseModel model : kBaseModels.values() ) { buildKnowledgePackages((KieBaseModelImpl) model, this, messages); } } public void verify(String[] kBaseNames, ResultsImpl messages) { for ( String modelName : kBaseNames ) { buildKnowledgePackages( (KieBaseModelImpl) kBaseModels.get( modelName ), this, messages); } } public KieBaseModel getDefaultKieBaseModel() { return defaultKieBase; } public KieSessionModel getDefaultKieSession() { return defaultKieSession; } public KieSessionModel getDefaultStatelessKieSession() { return defaultStatelessKieSession; } public KieBaseModel getKieBaseModel(String kBaseName) { return kBaseName == null ? getDefaultKieBaseModel() : kBaseModels.get( kBaseName ); } public Collection<String> getKieBaseNames() { return kBaseModels.keySet(); } public KieSessionModel getKieSessionModel(String kSessionName) { return kSessionName == null ? getDefaultKieSession() : kSessionModels.get( kSessionName ); } protected void indexParts(Collection<InternalKieModule> kieModules, Map<String, InternalKieModule> kJarFromKBaseName) { for ( InternalKieModule kJar : kieModules ) { KieModuleModel kieProject = kJar.getKieModuleModel(); for ( KieBaseModel kieBaseModel : kieProject.getKieBaseModels().values() ) { if (kieBaseModel.isDefault()) { if (defaultKieBase == null) { defaultKieBase = kieBaseModel; } else { defaultKieBase = null; log.warn("Found more than one default KieBase: disabling all. KieBases will be accessible only by name"); } } kBaseModels.put( kieBaseModel.getName(), kieBaseModel ); ((KieBaseModelImpl) kieBaseModel).setKModule( kieProject ); // should already be set, but just in case kJarFromKBaseName.put( kieBaseModel.getName(), kJar ); for ( KieSessionModel kieSessionModel : kieBaseModel.getKieSessionModels().values() ) { if (kieSessionModel.isDefault()) { if (kieSessionModel.getType() == KieSessionModel.KieSessionType.STATEFUL) { if (defaultKieSession == null) { defaultKieSession = kieSessionModel; } else { defaultKieSession = null; log.warn("Found more than one default KieSession: disabling all. KieSessions will be accessible only by name"); } } else { if (defaultStatelessKieSession == null) { defaultStatelessKieSession = kieSessionModel; } else { defaultStatelessKieSession = null; log.warn("Found more than one default StatelessKieSession: disabling all. StatelessKieSessions will be accessible only by name"); } } } ((KieSessionModelImpl) kieSessionModel).setKBase( kieBaseModel ); // should already be set, but just in case kSessionModels.put( kieSessionModel.getName(), kieSessionModel ); } } } } protected void cleanIndex() { kBaseModels.clear(); kSessionModels.clear(); includesInKieBase.clear(); defaultKieBase = null; defaultKieSession = null; defaultStatelessKieSession = null; } public Set<String> getTransitiveIncludes(String kBaseName) { return getTransitiveIncludes(getKieBaseModel(kBaseName)); } public Set<String> getTransitiveIncludes(KieBaseModel kBaseModel) { Set<String> includes = includesInKieBase.get(kBaseModel); if (includes == null) { includes = new HashSet<String>(); getTransitiveIncludes(kBaseModel, includes); includesInKieBase.put(kBaseModel, includes); } return includes; } private void getTransitiveIncludes(KieBaseModel kBaseModel, Set<String> includes) { if (kBaseModel == null) { return; } Set<String> incs = ((KieBaseModelImpl)kBaseModel).getIncludes(); if (incs != null && !incs.isEmpty()) { for (String inc : incs) { if (!includes.contains(inc)) { includes.add(inc); getTransitiveIncludes(getKieBaseModel(inc), includes); } } } } }