// Path: src/main/java/org/psidnell/omnifocus/model/NodeFactory.java
// public class NodeFactory {
// 
//     private ConfigParams config;
// 
//     @SuppressWarnings({"unchecked", "deprecation"})
//     public <T> T create(String name, Class<T> clazz) {
//         Node node;
//         switch (clazz.getSimpleName()) {
//             case "ProjectInfo":
//                 // Not really a node
//                 return (T) new ProjectInfo();
//             case "Task":
//                 node = new Task();
//                 break;
//             case "Project":
//                 node = new Project();
//                 break;
//             case "Folder":
//                 node = new Folder();
//                 break;
//             case "Context":
//                 node = new Context();
//                 break;
//             default:
//                 throw new IllegalArgumentException("" + clazz);
//         }
// 
//         initialise(node);
// 
//         return (T) node;
//     }
// 
//     public Task createTask(String name) {
//         @SuppressWarnings("deprecation")
//         Task node = new Task();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Folder createFolder(String name) {
//         @SuppressWarnings("deprecation")
//         Folder node = new Folder();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Project createProject(String name) {
//         @SuppressWarnings("deprecation")
//         Project node = new Project();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Project createProject(ProjectInfo pi, Task rootTask) {
//         @SuppressWarnings("deprecation")
//         Project node = new Project(pi, rootTask);
//         initialise(node);
//         return node;
//     }
// 
//     public Context createContext(String name) {
//         @SuppressWarnings("deprecation")
//         Context node = new Context();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public void initialise(Node node) {
//         node.setConfigParams(config);
//     }
// 
//     public void setConfigParams(ConfigParams config) {
//         this.config = config;
//     }
// }


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import org.psidnell.omnifocus.model.NodeFactory;
                if (methodName.startsWith("is")) {
                    propName = propertyName("is", m.getName());
                    setterName = m.getName().replaceFirst("^is", "set");
                } else if (methodName.startsWith("get")) {
                    propName = propertyName("get", m.getName());
                    setterName = m.getName().replaceFirst("^get", "set");
                } else {
                    throw new IllegalArgumentException("bad property accessor: " + m);
                }

                if (p.name().length() != 0) {
                    propName = p.name();
                }

                Method setter = clazz.getMethod(setterName, m.getReturnType());
                columns.append(columns.length() != 0 ? ',' : "");
                columns.append(propName);

                SQLITEPropertyDescriptor pd = new SQLITEPropertyDescriptor(propName, setter, m.getReturnType());
                properties.add(pd);
            }
        }
        columnsForSelect = columns.toString();
    }

    private String propertyName(String prefix, String methodName) {
        int prefixLen = prefix.length();
        return Character.toLowerCase(methodName.charAt(prefixLen)) + methodName.substring(prefixLen + 1);
    }

// Path: src/main/java/org/psidnell/omnifocus/model/NodeFactory.java
// public class NodeFactory {
// 
//     private ConfigParams config;
// 
//     @SuppressWarnings({"unchecked", "deprecation"})
//     public <T> T create(String name, Class<T> clazz) {
//         Node node;
//         switch (clazz.getSimpleName()) {
//             case "ProjectInfo":
//                 // Not really a node
//                 return (T) new ProjectInfo();
//             case "Task":
//                 node = new Task();
//                 break;
//             case "Project":
//                 node = new Project();
//                 break;
//             case "Folder":
//                 node = new Folder();
//                 break;
//             case "Context":
//                 node = new Context();
//                 break;
//             default:
//                 throw new IllegalArgumentException("" + clazz);
//         }
// 
//         initialise(node);
// 
//         return (T) node;
//     }
// 
//     public Task createTask(String name) {
//         @SuppressWarnings("deprecation")
//         Task node = new Task();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Folder createFolder(String name) {
//         @SuppressWarnings("deprecation")
//         Folder node = new Folder();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Project createProject(String name) {
//         @SuppressWarnings("deprecation")
//         Project node = new Project();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public Project createProject(ProjectInfo pi, Task rootTask) {
//         @SuppressWarnings("deprecation")
//         Project node = new Project(pi, rootTask);
//         initialise(node);
//         return node;
//     }
// 
//     public Context createContext(String name) {
//         @SuppressWarnings("deprecation")
//         Context node = new Context();
//         node.setName(name);
//         initialise(node);
//         return node;
//     }
// 
//     public void initialise(Node node) {
//         node.setConfigParams(config);
//     }
// 
//     public void setConfigParams(ConfigParams config) {
//         this.config = config;
//     }
// }


// Path: src/main/java/org/psidnell/omnifocus/sqlite/SQLiteClassDescriptor.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import org.psidnell.omnifocus.model.NodeFactory;

                if (methodName.startsWith("is")) {
                    propName = propertyName("is", m.getName());
                    setterName = m.getName().replaceFirst("^is", "set");
                } else if (methodName.startsWith("get")) {
                    propName = propertyName("get", m.getName());
                    setterName = m.getName().replaceFirst("^get", "set");
                } else {
                    throw new IllegalArgumentException("bad property accessor: " + m);
                }

                if (p.name().length() != 0) {
                    propName = p.name();
                }

                Method setter = clazz.getMethod(setterName, m.getReturnType());
                columns.append(columns.length() != 0 ? ',' : "");
                columns.append(propName);

                SQLITEPropertyDescriptor pd = new SQLITEPropertyDescriptor(propName, setter, m.getReturnType());
                properties.add(pd);
            }
        }
        columnsForSelect = columns.toString();
    }

    private String propertyName(String prefix, String methodName) {
        int prefixLen = prefix.length();
        return Character.toLowerCase(methodName.charAt(prefixLen)) + methodName.substring(prefixLen + 1);
    }

    public LinkedList<T> load(ResultSet rs, NodeFactory nodeFactory) throws SQLException, InvocationTargetException, InstantiationException,