From 033f0c30154107ddf36cd682c860e95025bf00b0 Mon Sep 17 00:00:00 2001 From: lj1412 Date: Tue, 14 Feb 2017 15:11:44 +0000 Subject: Init ncomp.sirius.manager Change-Id: I6691ecd21a942c96cb20cf3baa297e4b2dc7f970 Signed-off-by: lj1412 --- ncomp-sirius-manager-drools/.classpath | 27 + ncomp-sirius-manager-drools/.gitignore | 1 + ncomp-sirius-manager-drools/.project | 34 + .../.settings/org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + ncomp-sirius-manager-drools/LICENSE.txt | 22 + ncomp-sirius-manager-drools/META-INF/MANIFEST.MF | 8 + ncomp-sirius-manager-drools/build.properties | 3 + ncomp-sirius-manager-drools/pom.xml | 148 +++++ .../sirius/manager/drools/DroolsEventListener.java | 29 + .../ncomp/sirius/manager/drools/DroolsRuntime.java | 710 +++++++++++++++++++++ 12 files changed, 998 insertions(+) create mode 100644 ncomp-sirius-manager-drools/.classpath create mode 100644 ncomp-sirius-manager-drools/.gitignore create mode 100644 ncomp-sirius-manager-drools/.project create mode 100644 ncomp-sirius-manager-drools/.settings/org.eclipse.core.resources.prefs create mode 100644 ncomp-sirius-manager-drools/.settings/org.eclipse.jdt.core.prefs create mode 100644 ncomp-sirius-manager-drools/.settings/org.eclipse.m2e.core.prefs create mode 100644 ncomp-sirius-manager-drools/LICENSE.txt create mode 100644 ncomp-sirius-manager-drools/META-INF/MANIFEST.MF create mode 100644 ncomp-sirius-manager-drools/build.properties create mode 100644 ncomp-sirius-manager-drools/pom.xml create mode 100644 ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsEventListener.java create mode 100644 ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsRuntime.java (limited to 'ncomp-sirius-manager-drools') diff --git a/ncomp-sirius-manager-drools/.classpath b/ncomp-sirius-manager-drools/.classpath new file mode 100644 index 0000000..c220c0b --- /dev/null +++ b/ncomp-sirius-manager-drools/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ncomp-sirius-manager-drools/.gitignore b/ncomp-sirius-manager-drools/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/ncomp-sirius-manager-drools/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/ncomp-sirius-manager-drools/.project b/ncomp-sirius-manager-drools/.project new file mode 100644 index 0000000..7b6a8cf --- /dev/null +++ b/ncomp-sirius-manager-drools/.project @@ -0,0 +1,34 @@ + + + ncomp-sirius-manager-drools + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.pde.PluginNature + + diff --git a/ncomp-sirius-manager-drools/.settings/org.eclipse.core.resources.prefs b/ncomp-sirius-manager-drools/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..f9fe345 --- /dev/null +++ b/ncomp-sirius-manager-drools/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/ncomp-sirius-manager-drools/.settings/org.eclipse.jdt.core.prefs b/ncomp-sirius-manager-drools/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..443e085 --- /dev/null +++ b/ncomp-sirius-manager-drools/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/ncomp-sirius-manager-drools/.settings/org.eclipse.m2e.core.prefs b/ncomp-sirius-manager-drools/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/ncomp-sirius-manager-drools/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/ncomp-sirius-manager-drools/LICENSE.txt b/ncomp-sirius-manager-drools/LICENSE.txt new file mode 100644 index 0000000..30471b5 --- /dev/null +++ b/ncomp-sirius-manager-drools/LICENSE.txt @@ -0,0 +1,22 @@ + +/*- + * ============LICENSE_START========================================== + * OPENECOMP - DCAE + * =================================================================== + * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * 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. + * ============LICENSE_END============================================ + */ + +ECOMP and OpenECOMP are trademarks and service marks of AT&T Intellectual Property. diff --git a/ncomp-sirius-manager-drools/META-INF/MANIFEST.MF b/ncomp-sirius-manager-drools/META-INF/MANIFEST.MF new file mode 100644 index 0000000..a80a85a --- /dev/null +++ b/ncomp-sirius-manager-drools/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: ncomp-sirius-manager-drools +Bundle-Version: 0.1.0.qualifier +Export-Package: org.openecomp.ncomp.sirius.manager.drools +Bundle-Vendor: %providerName +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 diff --git a/ncomp-sirius-manager-drools/build.properties b/ncomp-sirius-manager-drools/build.properties new file mode 100644 index 0000000..a1ec8c4 --- /dev/null +++ b/ncomp-sirius-manager-drools/build.properties @@ -0,0 +1,3 @@ +source.. = src/main/java/ +bin.includes = META-INF/,\ + . diff --git a/ncomp-sirius-manager-drools/pom.xml b/ncomp-sirius-manager-drools/pom.xml new file mode 100644 index 0000000..86720c3 --- /dev/null +++ b/ncomp-sirius-manager-drools/pom.xml @@ -0,0 +1,148 @@ + + 4.0.0 + org.openecomp.ncomp.sirius.manager + ncomp-sirius-manager-drools + 0.1.0-SNAPSHOT + + + UTF-8 + 1.7 + 1.7 + + + + + + + JCenter + JCenter Repository + http://jcenter.bintray.com + + + + Restlet + Restlet Repository + http://maven.restlet.com + + + + + + + com.blackducksoftware.integration + hub-maven-plugin + 1.4.0 + false + + ${project.name} + ${project.basedir} + + + + create-bdio-file + package + + createHubOutput + + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.6 + + + org.apache.maven.wagon + wagon-webdav-jackrabbit + 2.10 + + + + + + maven-compiler-plugin + 3.1 + + + + + + + + + + + log4j + log4j + 1.2.17 + + + org.eclipse.emf + org.eclipse.emf.ecore + 2.11.0-v20150123-0347 + + + org.eclipse.emf + org.eclipse.emf.common + 2.11.0-v20150123-0347 + + + org.eclipse.xtext + org.eclipse.xtext.xbase.lib + 2.8.2 + + + org.kie + kie-api + 6.3.0.Final + + + org.drools + drools-core + 6.3.0.Final + + + + + + + osecomp-nexus-releases + OSECOMP Release Repository + ${openecomp.nexus.releases} + + + osecomp-nexus-snapshots + OSECOMP Snapshot Repository + ${openecomp.nexus.snapshots} + + + dcae-javadoc + ${site.urlroot}/${project.artifactId}/${project.version}/ + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + false + org.umlgraph.doclet.UmlGraphDoc + + org.umlgraph + umlgraph + 5.6 + + -views + true + + + + + + + diff --git a/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsEventListener.java b/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsEventListener.java new file mode 100644 index 0000000..d542573 --- /dev/null +++ b/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsEventListener.java @@ -0,0 +1,29 @@ + +/*- + * ============LICENSE_START========================================== + * OPENECOMP - DCAE + * =================================================================== + * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * 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. + * ============LICENSE_END============================================ + */ + +package org.openecomp.ncomp.sirius.manager.drools; + +public interface DroolsEventListener { + public void recordPolicyFire(String ruleName); + public void recordPolicyObjectInserted(Object o); + public void recordPolicyObjectDeleted(Object o); + public void recordPolicyObjectUpdated(Object o); +} diff --git a/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsRuntime.java b/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsRuntime.java new file mode 100644 index 0000000..7b4ce13 --- /dev/null +++ b/ncomp-sirius-manager-drools/src/main/java/org/openecomp/ncomp/sirius/manager/drools/DroolsRuntime.java @@ -0,0 +1,710 @@ + +/*- + * ============LICENSE_START========================================== + * OPENECOMP - DCAE + * =================================================================== + * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * 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. + * ============LICENSE_END============================================ + */ + +/* + * Copyright 2010 JBoss Inc + * + * 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.openecomp.ncomp.sirius.manager.drools; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.ecore.util.EContentAdapter; +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.rule.FactHandle; +import org.kie.api.runtime.rule.Match; +import org.kie.api.time.SessionClock; +import org.kie.api.logger.KieRuntimeLogger; +import org.kie.api.builder.KieScanner; +import org.kie.api.builder.ReleaseId; +//import org.kie.api.event.process.ProcessCompletedEvent; +//import org.kie.api.event.process.ProcessEventListener; +//import org.kie.api.event.process.ProcessNodeLeftEvent; +//import org.kie.api.event.process.ProcessNodeTriggeredEvent; +//import org.kie.api.event.process.ProcessStartedEvent; +//import org.kie.api.event.process.ProcessVariableChangedEvent; +import org.kie.api.event.rule.AfterMatchFiredEvent; +import org.kie.api.event.rule.AgendaEventListener; +//import java.util.Calendar; +//import org.kie.api.event.KieRuntimeEventManager; +//import org.kie.api.event.rule.DebugAgendaEventListener; +//import org.kie.api.event.rule.DebugRuleRuntimeEventListener; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +import org.kie.api.event.rule.AgendaGroupPoppedEvent; +import org.kie.api.event.rule.AgendaGroupPushedEvent; +import org.kie.api.event.rule.BeforeMatchFiredEvent; +import org.kie.api.event.rule.MatchCancelledEvent; +import org.kie.api.event.rule.MatchCreatedEvent; +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleFlowGroupActivatedEvent; +import org.kie.api.event.rule.RuleFlowGroupDeactivatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; + +public class DroolsRuntime { + private static final Logger logger = Logger.getLogger(DroolsRuntime.class); + private static final Logger logevents = Logger.getLogger("org.openecomp.ncomp.sirius.manager.drools.events"); + + private final KieServices ks; + private final ReleaseId releaseId; + private final KieContainer kContainer; + private final KieScanner kieScanner; + private KieRuntimeLogger kLogger; + private KieSession kSession; + private final ArrayList rootList; + private final HashMap factmap; + private final HashMap globalmap; + private long fireInterval = 1000L; + private Thread fireThread = null; + + private final DroolsEventListener listener; + + // copied from org.openecomp.ncomp.sirius.manager.ManagementServer + // except didn't use artificial id counter for final return case + private static String ecoreId(EObject oo) { + EStructuralFeature f = oo.eClass().getEStructuralFeature("name"); + if (f instanceof EAttribute) { + EAttribute attr = (EAttribute) f; + return (String) oo.eGet(attr); + } + if (oo.eContainer() != null) { + if (oo.eContainmentFeature().isMany()) { + @SuppressWarnings("unchecked") + EList l = (EList) oo.eContainer().eGet(oo.eContainmentFeature()); + return Integer.toString(l.indexOf(oo)); + } else { + return oo.eContainmentFeature().getName(); + } + } +// WAS return "id" + id++; + return "idXXXXXX"; + } + + // copied from org.openecomp.ncomp.sirius.manager.ManagementServer + private static String object2ref(EObject oo) { + if (oo.eContainer() == null) { + return ""; + } + EReference ref = (EReference) oo.eContainingFeature(); + StringBuffer b = new StringBuffer(); + b.append(object2ref(oo.eContainer())); + b.append("/"); + b.append(ref.getName()); + if (ref.isMany()) { + b.append("/"); + b.append(ecoreId(oo)); + } + return b.toString(); + } + + private static String describeObject (Object o) { + if (o instanceof EObject) { + try { + String s = object2ref((EObject) o); + if (s != "") return s; + } catch (Exception e) { + } + } + return "object:" + o.getClass().getName(); + } + + private static String describeObject (Object parent, Object o) { + StringBuffer b = new StringBuffer(); + b.append(object2ref((EObject)parent)); + b.append("/"); + if (o instanceof EObject) { + EObject oo = (EObject) o; + EReference ref = (EReference) oo.eContainingFeature(); + if (ref == null) { + b.append("NullRef"); + } else { + b.append(ref.getName()); + if (ref.isMany()) { + b.append("/"); + b.append(ecoreId(oo)); + } + } + } else { + b.append("child"); + } + return b.toString(); + } + + private static String describeFact (FactHandle f) { + String s = f.toExternalForm(); + int i = s.indexOf(' '); + if (i >= 0) return s.substring(0,i-1); + else return s; + } + + private class DroolsAgendaListener implements AgendaEventListener { + private void logMatch (Logger log, String label, Match m) { + log.info(label + ": rule " + m.getRule().getName()); + for (int i=0; i l = (List) n.getOldValue(); + int[] positions = (int []) n.getNewValue(); + for (int i=0; i(); + factmap = new HashMap(); + globalmap = new HashMap(); + + this.fireInterval = fireInterval; + } + + public void addObjectTree (EObject o) { + o.eAdapters().add(new UpdateDroolsContentAdapter()); + rootList.add(o); + if (kSession != null) { + insertRecursively (o); + } + } + + public void addEvents(EList l) { + for (EObject o : l) { + addEvent(o); + } + } + + public void addEvent (EObject o) { + logger.debug("inserting event into kSession: " + describeObject(o)); + logger.debug("insert event class: " + o.getClass()); + try { + kSession.insert(o); + } catch (Exception e) { + logger.error("kSession insert failed inserting " + o.toString(), e); + } + } + + public void setGlobal (String s, Object o) { + globalmap.put(s, o); + } + + private void insertRecursively (EObject o) { + logger.debug("inserting (recursively) into kSession: " + describeObject(o)); + FactHandle fh = kSession.insert(o); + factmap.put (o, fh); + for (EReference ref : o.eClass().getEAllContainments()) { + if (ref.isMany()) { + @SuppressWarnings("unchecked") + EList l = (EList) o.eGet(ref); + for (EObject o1 : l) { + insertRecursively(o1); + } + } else { + EObject o1 = (EObject) o.eGet(ref); + if (o1 != null) + insertRecursively(o1); + } + } + } + + public void startSession() { + logger.info("starting kie session"); +// specifying TimedRuleExectionOption here appears to override any values from kmodules.xml +// KieSessionConfiguration ksconf = ks.newKieSessionConfiguration(); +// ksconf.setOption(TimedRuleExectionOption.YES); +// kSession = kContainer.newKieSession("ksession-rules", ksconf); + kSession = kContainer.newKieSession("ksession-rules"); + if (kSession == null) logger.error("Unable to start kie session"); + kSession.addEventListener (new DroolsAgendaListener() ); + kSession.addEventListener (new DroolsRuntimeListener() ); +// kSession.addEventListener (new DroolsProcessListener() ); + //logger = KieServices.Factory.get().getLoggers().newConsoleLogger(kSession); + //kLogger = ks.getLoggers().newFileLogger( kSession, "./logs/audit" ); + + for (Entry e : globalmap.entrySet()) { + try { + kSession.setGlobal(e.getKey(), e.getValue()); + } catch (RuntimeException re) { + logger.warn("Unable to set global " + e.getKey() + ": " + re.getMessage()); + } + } + + for (EObject o : rootList) { + insertRecursively (o); + } + + fireThread = new Thread("rule-firing-thread") { + public void run() { + while (!isInterrupted()) { + logger.debug("firing all rules..."); + try { +// fireAllRules(); + fireUntilHalt(); + } catch (Exception e) { + logger.error("fireAllRules() threw exception", e); + } + + try { + Thread.sleep(fireInterval); + } catch(InterruptedException ex) { + logger.info("rule firing thread interruped"); + Thread.currentThread().interrupt(); + } + } + logger.info("rule firing thread returning"); + } + }; + fireThread.start(); + } + + public void stopSession() { + logger.info("stopping session"); + logger.info("stopping rule firing thread"); + fireThread.interrupt(); + try { + fireThread.join(); + } catch (InterruptedException e) { + logger.warn("Interruped while waiting for fireThread.join()"); + Thread.currentThread().interrupt(); + } + fireThread = null; + if (kSession != null) kSession.dispose(); + if (kLogger != null) kLogger.close(); + kSession = null; + kLogger = null; + factmap.clear(); + } + + public void startScanner (long interval) { + kieScanner.start (interval); + } + public void doScan () { + kieScanner.scanNow (); + } + public void stopScanner () { + kieScanner.stop (); + } + + public void renewSession () { + stopSession(); + startSession(); + } + + public void fireAllRules() { + if (kSession != null) + kSession.fireAllRules(); + } + + public void fireUntilHalt() { + if (kSession != null) { + kSession.fireUntilHalt(); + } else { + logger.warn("fireUntilHalt but null kSession"); + } + } + + public long getCurrentTime() { + return kSession.getSessionClock().getCurrentTime(); + } + + public long advanceTime(long delta, TimeUnit unit) { + SessionClock clock = kSession.getSessionClock(); +// if (kSession.getSessionConfiguration().getOption(ClockTypeOption.class).getClockType() == "pseudo") { +// org.drools.core.time.SessionPseudoClock clock = kSession.getSessionClock(); +// clock.advanceTime(delta, unit); +// } + if (clock instanceof org.drools.core.time.SessionPseudoClock) { + ((org.drools.core.time.SessionPseudoClock) clock).advanceTime(delta, unit); + } else { + logger.error("Attempted to advanceTime, but session clock is not pesudoclock"); + } + return clock.getCurrentTime(); + } + + +// public static void main(String[] args) throws Exception { +// ServiceController s = ServiceFactory.eINSTANCE.createServiceController(); +// +// Enodeb e = ServiceFactory.eINSTANCE.createEnodeb(); +// s.getENodeBs().add(e); +// e.setGain1("foo"); +// Enodeb e2 = ServiceFactory.eINSTANCE.createEnodeb(); +// s.getENodeBs().add(e2); +// e2.setGain1("foo"); +// +// DroolsRuntime drools = new DroolsRuntime (1000L, "org.openecomp.ncomp.test", "pol", "1.1.1-SNAPSHOT"); +// +// drools.addObjectTree(s); +// +// // Start the KieScanner polling the Maven repository every 10 seconds +// drools.startScanner( 10000L ); +// +// drools.startSession(); +// +// EnodebTcpLossAnomalyList anomalylist = ServiceFactory.eINSTANCE.createEnodebTcpLossAnomalyList(); +// drools.addObjectTree(anomalylist); +// EnodebTcpLossAnomaly a = ServiceFactory.eINSTANCE.createEnodebTcpLossAnomaly(); +// a.setNewEvent(true); +// Date d = new Date(); +// a.setStartTime(new Date(d.getTime() - 30000)); +// a.setEndTime(d); +// anomalylist.getAnomalies().add(a); +// +// while (true) { +// drools.fireAllRules(); +// +// try { +// Thread.sleep(10000L); // In milliseconds for looping. +// } catch(InterruptedException ex) { +// Thread.currentThread().interrupt(); +// } +// drools.renewSession(); +// } +// } +} -- cgit 1.2.3-korg