/* * Copyright 2016 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.aries.blueprint.factorybeans; import org.kie.api.KieBase; import org.kie.api.KieServices; import org.kie.api.builder.KieScanner; import org.kie.api.builder.ReleaseId; import org.kie.api.runtime.KieContainer; import org.kie.aries.blueprint.namespace.BlueprintContextHelper; public class KieImportResolver extends AbstractKieObjectsResolver { private final String releaseIdName; private final boolean scannerEnabled; private final long scannerInterval; private KieContainer kieContainer; public KieImportResolver( String releaseIdName, ReleaseId releaseId, boolean scannerEnabled, long scannerInterval ) { super( releaseId ); this.releaseIdName = releaseIdName; this.scannerEnabled = scannerEnabled; this.scannerInterval = scannerInterval; } @Override public Object init(BlueprintContextHelper context) { KieContainer kContainer = registerKieContainer(context); registerKieBases(context, kContainer); return kContainer; } private synchronized KieContainer registerKieContainer(BlueprintContextHelper context) { if (kieContainer == null) { KieServices ks = KieServices.Factory.get(); if ( releaseId == null ) { kieContainer = ks.getKieClasspathContainer(); } else { kieContainer = resolveKContainer( releaseId ); if (scannerEnabled) { KieScanner kieScanner = KieServices.Factory.get().newKieScanner( kieContainer ); String scannerName = releaseIdName+"-scanner"; context.registerBean(scannerName, kieScanner); if (scannerInterval > 0) { kieScanner.start( scannerInterval ); } KieObjectsFactoryBean.importInjector.wireScanner( scannerName, kieScanner ); } } } return kieContainer; } private void registerKieBases(BlueprintContextHelper context, KieContainer kContainer) { for (String kieBaseName : kContainer.getKieBaseNames()) { KieBase kieBase = kContainer.getKieBase( kieBaseName ); context.registerBean(kieBaseName, kieBase); registerKieSessions(context, kieBaseName, kContainer); KieObjectsFactoryBean.importInjector.wireBase( kieBaseName, kieBase ); } } private void registerKieSessions(BlueprintContextHelper context, String kieBaseName, KieContainer kContainer) { for (String kieSessionName : kContainer.getKieSessionNamesInKieBase(kieBaseName)) { Object ksession = resolveKSession(kieSessionName, kContainer); context.registerBean(kieSessionName, ksession); KieObjectsFactoryBean.importInjector.wireSession( kieSessionName, ksession ); } } }