/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.squalecommon.enterpriselayer.facade.rule.xml; import java.io.InputStream; import java.util.Collection; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.squalecommon.enterpriselayer.businessobject.rule.ConditionFormulaBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.CriteriumRuleBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.PracticeRuleBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.SimpleFormulaBO; import org.squale.squalecommon.util.xml.XmlImport; /** * Importation de grille qualit� � partir d'un fichier XML */ public class GridImport extends XmlImport { /** Log */ private static Log LOG = LogFactory.getLog( GridImport.class ); /** Nom publique de la DTD */ static final String PUBLIC_DTD = "-//Squale//DTD Grid Configuration 1.3//EN"; /** Localisation de la DTD */ static final String DTD_LOCATION = "/org/squale/squalecommon/dtd/grid-1.3.dtd"; /** * Constructeur */ public GridImport() { super( LOG ); } /** * Importation d'une grille * * @param pStream flux de grille * @param pErrors erreurs de traitement ou vide si aucune erreur n'est rencontr�e * @return collection de grilles import�es sous la forme de QualityGridBO */ public Collection importGrid( InputStream pStream, StringBuffer pErrors ) { GridFactory gridFactory = new GridFactory(); Digester configDigester = setupDigester( gridFactory, pErrors ); parse( configDigester, pStream, pErrors ); return gridFactory.getGrids().values(); } /** * Configuration du digester Le digester est utilis� pour le chargement du fichier XML de r�gles * * @param pGridFactory factory * @param pErrors erreurs de traitement * @return digester */ protected Digester setupDigester( GridFactory pGridFactory, StringBuffer pErrors ) { Digester configDigester = preSetupDigester( PUBLIC_DTD, DTD_LOCATION, pErrors ); // Traitement des pratiques PracticeFactory practiceFactory = new PracticeFactory(); configDigester.addFactoryCreate( "squale/practiceset/practice", practiceFactory ); configDigester.addSetProperties( "squale/practiceset/practice" ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/weight/", "weightFunction" ); // Processing of the time limitation configDigester.addCallMethod( "squale/practiceset/practice/timeLimitation", "setTimeLimitationFromXmlParse", 2, new Class[]{String.class, String.class} ); configDigester.addCallParam( "squale/practiceset/practice/timeLimitation", 0 ); configDigester.addCallParam( "squale/practiceset/practice/timeLimitation", 1, "unit" ); // Traitement des formules // Formule avec condition configDigester.addObjectCreate( "squale/practiceset/practice/conditionformula", ConditionFormulaBO.class ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/conditionformula/level", "componentLevel" ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/conditionformula/trigger", "triggerCondition" ); configDigester.addCallMethod( "squale/practiceset/practice/conditionformula/conditions/condition", "addMarkCondition", 1 ); configDigester.addCallParam( "squale/practiceset/practice/conditionformula/conditions/condition", 0 ); configDigester.addCallMethod( "squale/practiceset/practice/conditionformula/measures/measure", "addMeasureKind", 1 ); configDigester.addCallParam( "squale/practiceset/practice/conditionformula/measures/measure", 0 ); configDigester.addSetNext( "squale/practiceset/practice/conditionformula", "setFormula" ); // Formule simple configDigester.addObjectCreate( "squale/practiceset/practice/simpleformula", SimpleFormulaBO.class ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/simpleformula/level", "componentLevel" ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/simpleformula/trigger", "triggerCondition" ); configDigester.addBeanPropertySetter( "squale/practiceset/practice/simpleformula/formula", "formula" ); configDigester.addCallMethod( "squale/practiceset/practice/simpleformula/measures/measure", "addMeasureKind", 1 ); configDigester.addCallParam( "squale/practiceset/practice/simpleformula/measures/measure", 0 ); configDigester.addSetNext( "squale/practiceset/practice/simpleformula", "setFormula" ); // Traitement des crit�res CriteriumFactory criteriumFactory = new CriteriumFactory(); PracticeRefFactory practiceRefFactory = new PracticeRefFactory( practiceFactory.getPractices() ); configDigester.addFactoryCreate( "squale/criteriumset/criterium", criteriumFactory ); configDigester.addSetProperties( "squale/criteriumset/criterium" ); configDigester.addCallMethod( "squale/criteriumset/criterium/practice-ref", "addPractice", 2, new Class[] { PracticeRuleBO.class, Float.class } ); configDigester.addFactoryCreate( "squale/criteriumset/criterium/practice-ref", practiceRefFactory ); configDigester.addCallParam( "squale/criteriumset/criterium/practice-ref", 0, true ); configDigester.addCallParam( "squale/criteriumset/criterium/practice-ref", 1, "weight" ); // Traitement des facteurs FactorFactory factorFactory = new FactorFactory(); CriteriumRefFactory criteriumRefFactory = new CriteriumRefFactory( criteriumFactory.getCriteria() ); configDigester.addFactoryCreate( "squale/factorset/factor", factorFactory ); configDigester.addSetProperties( "squale/factorset/factor" ); configDigester.addCallMethod( "squale/factorset/factor/criterium-ref", "addCriterium", 2, new Class[] { CriteriumRuleBO.class, Float.class } ); configDigester.addFactoryCreate( "squale/factorset/factor/criterium-ref", criteriumRefFactory ); configDigester.addCallParam( "squale/factorset/factor/criterium-ref", 0, true ); configDigester.addCallParam( "squale/factorset/factor/criterium-ref", 1, "weight" ); // Traitement des grilles FactorRefFactory factorRefFactory = new FactorRefFactory( factorFactory.getFactors() ); configDigester.addFactoryCreate( "squale/gridset/grid", pGridFactory ); configDigester.addSetProperties( "squale/gridset/grid" ); configDigester.addFactoryCreate( "squale/gridset/grid/factor-ref", factorRefFactory ); configDigester.addSetNext( "squale/gridset/grid/factor-ref", "addFactor" ); return configDigester; } }