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;
}
}
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);
}
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");
}
}
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();
}
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");
}
Aggregations