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

net.leadware.drools.server.engine.configuration.DroolsServerConfigurationInitializer Maven / Gradle / Ivy

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

/*
 * #%L
 * DROOLS SERVER :: Engine
 * $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.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import net.leadware.drools.server.model.configuration.DroolsServerConfiguration;
import net.leadware.drools.server.tools.env.ENVHelper;
import net.leadware.drools.server.tools.jaxb.DroolsServerConfigurationJaxbValidationEventHandler;

/**
 * Classe representant l'initialiseur de configuration du serveur
 * @author Jean-Jacques ETUNE NGI
 * @since 24 déc. 2013 - 14:26:34
 */
@SuppressWarnings("unchecked")
public class DroolsServerConfigurationInitializer {
	
	/**
	 * Localisation du schema de validation du fichier de configuration server dans le classpath
	 */
	public static final String SCHEMA_LOCATION = "xsd/drools-server-configuration.xsd";
	
	/**
	 * Chemin du fichier de configuration
	 */
	private String configurationPath = "META-INF/drools-server-configuration.xml";
	
	/**
	 * Recherche du fichier dans le Classpath
	 */
	private boolean inClasspath = true;
	
	/**
	 * Etat de validation de configuration
	 */
	private boolean validateConfiguration = true;
	
	/**
	 * Gestionnaire des evenements de validation
	 */
	private DroolsServerConfigurationJaxbValidationEventHandler handler;
	
	/**
	 * Constructeur par defaut
	 */
	public DroolsServerConfigurationInitializer() {}

	/**
	 * Constructeur avec initialisation des parametres
	 * @param configurationPath	Chemin du fichier de configuration
	 * @param inClasspath	Etat de recherche du fichier dans le Classpath
	 * @param validateConfiguration	Etat de validation du fichier de configuration
	 */
	public DroolsServerConfigurationInitializer(String configurationPath,
			boolean inClasspath, boolean validateConfiguration) {
		this.configurationPath = configurationPath;
		this.inClasspath = inClasspath;
		this.validateConfiguration = validateConfiguration;
		
		// Si le chemin est null
		if(this.configurationPath == null) this.configurationPath = "META-INF/drools-server-configuration.xml";
	}
	
	/**
	 * Methode d'obtention du champ "configurationPath"
	 * @return champ "configurationPath"
	 */
	public String getConfigurationPath() {
		
		// Renvoi de la valeur du champ
		return configurationPath;
	}
	
	/**
	 * Methode de modification du champ "configurationPath"
	 * @param configurationPath champ configurationPath a modifier
	 */
	public void setConfigurationPath(String configurationPath) {
		
		// Modification de la valeur du champ
		this.configurationPath = configurationPath;

		// Si le chemin est null
		if(this.configurationPath == null) this.configurationPath = "META-INF/drools-server-configuration.xml";
	}

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

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

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

	/**
	 * Methode de modification du champ "validateConfiguration"
	 * @param validateConfiguration champ validateConfiguration a modifier
	 */
	public void setValidateConfiguration(boolean validateConfiguration) {
		
		// Modification de la valeur du champ
		this.validateConfiguration = validateConfiguration;
	}
	
	/**
	 * Methode permettant de traiter le fichier de configuration 
	 * @return	Objet de configuration initialise
	 */
	public DroolsServerConfiguration initConfiguration() {

		// Contexte JAXB
		JAXBContext context = null;
		
		// Creation d'un Unmarshaller
		Unmarshaller unmarshaller = null;

		// Stream sur le fichier de configuration
		InputStream configurationStream = null;
		
		// Configuration Server Drools
		DroolsServerConfiguration serverConfiguration = null;
		
		try {
			
			// Contexte JAXB
			context = JAXBContext.newInstance(DroolsServerConfiguration.class.getPackage().getName());
			
		} catch (JAXBException e) {
			
			// On relance
			throw new RuntimeException("Erreur lors de l'initialisation du contexte JAXB", e);
		}
		
		try {
			
			// Creation d'un Unmarshaller
			unmarshaller = context.createUnmarshaller();
			
		} catch (JAXBException e) {
			
			// On relance
			throw new RuntimeException("Erreur lors de l'initialisation de l'Unmarshaller JAXB", e);
		}
		
		// Validation non requise
		unmarshaller.setSchema(null);
		
		// Si la validation est requise
		if(validateConfiguration) {
			
			// Positionnement du schema
			unmarshaller.setSchema(loadConfigurationSchema());
			
			try {
				
				// Instanciation du gestionnaire d'evenements de validation
				handler = new DroolsServerConfigurationJaxbValidationEventHandler();
				
				// Positionnement du gestionnaire d'erreur de validation
				unmarshaller.setEventHandler(handler);
				
			} catch (JAXBException e) {
				
				// On relance
				throw new RuntimeException("Erreur lors du positionnement du gestionnaire des evenements de validation", e);
			}
		}
		
		// Si le fichier est charge depuis le classpath
		if(inClasspath) {
			
			// Chargement du Stream sur le fichier de configuration
			configurationStream = getClass().getClassLoader().getResourceAsStream(configurationPath);
			
			// Si le stream est null
			if(configurationStream == null) throw new RuntimeException("Erreur lors du chargement du ficher de configuration du serveur (Fichier introuvable) : [classpath:" + configurationPath + "]"); 
			
		} else {
			
			// Un File sur le chemin resolu en ENV
			File configurationFile = new File(ENVHelper.resolveEnvironmentsParameters(configurationPath));
			
			try {
				
				// Chargement du Stream sur le fichier de configuration
				configurationStream = new FileInputStream(configurationFile);
				
			} catch (FileNotFoundException e) {
				
				// On relance
				throw new RuntimeException("Erreur lors du chargement du ficher de configuration du serveur (Fichier introuvable) : " + configurationPath);
			}
		}
		
		try {
			
			// Unmarshalling
			JAXBElement serverConfigurationElements = (JAXBElement) unmarshaller.unmarshal(configurationStream);
			
			// Obtention de la configuration
			serverConfiguration = serverConfigurationElements.getValue();
			
		} catch (JAXBException e) {
			
			// On relance
			throw new RuntimeException("Erreur survenue lors de la validation du fichier de configuration du serveur Drools [Fichier : " + ENVHelper.resolveEnvironmentsParameters(configurationPath) + ", ligne: " + handler.getLine() + ", colonne: " + handler.getColumn() + ", Erreur: " + handler.getMessage() + "]", handler.getLinkedException());
		}
		
		// On retourne la configuration
		return serverConfiguration;
	}
	
	/**
	 * Methode permettant de charger le schema XSD du fichier de configuration
	 * @return Schema a retourner
	 */
	private Schema loadConfigurationSchema() {
		
		// Fabrique de schema
		SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
		
		// Un stream sur la localisation du schema
		InputStream stream = getClass().getClassLoader().getResourceAsStream(SCHEMA_LOCATION);
		
		// Si le stream est null
		if(stream == null) throw new RuntimeException("Erreur lors du chargement du schema de validation du ficcher de configuration du serveur: [classpath:" + SCHEMA_LOCATION + "]");
		
		try {
			
			// Construction du schema
			Schema schema = factory.newSchema(new StreamSource(stream));
			
			// On retourne le schema
			return schema;
			
		} catch (Exception e) {
			
			// On relance
			throw new RuntimeException("Erreur lors du chargement du schema de validation du ficcher de configuration du serveur: [classpath:" + SCHEMA_LOCATION + "]", e);
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		
		// Buffer
		StringBuilder builder = new StringBuilder();
		
		// Construction de la chaine
		builder.append("Configuration Path : " + this.configurationPath + " --- ")
			   .append("Find In Class Path : " + this.inClasspath + " --- ")
			   .append("Validate Configuration : " + this.validateConfiguration);
		
		// On retourne la chaine
		return builder.toString();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy