/**
* 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;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.AbstractFormulaBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.ConditionFormulaBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.FormulaVisitor;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.SimpleFormulaBO;
/**
* Extraction des param�tres d'une formule Une formule est compos�e de param�tres avec une syntaxe du type xxx.yyy o�
* xxx est le type de mesure et yyy l'attribut de cette mesure (par exemple mccabe.sumvg)
*/
public class ParameterExtraction
implements FormulaVisitor
{
/**
* Obtention des param�tres d'une formule
*
* @param pFormula formule
* @return liste des param�tres intervenant dans la formule
*/
public Collection getFormulaParameters( AbstractFormulaBO pFormula )
{
Set result = new HashSet();
if ( pFormula != null )
{
// Extraction des param�tres du trigger
if ( pFormula.getTriggerCondition() != null )
{
extractParameters( pFormula.getMeasureKinds(), pFormula.getTriggerCondition(), result );
}
// Extraction des param�tres pour une condition de type
pFormula.accept( this, result );
}
return result;
}
/**
* Extraction des param�tres d'une expression
*
* @param pMeasureKinds types de mesures
* @param pCondition condition
* @param pParameters collectiond es param�tres
*/
private void extractParameters( Collection pMeasureKinds, String pCondition, Collection pParameters )
{
StringBuffer buf = new StringBuffer();
buf.append( "(" );
Iterator measureKinds = pMeasureKinds.iterator();
int i = 0;
while ( measureKinds.hasNext() )
{
if ( i > 0 )
{
buf.append( '|' );
}
buf.append( (String) measureKinds.next() );
i++;
}
// Un param�tre est du type xxx.attribut et pas xxx.methode(
buf.append( ").([a-zA-Z0-9]+)([^a-zA-Z0-9(]|$)" );
Pattern pattern = Pattern.compile( buf.toString() );
Matcher matcher = pattern.matcher( pCondition );
// On cherche toutes les occurrences de xxx.yyy
// dans la cha�ne de caract�res pass�e en param�tre
// xxx �tant un type de mesure et yyy un attribut de cette mesure
while ( matcher.find() )
{
FormulaParameter parameter = new FormulaParameter();
parameter.setMeasureKind( matcher.group( 1 ) );
parameter.setMeasureAttribute( matcher.group( 2 ) );
pParameters.add( parameter );
}
}
/**
* (non-Javadoc)
*
* @see org.squale.squalecommon.enterpriselayer.businessobject.rule.practice.FormulaVisitor#visit(org.squale.squalecommon.enterpriselayer.businessobject.rule.practice.ConditionFormulaBO,
* java.lang.Object)
*/
public Object visit( ConditionFormulaBO pConditionFormula, Object pArgument )
{
Iterator conditions = pConditionFormula.getMarkConditions().iterator();
while ( conditions.hasNext() )
{
String condition = (String) conditions.next();
extractParameters( pConditionFormula.getMeasureKinds(), condition, (Collection) pArgument );
}
return null;
}
/**
* (non-Javadoc)
*
* @see org.squale.squalecommon.enterpriselayer.businessobject.rule.practice.FormulaVisitor#visit(org.squale.squalecommon.enterpriselayer.businessobject.rule.practice.SimpleFormulaBO,
* java.lang.Object)
*/
public Object visit( SimpleFormulaBO pSimpleFormula, Object pArgument )
{
extractParameters( pSimpleFormula.getMeasureKinds(), pSimpleFormula.getFormula(), (Collection) pArgument );
return null;
}
}