All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.leadware.drools.server.engine.DroolsEngine Maven / Gradle / Ivy

The newest version!
/**
 * 
 */
package net.leadware.drools.server.engine;

/*
 * #%L
 * DROOLS SERVER
 * $Id:$
 * $HeadURL:$
 * %%
 * Copyright (C) 2013 Leadware
 * %%
 * 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.
 * #L%
 */

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.leadware.drools.server.engine.configuration.DroolsServerConfigurationInitializer;
import net.leadware.drools.server.model.configuration.DroolsServerConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeAgentConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeAgentsConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeBaseConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeBaseConfigurationRef;
import net.leadware.drools.server.model.configuration.KnowledgeBasesConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeSessionConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeSessionTypeConfiguration;
import net.leadware.drools.server.model.configuration.KnowledgeSessionsConfiguration;
import net.leadware.drools.server.model.configuration.ResourceConfiguration;
import net.leadware.drools.server.model.configuration.ResourceConfigurationRef;
import net.leadware.drools.server.model.configuration.ResourceTypeConfiguration;
import net.leadware.drools.server.model.configuration.ResourcesConfiguration;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.RuntimeDroolsException;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderConfiguration;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.builder.ResultSeverity;
import org.drools.builder.conf.KBuilderSeverityOption;
import org.drools.command.CommandFactory;
import org.drools.command.impl.GenericCommand;
import org.drools.command.runtime.BatchExecutionCommandImpl;
import org.drools.conf.MaxThreadsOption;
import org.drools.conf.MultithreadEvaluationOption;
import org.drools.event.rule.DebugAgendaEventListener;
import org.drools.event.rule.DebugWorkingMemoryEventListener;
import org.drools.io.ResourceFactory;
import org.drools.runtime.ExecutionResults;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;

/**
 * Classe representant le server drools
 * @author Jean-Jacques ETUNE NGI
 * @since 25 déc. 2013 - 13:01:12
 */
@SuppressWarnings("deprecation")
public class DroolsEngine {
	
	/**
	 * Initialiseur de configuration serveur
	 */
	private DroolsServerConfigurationInitializer serverConfigurationInitializer = new DroolsServerConfigurationInitializer();
	
	/**
	 * MAP des ressources
	 */
	private Map resourcesConfiguration = new HashMap();
	
	/**
	 * MAP Des bases de connaissances
	 */
	private Map knowledgeBases = new HashMap();
	
	/**
	 * Map des agents intelligents par session
	 */
	private Map knowledgeAgents = new HashMap();

	/**
	 * Map des sessions
	 */
	private Map knowledgeSessions = new HashMap();
	
	/**
	 * Etat de demarrage des services de moditoring des changement d'etat des ressources
	 */
	private boolean startResourceChangeService = false;
	
	/**
	 * Methode permettant d'initialiser la MAP des Resources par nom
	 * @param resourcesConfiguration	Configuration des ressources
	 */
	private void buildResources(ResourcesConfiguration resourcesConfiguration) {
		
		// Parcours
		for (ResourceConfiguration resourceConfiguration : resourcesConfiguration.getResource()) {
			
			// Ajout dans la MAP des configuration de ressources
			this.resourcesConfiguration.put(resourceConfiguration.getName().trim(), resourceConfiguration);
		}
	}
	
	/**
	 * Methode permettant de construire une knowledgeBaseName de connaissance a partir de la knowledgeBaseName de connaissance configuree
	 * @param knowledgeBaseConfiguration	Configuration de knowledgeBaseName de connaissance	
	 * @return	Base de connaissance Drools
	 */
	private KnowledgeBase buildKnowledgeBase(KnowledgeBaseConfiguration knowledgeBaseConfiguration) {

		// Configuration du constructeur de connaissance
		KnowledgeBuilderConfiguration droolsKnowledgeBuilderConfiguration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
		
		// Traitement des regles multiples
		switch (knowledgeBaseConfiguration.getOnDuplicateRule()) {
			
			// en cas d'INFO
			case INFO:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateRule", ResultSeverity.INFO));
				 		break;

			// en cas de WARN
			case WARN:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateRule", ResultSeverity.WARNING));
				 		break;

			// en cas d'ERROR
			case ERROR:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateRule", ResultSeverity.ERROR));
						break;
										 		
			default:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateRule", ResultSeverity.INFO));
						break;
		}

		// Traitement des fonctions multiples
		switch (knowledgeBaseConfiguration.getOnDuplicateFunction()) {
			
			// en cas d'INFO
			case INFO:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateFunction", ResultSeverity.INFO));
				 		break;

			// en cas de WARN
			case WARN:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateFunction", ResultSeverity.WARNING));
				 		break;

			// en cas d'ERROR
			case ERROR:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateFunction", ResultSeverity.ERROR));
						break;
			
			// Cas par defaut			
			default:	droolsKnowledgeBuilderConfiguration.setOption(KBuilderSeverityOption.get("drools.kbuilder.severity.duplicateFunction", ResultSeverity.INFO));
						break;
		}
		
		// Constructeur de connaissances
		KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(droolsKnowledgeBuilderConfiguration);
		
		// Parcours de la liste des references de Resources de la configuration
		for (ResourceConfigurationRef resourceConfigurationref : knowledgeBaseConfiguration.getResourceRef()) {
			
			// Obtention de la configuration de ressources
			ResourceConfiguration resourceConfiguration = this.resourcesConfiguration.get(resourceConfigurationref.getResourceName().trim());
			
			// Si la ressource n'existe pas
			if(resourceConfiguration == null) 
				throw new RuntimeException("Erreur lors de la construction de la knowledgeBaseName de connaissance : la ressource referencee par '" + resourceConfigurationref.getResourceName() + "' n'existe pas.");
			
			// Si la ressource est dans le classpath
			if(resourceConfiguration.isInClassPath()) {
				
				// Ajout de la resource
				knowledgeBuilder.add(ResourceFactory.newClassPathResource(resourceConfiguration.getPath(), getClass()), buildResourceType(resourceConfiguration.getType()));
				
			} else {
				
				// Ajout de la ressource
				knowledgeBuilder.add(ResourceFactory.newFileResource(resourceConfiguration.getPath()), buildResourceType(resourceConfiguration.getType()));
			}
		}
		
		// S'il y a des erreurs
		if(knowledgeBuilder.hasErrors()) {
			
			// On leve une exceprion
			throw new RuntimeException("Erreur lors du chargement des ressources metier : " + knowledgeBuilder.getErrors().toString());
		}
		
		// Configuration de la knowledgeBaseName de connaissance
		org.drools.KnowledgeBaseConfiguration droolsKnowledgeBaseConfiguration = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
		
		// Si on est en evaluation multithread
		if(knowledgeBaseConfiguration.isMultiThreadEvaluation()) {
			
			// On positionne l'etat de multithread
			droolsKnowledgeBaseConfiguration.setOption(MultithreadEvaluationOption.YES);
			
			// Positionnement du nombre de thread
			droolsKnowledgeBaseConfiguration.setOption(MaxThreadsOption.get(knowledgeBaseConfiguration.getMaxEvaluationThreads()));
		}
		
		// Instanciation de la knowledgeBaseName de connaissance
		KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase(droolsKnowledgeBaseConfiguration);
		
		// Ajout des packages de connaissances dans la knowledgeBaseName
		knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
		
		// On retourne la knowledgeBaseName de connaissances
		return knowledgeBase;
	}
	
	/**
	 * Methode permettant de construire la liste des bases de connaissance a partir de la knowledgeBaseName de connaissance configuree
	 * @param knowledgeBasesConfiguration	Configuration de la liste des bases de connaissance	
	 */
	private void buildKnowledgeBases(KnowledgeBasesConfiguration knowledgeBasesConfiguration) {
		
		// Parcours de la liste des configuration des bases de connaissances
		for (KnowledgeBaseConfiguration knowledgeBaseConfiguration : knowledgeBasesConfiguration.getKnowledgeBase()) {
			
			// Obtention de la knowledgeBaseName de connaissance
			KnowledgeBase knowledgeBase = buildKnowledgeBase(knowledgeBaseConfiguration);
			
			// Ajout de la knowledgeBaseName de connaissance dans la MAP des bases de connaissance
			knowledgeBases.put(knowledgeBaseConfiguration.getName().trim(), knowledgeBase);
		}
	}
	
	/**
	 * Methode permettant de construire un agent intelligent configuree
	 * @param knowledgeAgentConfiguration	Configuration de l'agent intelligent
	 * @return	Agent intelligent Drools
	 */
	private KnowledgeAgent buildKnowledgeAgent(KnowledgeAgentConfiguration knowledgeAgentConfiguration) {

		// Base de connaissance drools a construire
		KnowledgeBase knowledgeBase = null;
		
		// Obtention de la reference sur la knowledgeBaseName de connaissance
		KnowledgeBaseConfigurationRef knowledgeBaseConfigurationRef = knowledgeAgentConfiguration.getKnowledgeBaseRef();

		// Recherche de la knowledgeBaseName de connaissance dans la MAP des bases de connaissances
		knowledgeBase = this.knowledgeBases.get(knowledgeBaseConfigurationRef.getKnowledgeBase().trim());
		
		// Si la knowledgeBaseName de connaissance est nulle
		if(knowledgeBase == null) 
			throw new RuntimeException("Erreur lors de la construction de l'agent intelligent : la knowledgeBaseName de connaissance referencee par '" + knowledgeBaseConfigurationRef.getKnowledgeBase() + "' n'existe pas.");
		
		// Configuration de l'agent intelligent
		org.drools.agent.KnowledgeAgentConfiguration droolsKnowledgeAgentConfiguration = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
		
		// Si on doit scanner les ressources
		if(knowledgeAgentConfiguration.isScanDirectories() || knowledgeAgentConfiguration.isScanResources()) this.startResourceChangeService = true;
		
		// Positionnement du scan des repertoires
		droolsKnowledgeAgentConfiguration.setProperty("drools.agent.scanDirectories", Boolean.toString(knowledgeAgentConfiguration.isScanDirectories()));
		
		// Positionnement du scan des ressources
		droolsKnowledgeAgentConfiguration.setProperty("drools.agent.scanResources", Boolean.toString(knowledgeAgentConfiguration.isScanResources()));
		
		// Positionnement de la periode de scan
		droolsKnowledgeAgentConfiguration.setProperty("drools.agent.scanPeriod", Integer.toString(knowledgeAgentConfiguration.getScanPeriod()));
		
		// Positionnement de l'etat d'utilisation du classloader de la knowledgeBaseName de connaissance
		droolsKnowledgeAgentConfiguration.setProperty("drools.agent.useKBaseClassLoaderForCompiling", Integer.toString(knowledgeAgentConfiguration.getScanPeriod()));
		
		// Construction de l'agent
		KnowledgeAgent knowledgeAgent = KnowledgeAgentFactory.newKnowledgeAgent(knowledgeAgentConfiguration.getName(), knowledgeBase, droolsKnowledgeAgentConfiguration);
		
		// On retourne la knowledgeBaseName de connaissance issue de l'agent
		return knowledgeAgent;
	}
	
	/**
	 * Methode permettant de construire la liste des agent intelligent configuree a partir de la configuration des agents
	 * @param knowledgeAgentsConfiguration	Configuration des agents intelligent
	 */
	private void buildKnowledgeAgents(KnowledgeAgentsConfiguration knowledgeAgentsConfiguration) {
		
		// Parcours de la liste des configuration d'agents
		for (KnowledgeAgentConfiguration knowledgeAgentConfiguration : knowledgeAgentsConfiguration.getKnowledgeAgent()) {
			
			// Construction de l'agent intelligent
			KnowledgeAgent knowledgeAgent = buildKnowledgeAgent(knowledgeAgentConfiguration);
			
			// Ajout de l'agent dans la MAP des agents
			this.knowledgeAgents.put(knowledgeAgentConfiguration.getName().trim(), knowledgeAgent);
		}
	}
	
	/**
	 * Methode permettant de construire une session intelligente sans etat
	 * @param knowledgeSessionConfiguration	Configuration de la session intelligente sans etat
	 * @return	Session intelligente sans etat
	 */
	private StatelessKnowledgeSession buildStatelessKnowledgeSession(KnowledgeSessionConfiguration knowledgeSessionConfiguration) {
		
		// Base de connaissance
		KnowledgeBase knowledgeBase = null;
		
		// Agent intelligent
		KnowledgeAgent knowledgeAgent = null;
		
		// Si la reference a la knowledgeBaseName de connaissance est non nulle
		if(knowledgeSessionConfiguration.getKnowledgeBaseRef() != null) {
			
			// Obtention de la knowledgeBaseName de connaissance depuis la MAP des bases de connaissances
			knowledgeBase = this.knowledgeBases.get(knowledgeSessionConfiguration.getKnowledgeBaseRef().getKnowledgeBase().trim());
			
			// Si la knowledgeBaseName de connaissance est nulle
			if(knowledgeBase == null) 
				throw new RuntimeException("Erreur lors de la construction de la session intelligente (stateless) : la knowledgeBaseName de connaissance referencee par '" + knowledgeSessionConfiguration.getKnowledgeBaseRef().getKnowledgeBase() + "' n'existe pas.");
			
		} else {
			
			// Obtention de l'agent intelligent depuis la MAP des aggents intelligents
			knowledgeAgent = this.knowledgeAgents.get(knowledgeSessionConfiguration.getKnowledgeAgentRef().getKnowledgeAgent().trim());
			
			// Si l'agent est null
			if(knowledgeAgent == null)
				throw new RuntimeException("Erreur lors de la construction de la session intelligente (stateless) : l'agent intelligent referencee par '" + knowledgeSessionConfiguration.getKnowledgeAgentRef().getKnowledgeAgent() + "' n'existe pas.");
			
			// Construction de la knowledgeBaseName de connaissance
			knowledgeBase = knowledgeAgent.getKnowledgeBase();
			
		}
		
		// Construction de la session sans etat
		StatelessKnowledgeSession statelessKnowledgeSession = knowledgeBase.newStatelessKnowledgeSession();
		
		// Si la session est a debogguer
		if(knowledgeSessionConfiguration.isDebug()) {

			// Ajout du listener de debug des evenements sur la memoire de travail
			statelessKnowledgeSession.addEventListener(new DebugWorkingMemoryEventListener(System.out));
			
			// Ajout du listener de debug des evenements sur l'agenda
			statelessKnowledgeSession.addEventListener(new DebugAgendaEventListener(System.out));
		}
		
		// On retourne la session sans etat
		return statelessKnowledgeSession;
	}

	/**
	 * Methode permettant de construire une session intelligente avec etat
	 * @param knowledgeSessionConfiguration	Configuration de la session intelligente sans etat
	 * @return	Session intelligente sans etat
	 */
	private StatefulKnowledgeSession buildStatefulKnowledgeSession(KnowledgeSessionConfiguration knowledgeSessionConfiguration) {
		
		// Base de connaissance
		KnowledgeBase knowledgeBase = null;
		
		// Agent intelligent
		KnowledgeAgent knowledgeAgent = null;
		
		// Si la reference a la knowledgeBaseName de connaissance est non nulle
		if(knowledgeSessionConfiguration.getKnowledgeBaseRef() != null) {
			
			// Obtention de la knowledgeBaseName de connaissance depuis la MAP des bases de connaissances
			knowledgeBase = this.knowledgeBases.get(knowledgeSessionConfiguration.getKnowledgeBaseRef().getKnowledgeBase().trim());
			
			// Si la knowledgeBaseName de connaissance est nulle
			if(knowledgeBase == null) 
				throw new RuntimeException("Erreur lors de la construction de la session intelligente (stateful) : la knowledgeBaseName de connaissance referencee par '" + knowledgeSessionConfiguration.getKnowledgeBaseRef().getKnowledgeBase() + "' n'existe pas.");
			
		} else {
			
			// Obtention de l'agent intelligent depuis la MAP des aggents intelligents
			knowledgeAgent = this.knowledgeAgents.get(knowledgeSessionConfiguration.getKnowledgeAgentRef().getKnowledgeAgent().trim());
			
			// Si l'agent est null
			if(knowledgeAgent == null)
				throw new RuntimeException("Erreur lors de la construction de la session intelligente (stateful) : l'agent intelligent referencee par '" + knowledgeSessionConfiguration.getKnowledgeAgentRef().getKnowledgeAgent() + "' n'existe pas.");
			
			// Construction de la knowledgeBaseName de connaissance
			knowledgeBase = knowledgeAgent.getKnowledgeBase();
			
		}
		
		// Construction de la session sans etat
		StatefulKnowledgeSession statefulKnowledgeSession = knowledgeBase.newStatefulKnowledgeSession();
		
		// Si la session est a debogguer
		if(knowledgeSessionConfiguration.isDebug()) {

			// Ajout du listener de debug des evenements sur la memoire de travail
			statefulKnowledgeSession.addEventListener(new DebugWorkingMemoryEventListener(System.out));
			
			// Ajout du listener de debug des evenements sur l'agenda
			statefulKnowledgeSession.addEventListener(new DebugAgendaEventListener(System.out));
		}
		
		// On retourne la session sans etat
		return statefulKnowledgeSession;
	}
	
	/**
	 * Methode permettant d'obtenir le type de la ressource 
	 * @param resourceTypeConfiguration	Configuration du type
	 * @return	Type Drools
	 */
	private ResourceType buildResourceType(ResourceTypeConfiguration resourceTypeConfiguration) {
		
		// Choix
		switch (resourceTypeConfiguration) {
			
			// En cas de BPMN
			case BPMN: return ResourceType.BPMN2;

			// En cas de CHANGE_SET
			case CHANGE_SET: return ResourceType.CHANGE_SET;

			// En cas de BRL
			case BRL: return ResourceType.BRL;

			// En cas de DESCR
			case DESCR: return ResourceType.DESCR;

			// En cas de DRF
			case DRF: return ResourceType.DRF;

			// En cas de DRL
			case DRL: return ResourceType.DRL;

			// En cas de DSL
			case DSL: return ResourceType.DSL;

			// En cas de DSLR
			case DSLR: return ResourceType.DSLR;

			// En cas de DTABLE
			case DTABLE: return ResourceType.DTABLE;

			// En cas de PKG
			case PKG: return ResourceType.PKG;

			// En cas de PMML
			case PMML: return ResourceType.PMML;

			// En cas de XDRL
			case XDRL: return ResourceType.XDRL;

			// En cas de XSD
			case XSD: return ResourceType.XSD;
			
			// Valeur par defaut
			default: return ResourceType.DRL;
		}
	}

	/**
	 * Methode d'obtention du champ "configurationPath"
	 * @return champ "configurationPath"
	 */
	public String getConfigurationPath() {
		
		// Renvoi de la valeur du champ
		return serverConfigurationInitializer.getConfigurationPath();
	}
	
	/**
	 * Methode de modification du champ "configurationPath"
	 * @param configurationPath champ configurationPath a modifier
	 */
	public void setConfigurationPath(String configurationPath) {
		
		// Modification de la valeur du champ
		serverConfigurationInitializer.setConfigurationPath(configurationPath);
	}

	/**
	 * Methode d'obtention du champ "inClasspath"
	 * @return champ "inClasspath"
	 */
	public boolean isInClasspath() {
		
		// Renvoi de la valeur du champ
		return serverConfigurationInitializer.isInClasspath();
	}

	/**
	 * Methode de modification du champ "inClasspath"
	 * @param inClasspath champ inClasspath a modifier
	 */
	public void setInClasspath(boolean inClasspath) {
		
		// Modification de la valeur du champ
		serverConfigurationInitializer.setInClasspath(inClasspath);
	}

	/**
	 * Methode d'obtention du champ "validateConfiguration"
	 * @return champ "validateConfiguration"
	 */
	public boolean isValidateConfiguration() {
		
		// Renvoi de la valeur du champ
		return serverConfigurationInitializer.isValidateConfiguration();
	}

	/**
	 * Methode de modification du champ "validateConfiguration"
	 * @param validateConfiguration champ validateConfiguration a modifier
	 */
	public void setValidateConfiguration(boolean validateConfiguration) {
		
		// Modification de la valeur du champ
		serverConfigurationInitializer.setValidateConfiguration(validateConfiguration);
	}
	
	/**
	 * Methode de demarrage du serveur
	 */
	public void start() {
		
		// Construction de la configuration
		DroolsServerConfiguration droolsServerConfiguration = this.serverConfigurationInitializer.initConfiguration();
		
		// Initialisation de la MAP des resources
		buildResources(droolsServerConfiguration.getResources());
		
		// Initialisation de la MAP des Bases de connaissances
		buildKnowledgeBases(droolsServerConfiguration.getKnowledgeBases());
		
		// Obtention de la configuration des agents intelligents
		KnowledgeAgentsConfiguration knowledgeAgentsConfiguration = droolsServerConfiguration.getKnowledgeAgents();
		
		// Si la configuration est non nulle (Initialisation de la MAP des Agents intelligents)
		if(knowledgeAgentsConfiguration != null) buildKnowledgeAgents(knowledgeAgentsConfiguration);
		
		// Obtention de la configuration de la liste des sessions
		KnowledgeSessionsConfiguration knowledgeSessionsConfiguration = droolsServerConfiguration.getKnowledgeSessions();
		
		// Si la configuration est non nulle
		if(knowledgeSessionsConfiguration != null) {

			// Obtention de la liste des configurations des Sessions
			List knowledgeSessionConfigurations = knowledgeSessionsConfiguration.getKnowledgeSession();

			// Parcours
			for (KnowledgeSessionConfiguration knowledgeSessionConfiguration : knowledgeSessionConfigurations) {
				
				// Si c'est une session stateless
				if(knowledgeSessionConfiguration.getType().equals(KnowledgeSessionTypeConfiguration.STATELESS)) {
					
					// Creation de la session
					StatelessKnowledgeSession statelessKnowledgeSession = buildStatelessKnowledgeSession(knowledgeSessionConfiguration);
					
					// Ajout de la session dans la MAP
					knowledgeSessions.put(knowledgeSessionConfiguration.getName(), statelessKnowledgeSession);
					
				} else {
					
					// Creation de la session
					StatefulKnowledgeSession statefulKnowledgeSession = buildStatefulKnowledgeSession(knowledgeSessionConfiguration);
					
					// Ajout de la session dans la MAP
					knowledgeSessions.put(knowledgeSessionConfiguration.getName(), statefulKnowledgeSession);
				}
				
			}
		}
		
		// Si le service de monitoring des changements doit etre demarre
		if(startResourceChangeService) {
			
			// Demarage du service de scanning des ressources
			ResourceFactory.getResourceChangeScannerService().start();
			
			// Demarrage du service de notification
			ResourceFactory.getResourceChangeNotifierService().start();
		}
	}
	
	/**
	 * Methode d'arret du serveur
	 */
	public void stop() {

		// Si le service de monitoring des changements doit est demarre
		if(startResourceChangeService) {
			
			try {

				// Arret du service de scanning des ressources
				ResourceFactory.getResourceChangeScannerService().stop();
				
			} catch (Exception e) {
				
				// Trace
				e.printStackTrace();
			}
			
			try {

				// Arret du service de notification
				ResourceFactory.getResourceChangeNotifierService().start();
				
			} catch (Exception e) {
				
				// Trace
				e.printStackTrace();
			}
		}
		
		// Parcours de la Map des sessions
		for (String sessionName : knowledgeSessions.keySet()) {
			
			try {
				
				// Si c'est une session Statefull
				if(isStatefulSession(sessionName)) {
					
					// Cast
					StatefulKnowledgeSession statefulKnowledgeSession = (StatefulKnowledgeSession) knowledgeSessions.get(sessionName);

					// Arret des travaux
					statefulKnowledgeSession.halt();
					
					// tentative de liberation des ressources
					statefulKnowledgeSession.dispose();
				}
				
			} catch (Exception e) {
				
				// Trace
				e.printStackTrace();
			}
		}
		
		// On vide la map
		knowledgeSessions.clear();
	}
	
	/**
	 * Methode permettant de tester si une session existe
	 * @param sessionName	Nom de la session
	 * @return	Etat d'existence de la session
	 */
	public boolean isSessionExists(String sessionName) {
		
		// on retourne l'etat d'existence
		return (sessionName != null) && (!sessionName.trim().isEmpty()) && (knowledgeSessions.get(sessionName.trim()) != null);
	}
	
	/**
	 * Methode permettant de verifier qu'une session est de type Stateless
	 * @param sessionName	Nom de la session
	 * @return	Etat stateless de la session
	 */
	public boolean isStatelessSession(String sessionName) {
		
		// Si la session n'existe pas
		if(!isSessionExists(sessionName)) return false;
		
		// Objet session
		Object knowledgeSession = knowledgeSessions.get(sessionName.trim());
		
		// On retourne l'etat
		return (knowledgeSession != null) && (knowledgeSession instanceof StatelessKnowledgeSession);
	}
	
	/**
	 * Methode permettant de verifier qu'une session est de type Stateful
	 * @param sessionName	Nom de la session
	 * @return	Etat stateful de la session
	 */
	public boolean isStatefulSession(String sessionName) {

		// Si la session n'existe pas
		if(!isSessionExists(sessionName)) return false;
		
		// Objet session
		Object knowledgeSession = knowledgeSessions.get(sessionName.trim());
		
		// On retourne l'etat
		return (knowledgeSession != null) && (knowledgeSession instanceof StatefulKnowledgeSession);
	}
	
	/**
	 * Methode permettant d'obtenir un session intelligente
	 * @param sessionName	Nom de la session
	 * @return	Session intelligente
	 */
	public Object getKnowledgeSession(String sessionName) {
		
		// Si la session n'existe pas
		if(!isSessionExists(sessionName)) return null;
		
		// On retourne la session
		return knowledgeSessions.get(sessionName.trim());
	}
	
	/**
	 * Methode permettant d'obtenir une knowledgeBaseName de connaissance
	 * @param baseName	Nom de la knowledgeBaseName de connaissance
	 * @return	Base de connaissance
	 */
	public KnowledgeBase getKnowledgeBase(String baseName) {
		
		// Si la knowledgeBaseName n'existe pas
		if(!isBaseExists(baseName)) return null;
		
		// On retourne la knowledgeBaseName
		return knowledgeBases.get(baseName.trim());
	}
	
	/**
	 * Methode permettant de tester si une knowledgeBaseName de connaissance existe
	 * @param baseName	Nom de la knowledgeBaseName de connaissance
	 * @return	Etat d'existence de la knowledgeBaseName de connaissance
	 */
	public boolean isBaseExists(String baseName) {
		
		// on retourne l'etat d'existence
		return (baseName != null) && (!baseName.trim().isEmpty()) && (knowledgeBases.get(baseName.trim()) != null);
	}

	/**
	 * Methode permettant d'obtenir un agent intelligent
	 * @param sessionName	Nom de l'agent
	 * @return	Agent intelligent
	 */
	public KnowledgeAgent getKnowledgeAgent(String agentName) {
		
		// Si l'agent n'existe pas
		if(!isAgentExists(agentName)) return null;
		
		// On retourne l'agent
		return knowledgeAgents.get(agentName.trim());
	}
	
	/**
	 * Methode permettant de tester si une agent intelligent existe
	 * @param agentName	Nom de l'agent
	 * @return	Etat d'existence de l'agent
	 */
	public boolean isAgentExists(String agentName) {
		
		// on retourne l'etat d'existence
		return (agentName != null) && (!agentName.trim().isEmpty()) && (knowledgeAgents.get(agentName.trim()) != null);
	}
	
	/**
	 * Methode permettant de creer une session stateless a partir d'un agent intelligent
	 * @param sessionName	Nom de la session a creer
	 * @param agentName Nom de l'agent intelligent source
	 * @param overwrite Etat d'ecrasement d'une session existante
	 * @return	Agent intelligent
	 */
	public void newStatelessSessionFromAgent(String sessionName, String agentName, boolean overwrite) {

		// Si le nom de la session est vide
		if(sessionName == null || sessionName.trim().isEmpty()) throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.sessionnameempty");
		
		// Si l'agent n'existe pas
		if(!isAgentExists(agentName)) throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.agentnotfound");
		
		// Si la session existe et qu'on ne doit pas ecraser
		if(isSessionExists(sessionName) && !overwrite)  throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.sessionexists.nooverwrite");
		
		// Obtention de l'agent
		KnowledgeAgent knowledgeAgent = knowledgeAgents.get(agentName);
		
		// Obtention de la knowledgeBaseName de connaissance
		KnowledgeBase knowledgeBase = knowledgeAgent.getKnowledgeBase();
		
		// Ajout de la session
		knowledgeSessions.put(sessionName, knowledgeBase.newStatelessKnowledgeSession());
	}

	/**
	 * Methode permettant de creer une session stateful a partir d'un agent intelligent
	 * @param sessionName	Nom de la session a creer
	 * @param agentName Nom de l'agent intelligent source
	 * @param overwrite Etat d'ecrasement d'une session existante
	 * @return	Agent intelligent
	 */
	public void newStatefulSessionFromAgent(String sessionName, String agentName, boolean overwrite) {
		
		// Si le nom de la session est vide
		if(sessionName == null || sessionName.trim().isEmpty()) throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.sessionnameempty");
		
		// Si l'agent n'existe pas
		if(!isAgentExists(agentName)) throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.agentnotfound");
		
		// Si la session existe et qu'on ne doit pas ecraser
		if(isSessionExists(sessionName)) {
			
			// Si on ne doit pas ecraser
			if(!overwrite) throw new RuntimeException("net.leadware.drools.engine.create.sessionfromagent.agentnotfound");
			
			// Si la session est stateful
			if(isStatefulSession(sessionName)) {
				
				try {
					
					// Liberation des ressources
					((StatefulKnowledgeSession)getKnowledgeSession(sessionName)).dispose();
					
				} catch (Exception e) {}
			}
		}
		// Obtention de l'agent
		KnowledgeAgent knowledgeAgent = knowledgeAgents.get(agentName);
		
		// Obtention de la knowledgeBaseName de connaissance
		KnowledgeBase knowledgeBase = knowledgeAgent.getKnowledgeBase();
		
		// Ajout de la session
		knowledgeSessions.put(sessionName.trim(), knowledgeBase.newStatefulKnowledgeSession());
	}
	
	/**
	 * Methode permettant de creer une session stateless a partir d'une knowledgeBaseName de connaissance
	 * @param sessionName	Nom de la session a creer
	 * @param baseName	Nom de la knowledgeBaseName de connaissance source
	 * @param overwrite Etat d'ecrasement d'une session existante
	 */
	public void newStatelessSessionFromBase(String sessionName, String baseName, boolean overwrite) {
		
		// Si le nom de la session est vide
		if(sessionName == null || sessionName.trim().isEmpty()) throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.sessionnameempty");
		
		// Si l'agent n'existe pas
		if(!isBaseExists(baseName)) throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.basenotfound");
		
		// Si la session existe et qu'on ne doit pas ecraser
		if(isSessionExists(sessionName) && !overwrite)  throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.sessionexists.nooverwrite");
		
		// Obtention de la knowledgeBaseName de connaissance
		KnowledgeBase knowledgeBase = knowledgeBases.get(baseName);
		
		// Ajout de la session
		knowledgeSessions.put(sessionName.trim(), knowledgeBase.newStatelessKnowledgeSession());
	}
	
	/**
	 * Methode permettant de creer une session statefull a partir d'une knowledgeBaseName de connaissance
	 * @param sessionName	Nom de la session a creer
	 * @param baseName	Nom de la knowledgeBaseName de connaissance
	 * @param overwrite Etat d'ecrasement d'une session existante
	 */
	public void newStatefulSessionFromBase(String sessionName, String baseName, boolean overwrite) {
		
		// Si le nom de la session est vide
		if(sessionName == null || sessionName.trim().isEmpty()) throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.sessionnameempty");
		
		// Si l'agent n'existe pas
		if(!isBaseExists(baseName)) throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.basenotfound");
		
		// Si la session existe et qu'on ne doit pas ecraser
		if(isSessionExists(sessionName)) {
			
			// Si on ne doit pas ecraser
			if(!overwrite) throw new RuntimeException("net.leadware.drools.engine.create.sessionfrombase.sessionexists.nooverwrite");
			
			// Si la session est stateful
			if(isStatefulSession(sessionName)) {
				
				try {
					
					// Liberation des ressources
					((StatefulKnowledgeSession)getKnowledgeSession(sessionName)).dispose();
					
				} catch (Exception e) {}
			}
		}
		
		// Obtention de la knowledgeBaseName de connaissance
		KnowledgeBase knowledgeBase = knowledgeBases.get(baseName);
		
		// Ajout de la session
		knowledgeSessions.put(sessionName.trim(), knowledgeBase.newStatefulKnowledgeSession());
	}
	
	/**
	 * Methode d'execution d'une commandes batch
	 * @param command	Commandes batch a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults execute(BatchExecutionCommandImpl command) {
		
		// Nom de la session
		String sessionName = command.getLookup();
		
		// Si le lookup n'est pas present
		if(sessionName == null || sessionName.trim().isEmpty()) throw new RuntimeException("net.leadware.drools.engine.execute.commands.nosessionspecified");
		
		// Obtention de la session objet 
		Object oSession = getKnowledgeSession(sessionName);
		
		// Si la session n'existe pas
		if(oSession == null) throw new RuntimeException("net.leadware.drools.engine.execute.commands.sessionnotfound");
		
		// Resultat de l'execution
		ExecutionResults result = null;
		
		// Si on est en Stateless
		if(isStatelessSession(sessionName)) {
			
			// On caste
			StatelessKnowledgeSession knowledgeSession = (StatelessKnowledgeSession) oSession;
			
			// Execution
			result = knowledgeSession.execute(command);
			
		} else {
			
			// On caste
			StatefulKnowledgeSession knowledgeSession = (StatefulKnowledgeSession) oSession;
			
			// Execution
			result = knowledgeSession.execute(command);
		}
		
		// On retourne le resultat
		return result;
	}
	
	/**
	 * Methode d'execution d'une commandes batch sur une session creee sur une knowledgeBaseName de connaissace donnee
	 * @param baseName Base de connaissance source
	 * @param command	Commandes batch a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults executeOnBase(String baseName, BatchExecutionCommandImpl command) {
		
		// Si la knowledgeBaseName n'existe pas
		if(!isBaseExists(baseName)) throw new RuntimeException("net.leadware.drools.engine.execute.commands.onbase.basenotfound");
		
		// Obtention de la knowledgeBaseName
		KnowledgeBase knowledgeBase = knowledgeBases.get(baseName.trim());
		
		// Creation de la session stateless
		StatelessKnowledgeSession statelessKnowledgeSession = knowledgeBase.newStatelessKnowledgeSession();
		
		// Execution de la commande
		ExecutionResults result = statelessKnowledgeSession.execute(command);
		
		// On retourne le resultat
		return result;
	}
	
	/**
	 * Methode d'execution d'une commandes batch sur une session creee sur une agent intelligent
	 * @param agentName Base de connaissance source
	 * @param command	Commandes batch a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults executeOnAgent(String agentName, BatchExecutionCommandImpl command) {
		
		// Si la knowledgeBaseName n'existe pas
		if(!isAgentExists(agentName)) throw new RuntimeException("net.leadware.drools.engine.execute.commands.onagent.agentnotfound");
		
		// Obtention de la knowledgeBaseName
		KnowledgeBase knowledgeBase = knowledgeAgents.get(agentName.trim()).getKnowledgeBase();
		
		// Creation de la session stateless
		StatelessKnowledgeSession statelessKnowledgeSession = knowledgeBase.newStatelessKnowledgeSession();
		
		// Execution de la commande
		ExecutionResults result = statelessKnowledgeSession.execute(command);
		
		// On retourne le resultat
		return result;
	}

	/**
	 * Methode d'execution d'une liste de commandes
	 * @param commands	Liste de commandes a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults execute(String sessionName, List> commands) {
		
		// Obtention de la session objet 
		Object oSession = getKnowledgeSession(sessionName);
		
		// Si la session n'existe pas
		if(oSession == null) throw new RuntimeException("net.leadware.drools.engine.execute.commands.sessionnotfound");
		
		// Si la liste de commandes est vide
		if(commands == null || commands.isEmpty()) throw new RuntimeDroolsException("net.leadware.drools.engine.execute.commands.emptycommandslist");
		
		// Resultat de l'execution
		ExecutionResults result = null;
		
		// Si on est en Stateless
		if(isStatelessSession(sessionName)) {
			
			// On caste
			StatelessKnowledgeSession knowledgeSession = (StatelessKnowledgeSession) oSession;
			
			// Execution
			result = knowledgeSession.execute(CommandFactory.newBatchExecution(commands));
			
		} else {
			
			// On caste
			StatefulKnowledgeSession knowledgeSession = (StatefulKnowledgeSession) oSession;
			
			// Execution
			result = knowledgeSession.execute(CommandFactory.newBatchExecution(commands));
		}
		
		// On retourne le resultat
		return result;
	}

	/**
	 * Methode d'execution d'une liste de commandes sur une knowledgeBaseName de connaissance
	 * @param baseName Nom de la knowledgeBaseName de connaissance source
	 * @param commands	Liste de commandes a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults executeOnBase(String baseName, List> commands) {
		
		// Si la knowledgeBaseName n'existe pas
		if(!isBaseExists(baseName)) throw new RuntimeException("net.leadware.drools.engine.execute.commands.onbase.basenotfound");
		
		// Obtention de la knowledgeBaseName
		KnowledgeBase knowledgeBase = knowledgeBases.get(baseName.trim());
		
		// Creation de la session stateless
		StatelessKnowledgeSession statelessKnowledgeSession = knowledgeBase.newStatelessKnowledgeSession();
		
		// Execution de la commande
		ExecutionResults result = statelessKnowledgeSession.execute(CommandFactory.newBatchExecution(commands));
		
		// On retourne le resultat
		return result;
	}

	/**
	 * Methode d'execution d'une liste de commandes sur un agent intelligent
	 * @param agentName Nom de l'agent intelligent source
	 * @param commands	Liste de commandes a executer
	 * @return Map des resultats de l'execution de la liste de commandes
	 */
	public ExecutionResults executeOnAgent(String agentName, List> commands) {
		
		// Si la knowledgeBaseName n'existe pas
		if(!isAgentExists(agentName)) throw new RuntimeException("net.leadware.drools.engine.execute.commands.onagent.agentnotfound");
		
		// Obtention de la knowledgeBaseName
		KnowledgeBase knowledgeBase = knowledgeAgents.get(agentName.trim()).getKnowledgeBase();
		
		// Creation de la session stateless
		StatelessKnowledgeSession statelessKnowledgeSession = knowledgeBase.newStatelessKnowledgeSession();
		
		// Execution de la commande
		ExecutionResults result = statelessKnowledgeSession.execute(CommandFactory.newBatchExecution(commands));
		
		// On retourne le resultat
		return result;
	}
	
	/**
	 * Methode permettant de liberer une session
	 * @param sessionName	Nom de la session
	 */
	public void disposeSession(String sessionName) {
		
		// Si la session n'existe pas
		if(!isSessionExists(sessionName)) return;
		
		// Si la session est de type stateless
		if(isStatelessSession(sessionName)) return;

		try {
			
			// Liberation des ressources
			((StatefulKnowledgeSession)getKnowledgeSession(sessionName)).dispose();
			
		} catch (Exception e) {}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy