From 20ad89f28ef4f1e72ae7920adf5a50c9edb2dac7 Mon Sep 17 00:00:00 2001 From: Mario Fusco Date: Wed, 27 Jul 2016 17:43:25 +0200 Subject: [PATCH] [DROOLS-969] implement import tag in kie-aries-blueprint integration --- kie-aries-blueprint/pom.xml | 12 ++ .../aries/blueprint/KieNamespaceHandler.java | 40 ++++-- .../AbstractKieObjectsResolver.java | 18 +-- .../blueprint/factorybeans/Initializable.java | 23 ++++ .../factorybeans/KieBaseResolver.java | 3 +- .../factorybeans/KieContainerResolver.java | 3 +- .../factorybeans/KieImportResolver.java | 81 ++++++++++++ .../factorybeans/KieObjectsFactoryBean.java | 4 + .../factorybeans/KieSessionRefResolver.java | 3 +- .../factorybeans/KieSessionResolver.java | 3 +- .../namespace/AbstractElementParser.java | 10 +- .../namespace/BlueprintContextHelper.java | 92 +++++++++++++ .../namespace/KieImportElementParser.java | 65 +++++++++ .../namespace/KieObjectsInjector.java | 17 ++- .../KieSessionBatchElementParser.java | 16 ++- .../KieSessionLoggerElementParser.java | 14 +- .../aries/blueprint/kie-aries-blueprint.xsd | 8 ++ .../org/kie/aries/blueprint/gav.xml | 6 +- .../blueprint/KieBlueprintContainer.java | 54 +++++++- ...AbstractKieBlueprintDynamicModuleTest.java | 124 ++++++++++++++++++ .../blueprint/tests/KieBlueprintGAVTest.java | 8 +- .../tests/KieBlueprintScannerTest.java | 86 ++++++++++++ .../org/kie/aries/blueprint/kie-scanner.xml | 30 +++++ .../factorybeans/KieImportFactoryBean.java | 26 +--- .../spring/tests/KieSpringScannerTest.java | 8 +- 25 files changed, 667 insertions(+), 87 deletions(-) create mode 100644 kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/Initializable.java create mode 100644 kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieImportResolver.java create mode 100644 kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/BlueprintContextHelper.java create mode 100644 kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieImportElementParser.java create mode 100644 kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/AbstractKieBlueprintDynamicModuleTest.java create mode 100644 kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintScannerTest.java create mode 100644 kie-aries-blueprint/src/test/resources/org/kie/aries/blueprint/kie-scanner.xml diff --git a/kie-aries-blueprint/pom.xml b/kie-aries-blueprint/pom.xml index dfb569e08c..1d56802fbe 100644 --- a/kie-aries-blueprint/pom.xml +++ b/kie-aries-blueprint/pom.xml @@ -143,6 +143,18 @@ test --> + + + org.kie + kie-ci + test + + + org.drools + drools-core + test-jar + test + diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/KieNamespaceHandler.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/KieNamespaceHandler.java index b9001efb2e..7a6d738c5f 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/KieNamespaceHandler.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/KieNamespaceHandler.java @@ -15,23 +15,35 @@ */ package org.kie.aries.blueprint; -import java.net.URL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; - import org.apache.aries.blueprint.ParserContext; import org.apache.aries.blueprint.mutable.MutableBeanMetadata; import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata; -import org.kie.aries.blueprint.namespace.*; +import org.kie.aries.blueprint.namespace.AbstractElementParser; +import org.kie.aries.blueprint.namespace.KieBaseElementParser; +import org.kie.aries.blueprint.namespace.KieContainerElementParser; +import org.kie.aries.blueprint.namespace.KieEnvironmentElementParser; +import org.kie.aries.blueprint.namespace.KieEventListenersElementParser; +import org.kie.aries.blueprint.namespace.KieImportElementParser; +import org.kie.aries.blueprint.namespace.KieModuleElementParser; +import org.kie.aries.blueprint.namespace.KieObjectsInjector; +import org.kie.aries.blueprint.namespace.KieRuntimeManagerElementParser; +import org.kie.aries.blueprint.namespace.KieRuntimeManagerSessionElementParser; +import org.kie.aries.blueprint.namespace.KieSessionElementParser; +import org.kie.aries.blueprint.namespace.KieStoreElementParser; +import org.kie.aries.blueprint.namespace.ReleaseIdElementParser; import org.osgi.service.blueprint.container.ComponentDefinitionException; import org.osgi.service.blueprint.reflect.ComponentMetadata; import org.osgi.service.blueprint.reflect.Metadata; import org.w3c.dom.Element; import org.w3c.dom.Node; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Callable; + public class KieNamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler { /** The list of Aries Blueprint XML files*/ @@ -43,7 +55,6 @@ public class KieNamespaceHandler implements org.apache.aries.blueprint.Namespace private static final String BLUEPRINT_NS = "http://www.osgi.org/xmlns/blueprint/v1.0.0"; public static final String ELEMENT_RELEASE_ID = "releaseId"; - public static final String ELEMENT_KBASE_REF = "kbase-ref"; public static final String ELEMENT_KBASE = "kbase"; public static final String ELEMENT_KCONTAINER = "kcontainer-ref"; public static final String ELEMENT_KSTORE = "kstore"; @@ -54,11 +65,11 @@ public class KieNamespaceHandler implements org.apache.aries.blueprint.Namespace public static final String ELEMENT_KRUNTIMEMANAGER = "kruntimeManager"; public static final String ELEMENT_KSESSION_RUNTIMEMANAGER = "kruntimeManagerSession"; public static final String ELEMENT_KMODULE = "kmodule"; + public static final String ELEMENT_IMPORT = "import"; protected static Map droolsElementParserMap = new HashMap(); static { droolsElementParserMap.put(ELEMENT_RELEASE_ID, new ReleaseIdElementParser()); - droolsElementParserMap.put(ELEMENT_KBASE_REF, new KieBaseElementParser()); droolsElementParserMap.put(ELEMENT_KBASE, new KieBaseElementParser()); droolsElementParserMap.put(ELEMENT_KSESSION, new KieSessionElementParser()); droolsElementParserMap.put(ELEMENT_KSESSION_REF, new KieSessionElementParser()); @@ -69,6 +80,7 @@ public class KieNamespaceHandler implements org.apache.aries.blueprint.Namespace droolsElementParserMap.put(ELEMENT_KRUNTIMEMANAGER, new KieRuntimeManagerElementParser()); droolsElementParserMap.put(ELEMENT_KSESSION_RUNTIMEMANAGER, new KieRuntimeManagerSessionElementParser()); droolsElementParserMap.put(ELEMENT_KMODULE, new KieModuleElementParser()); + droolsElementParserMap.put(ELEMENT_IMPORT, new KieImportElementParser() ); } public KieNamespaceHandler() { @@ -100,12 +112,14 @@ public Metadata parse(Element element, ParserContext parserContext) { throw new ComponentDefinitionException("Unsupported Kie Blueprint Element '"+elementName+"'"); } if (ELEMENT_KMODULE.equalsIgnoreCase(elementName)) { - addKieObjectsProcessor(element, parserContext, elementParser); + addProcessor( element, parserContext, elementParser, "afterKmoduleSet" ); + } else if (ELEMENT_IMPORT.equalsIgnoreCase(elementName)) { + addProcessor( element, parserContext, elementParser, "afterImportSet" ); } return elementParser.parseElement(parserContext, element); } - private void addKieObjectsProcessor(Element element, ParserContext context, AbstractElementParser elementParser) { + private void addProcessor( Element element, ParserContext context, AbstractElementParser elementParser, String initMethodName ) { // Register processors MutablePassThroughMetadata beanProcessorFactory = context.createMetadata(MutablePassThroughMetadata.class); @@ -121,7 +135,7 @@ private void addKieObjectsProcessor(Element element, ParserContext context, Abst beanProcessor.setFactoryComponent(beanProcessorFactory); beanProcessor.setFactoryMethod("call"); beanProcessor.setProcessor(true); - beanProcessor.setInitMethod("afterPropertiesSet"); + beanProcessor.setInitMethod(initMethodName); beanProcessor.addProperty("blueprintContainer", AbstractElementParser.createRef(context, "blueprintContainer")); context.getComponentDefinitionRegistry().registerComponentDefinition(beanProcessor); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/AbstractKieObjectsResolver.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/AbstractKieObjectsResolver.java index 4377d97183..06a0897f32 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/AbstractKieObjectsResolver.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/AbstractKieObjectsResolver.java @@ -29,9 +29,7 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.wiring.BundleWiring; -import java.util.concurrent.Callable; - -public abstract class AbstractKieObjectsResolver implements Callable { +public abstract class AbstractKieObjectsResolver implements Initializable { private BundleContext bundleContext; protected final ReleaseId releaseId; @@ -57,19 +55,21 @@ public KieBase resolveKBase( String id, ReleaseId releaseId ) { return kieBase; } - public Object resolveKSession(String id, ReleaseId releaseId) { - KieContainer kieContainer = resolveKContainer(releaseId); + public Object resolveKSession( String id, ReleaseId releaseId ) { + return resolveKSession( id, resolveKContainer(releaseId) ); + } - // KieBase kbase = resolveKBase(kbaseName, releaseId); - KieProject kProject = ((KieContainerImpl) kieContainer).getKieProject(); + protected Object resolveKSession( String id, KieContainer kieContainer ) { + KieContainerImpl kcontainer = (KieContainerImpl) kieContainer; + KieProject kProject = kcontainer.getKieProject(); KieSessionModel kieSessionModel = kProject.getKieSessionModel( id ); if ( kieSessionModel == null) { return null; } if (kieSessionModel.getType() == KieSessionModel.KieSessionType.STATEFUL) { - return ((KieContainerImpl) kieContainer).getKieSession(id); + return kcontainer.getKieSession( id ); } else if (kieSessionModel.getType() == KieSessionModel.KieSessionType.STATELESS) { - return ((KieContainerImpl) kieContainer).getStatelessKieSession(id); + return kcontainer.getStatelessKieSession( id ); } return null; } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/Initializable.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/Initializable.java new file mode 100644 index 0000000000..b1d5940667 --- /dev/null +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/Initializable.java @@ -0,0 +1,23 @@ +/* + * 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.aries.blueprint.namespace.BlueprintContextHelper; + +public interface Initializable { + Object init(BlueprintContextHelper context ); +} diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieBaseResolver.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieBaseResolver.java index 86a26cd456..a79e1b24bf 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieBaseResolver.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieBaseResolver.java @@ -28,6 +28,7 @@ import org.kie.api.runtime.KieSession; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.runtime.StatelessKieSession; +import org.kie.aries.blueprint.namespace.BlueprintContextHelper; import java.util.Collection; import java.util.Set; @@ -44,7 +45,7 @@ public KieBaseResolver( ReleaseId releaseId, String id ) { } @Override - public Object call() throws Exception { + public Object init(BlueprintContextHelper context ) { return getKieBase(); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieContainerResolver.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieContainerResolver.java index c28d0b168f..3e2ae204af 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieContainerResolver.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieContainerResolver.java @@ -27,6 +27,7 @@ import org.kie.api.runtime.KieSession; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.runtime.StatelessKieSession; +import org.kie.aries.blueprint.namespace.BlueprintContextHelper; import java.util.Collection; @@ -39,7 +40,7 @@ public KieContainerResolver( ReleaseId releaseId ) { } @Override - public Object call() throws Exception { + public Object init(BlueprintContextHelper context ) { return getKieContainer(); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieImportResolver.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieImportResolver.java new file mode 100644 index 0000000000..08bff17c5b --- /dev/null +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieImportResolver.java @@ -0,0 +1,81 @@ +/* + * 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 ); + context.registerBean(releaseIdName+"#scanner", kieScanner); + if (scannerInterval > 0) { + kieScanner.start( scannerInterval ); + } + } + } + } + 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); + } + } + + private void registerKieSessions(BlueprintContextHelper context, String kieBaseName, KieContainer kContainer) { + for (String kieSessionName : kContainer.getKieSessionNamesInKieBase(kieBaseName)) { + Object ksession = resolveKSession(kieSessionName, kContainer); + context.registerBean(kieSessionName, ksession); + } + } +} diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieObjectsFactoryBean.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieObjectsFactoryBean.java index ddad9ec497..80f5c298a0 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieObjectsFactoryBean.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieObjectsFactoryBean.java @@ -56,6 +56,10 @@ public static ReleaseId createReleaseId(String id, String groupId, String artifa return new ReleaseIdImpl(groupId, artifactId, version); } + public static Object createImport(String releaseIdName, ReleaseId releaseId, boolean enableScanner, long scannerInterval) { + return new KieImportResolver( releaseIdName, releaseId, enableScanner, scannerInterval ); + } + public static Environment createEnvironment(String id, HashMap parameters, List marshallingStrategies){ Environment environment = EnvironmentFactory.newEnvironment(); if ( parameters != null) { diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieSessionRefResolver.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieSessionRefResolver.java index 73e4a520dc..4ce70e332d 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieSessionRefResolver.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/factorybeans/KieSessionRefResolver.java @@ -19,6 +19,7 @@ import org.kie.api.builder.ReleaseId; import org.kie.api.event.KieRuntimeEventManager; import org.kie.api.runtime.KieSession; +import org.kie.aries.blueprint.namespace.BlueprintContextHelper; import org.osgi.service.blueprint.container.ComponentDefinitionException; import java.util.List; @@ -38,7 +39,7 @@ public KieSessionRefResolver( ReleaseId releaseId, String id, List listene } @Override - public Object call() throws Exception { + public Object init(BlueprintContextHelper context) { return getSession(); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/AbstractElementParser.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/AbstractElementParser.java index b9ee3753c8..ceb30b34fb 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/AbstractElementParser.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/AbstractElementParser.java @@ -94,7 +94,15 @@ public static ValueMetadata createValue(ParserContext context, int value) { return createValue(context, value, "java.lang.Integer"); } - public static ValueMetadata createValue(ParserContext context, int value, String type) { + public static ValueMetadata createValue(ParserContext context, long value) { + return createValue(context, value, "java.lang.Long"); + } + + public static ValueMetadata createValue(ParserContext context, boolean value) { + return createValue(context, value, "java.lang.Boolean"); + } + + public static ValueMetadata createValue(ParserContext context, Object value, String type) { MutableValueMetadata m = context.createMetadata(MutableValueMetadata.class); m.setStringValue(""+value); m.setType(type); diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/BlueprintContextHelper.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/BlueprintContextHelper.java new file mode 100644 index 0000000000..c9a6fd4b36 --- /dev/null +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/BlueprintContextHelper.java @@ -0,0 +1,92 @@ +/* + * 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.namespace; + +import org.osgi.service.blueprint.container.BlueprintContainer; + +import java.lang.reflect.Method; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class BlueprintContextHelper { + private final BlueprintContainer blueprintContainer; + private final Object blueprintContext; + private final Method addObjectMethod; + + public BlueprintContextHelper(BlueprintContainer blueprintContainer) { + this.blueprintContainer = blueprintContainer; + + // The ExecutionContext class is in the blueprint-core module, but we cannot explicitly import it + // because there are 2 implementations of it (osgi and no-osgi) with same class names and we + // dynamically import one of the 2. For this reason ExecutionContext class can be used only via reflection + + try { + Class ctxClass = Class.forName( "org.apache.aries.blueprint.di.ExecutionContext", true, blueprintContainer.getClass().getClassLoader() ); + addObjectMethod = ctxClass.getMethod( "addFullObject", String.class, Future.class ); + + Class holderClass = Class.forName( "org.apache.aries.blueprint.di.ExecutionContext$Holder", true, blueprintContainer.getClass().getClassLoader() ); + Method getCtxMethod = holderClass.getMethod( "getContext" ); + blueprintContext = getCtxMethod.invoke( null ); + } catch (Exception e) { + throw new RuntimeException( e ); + } + } + + public void registerBean(String name, Object bean) { + try { + addObjectMethod.invoke( blueprintContext, name, new CompletedFuture( bean ) ); + } catch (Exception e) { + throw new RuntimeException( e ); + } + } + + public static class CompletedFuture implements Future { + + private final T result; + + public CompletedFuture( T result ) { + this.result = result; + } + + @Override + public boolean cancel( boolean mayInterruptIfRunning ) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return true; + } + + @Override + public T get() throws InterruptedException, ExecutionException { + return result; + } + + @Override + public T get( long timeout, TimeUnit unit ) throws InterruptedException, ExecutionException, TimeoutException { + return result; + } + } +} diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieImportElementParser.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieImportElementParser.java new file mode 100644 index 0000000000..e124b2d32a --- /dev/null +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieImportElementParser.java @@ -0,0 +1,65 @@ +/* + * 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.namespace; + +import org.apache.aries.blueprint.ParserContext; +import org.apache.aries.blueprint.mutable.MutableBeanMetadata; +import org.drools.core.util.StringUtils; +import org.osgi.service.blueprint.reflect.BeanMetadata; +import org.osgi.service.blueprint.reflect.ComponentMetadata; +import org.w3c.dom.Element; + +public class KieImportElementParser extends AbstractElementParser { + + @Override + public ComponentMetadata parseElement( ParserContext context, Element element ) { + String id = getId(context, element); + + MutableBeanMetadata beanMetadata = (MutableBeanMetadata) context.createMetadata( BeanMetadata.class ); + beanMetadata.setClassName("org.kie.aries.blueprint.factorybeans.KieObjectsFactoryBean"); + beanMetadata.setFactoryMethod("createImport"); + beanMetadata.setId(id); + + addBundleContextProperty(beanMetadata, context); + + String releaseIdRef = element.getAttribute("releaseId-ref"); + beanMetadata.addArgument(createValue(context, releaseIdRef), null, 0); + + if (!StringUtils.isEmpty(releaseIdRef)) { + beanMetadata.addArgument(createRef(context, releaseIdRef), null, 1); + } else { + beanMetadata.addArgument(createNullMetadata(), null, 1); + } + + String enableScanner = element.getAttribute("enableScanner"); + beanMetadata.addArgument(createValue(context, "true".equals( enableScanner )), null, 2); + + String scannerInterval = element.getAttribute("scannerInterval"); + long interval = -1L; + if (!StringUtils.isEmpty( scannerInterval )) { + try { + interval = Long.parseLong( scannerInterval ); + } catch (NumberFormatException nfe) { + throw new IllegalArgumentException("scannerInterval must be positive"); + } + } + beanMetadata.addArgument(createValue(context, interval), null, 3); + + beanMetadata.setActivation(ComponentMetadata.ACTIVATION_EAGER); + return beanMetadata; + } +} diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieObjectsInjector.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieObjectsInjector.java index f698b2d16f..1881d5e392 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieObjectsInjector.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieObjectsInjector.java @@ -37,6 +37,7 @@ import org.kie.api.conf.EqualityBehaviorOption; import org.kie.api.conf.EventProcessingOption; import org.kie.api.runtime.conf.ClockTypeOption; +import org.kie.aries.blueprint.factorybeans.Initializable; import org.kie.aries.blueprint.factorybeans.KBaseOptions; import org.kie.aries.blueprint.factorybeans.KSessionOptions; import org.kie.aries.blueprint.factorybeans.KieObjectsFactoryBean; @@ -55,7 +56,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.Callable; public class KieObjectsInjector implements BeanProcessor { @@ -67,6 +67,7 @@ public class KieObjectsInjector implements BeanProcessor { private ReleaseId releaseId; private URL configFileURL; private ParserContext parserContext; + private BlueprintContextHelper context; /** The list of Aries Blueprint XML files*/ protected java.util.List resources; @@ -89,16 +90,14 @@ public KieObjectsInjector(List resources, String contextId) { this.contextId = contextId; } - public KieObjectsInjector() { - - } - + public KieObjectsInjector() { } public void setBlueprintContainer(BlueprintContainer blueprintContainer) { this.blueprintContainer = blueprintContainer; + this.context = new BlueprintContextHelper( blueprintContainer ); } - public void afterPropertiesSet(){ + public void afterKmoduleSet() { log.debug(" :: Starting Blueprint KieObjectsInjector for kmodule ("+contextId+") :: "); if ( resources == null || resources.isEmpty()) { configFileURL = getClass().getResource("/"); @@ -131,6 +130,10 @@ protected void injectKieModule(KieModuleModel kieModuleModel) { } } + public void afterImportSet() { + // no-op + } + private void createOsgiKieModule() { configFileURL = getConfigFileURL(); if (releaseId == null) { @@ -303,7 +306,7 @@ public Object beforeInit(Object o, String s, BeanCreator beanCreator, BeanMetada @Override public Object afterInit(Object o, String s, BeanCreator beanCreator, BeanMetadata beanMetadata) { try { - return o instanceof Callable ? ( (Callable) o ).call() : o; + return o instanceof Initializable ? ( (Initializable) o ).init( context ) : o; } catch (Exception e) { throw new RuntimeException( e ); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionBatchElementParser.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionBatchElementParser.java index f92b9a7796..f3393a3fa6 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionBatchElementParser.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionBatchElementParser.java @@ -15,8 +15,6 @@ */ package org.kie.aries.blueprint.namespace; -import java.util.ArrayList; - import org.apache.aries.blueprint.ParserContext; import org.apache.aries.blueprint.mutable.MutableBeanMetadata; import org.apache.aries.blueprint.mutable.MutableCollectionMetadata; @@ -31,6 +29,10 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import java.util.ArrayList; + +import static org.kie.aries.blueprint.namespace.AbstractElementParser.createValue; + class KieSessionBatchElementParser { public static final String LOGGER_ATTRIBUTE_FILE = "file"; @@ -83,7 +85,7 @@ public static MutableCollectionMetadata parseBatchElement(KieSessionElementParse argument.setValue(kieSessionElementParser.createValue(context, identifier)); componentMetadata.addArgument(argument); */ - componentMetadata.addArgument(kieSessionElementParser.createValue(context, identifier), null, 0); + componentMetadata.addArgument( createValue( context, identifier ), null, 0 ); //argument = new BeanArgumentImpl(); //argument.setIndex(1); @@ -103,7 +105,7 @@ public static MutableCollectionMetadata parseBatchElement(KieSessionElementParse // argument.setIndex(0); // argument.setValue(kieSessionElementParser.createValue(context, Integer.parseInt(max))); // componentMetadata.addArgument(argument); - componentMetadata.addArgument(kieSessionElementParser.createValue(context, Integer.parseInt(max)), null, 0); + componentMetadata.addArgument( createValue(context, Integer.parseInt(max)), null, 0 ); }catch (NumberFormatException e1){ //xsd will prevent this from happening. } @@ -132,7 +134,7 @@ public static MutableCollectionMetadata parseBatchElement(KieSessionElementParse //argument = new BeanArgumentImpl(); try{ // argument.setValue(kieSessionElementParser.createValue(context, Integer.parseInt(processInstanceId))); - componentMetadata.addArgument(kieSessionElementParser.createValue(context, Integer.parseInt(processInstanceId)), null, 0); + componentMetadata.addArgument( createValue( context, Integer.parseInt( processInstanceId ) ), null, 0 ); } catch (NumberFormatException e1){ //xsd will prevent this from happening. } @@ -151,13 +153,13 @@ public static MutableCollectionMetadata parseBatchElement(KieSessionElementParse /*argument = new BeanArgumentImpl(); argument.setIndex(index++); argument.setValue(kieSessionElementParser.createRef(context, ref)); */ - componentMetadata.addArgument(kieSessionElementParser.createValue(context, ref), null, index++); + componentMetadata.addArgument( createValue( context, ref ), null, index++ ); /*argument = new BeanArgumentImpl(); argument.setIndex(index++); argument.setValue(kieSessionElementParser.createValue(context, eventType)); componentMetadata.addArgument(argument);*/ - componentMetadata.addArgument(kieSessionElementParser.createValue(context, eventType), null, index++); + componentMetadata.addArgument( createValue( context, eventType ), null, index++ ); } else { throw new ComponentDefinitionException("Unknown child element found in batch element."); } diff --git a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionLoggerElementParser.java b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionLoggerElementParser.java index b3d677c4f3..9d1c0b29dd 100644 --- a/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionLoggerElementParser.java +++ b/kie-aries-blueprint/src/main/java/org/kie/aries/blueprint/namespace/KieSessionLoggerElementParser.java @@ -15,8 +15,6 @@ */ package org.kie.aries.blueprint.namespace; -import java.util.ArrayList; - import org.apache.aries.blueprint.ParserContext; import org.apache.aries.blueprint.mutable.MutableBeanMetadata; import org.apache.aries.blueprint.mutable.MutableCollectionMetadata; @@ -28,6 +26,10 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import java.util.ArrayList; + +import static org.kie.aries.blueprint.namespace.AbstractElementParser.createValue; + class KieSessionLoggerElementParser { public static final String LOGGER_ATTRIBUTE_FILE = "file"; @@ -76,16 +78,16 @@ public static MutableCollectionMetadata parseConsoleLoggers(KieSessionElementPar throw new ComponentDefinitionException(LOGGER_ATTRIBUTE_FILE+" attribute is missing for logger ("+ kieLoggerElementParser.getId(context, element)+")"); } fileName = ExpressionUtils.resolveExpressionInPath(fileName); - componentMetadata.addProperty("file", kieLoggerElementParser.createValue(context, fileName)); + componentMetadata.addProperty("file", createValue(context, fileName)); String threaded = kieLoggerElementParser.getAttributeValue(loggerNode, LOGGER_ATTRIBUTE_THREADED); if (!StringUtils.isEmpty(LOGGER_ATTRIBUTE_FILE) && "true".equalsIgnoreCase(threaded)){ - componentMetadata.addProperty("loggerType", kieLoggerElementParser.createValue(context, KieLoggerAdaptor.KNOWLEDGE_LOGGER_TYPE.LOGGER_TYPE_THREADED_FILE.toString())); + componentMetadata.addProperty("loggerType", createValue(context, KieLoggerAdaptor.KNOWLEDGE_LOGGER_TYPE.LOGGER_TYPE_THREADED_FILE.toString())); String interval = kieLoggerElementParser.getAttributeValue(loggerNode, LOGGER_ATTRIBUTE_INTERVAL); if ( !StringUtils.isEmpty(interval)){ try{ int nInterval = Integer.parseInt(interval); - componentMetadata.addProperty("interval", kieLoggerElementParser.createValue(context, nInterval)); + componentMetadata.addProperty("interval", createValue(context, nInterval)); }catch (Exception e){ //should never happen, the XSD would prevent non-integers coming this far. } @@ -95,7 +97,7 @@ public static MutableCollectionMetadata parseConsoleLoggers(KieSessionElementPar } } else{ - componentMetadata.addProperty("loggerType", kieLoggerElementParser.createValue(context, KieLoggerAdaptor.KNOWLEDGE_LOGGER_TYPE.LOGGER_TYPE_FILE.toString())); + componentMetadata.addProperty("loggerType", createValue(context, KieLoggerAdaptor.KNOWLEDGE_LOGGER_TYPE.LOGGER_TYPE_FILE.toString())); } MutableRefMetadata refMetadata = context.createMetadata(MutableRefMetadata.class); diff --git a/kie-aries-blueprint/src/main/resources/org/kie/aries/blueprint/kie-aries-blueprint.xsd b/kie-aries-blueprint/src/main/resources/org/kie/aries/blueprint/kie-aries-blueprint.xsd index d44e471d33..5f2f379621 100644 --- a/kie-aries-blueprint/src/main/resources/org/kie/aries/blueprint/kie-aries-blueprint.xsd +++ b/kie-aries-blueprint/src/main/resources/org/kie/aries/blueprint/kie-aries-blueprint.xsd @@ -97,6 +97,14 @@ + + + + + + + + diff --git a/kie-aries-blueprint/src/test/filtered-resources/org/kie/aries/blueprint/gav.xml b/kie-aries-blueprint/src/test/filtered-resources/org/kie/aries/blueprint/gav.xml index 4e4e5d3669..006f1866d3 100644 --- a/kie-aries-blueprint/src/test/filtered-resources/org/kie/aries/blueprint/gav.xml +++ b/kie-aries-blueprint/src/test/filtered-resources/org/kie/aries/blueprint/gav.xml @@ -7,9 +7,11 @@ - + - + + + diff --git a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/KieBlueprintContainer.java b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/KieBlueprintContainer.java index ef93e431ef..1a8fc06955 100644 --- a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/KieBlueprintContainer.java +++ b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/KieBlueprintContainer.java @@ -15,13 +15,6 @@ */ package org.kie.aries.blueprint; -import java.net.URI; -import java.net.URL; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import org.apache.aries.blueprint.container.BlueprintContainerImpl; import org.apache.aries.blueprint.container.SimpleNamespaceHandlerSet; import org.apache.aries.blueprint.parser.NamespaceHandlerSet; @@ -32,6 +25,15 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.wiring.BundleWiring; +import java.net.URI; +import java.net.URL; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + public class KieBlueprintContainer extends BlueprintContainerImpl { public KieBlueprintContainer(ClassLoader loader, List resources) throws Exception { @@ -80,4 +82,42 @@ private static BundleWiring createMockBundleWiring(ClassLoader classLoader) { Mockito.when(mockBundleWiring.getClassLoader()).thenReturn(classLoader); return mockBundleWiring; } + + public void registerBean(String name, Object bean) { + getRepository().addFullObject( name, new CompletedFuture(bean)); + } + + public static class CompletedFuture implements Future { + + private final T result; + + public CompletedFuture( T result ) { + this.result = result; + } + + @Override + public boolean cancel( boolean mayInterruptIfRunning ) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return true; + } + + @Override + public T get() throws InterruptedException, ExecutionException { + return result; + } + + @Override + public T get( long timeout, TimeUnit unit ) throws InterruptedException, ExecutionException, TimeoutException { + return result; + } + } } diff --git a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/AbstractKieBlueprintDynamicModuleTest.java b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/AbstractKieBlueprintDynamicModuleTest.java new file mode 100644 index 0000000000..a01bc45221 --- /dev/null +++ b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/AbstractKieBlueprintDynamicModuleTest.java @@ -0,0 +1,124 @@ +/* + * 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.tests; + +import org.drools.compiler.kie.builder.impl.InternalKieModule; +import org.drools.core.util.FileManager; +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.ReleaseId; +import org.kie.api.builder.model.KieBaseModel; +import org.kie.api.builder.model.KieModuleModel; +import org.kie.api.builder.model.KieSessionModel; +import org.kie.api.conf.EqualityBehaviorOption; +import org.kie.api.conf.EventProcessingOption; +import org.kie.api.runtime.conf.ClockTypeOption; +import org.kie.scanner.MavenRepository; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.assertTrue; +import static org.kie.scanner.MavenRepository.getMavenRepository; + +public class AbstractKieBlueprintDynamicModuleTest { + protected ReleaseId releaseId; + protected FileManager fileManager; + + protected MavenRepository createAndInstallModule( KieServices ks, int FIRST_VALUE ) throws IOException { + this.fileManager = new FileManager(); + this.fileManager.setUp(); + + releaseId = KieServices.Factory.get().newReleaseId("org.kie.blueprint", "blueprint-scanner-test", "1.0-SNAPSHOT"); + File kPom = createKPom(releaseId); + InternalKieModule kJar1 = createKieJarWithClass(ks, releaseId, FIRST_VALUE); + + MavenRepository repository = getMavenRepository(); + repository.installArtifact(releaseId, kJar1, kPom); + return repository; + } + + protected InternalKieModule createKieJarWithClass(KieServices ks, ReleaseId releaseId, int value) throws IOException { + KieFileSystem kfs = createKieFileSystemWithKProject(ks, false); + kfs.writePomXML(getPom(releaseId)); + + kfs.write("src/main/resources/KBase1/rule1.drl", createDRL(value)); + + KieBuilder kieBuilder = ks.newKieBuilder(kfs); + assertTrue("", kieBuilder.buildAll().getResults().getMessages().isEmpty()); + return (InternalKieModule) kieBuilder.getKieModule(); + } + + protected KieFileSystem createKieFileSystemWithKProject(KieServices ks, boolean isdefault) { + KieModuleModel kproj = ks.newKieModuleModel(); + + KieBaseModel kieBaseModel1 = kproj.newKieBaseModel("KBase1").setDefault(isdefault) + .setEqualsBehavior(EqualityBehaviorOption.EQUALITY) + .setEventProcessingMode(EventProcessingOption.STREAM); + + KieSessionModel ksession1 = kieBaseModel1.newKieSessionModel("KSession1").setDefault(isdefault) + .setType(KieSessionModel.KieSessionType.STATEFUL) + .setClockType(ClockTypeOption.get("realtime")); + + KieFileSystem kfs = ks.newKieFileSystem(); + kfs.writeKModuleXML(kproj.toXML()); + return kfs; + } + + protected File createKPom(ReleaseId releaseId) throws IOException { + File pomFile = fileManager.newFile("pom.xml"); + fileManager.write(pomFile, getPom(releaseId)); + return pomFile; + } + + protected String getPom(ReleaseId releaseId, ReleaseId... dependencies) { + String pom = + "\n" + + "\n" + + " 4.0.0\n" + + "\n" + + " " + releaseId.getGroupId() + "\n" + + " " + releaseId.getArtifactId() + "\n" + + " " + releaseId.getVersion() + "\n" + + "\n"; + if (dependencies != null && dependencies.length > 0) { + pom += "\n"; + for (ReleaseId dep : dependencies) { + pom += "\n"; + pom += " " + dep.getGroupId() + "\n"; + pom += " " + dep.getArtifactId() + "\n"; + pom += " " + dep.getVersion() + "\n"; + pom += "\n"; + } + pom += "\n"; + } + pom += ""; + return pom; + } + + protected String createDRL(int value) { + return "package org.kie.test\n" + + "global java.util.List list\n" + + "rule simple\n" + + "when\n" + + "then\n" + + " list.add(" + value + ");\n" + + "end\n"; + } +} diff --git a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintGAVTest.java b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintGAVTest.java index 6ba7ba513f..102298f6bc 100644 --- a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintGAVTest.java +++ b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintGAVTest.java @@ -20,7 +20,6 @@ import org.drools.example.api.namedkiesession.Message; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.kie.api.KieBase; import org.kie.api.builder.ReleaseId; @@ -36,7 +35,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -@Ignore("kie:kbase-ref and kie:ksession-ref not (yet or anymore) supported. ") public class KieBlueprintGAVTest { static BlueprintContainerImpl container = null; @@ -50,7 +48,7 @@ public static void setup() throws Exception { @Test public void testKieBase() throws Exception { - KieBase kbase = (KieBase) container.getComponentInstance("namedkiesession"); + KieBase kbase = (KieBase) container.getComponentInstance("kbase1"); assertNotNull(kbase); } @@ -81,8 +79,8 @@ public void testKSessionExecution() throws Exception { String lineSeparator = System.getProperty("line.separator"); String actual = new String(baos.toByteArray()); String expected = "" + - "HAL: Dave. I read you."+lineSeparator+ - "Dave: Hello, HAL. Do you read me, HAL?" +lineSeparator; + "Dave: Hello, HAL. Do you read me, HAL?" +lineSeparator + + "HAL: Dave. I read you."+lineSeparator; assertEquals(expected, actual); } diff --git a/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintScannerTest.java b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintScannerTest.java new file mode 100644 index 0000000000..8f94e26b76 --- /dev/null +++ b/kie-aries-blueprint/src/test/java/org/kie/aries/blueprint/tests/KieBlueprintScannerTest.java @@ -0,0 +1,86 @@ +/* + * 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.tests; + +import org.apache.aries.blueprint.container.BlueprintContainerImpl; +import org.drools.compiler.kie.builder.impl.InternalKieModule; +import org.junit.Test; +import org.kie.api.KieBase; +import org.kie.api.KieServices; +import org.kie.api.builder.KieScanner; +import org.kie.api.runtime.KieSession; +import org.kie.aries.blueprint.KieBlueprintContainer; +import org.kie.scanner.MavenRepository; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertTrue; + +public class KieBlueprintScannerTest extends AbstractKieBlueprintDynamicModuleTest { + + private final int FIRST_VALUE = 5; + private final int SECOND_VALUE = 10; + + private static BlueprintContainerImpl container = null; + + @Test + public void testBlueprintKieScanner() throws Exception { + KieServices ks = KieServices.Factory.get(); + MavenRepository repository = createAndInstallModule( ks, FIRST_VALUE ); + + container = createContainer(); + + checkForValue(FIRST_VALUE); + + reinstallModule( repository, ks ); + + KieScanner kscanner = (KieScanner)container.getComponentInstance( "blueprint-scanner-releaseId#scanner" ); + kscanner.scanNow(); + + checkForValue(SECOND_VALUE); + + ks.getRepository().removeKieModule(releaseId); + } + + public static BlueprintContainerImpl createContainer() throws Exception { + List urls = new ArrayList(); + urls.add(KieBlueprintListenerTest.class.getResource("/org/kie/aries/blueprint/kie-scanner.xml")); + return new KieBlueprintContainer( ClassLoader.getSystemClassLoader(), urls); + } + + protected void reinstallModule( MavenRepository repository, KieServices ks ) throws IOException { + InternalKieModule kJar2 = createKieJarWithClass(ks, releaseId, SECOND_VALUE); + File kPom = createKPom( releaseId ); + repository.installArtifact(releaseId, kJar2, kPom); + } + + protected void checkForValue(int value) { + List list = new ArrayList(); + KieBase kieBase = (KieBase)container.getComponentInstance("KBase1"); + KieSession ksession = kieBase.newKieSession(); + + ksession.setGlobal( "list", list ); + ksession.fireAllRules(); + ksession.dispose(); + assertTrue("Expected:<" + value + "> but was:<" + list.get(0) + ">", list.get(0) == value); + } + +} diff --git a/kie-aries-blueprint/src/test/resources/org/kie/aries/blueprint/kie-scanner.xml b/kie-aries-blueprint/src/test/resources/org/kie/aries/blueprint/kie-scanner.xml new file mode 100644 index 0000000000..d4b92f2c4e --- /dev/null +++ b/kie-aries-blueprint/src/test/resources/org/kie/aries/blueprint/kie-scanner.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/kie-spring/src/main/java/org/kie/spring/factorybeans/KieImportFactoryBean.java b/kie-spring/src/main/java/org/kie/spring/factorybeans/KieImportFactoryBean.java index c8284f808a..2dd1f8a566 100644 --- a/kie-spring/src/main/java/org/kie/spring/factorybeans/KieImportFactoryBean.java +++ b/kie-spring/src/main/java/org/kie/spring/factorybeans/KieImportFactoryBean.java @@ -28,7 +28,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -103,19 +102,20 @@ public void setApplicationContext(ApplicationContext applicationContext) throws public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { kieObjectsResolver = new KieObjectsResolver(); - setKContainer(); + registerKieContainer(beanFactory); registerKieBases(beanFactory); AnnotationsUtil.registerAnnotationConfigProcessors((BeanDefinitionRegistry) beanFactory, releaseId); } - protected void setKContainer() { + protected void registerKieContainer(ConfigurableListableBeanFactory configurableListableBeanFactory) { if (releaseId != null) { kContainer = KieServices.Factory.get().newKieContainer(releaseId); if (scannerEnabled){ kieScanner = KieServices.Factory.get().newKieScanner(kContainer); kieScanner.start(scannerInterval); + configurableListableBeanFactory.registerSingleton(releaseIdName+"#scanner", kieScanner); } } else { kContainer = KieServices.Factory.get().getKieClasspathContainer(); @@ -124,32 +124,16 @@ protected void setKContainer() { protected void registerKieBases(ConfigurableListableBeanFactory configurableListableBeanFactory) { for (String kieBaseName : kContainer.getKieBaseNames()) { - if ( scannerEnabled ) { - registerKieBeanDef((BeanDefinitionRegistry) configurableListableBeanFactory, kieBaseName); - configurableListableBeanFactory.registerSingleton(releaseIdName+"#scanner", kieScanner); - } else { - KieBase kieBase = kContainer.getKieBase(kieBaseName); - configurableListableBeanFactory.registerSingleton(kieBaseName, kieBase); - } + KieBase kieBase = kContainer.getKieBase(kieBaseName); + configurableListableBeanFactory.registerSingleton(kieBaseName, kieBase); registerKieSessions(kieBaseName, configurableListableBeanFactory); } } - private void registerKieBeanDef(BeanDefinitionRegistry beanDefinitionRegistry, String kieBaseName) { - BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(KBaseFactoryBean.class); - factory.addPropertyValue("kBaseName", kieBaseName); - factory.addPropertyValue("id", kieBaseName); - factory.addPropertyValue("singleton", false); - factory.addPropertyValue("kieContainer", kContainer); - beanDefinitionRegistry.registerBeanDefinition(kieBaseName, factory.getBeanDefinition()); - } - protected void registerKieSessions(String kieBaseName, ConfigurableListableBeanFactory configurableListableBeanFactory) { - for (String kieSessionName : kContainer.getKieSessionNamesInKieBase(kieBaseName)) { Object ksession = kieObjectsResolver.resolveKSession(kContainer, kieSessionName); configurableListableBeanFactory.registerSingleton(kieSessionName, ksession); } - } } diff --git a/kie-spring/src/test/java/org/kie/spring/tests/KieSpringScannerTest.java b/kie-spring/src/test/java/org/kie/spring/tests/KieSpringScannerTest.java index 93fb88c93b..67194dd5e4 100644 --- a/kie-spring/src/test/java/org/kie/spring/tests/KieSpringScannerTest.java +++ b/kie-spring/src/test/java/org/kie/spring/tests/KieSpringScannerTest.java @@ -17,7 +17,7 @@ package org.kie.spring.tests; import org.drools.compiler.kie.builder.impl.InternalKieModule; -import org.junit.*; +import org.junit.Test; import org.kie.api.KieBase; import org.kie.api.KieServices; import org.kie.api.builder.KieScanner; @@ -27,7 +27,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; - import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -35,13 +34,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.kie.scanner.MavenRepository.getMavenRepository; public class KieSpringScannerTest extends AbstractKieSpringDynamicModuleTest { - static ApplicationContext context = null; + private static ApplicationContext context = null; + private final int FIRST_VALUE = 5; private final int SECOND_VALUE = 10; - protected final int FIRST_VALUE = 5; @Test public void testSpringKieScanner() throws Exception {