Search in sources :

Example 1 with FilterVariables

use of com.zimbra.soap.mail.type.FilterVariables in project zm-mailbox by Zimbra.

the class SieveToSoap method initRule.

private void initRule(RuleProperties props) {
    if (!isNestedRule()) {
        initCurrentRule(props);
    } else {
        // set new Nested Rule instance as child of current one.
        FilterTests tests = props.getCondition() != null ? new FilterTests(props.getCondition().toString()) : new FilterTests(null);
        NestedRule nestedRule = new NestedRule(tests);
        if (currentNestedRule != null) {
            // some nested rule has been already processed
            // set it as child of previous one
            currentNestedRule.setChild(nestedRule);
            setCurrentVariables();
            if (actionVariables != null && !actionVariables.isEmpty()) {
                currentNestedRule.addFilterAction(new FilterVariables(actionVariables));
            }
        } else {
            // set it as child of root rule
            if (null == currentRule) {
                initCurrentRule(props);
            }
            currentRule.setChild(nestedRule);
            setCurrentVariables();
            if (actionVariables != null && !actionVariables.isEmpty()) {
                currentRule.addFilterAction(new FilterVariables(actionVariables));
            }
        }
        currentNestedRule = nestedRule;
        actionVariables = null;
    }
}
Also used : FilterTests(com.zimbra.soap.mail.type.FilterTests) NestedRule(com.zimbra.soap.mail.type.NestedRule) FilterVariables(com.zimbra.soap.mail.type.FilterVariables)

Example 2 with FilterVariables

use of com.zimbra.soap.mail.type.FilterVariables in project zm-mailbox by Zimbra.

the class SieveToSoap method visitIfControl.

@Override
protected void visitIfControl(Node ruleNode, VisitPhase phase, RuleProperties props) {
    if (phase == VisitPhase.end) {
        // number of if for which process is done
        numOfIfProcessingDone++;
        if (actionVariables != null && !actionVariables.isEmpty()) {
            FilterAction action = new FilterVariables(actionVariables);
            addAction(action);
            actionVariables = null;
        }
        if (numOfIfProcessingStarted == numOfIfProcessingDone) {
            // If all the nested 'if' is completed, clean up the rule objects
            currentRule = null;
            currentNestedRule = null;
        }
        visitRule(ruleNode, VisitPhase.end, props);
        return;
    }
    // number of if for which process is started.
    numOfIfProcessingStarted++;
    visitRule(ruleNode, VisitPhase.begin, props);
}
Also used : FilterVariables(com.zimbra.soap.mail.type.FilterVariables) FilterAction(com.zimbra.soap.mail.type.FilterAction)

Example 3 with FilterVariables

use of com.zimbra.soap.mail.type.FilterVariables in project zm-mailbox by Zimbra.

the class SoapToSieve method handleRule.

private void handleRule(FilterRule rule, boolean isAdminScript) throws ServiceException {
    String name = rule.getName();
    boolean active = rule.isActive();
    // Rule name
    buffer.append("# ").append(name).append('\n');
    FilterVariables filterVariables = rule.getFilterVariables();
    buffer.append(handleVariables(filterVariables, null));
    FilterTests tests = rule.getFilterTests();
    if (hasTest(tests)) {
        Sieve.Condition condition = Sieve.Condition.fromString(tests.getCondition());
        if (condition == null) {
            condition = Sieve.Condition.allof;
        }
        if (active) {
            buffer.append("if ");
        } else {
            buffer.append("disabled_if ");
        }
        buffer.append(condition).append(" (");
        // Handle tests
        // sort by index
        Map<Integer, String> index2test = new TreeMap<Integer, String>();
        for (FilterTest test : tests.getTests()) {
            String result = handleTest(test);
            if (result != null) {
                FilterUtil.addToMap(index2test, test.getIndex(), result);
            }
        }
        Joiner.on(",\n  ").appendTo(buffer, index2test.values());
        buffer.append(") {\n");
    }
    // Handle actions
    // sort by index
    Map<Integer, String> index2action = new TreeMap<Integer, String>();
    List<FilterAction> filterActions = rule.getFilterActions();
    String variables = "";
    if (filterActions != null) {
        for (FilterAction action : filterActions) {
            if (action instanceof FilterVariables) {
                FilterVariables var = (FilterVariables) action;
                variables = handleVariables(var, "    ");
            } else {
                String result = handleAction(action, isAdminScript);
                if (result != null) {
                    FilterUtil.addToMap(index2action, action.getIndex(), result);
                }
            }
        }
        for (String action : index2action.values()) {
            if (hasTest(tests)) {
                buffer.append("    ");
            }
            buffer.append(action).append(END_OF_LINE);
        }
        if (!variables.isEmpty()) {
            buffer.append(variables);
        }
    }
    NestedRule child = rule.getChild();
    // Handle nested rule
    if (child != null) {
        // first nested block's indent is "    "
        String nestedRuleBlock = handleNest("    ", child, isAdminScript);
        buffer.append(nestedRuleBlock);
    }
    if (filterActions == null && child == null) {
        // If there is no more nested rule, there should be at least one action.
        throw ServiceException.INVALID_REQUEST("Missing action", null);
    }
    if (hasTest(tests)) {
        buffer.append("}\n");
    }
}
Also used : NestedRule(com.zimbra.soap.mail.type.NestedRule) TreeMap(java.util.TreeMap) FilterVariables(com.zimbra.soap.mail.type.FilterVariables) FilterTests(com.zimbra.soap.mail.type.FilterTests) FilterTest(com.zimbra.soap.mail.type.FilterTest) Sieve(com.zimbra.common.filter.Sieve) FilterAction(com.zimbra.soap.mail.type.FilterAction)

Example 4 with FilterVariables

use of com.zimbra.soap.mail.type.FilterVariables in project zm-mailbox by Zimbra.

the class SoapToSieve method handleNest.

// Constructing nested rule block with base indents which is for entire block.
private String handleNest(String baseIndents, NestedRule currentNestedRule) throws ServiceException {
    StringBuilder nestedIfBlock = new StringBuilder();
    FilterVariables filterVariables = currentNestedRule.getFilterVariables();
    nestedIfBlock.append(handleVariables(filterVariables, baseIndents));
    Sieve.Condition childCondition = Sieve.Condition.fromString(currentNestedRule.getFilterTests().getCondition());
    if (childCondition == null) {
        childCondition = Sieve.Condition.allof;
    }
    // assuming no disabled_if for child tests so far
    nestedIfBlock.append(baseIndents).append("if ");
    nestedIfBlock.append(childCondition).append(" (");
    // Handle tests
    // sort by index
    Map<Integer, String> index2childTest = new TreeMap<Integer, String>();
    for (FilterTest childTest : currentNestedRule.getFilterTests().getTests()) {
        String childResult = handleTest(childTest);
        if (childResult != null) {
            FilterUtil.addToMap(index2childTest, childTest.getIndex(), childResult);
        }
    }
    Joiner.on(",\n  " + baseIndents).appendTo(nestedIfBlock, index2childTest.values());
    nestedIfBlock.append(") {\n");
    // Handle actions
    // sort by index
    Map<Integer, String> index2childAction = new TreeMap<Integer, String>();
    List<FilterAction> childActions = currentNestedRule.getFilterActions();
    String variables = "";
    if (childActions != null) {
        for (FilterAction childAction : childActions) {
            if (childAction instanceof FilterVariables) {
                FilterVariables var = (FilterVariables) childAction;
                variables = handleVariables(var, baseIndents + "    ");
            } else {
                String childResult = handleAction(childAction);
                if (childResult != null) {
                    FilterUtil.addToMap(index2childAction, childAction.getIndex(), childResult);
                }
            }
        }
        for (String childAction : index2childAction.values()) {
            nestedIfBlock.append(baseIndents);
            nestedIfBlock.append("    ").append(childAction).append(END_OF_LINE);
        }
        if (!variables.isEmpty()) {
            nestedIfBlock.append(variables);
        }
    }
    // Handle nest
    if (currentNestedRule.getChild() != null) {
        nestedIfBlock.append(handleNest(baseIndents + "    ", currentNestedRule.getChild()));
    }
    if (childActions == null && currentNestedRule.getChild() == null) {
        // If there is no more nested rule, there should be at least one action.
        throw ServiceException.INVALID_REQUEST("Missing action", null);
    }
    nestedIfBlock.append(baseIndents);
    nestedIfBlock.append("}\n");
    return nestedIfBlock.toString();
}
Also used : FilterTest(com.zimbra.soap.mail.type.FilterTest) Sieve(com.zimbra.common.filter.Sieve) TreeMap(java.util.TreeMap) FilterVariables(com.zimbra.soap.mail.type.FilterVariables) FilterAction(com.zimbra.soap.mail.type.FilterAction)

Example 5 with FilterVariables

use of com.zimbra.soap.mail.type.FilterVariables in project zm-mailbox by Zimbra.

the class SoapToSieve method handleRule.

private void handleRule(FilterRule rule) throws ServiceException {
    String name = rule.getName();
    boolean active = rule.isActive();
    // Rule name
    buffer.append("# ").append(name).append('\n');
    FilterVariables filterVariables = rule.getFilterVariables();
    buffer.append(handleVariables(filterVariables, null));
    FilterTests tests = rule.getFilterTests();
    Sieve.Condition condition = Sieve.Condition.fromString(tests.getCondition());
    if (condition == null) {
        condition = Sieve.Condition.allof;
    }
    if (active) {
        buffer.append("if ");
    } else {
        buffer.append("disabled_if ");
    }
    buffer.append(condition).append(" (");
    // Handle tests
    // sort by index
    Map<Integer, String> index2test = new TreeMap<Integer, String>();
    for (FilterTest test : tests.getTests()) {
        String result = handleTest(test);
        if (result != null) {
            FilterUtil.addToMap(index2test, test.getIndex(), result);
        }
    }
    Joiner.on(",\n  ").appendTo(buffer, index2test.values());
    buffer.append(") {\n");
    // Handle actions
    // sort by index
    Map<Integer, String> index2action = new TreeMap<Integer, String>();
    List<FilterAction> filterActions = rule.getFilterActions();
    String variables = "";
    if (filterActions != null) {
        for (FilterAction action : filterActions) {
            if (action instanceof FilterVariables) {
                FilterVariables var = (FilterVariables) action;
                variables = handleVariables(var, "    ");
            } else {
                String result = handleAction(action);
                if (result != null) {
                    FilterUtil.addToMap(index2action, action.getIndex(), result);
                }
            }
        }
        for (String action : index2action.values()) {
            buffer.append("    ").append(action).append(END_OF_LINE);
        }
        if (!variables.isEmpty()) {
            buffer.append(variables);
        }
    }
    NestedRule child = rule.getChild();
    // Handle nested rule
    if (child != null) {
        // first nested block's indent is "    "
        String nestedRuleBlock = handleNest("    ", child);
        buffer.append(nestedRuleBlock);
    }
    if (filterActions == null && child == null) {
        // If there is no more nested rule, there should be at least one action.
        throw ServiceException.INVALID_REQUEST("Missing action", null);
    }
    buffer.append("}\n");
}
Also used : NestedRule(com.zimbra.soap.mail.type.NestedRule) TreeMap(java.util.TreeMap) FilterVariables(com.zimbra.soap.mail.type.FilterVariables) FilterTests(com.zimbra.soap.mail.type.FilterTests) FilterTest(com.zimbra.soap.mail.type.FilterTest) Sieve(com.zimbra.common.filter.Sieve) FilterAction(com.zimbra.soap.mail.type.FilterAction)

Aggregations

FilterVariables (com.zimbra.soap.mail.type.FilterVariables)9 FilterAction (com.zimbra.soap.mail.type.FilterAction)5 FilterTests (com.zimbra.soap.mail.type.FilterTests)5 Sieve (com.zimbra.common.filter.Sieve)4 FilterTest (com.zimbra.soap.mail.type.FilterTest)4 NestedRule (com.zimbra.soap.mail.type.NestedRule)4 TreeMap (java.util.TreeMap)4 FilterRule (com.zimbra.soap.mail.type.FilterRule)2