// Path: src/main/java/org/psidnell/omnifocus/model/Node.java
// public interface Node {
// 
//     String getName();
// 
//     void setName(String name);
// 
//     String getId();
// 
//     void setId(String id);
// 
//     int getRank();
// 
//     void setRank(int rank);
// 
//     String getType();
// 
//     boolean isRoot();
// 
//     boolean isMarked();
// 
//     void setMarked(boolean marked);
// 
//     void cascadeMarked();
// 
//     void setConfigParams(ConfigParams config);
// 
//     java.util.Date getDateAdded();
// 
//     void setDateAdded(java.util.Date date);
// 
//     org.psidnell.omnifocus.expr.Date getAdded();
// 
//     java.util.Date getDateModified();
// 
//     void setDateModified(java.util.Date date);
// 
//     org.psidnell.omnifocus.expr.Date getModified();
// }
// 
// Path: src/main/java/org/psidnell/omnifocus/visitor/VisitorDescriptor.java
// public class VisitorDescriptor {
//     private boolean visitTasks = false;
//     private boolean visitProjects = false;
//     private boolean visitContexts = false;
//     private boolean filterTasks = false;
//     private boolean filterProjects = false;
//     private boolean filterContexts = false;
//     private boolean visitFolders = false;
//     private boolean filterFolders;
// 
//     public VisitorDescriptor visitAll() {
//         visitTasks = true;
//         visitContexts = true;
//         visitProjects = true;
//         visitFolders = true;
//         return this;
//     }
// 
//     public VisitorDescriptor filterAll() {
//         filterTasks = true;
//         filterContexts = true;
//         filterProjects = true;
//         filterFolders = true;
//         return this;
//     }
// 
//     @SafeVarargs
//     public final VisitorDescriptor visit(Class<? extends NodeImpl>... classes) {
//         for (Class<? extends NodeImpl> clazz : classes) {
//             switch (clazz.getSimpleName()) {
//                 case "Folder":
//                     visitFolders = true;
//                     break;
//                 case "Project":
//                     visitProjects = true;
//                     break;
//                 case "Task":
//                     visitTasks = true;
//                     break;
//                 case "Context":
//                     visitContexts = true;
//                     break;
//                 default:
//                     break;
//             }
//         }
//         return this;
//     }
// 
//     @SafeVarargs
//     public final VisitorDescriptor filter(Class<? extends NodeImpl>... classes) {
//         for (Class<? extends NodeImpl> clazz : classes) {
//             switch (clazz.getSimpleName()) {
//                 case "Folder":
//                     filterFolders = true;
//                     break;
//                 case "Project":
//                     filterProjects = true;
//                     break;
//                 case "Task":
//                     filterTasks = true;
//                     break;
//                 case "Context":
//                     filterContexts = true;
//                     break;
//                 default:
//                     break;
//             }
//         }
//         return this;
//     }
// 
//     public boolean getFoldersTasks() {
//         return visitTasks;
//     }
// 
//     public boolean getVisitTasks() {
//         return visitTasks;
//     }
// 
//     public boolean getVisitProjects() {
//         return visitProjects;
//     }
// 
//     public boolean getVisitContexts() {
//         return visitContexts;
//     }
// 
//     public boolean getVisitFolders() {
//         return visitFolders;
//     }
// 
//     public boolean getFilterTasks() {
//         return filterTasks;
//     }
// 
//     public boolean getFilterProjects() {
//         return filterProjects;
//     }
// 
//     public boolean getFilterContexts() {
//         return filterContexts;
//     }
// 
//     public boolean getFilterFolders() {
//         return filterFolders;
//     }
// }


import org.psidnell.omnifocus.model.Node;
import org.psidnell.omnifocus.visitor.VisitorDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
 * Copyright 2015 Paul Sidnell
 *
 * 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.psidnell.omnifocus.expr;


/**
 * @author psidnell
 *
 *         Traverses the node tree including only those nodes where the OGNL expression evaluates
 *         true.
 */
public class ExprMarkVisitor extends ExprVisitor {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExprMarkVisitor.class);

    private boolean includeMode = true;

    public ExprMarkVisitor(String expr, boolean includeMode, VisitorDescriptor visitWhat,
            VisitorDescriptor applyToWhat) {
        super(expr, visitWhat, applyToWhat);
        this.includeMode = includeMode;
    }

    @Override
// Path: src/main/java/org/psidnell/omnifocus/model/Node.java
// public interface Node {
// 
//     String getName();
// 
//     void setName(String name);
// 
//     String getId();
// 
//     void setId(String id);
// 
//     int getRank();
// 
//     void setRank(int rank);
// 
//     String getType();
// 
//     boolean isRoot();
// 
//     boolean isMarked();
// 
//     void setMarked(boolean marked);
// 
//     void cascadeMarked();
// 
//     void setConfigParams(ConfigParams config);
// 
//     java.util.Date getDateAdded();
// 
//     void setDateAdded(java.util.Date date);
// 
//     org.psidnell.omnifocus.expr.Date getAdded();
// 
//     java.util.Date getDateModified();
// 
//     void setDateModified(java.util.Date date);
// 
//     org.psidnell.omnifocus.expr.Date getModified();
// }
// 
// Path: src/main/java/org/psidnell/omnifocus/visitor/VisitorDescriptor.java
// public class VisitorDescriptor {
//     private boolean visitTasks = false;
//     private boolean visitProjects = false;
//     private boolean visitContexts = false;
//     private boolean filterTasks = false;
//     private boolean filterProjects = false;
//     private boolean filterContexts = false;
//     private boolean visitFolders = false;
//     private boolean filterFolders;
// 
//     public VisitorDescriptor visitAll() {
//         visitTasks = true;
//         visitContexts = true;
//         visitProjects = true;
//         visitFolders = true;
//         return this;
//     }
// 
//     public VisitorDescriptor filterAll() {
//         filterTasks = true;
//         filterContexts = true;
//         filterProjects = true;
//         filterFolders = true;
//         return this;
//     }
// 
//     @SafeVarargs
//     public final VisitorDescriptor visit(Class<? extends NodeImpl>... classes) {
//         for (Class<? extends NodeImpl> clazz : classes) {
//             switch (clazz.getSimpleName()) {
//                 case "Folder":
//                     visitFolders = true;
//                     break;
//                 case "Project":
//                     visitProjects = true;
//                     break;
//                 case "Task":
//                     visitTasks = true;
//                     break;
//                 case "Context":
//                     visitContexts = true;
//                     break;
//                 default:
//                     break;
//             }
//         }
//         return this;
//     }
// 
//     @SafeVarargs
//     public final VisitorDescriptor filter(Class<? extends NodeImpl>... classes) {
//         for (Class<? extends NodeImpl> clazz : classes) {
//             switch (clazz.getSimpleName()) {
//                 case "Folder":
//                     filterFolders = true;
//                     break;
//                 case "Project":
//                     filterProjects = true;
//                     break;
//                 case "Task":
//                     filterTasks = true;
//                     break;
//                 case "Context":
//                     filterContexts = true;
//                     break;
//                 default:
//                     break;
//             }
//         }
//         return this;
//     }
// 
//     public boolean getFoldersTasks() {
//         return visitTasks;
//     }
// 
//     public boolean getVisitTasks() {
//         return visitTasks;
//     }
// 
//     public boolean getVisitProjects() {
//         return visitProjects;
//     }
// 
//     public boolean getVisitContexts() {
//         return visitContexts;
//     }
// 
//     public boolean getVisitFolders() {
//         return visitFolders;
//     }
// 
//     public boolean getFilterTasks() {
//         return filterTasks;
//     }
// 
//     public boolean getFilterProjects() {
//         return filterProjects;
//     }
// 
//     public boolean getFilterContexts() {
//         return filterContexts;
//     }
// 
//     public boolean getFilterFolders() {
//         return filterFolders;
//     }
// }


// Path: src/main/java/org/psidnell/omnifocus/expr/ExprMarkVisitor.java
import org.psidnell.omnifocus.model.Node;
import org.psidnell.omnifocus.visitor.VisitorDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * Copyright 2015 Paul Sidnell
 *
 * 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.psidnell.omnifocus.expr;


/**
 * @author psidnell
 *
 *         Traverses the node tree including only those nodes where the OGNL expression evaluates
 *         true.
 */
public class ExprMarkVisitor extends ExprVisitor {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExprMarkVisitor.class);

    private boolean includeMode = true;

    public ExprMarkVisitor(String expr, boolean includeMode, VisitorDescriptor visitWhat,
            VisitorDescriptor applyToWhat) {
        super(expr, visitWhat, applyToWhat);
        this.includeMode = includeMode;
    }

    @Override
    protected void evaluate(Node node) {