private String[] processNullSafeDereferencing( String expr, AtomicExprDescr atomicExpr, ConstraintConnectiveDescr ccd, int nullSafePos, int parentIdx, int childIdx ) {
// convert "field1!.field2" in ["field1 != null && ", "field1.field2"]
String field1 = expr.substring( 0, nullSafePos ).trim();
expr = field1 + "." + expr.substring( nullSafePos + 2 ).trim();
RelationalExprDescr check = new RelationalExprDescr( "!=",
false,
null,
new AtomicExprDescr( getPreconditionsToAppend( field1 ) ),
new AtomicExprDescr( "null" ) );
String innerCheck = "";
if ( ccd.getConnective() == ConnectiveType.AND || ccd.getConnective() == ConnectiveType.INC_AND ) {
ccd.getDescrs().add( childIdx, check );
} else {
BaseDescr desc = ccd.getDescrs().get( parentIdx );
if ( desc instanceof ConstraintConnectiveDescr ) {
((ConstraintConnectiveDescr) desc).getDescrs().add( childIdx, check );
} else {
ConstraintConnectiveDescr localAnd = new ConstraintConnectiveDescr( ConnectiveType.AND );
BaseDescr original = ccd.getDescrs().remove( parentIdx );
localAnd.getDescrs().add( check );
localAnd.getDescrs().add( original );
ccd.getDescrs().add( parentIdx, localAnd );
}
}
innerCheck = check.toString() + " && ";
String[] nullCheckAndExpr = new String[] { innerCheck, expr };
atomicExpr.setRewrittenExpression( expr );
return nullCheckAndExpr;
}