Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2014-2015 the original author or authors.
   *
   * 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.
  */
 package org.dbflute.twowaysql.node;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 

Author(s):
jflute
 
 public class IfCommentEvaluator {
 
     // ===================================================================================
     //                                                                          Definition
     //                                                                          ==========
     protected static final String AND = " && ";
     protected static final String OR = " || ";
     protected static final String EQUAL = " == ";
     protected static final String NOT_EQUAL = " != ";
     protected static final String GREATER_THAN = " > ";
     protected static final String LESS_THAN = " < ";
     protected static final String GREATER_EQUAL = " >= ";
     protected static final String LESS_EQUAL = " <= ";
     protected static final String BOOLEAN_NOT = "!";
     protected static final String METHOD_SUFFIX = "()";
 
     protected static final String[] CONNECTORS = new String[] { .trim(), .trim() };
     protected static final String[] OPERANDS = new String[] { .trim(), .trim(), .trim(), .trim(),
             .trim(), .trim() };
 
     public static String[] getConnectors() {
         return ;
     }
 
     public static String[] getOperands() {
         return ;
     }
 
     public static boolean isConnector(String target) {
         return Srl.equalsPlain(target);
     }
 
     public static boolean isOperand(String target) {
         return Srl.equalsPlain(target);
     }
 
     public static boolean isBooleanNotStatement(String target) {
         return Srl.startsWith(target);
     }
 
     public static boolean isMethodStatement(String target) {
        return Srl.endsWith(target);
    }
    public static String substringBooleanNotRear(String target) {
        return isBooleanNotStatement(target) ? Srl.substringFirstRear(target) : target;
    }
    // ===================================================================================
    //                                                                           Attribute
    //                                                                           =========
    protected final ParameterFinder _finder;
    protected final String _expression;
    protected final String _specifiedSql;
    protected final LoopInfo _loopInfo;
    // ===================================================================================
    //                                                                         Constructor
    //                                                                         ===========
    public IfCommentEvaluator(ParameterFinder finderString expressionString specifiedSqlLoopInfo loopInfo) {
        this. = finder;
        this. = expression != null ? expression.trim() : null;
        this. = specifiedSql;
        this. = loopInfo;
    }
    // ===================================================================================
    //                                                                              Accept
    //                                                                              ======
    public boolean evaluate() {
        assertExpression();
        if (.contains()) {
            final List<StringclauseList = splitList();
            for (String booleanClause : clauseList) {
                final boolean result = evaluateBooleanClause(booleanClause);
                if (!result) {
                    return false;
                }
            }
            return true;
        } else if (.contains()) {
            final List<StringclauseList = splitList();
            for (String booleanClause : clauseList) {
                final boolean result = evaluateBooleanClause(booleanClause);
                if (result) {
                    return true;
                }
            }
            return false;
        } else {
            return evaluateBooleanClause();
        }
    }
    public void assertExpression() {
        if ( == null || .trim().length() == 0) {
        }
        {
            String filtered = Srl.replace("()""");
            filtered = Srl.replace(filtered".get(""");
            if (filtered.contains("(")) {
                throwIfCommentUnsupportedExpressionException();
            }
        }
        if (.contains() && .contains()) {
        }
        if (.contains(" = ") || .contains(" <> ")) {
        }
        if (.contains("\"")) {
        }
    }
    protected boolean evaluateBooleanClause(final String booleanClause) {
        if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult instanceof Number && rightResult instanceof Number) {
                        leftResult = new BigDecimal(leftResult.toString());
                        rightResult = new BigDecimal(rightResult.toString());
                    }
                    assertCompareType(leftResultrightResultbooleanClause);
                    return leftResult != null ? leftResult.equals(rightResult) : rightResult == null;
                }
            });
        } else if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult instanceof Number && rightResult instanceof Number) {
                        leftResult = new BigDecimal(leftResult.toString());
                        rightResult = new BigDecimal(rightResult.toString());
                    }
                    assertCompareType(leftResultrightResultbooleanClause);
                    return leftResult != null ? !leftResult.equals(rightResult) : rightResult != null;
                }
            });
        } else if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult == null) {
                        return false;
                    }
                    if (rightResult == null) {
                        return true;
                    }
                    return compareLeftRight(leftResultrightResultnew ComparaDeterminer() {
                        public boolean compare(int compareResult) {
                            return compareResult > 0;
                        }
                    }, booleanClause);
                }
            });
        } else if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult == null) {
                        return true;
                    }
                    if (rightResult == null) {
                        return false;
                    }
                    return compareLeftRight(leftResultrightResultnew ComparaDeterminer() {
                        public boolean compare(int compareResult) {
                            return compareResult < 0;
                        }
                    }, booleanClause);
                }
            });
        } else if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult == null) {
                        return rightResult == null;
                    }
                    if (rightResult == null) {
                        return true;
                    }
                    return compareLeftRight(leftResultrightResultnew ComparaDeterminer() {
                        public boolean compare(int compareResult) {
                            return compareResult >= 0;
                        }
                    }, booleanClause);
                }
            });
        } else if (booleanClause.contains()) {
            return evaluateCompareClause(booleanClausenew OperandEvaluator() {
                public boolean evaluate(Object leftResultObject rightResult) {
                    if (leftResult == null) {
                        return true;
                    }
                    if (rightResult == null) {
                        return false;
                    }
                    return compareLeftRight(leftResultrightResultnew ComparaDeterminer() {
                        public boolean compare(int compareResult) {
                            return compareResult <= 0;
                        }
                    }, booleanClause);
                }
            });
        } else {
            return evaluateStandAloneValue(booleanClause);
        }
    }
    protected boolean compareLeftRight(Object leftResultObject rightResultComparaDeterminer determinerString booleanClause) {
        assertCompareType(leftResultrightResultbooleanClause);
        if (leftResult instanceof Number) {
            final BigDecimal leftDecimal = new BigDecimal(((NumberleftResult).toString());
            final BigDecimal rightDecimal = new BigDecimal(((NumberrightResult).toString());
            return determiner.compare(leftDecimal.compareTo(rightDecimal));
        } else if (leftResult instanceof LocalDate) { // #date_parade
            final LocalDate leftDate = (LocalDateleftResult;
            final LocalDate rightDate = toLocalDate(rightResult); // to fit with left, just in case
            return determiner.compare(leftDate.compareTo(rightDate));
        } else if (leftResult instanceof LocalDateTime) {
            final LocalDateTime leftDate = (LocalDateTimeleftResult;
            final LocalDateTime rightDate = toLocalDateTime(rightResult);
            return determiner.compare(leftDate.compareTo(rightDate));
        } else if (leftResult instanceof LocalTime) {
            final LocalTime leftDate = (LocalTimeleftResult;
            final LocalTime rightDate = toLocalTime(rightResult);
            return determiner.compare(leftDate.compareTo(rightDate));
        } else if (leftResult instanceof Date) {
            final Date leftDate = (DateleftResult;
            final Date rightDate = toDate(rightResult);
            return determiner.compare(leftDate.compareTo(rightDate));
        } else {
            throwIfCommentUnsupportedTypeComparisonException(leftResultrightResultbooleanClause);
            return false// unreachable
        }
    }
    protected void assertCompareType(Object leftResultObject rightResultString booleanClause) {
        if (leftResult == null || rightResult == null) {
            return;
        }
        if (leftResult instanceof Number) {
            if (!(rightResult instanceof Number)) {
                throwIfCommentDifferentTypeComparisonException(leftResultrightResultbooleanClause);
            }
        } else if (leftResult instanceof Date || DfTypeUtil.isAnyLocalDate(leftResult)) { // #date_parade
            if (!(rightResult instanceof Date) && !DfTypeUtil.isAnyLocalDate(rightResult)) { // converted if Date vs. LocalDate
                throwIfCommentDifferentTypeComparisonException(leftResultrightResultbooleanClause);
            }
        }
    }
    protected static interface ComparaDeterminer {
        boolean compare(int compareResult);
    }
    protected boolean evaluateCompareClause(String booleanClauseString operandOperandEvaluator evaluator) {
        final String left = booleanClause.substring(0, booleanClause.indexOf(operand)).trim();
        final String right = booleanClause.substring(booleanClause.indexOf(operand) + operand.length()).trim();
        final Object leftResult = evaluateComparePiece(leftnull);
        final Object rightResult = evaluateComparePiece(rightleftResult);
        return evaluator.evaluate(leftResultrightResult);
    }
    protected static interface OperandEvaluator {
        boolean evaluate(Object leftResultObject rightRight);
    }
    protected Object evaluateComparePiece(String pieceObject leftResult) {
        piece = piece.trim();
        if (!startsWithParameterBean(piece)) {
            if ("null".equalsIgnoreCase(piece)) {
                return null;
            }
            if ("true".equalsIgnoreCase(piece)) {
                return true;
            }
            if ("false".equalsIgnoreCase(piece)) {
                return false;
            }
            final String quote = "'";
            final int qlen = "'".length();
            if (piece.startsWith(quote) && piece.endsWith(quote)) {
                return piece.substring(qlenpiece.length() - qlen);
            }
            final String dateMark = "date ";
            if (piece.toLowerCase().startsWith(dateMark)) {
                final String rearValue = piece.substring(dateMark.length()).trim();
                if (rearValue.startsWith(quote) && rearValue.endsWith(quote)) {
                    final String literal = rearValue.substring(qlenrearValue.length() - qlen).trim();
                    try {
                        if (leftResult instanceof LocalDate) { // #date_parade
                            return toLocalDate(literal);
                        } else if (leftResult instanceof LocalDateTime) {
                            return toLocalDateTime(literal);
                        } else if (leftResult instanceof LocalTime) {
                            return toLocalTime(literal);
                        } else {
                            return DfTypeUtil.toTimestamp(literal);
                        }
                    } catch (ParseTimestampException ignored) {}
                }
            }
            try {
                return DfTypeUtil.toBigDecimal(piece);
            } catch (NumberFormatException ignored) {}
        }
        final List<StringpropertyList = new ArrayList<String>();
        String preProperty = setupPropertyList(piecepropertyList);
        Object baseObject = findBaseObject(preProperty);
        for (String property : propertyList) {
            baseObject = processOneProperty(baseObjectprePropertyproperty);
            preProperty = property;
        }
        return baseObject;
    }
    protected boolean evaluateStandAloneValue(String piece) {
        piece = piece.trim();
        boolean not = false;
        if (piece.startsWith()) {
            not = true;
            piece = piece.substring(.length());
        }
        if (!startsWithParameterBean(piece)) {
            if ("true".equalsIgnoreCase(piece)) {
                return not ? false : true;
            }
            if ("false".equalsIgnoreCase(piece)) {
                return not ? true : false;
            }
        }
        final List<StringpropertyList = new ArrayList<String>();
        String preProperty = setupPropertyList(piecepropertyList);
        Object baseObject = findBaseObject(preProperty);
        for (String property : propertyList) {
            baseObject = processOneProperty(baseObjectprePropertyproperty);
            preProperty = property;
        }
        if (baseObject == null) {
        }
        final boolean result = Boolean.valueOf(baseObject.toString());
        return not ? !result : result;
    }
    protected boolean startsWithParameterBean(String piece) {
        return piece.startsWith("pmb");
    }

    

Parameters:
piece The piece of condition. (NotNull)
propertyList The list of property except first property. (NotNull, FirstEmpty)
Returns:
The first property. (NotNull)
    protected String setupPropertyList(String pieceList<StringpropertyList) {
        final List<StringclauseList = splitList(piece".");
        String firstName = null;
        for (int i = 0; i < clauseList.size(); i++) {
            final String token = clauseList.get(i);
            if (i == 0) {
                assertFirstName(token);
                firstName = token;
                continue;
            }
            propertyList.add(token);
        }
        return firstName;
    }
    protected void assertFirstName(String firstName) {
        if (isLoopCurrentVariable(firstName)) {
            return;
        }
        if (NodeChecker.isCurrentVariableOutOfScope(firstNameisInLoop())) {
        }
        final Object firstArg = .find(firstName); // get from plain context
        if (NodeChecker.isWrongParameterBeanName(firstNamefirstArg)) {
        }
    }
    }
    protected Object processOneProperty(Object baseObjectString firstPropertyString property) {
        if (baseObject == null) {
            throwIfCommentNullPointerException(firstProperty);
        }
        final DfBeanDesc beanDesc = DfBeanDescFactory.getBeanDesc(baseObject.getClass());
        if (beanDesc.hasPropertyDesc(property)) { // main case
            final DfPropertyDesc propertyDesc = beanDesc.getPropertyDesc(property);
            try {
                return propertyDesc.getValue(baseObject);
            } catch (DfBeanIllegalPropertyException e) {
                throwIfCommentPropertyReadFailureException(baseObjectpropertyDesc.getPropertyName(), e);
                return null// unreachable
            }
        }
        if (property.endsWith()) { // sub-main case
            final String methodName = property.substring(0, property.length() - .length());
            try {
                final Method method = beanDesc.getMethod(methodName);
                return DfReflectionUtil.invoke(methodbaseObject, (Object[]) null);
            } catch (DfBeanMethodNotFoundException e) {
                throwIfCommentNotFoundMethodException(baseObjectmethodName);
                return null// unreachable
            } catch (ReflectionFailureException e) {
                throwIfCommentMethodInvocationFailureException(baseObjectmethodNamee);
                return null// unreachable
            }
        }
        if (MapParameterBean.class.isInstance(baseObject)) { // used by union-query internally
            // if the key does not exist, it does not process
            // (different specification with Map)
            final Map<?, ?> map = ((MapParameterBean<?>) baseObject).getParameterMap();
            if (map.containsKey(property)) {
                return map.get(property);
            }
        }
        if (Map.class.isInstance(baseObject)) {
            // if the key does not exist, treated same as a null value
            final Map<?, ?> map = (Map<?, ?>) baseObject;
            return map.get(property);
        }
        if (List.class.isInstance(baseObject)) {
            if (property.startsWith("get(") && property.endsWith(")")) {
                final List<?> list = (List<?>) baseObject;
                final String exp = Srl.extractScopeFirst(property"get("")").getContent();
                try {
                    final Integer index = DfTypeUtil.toInteger(exp);
                    return list.get(index);
                } catch (NumberFormatException e) {
                    throwIfCommentListIndexNotNumberException(listexpe);
                    return null// unreachable
                } catch (IndexOutOfBoundsException e) {
                    throwIfCommentListIndexOutOfBoundsException(listexpe);
                    return null// unreachable
                }
            }
        }
        throwIfCommentNotFoundPropertyException(baseObjectproperty);
        return null// unreachable
    }
    // ===================================================================================
    //                                                                         Base Object
    //                                                                         ===========
    protected Object findBaseObject(String firstName) {
        if (isLoopCurrentVariable(firstName)) {
            return .getCurrentParameter();
        } else {
            return .find(firstName);
        }
    }
    // ===================================================================================
    //                                                                           Loop Info
    //                                                                           =========
    protected boolean isInLoop() {
        return  != null;
    }
    protected boolean isLoopCurrentVariable(String firstName) {
        return isInLoop() && ..equals(firstName);
    }
    // ===================================================================================
    //                                                                           Exception
    //                                                                           =========
    protected void throwIfCommentEmptyExpressionException() {
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment expression was empty!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment." + ln();
        msg = msg + "For example, wrong and correct IF comment is as below:" + ln();
        msg = msg + "  /- - - - - - - - - - - - - - - - - - - - - - - - - - " + ln();
        msg = msg + "  (x) - /*IF */" + ln();
        msg = msg + "  (o) - /*IF pmb.memberId != null*/" + ln();
        msg = msg + "  - - - - - - - - - -/" + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentEmptyExpressionException(msg);
    }
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment expression was unsupported!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your unsupported IF comment." + ln();
        msg = msg + "For example, unsupported examples:" + ln();
        msg = msg + "  (x:andOr) - /*IF (pmb.fooId != null || pmb.barId != null) && pmb.fooName != null*/" + ln();
        msg = msg + "  (x:argsMethod) - /*IF pmb.buildFooId(123)*/" + ln();
        msg = msg + "  (x:stringLiteral) - /*IF pmb.fooName == 'Pixy' || pmb.fooName == \"Pixy\"*/" + ln();
        msg = msg + "  (x:singleEqual) - /*IF pmb.fooId = null*/ --> /*IF pmb.fooId == null*/" + ln();
        msg = msg + "  (x:anotherNot) - /*IF pmb.fooId <> null*/ --> /*IF pmb.fooId != null*/" + ln();
        msg = msg + "  (x:doubleQuotation) - /*IF pmb.fooName == \"Pixy\"*/ --> /*IF pmb.fooName == 'Pixy'*/" + ln();
        msg = msg + "  " + ln();
        msg = msg + "If you want to write a complex condition, write an ExParameterBean property." + ln();
        msg = msg + "And use the property in IF comment." + ln();
        msg = msg + "For example, ExParameterBean original property:" + ln();
        msg = msg + "  e.g. ExParameterBean (your original property)" + ln();
        msg = msg + "  /- - - - - - - - - - - - - - - - - - - - - - - - - - " + ln();
        msg = msg + "  public boolean isOriginalMemberProperty() {" + ln();
        msg = msg + "      return (getMemberId() != null || getBirthdate() != null) && getMemberName() != null);" + ln();
        msg = msg + "  }" + ln();
        msg = msg + "  - - - - - - - - - -/" + ln();
        msg = msg + "  " + ln();
        msg = msg + "  e.g. IF comment" + ln();
        msg = msg + "  /- - - - - - - - - - - - - - - - - - - - - - - - - - " + ln();
        msg = msg + "  /*IF pmb.originalMemberProperty*/" + ln();
        msg = msg + "  - - - - - - - - - -/" + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentUnsupportedExpressionException(msg);
    }
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment had the illegal parameter-bean specification!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment." + ln();
        msg = msg + "For example, wrong and correct IF comment is as below:" + ln();
        msg = msg + "  (x) - /*IF pmb,memberId != null*/" + ln();
        msg = msg + "  (x) - /*IF p mb.memberId != null*/" + ln();
        msg = msg + "  (x) - /*IF pmb:memberId != null*/" + ln();
        msg = msg + "  (x) - /*IF pnb.memberId != null*/" + ln();
        msg = msg + "  (o) - /*IF pmb.memberId != null*/" + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
    }
    protected void throwIfCommentPropertyReadFailureException(Object baseObjectString propertyNameDfBeanIllegalPropertyException e) {
        br.addNotice("Failed to read the property on the IF comment!");
        br.addItem("Advice");
        br.addElement("Please confirm your IF comment properties.");
        br.addElement("(readable? accessbile? and so on...)");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("Illegal Property");
        br.addElement(DfTypeUtil.toClassTitle(baseObject) + "." + propertyName);
        br.addItem("Exception Message");
        br.addElement(e.getClass());
        br.addElement(e.getMessage());
        final Throwable cause = e.getCause();
        if (cause != null) { // basically DfBeanIllegalPropertyException has its cause
            br.addElement(cause.getClass());
            br.addElement(cause.getMessage());
            final Throwable nextCause = cause.getCause();
            if (nextCause != null) {
                br.addElement(nextCause.getClass());
                br.addElement(nextCause.getMessage());
            }
        }
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentPropertyReadFailureException(msge);
    }
    protected void throwIfCommentNotFoundMethodException(Object baseObjectString notFoundMethod) {
        br.addNotice("The method on the IF comment was not found!");
        br.addItem("Advice");
        br.addElement("Please confirm your IF comment properties.");
        br.addElement("For example, wrong and correct IF comment is as below:");
        br.addElement("  /- - - - - - - - - - - - - - - - - - - - - - - - - - ");
        br.addElement("  (x) - /*IF pmb.getMemborWame() != null*/");
        br.addElement("  (o) - /*IF pmb.getMemberName() != null*/");
        br.addElement("  - - - - - - - - - -/");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("NotFound Method");
        br.addElement(DfTypeUtil.toClassTitle(baseObject) + "." + notFoundMethod + "()");
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentNotFoundMethodException(msg);
    }
    protected void throwIfCommentMethodInvocationFailureException(Object baseObjectString methodNameReflectionFailureException e) {
        br.addNotice("Failed to invoke the method on the IF comment!");
        br.addItem("Advice");
        br.addElement("Please confirm the method implementation on your comment.");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("Failure Method");
        br.addElement(DfTypeUtil.toClassTitle(baseObject) + "." + methodName + "()");
        br.addItem("Exception Message");
        br.addElement(e.getMessage());
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentMethodInvocationFailureException(msge);
    }
    protected void throwIfCommentNotFoundPropertyException(Object baseObjectString notFoundProperty) {
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment property was not found!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment properties." + ln();
        msg = msg + "For example, wrong and correct IF comment is as below:" + ln();
        msg = msg + "  /- - - - - - - - - - - - - - - - - - - - - - - - - - " + ln();
        msg = msg + "  (x) - /*IF pmb.memderBame != null*/" + ln();
        msg = msg + "  (o) - /*IF pmb.memberName != null*/" + ln();
        msg = msg + "  - - - - - - - - - -/" + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[not found Property]" + ln();
        msg = msg + (baseObject != null ? DfTypeUtil.toClassTitle(baseObject) + "." : "");
        msg = msg + notFoundProperty + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentNotFoundPropertyException(msg);
    }
    protected void throwIfCommentNullPointerException(String nullProperty) {
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment met the null pointer!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment and its property values." + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Null Property]" + ln() + nullProperty + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentNullPointerException(msg);
    }
    protected void throwIfCommentDifferentTypeComparisonException(Object leftObject rightString booleanClause) {
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment had the different type comparison!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment property types." + ln();
        msg = msg + "If the left type is Number, the right type should be Number." + ln();
        msg = msg + "If the left type is Date, the right type should be Date." + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Target Boolean Clause]" + ln() + booleanClause + ln();
        msg = msg + ln();
        msg = msg + "[Left]" + ln() + (left != null ? left.getClass() : "null") + ln();
        msg = msg + " => " + left + ln();
        msg = msg + ln();
        msg = msg + "[Right]" + ln() + (right != null ? right.getClass() : "null") + ln();
        msg = msg + " => " + right + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentDifferentTypeComparisonException(msg);
    }
    protected void throwIfCommentUnsupportedTypeComparisonException(Object leftObject rightString booleanClause) {
        String msg = "Look! Read the message below." + ln();
        msg = msg + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *" + ln();
        msg = msg + "The IF comment had the different type comparison!" + ln();
        msg = msg + ln();
        msg = msg + "[Advice]" + ln();
        msg = msg + "Please confirm your IF comment property types." + ln();
        msg = msg + "For example, String type is unsupported at comparison(>, <, >=, <=)." + ln();
        msg = msg + "Number and Date are only supported." + ln();
        msg = msg + ln();
        msg = msg + "[IF Comment Expression]" + ln() +  + ln();
        msg = msg + ln();
        msg = msg + "[Target Boolean Clause]" + ln() + booleanClause + ln();
        msg = msg + ln();
        msg = msg + "[Left]" + ln() + (left != null ? left.getClass() : "null") + ln();
        msg = msg + " => " + left + ln();
        msg = msg + ln();
        msg = msg + "[Right]" + ln() + (right != null ? right.getClass() : "null") + ln();
        msg = msg + " => " + right + ln();
        msg = msg + ln();
        msg = msg + "[Specified ParameterBean]" + ln() + getDisplayParameterBean() + ln();
        msg = msg + ln();
        msg = msg + "[Specified SQL]" + ln() +  + ln();
        msg = msg + "* * * * * * * * * */";
        throw new IfCommentUnsupportedTypeComparisonException(msg);
    }
    protected void throwIfCommentNotBooleanResultException() {
        br.addNotice("The IF comment was not boolean!");
        br.addItem("Advice");
        br.addElement("Please confirm your IF comment property.");
        br.addElement("IF-statement result should be boolean type.");
        br.addElement("(and also the result should not be null)");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentNotBooleanResultException(msg);
    }
    protected void throwIfCommentListIndexNotNumberException(List<?> listString notNumberIndexNumberFormatException e) {
        br.addNotice("The list index on the IF comment was not number!");
        br.addItem("Advice");
        br.addElement("Please confirm the index on your comment.");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("Target List");
        br.addElement(list);
        br.addItem("NotNumber Index");
        br.addElement(notNumberIndex);
        br.addItem("NumberFormatException");
        br.addElement(e.getMessage());
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentListIndexNotNumberException(msge);
    }
    protected void throwIfCommentListIndexOutOfBoundsException(List<?> listString numberIndexIndexOutOfBoundsException e) {
        br.addNotice("The list index on the IF comment was out of bounds!");
        br.addItem("Advice");
        br.addElement("Please confirm the index on your comment.");
        br.addItem("IF Comment");
        br.addElement();
        br.addItem("Target List");
        br.addElement(list);
        br.addItem("OutOfBounds Index");
        br.addElement(numberIndex);
        br.addItem("IndexOutOfBoundsException");
        br.addElement(e.getMessage());
        br.addItem("Specified ParameterBean");
        br.addElement(getDisplayParameterBean());
        br.addItem("Specified SQL");
        br.addElement();
        final String msg = br.buildExceptionMessage();
        throw new IfCommentListIndexOutOfBoundsException(msge);
    }
    protected Object getDisplayParameterBean() {
        // basically these exceptions are for debug,
        // so it can show the values of parameter-bean
        return findBaseObject("pmb");
    }
    // ===================================================================================
    //                                                                        Small Helper
    //                                                                        ============
    protected LocalDate toLocalDate(Object obj) {
        return DfTypeUtil.toLocalDate(objgetDBFluteSystemFinalTimeZone());
    }
    protected LocalDateTime toLocalDateTime(Object obj) {
        return DfTypeUtil.toLocalDateTime(objgetDBFluteSystemFinalTimeZone());
    }
    protected LocalTime toLocalTime(Object obj) {
        return DfTypeUtil.toLocalTime(objgetDBFluteSystemFinalTimeZone());
    }
    protected Date toDate(Object obj) {
        return DfTypeUtil.toDate(objgetDBFluteSystemFinalTimeZone());
    }
        return DBFluteSystem.getFinalTimeZone();
    }
        return new ExceptionMessageBuilder();
    }
    protected String ln() {
        return DBFluteSystem.ln();
    }
    protected List<StringsplitList(String strString delimiter) {
        return Srl.splitList(strdelimiter);
    }
    // ===================================================================================
    //                                                                            Accessor
    //                                                                            ========
    public String getExpression() {
        return ;
    }