org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor Class Reference

Inherits org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Inheritance diagram for org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 EjbqlQueryFilterVisitor (PMapper _mapper, Map _fields, Class[] parameterTypes, ASTEJBQL ejbql, QueryBuilder qb) throws Exception
Expression getQueryFilter ()
Object visit (ASTWhereClause node, Object data)
Object visit (ASTSingleValuedPathExpression node, Object data)
Object visit (ASTCmpPathExpression node, Object data)
Object visit (ASTSingleValuedCmrPathExpression node, Object data)
Object visit (ASTCollectionValuedPathExpression node, Object data)
Object visit (ASTConditionalExpression node, Object data)
Object visit (ASTConditionalTerm node, Object data)
Object visit (ASTConditionalFactor node, Object data)
Object visit (ASTBetweenExpression node, Object data)
Object visit (ASTInExpression node, Object data)
Object visit (ASTLikeExpression node, Object data)
Object visit (ASTNullComparisonExpression node, Object data)
Object visit (ASTEmptyCollectionComparisonExpression node, Object data)
Object visit (ASTCollectionMemberExpression node, Object data)
Object visit (ASTComparisonExpression node, Object data)
Object visit (ASTArithmeticExpression node, Object data)
Object visit (ASTArithmeticTerm node, Object data)
Object visit (ASTArithmeticFactor node, Object data)
Object visit (ASTStringExpression node, Object data)
Object visit (ASTDatetimeExpression node, Object data)
Object visit (ASTBooleanExpression node, Object data)
Object visit (ASTEntityBeanExpression node, Object data)
Object visit (ASTFunctionsReturningStrings node, Object data)
Object visit (ASTFunctionsReturningNumerics node, Object data)
Object visit (ASTIdentificationVariable node, Object data)
Object visit (ASTLiteral node, Object data)
Object visit (ASTStringLiteral node, Object data)
Object visit (ASTArithmeticLiteral node, Object data)
Object visit (ASTIntegerLiteral node, Object data)
Object visit (ASTFloatingPointLiteral node, Object data)
Object visit (ASTBooleanLiteral node, Object data)
Object visit (ASTInputParameter node, Object data)
Object visit (ASTPath node, Object data)

Detailed Description

Implementation of a visitor that creates the filter corresponding to the WHERE clause. Created on Sep 6, 2002
Author:
Christophe Ney [cney@batisseurs.com] : Intial developer

Helene Joanin: Take into account the following operators abs(x), sqrt(x), length(str), substring(s, start, length), locate(str1, str2), locate(str1, str2, start).

Helene Joanin: EJBLocalObject as parameter of a EJB-QL query.

Helene Joanin: Take into account the InExpression (IN operator).

Helene Joanin: Take into account the IS NULL operator.

Helene Joanin: Fix a bug in the visitor for ASTIdentificationVariable: push a BasicFieldOperand(field) instead of the field itself.

Helene Joanin: add '.element' to the path for CollectionValuedPathExpression.

Helene Joanin: Convert IsNull(cmr-field) to Equal(cmr-field, PNameNull).

Helene Joanin: Take into account the operators: IS EMPTY / IS NOT EMPTY

Helene Joanin: Take into account the CONCAT operator

Helene Joanin: Take into account the EJBQL version 2.1 syntax.

Helene Joanin: Take into account the operator MOD.

Helene Joanin: Take into account the operator ISNULL with a parameter.

Definition at line 139 of file EjbqlQueryFilterVisitor.java.


Constructor & Destructor Documentation

org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.EjbqlQueryFilterVisitor PMapper  _mapper,
Map  _fields,
Class[]  parameterTypes,
ASTEJBQL  ejbql,
QueryBuilder  qb
throws Exception
 

Constructor

Parameters:
_mapper the mapper of each fields. Needed to build the expression for the IsNull with a reference as an operand. This parameter may be null in case of the GenIC phase
_fields QueryTreeFields for all defined identifiers and all path expression of the query
parameterTypes Type of paramaters of the finder/select method
ejbql root of the lexical tree of the query

Definition at line 158 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:


Member Function Documentation

Expression org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.getQueryFilter  ) 
 

get the query filter that was built from visiting the syntaxic tree

Definition at line 173 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTPath  node,
Object  data
 

Push the Node to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 819 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTInputParameter  node,
Object  data
 

Node with value set to parameter index (1..n) string. Push the corresponding Operand to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 794 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTBooleanLiteral  node,
Object  data
 

Node with value set to litteral boolean. Push the corresponding Operand to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 785 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTFloatingPointLiteral  node,
Object  data
 

Node with value set to integer litteral arithmetic. Push the corresponding Operand to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 776 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTIntegerLiteral  node,
Object  data
 

Node with value set to integer litteral arithmetic. Push the corresponding Operand to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 767 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTArithmeticLiteral  node,
Object  data
 

Visit child nodes arithmetic_literal ::= integer_literal | floatingpoint_literal

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 758 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTStringLiteral  node,
Object  data
 

Node with value set to litteral string. Push the corresponding Operand to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 749 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTLiteral  node,
Object  data
 

Visit child nodes literal ::= string_literal | arithmetic_literal | boolean_literal

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 740 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTIdentificationVariable  node,
Object  data
 

Node with value set to identification variable string. Push the Node to the stack

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 729 of file EjbqlQueryFilterVisitor.java.

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTFunctionsReturningNumerics  node,
Object  data
 

visit child nodes Push corresponding Expression to the stack.
functions_returning_numerics ::= LENGTH (string_expression) | LOCATE (string_expression, string_expression [ , arithmetic_expression ] ) | ABS (arithmetic_expression) | SQRT (arithmetic_expression) | MOD (arithmetic_expression , arithmetic_expression)

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 679 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.third, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTFunctionsReturningStrings  node,
Object  data
 

visit child nodes Push corresponding Expression to the stack.
functions_returning_strings ::= CONCAT (string_expression, string_expression) | SUBSTRING (string_expression,arithmetic_expression,arithmetic_expression)

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 642 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTEntityBeanExpression  node,
Object  data
 

Visit child nodes entity_bean_expression ::= entity_bean_value | input_parameter

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 630 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTBooleanExpression  node,
Object  data
 

Visit child nodes boolean_expression ::= cmp_path_expression | boolean_literal | input_parameter

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 620 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTDatetimeExpression  node,
Object  data
 

Visit child nodes datetime_expression ::= datetime_value | input_parameter

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 610 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTStringExpression  node,
Object  data
 

Visit child nodes string_expression ::= string_primary | input_parameter

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 600 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTArithmeticFactor  node,
Object  data
 

Push corresponding Expression to the stack.
arithmetic_factor ::= [ + |- ] arithmetic_primary

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 582 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTArithmeticTerm  node,
Object  data
 

Push corresponding Expression to the stack.
arithmetic_term ::= arithmetic_factor [ { * | / } arithmetic_factor ]*

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 560 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.jjtGetNumChildren(), org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTArithmeticExpression  node,
Object  data
 

Push corresponding Expression to the stack.
arithmetic_expression ::= arithmetic_term [ { + | - } arithmetic_term ] *

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 538 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.jjtGetNumChildren(), org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTComparisonExpression  node,
Object  data
 

Push corresponding Expression to the stack.
comparison_expression ::= string_value { = | > | >= | < | <= | <> } string_expression | boolean_value { = | <>} boolean_expression | datetime_value { = | > | >= | < | <= | <> } datetime_expression | entity_bean_value { = | <> } entity_bean_expression | arithmetic_value { = | > | >= | < | <= | <> } single_value_designator

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 505 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.ops, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTCollectionMemberExpression  node,
Object  data
 

Push corresponding Expression to the stack.
collection_member_expression ::= {single_valued_cmr_path_expression | identification_variable | input_parameter} [ NOT ] MEMBER [ OF ] collection_valued_path_expression

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 474 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTEmptyCollectionComparisonExpression  node,
Object  data
 

Nothing to do: Already taken into account in EjbqlVariableVisitor at the variables parsing, so, just push the OP_IGNORE in the stack empty_collection_comparison_expression ::= collection_valued_path_expression IS [ NOT ] EMPTY

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 457 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTNullComparisonExpression  node,
Object  data
 

Push corresponding Expression to the stack.
null_comparison_expression ::= {single_valued_path_expression|input_parameter} IS [ NOT ] NULL

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 398 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTLikeExpression  node,
Object  data
 

Push corresponding Expression to the stack.
like_expression ::= cmp_path_expression [ NOT ] LIKE pattern_value [ ESCAPE escape_character ]

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 376 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.third, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTInExpression  node,
Object  data
 

Push corresponding Expression to the stack.
in_expression ::= cmp_path_expression [ NOT ] IN {literal|input_parameter} [ , {literal|input_parameter} ] * )

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 354 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.eltnum, org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTBetweenExpression  node,
Object  data
 

Push corresponding Expression to the stack.
between_expression ::= arithmetic_expression [ NOT ] BETWEEN arithmetic_expression AND arithmetic_expression

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 335 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTConditionalFactor  node,
Object  data
 

Push corresponding Expression to the stack.
conditional_factor ::= [ NOT ] conditional_test

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 319 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.not, and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTConditionalTerm  node,
Object  data
 

Push corresponding Expression to the stack.
conditional_term ::= conditional_factor [ AND conditional_factor ]*

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 298 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.jjtGetNumChildren(), and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTConditionalExpression  node,
Object  data
 

Push corresponding Expression to the stack.
conditional_expression ::= conditional_term [ OR conditional_term ]*

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 277 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.deployment.ejbql.SimpleNode.jjtGetNumChildren(), and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTCollectionValuedPathExpression  node,
Object  data
 

Push corresponding MedorField to the stack.
collection_valued_path_expression ::= path was in initial BNF collection_valued_path_expression ::= identification_variable. [ single_valued_cmr_field. ] *collection_valued_cmr_field

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 255 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.mergePath(), org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.splitPath(), and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTSingleValuedCmrPathExpression  node,
Object  data
 

Push corresponding MedorField to the stack.
single_valued_cmr_path_expression ::= path was in initial BNF single_valued_cmr_path_expression ::= identification_variable. [ single_valued_cmr_field. ] * single_valued_cmr_field

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 236 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTCmpPathExpression  node,
Object  data
 

Push corresponding MedorField to the stack.
cmp_path_expression ::= path was in initial BNF cmp_path_expression ::= identification_variable. [ single_valued_cmr_field. ] * cmp_field

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 217 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTSingleValuedPathExpression  node,
Object  data
 

Push corresponding MedorField to the stack.
single_valued_path_expression ::= path was in initial BNF single_valued_path_expression ::= cmp_path_expression | single_valued_cmr_path_expression

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 197 of file EjbqlQueryFilterVisitor.java.

References org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().

Here is the call graph for this function:

Object org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit ASTWhereClause  node,
Object  data
 

If query contains WHERE clause, visit child nodes
where_clause ::= WHERE conditional_expression

Reimplemented from org.objectweb.jonas_ejb.lib.EjbqlAbstractVisitor.

Definition at line 181 of file EjbqlQueryFilterVisitor.java.

Referenced by org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.EjbqlQueryFilterVisitor(), and org.objectweb.jonas_ejb.lib.EjbqlQueryFilterVisitor.visit().


The documentation for this class was generated from the following file:
Generated on Tue Feb 15 15:11:57 2005 for JOnAS by  doxygen 1.3.9.1