/* * file: AstaFileReader.java * author: Jon Iles * copyright: (c) Packwood Software 2012 * date: 23/04/2012 */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package net.sf.mpxj.asta; import java.io.InputStream; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Map.Entry; import net.sf.mpxj.DayType; import net.sf.mpxj.MPXJException; import net.sf.mpxj.ProjectFile; import net.sf.mpxj.Task; import net.sf.mpxj.common.InputStreamTokenizer; import net.sf.mpxj.common.Tokenizer; import net.sf.mpxj.listener.ProjectListener; import net.sf.mpxj.reader.AbstractProjectReader; /** * This class provides a generic front end to read project data from * a database. */ public final class AstaFileReader extends AbstractProjectReader { /** * {@inheritDoc} */ @Override public void addProjectListener(ProjectListener listener) { if (m_projectListeners == null) { m_projectListeners = new LinkedList<ProjectListener>(); } m_projectListeners.add(listener); } /** * {@inheritDoc} */ @Override public ProjectFile read(InputStream inputStream) throws MPXJException { try { m_reader = new AstaReader(); ProjectFile project = m_reader.getProject(); project.getEventManager().addProjectListeners(m_projectListeners); m_tables = new HashMap<String, List<Row>>(); processFile(inputStream); processProjectProperties(); processCalendars(); processResources(); processTasks(); processPredecessors(); processAssignments(); updateStructure(project); return (project); } catch (SQLException ex) { throw new MPXJException(MPXJException.READ_ERROR, ex); } finally { m_reader = null; } } /** * Tokenizes the input file and extracts the required data. * * @param is input stream * @throws MPXJException */ private void processFile(InputStream is) throws MPXJException { try { Tokenizer tk = new InputStreamTokenizer(is) { @Override protected boolean startQuotedIsValid(StringBuilder buffer) { return buffer.length() == 1 && buffer.charAt(0) == '<'; } }; tk.setDelimiter(DELIMITER); ArrayList<String> columns = new ArrayList<String>(); String nextTokenPrefix = null; while (tk.getType() != Tokenizer.TT_EOF) { columns.clear(); TableDefinition table = null; while (tk.nextToken() == Tokenizer.TT_WORD) { String token = tk.getToken(); if (columns.size() == 0) { if (token.charAt(0) == '#') { int index = token.lastIndexOf(':'); if (index != -1) { String headerToken; if (token.endsWith("-") || token.endsWith("=")) { headerToken = token; token = null; } else { headerToken = token.substring(0, index); token = token.substring(index + 1); } RowHeader header = new RowHeader(headerToken); table = TABLE_DEFINITIONS.get(header.getType()); columns.add(header.getID()); } } } if (table != null && token != null) { if (token.startsWith("<\"") && !token.endsWith("\">")) { nextTokenPrefix = token; } else { if (nextTokenPrefix != null) { token = nextTokenPrefix + DELIMITER + token; nextTokenPrefix = null; } columns.add(token); } } } if (table != null && columns.size() > 1) { FileRow row = new FileRow(table, columns); List<Row> rows = m_tables.get(table.getName()); if (rows == null) { rows = new LinkedList<Row>(); m_tables.put(table.getName(), rows); } rows.add(row); } } } catch (Exception ex) { throw new MPXJException(MPXJException.READ_ERROR, ex); } } /** * Select the project properties row from the database. * * @throws SQLException */ private void processProjectProperties() throws SQLException { List<Row> rows = getTable("PROJECT_SUMMARY"); if (rows.isEmpty() == false) { m_reader.processProjectProperties(rows.get(0)); } } /** * Extract calendar data from the file. * * @throws SQLException */ private void processCalendars() throws SQLException { List<Row> rows = getTable("EXCEPTIONN"); Map<Integer, DayType> exceptionMap = m_reader.createExceptionTypeMap(rows); rows = getTable("WORK_PATTERN"); Map<Integer, Row> workPatternMap = m_reader.createWorkPatternMap(rows); rows = new LinkedList<Row>();// getTable("WORK_PATTERN_ASSIGNMENT"); // Need to generate an example Map<Integer, List<Row>> workPatternAssignmentMap = m_reader.createWorkPatternAssignmentMap(rows); rows = getTable("EXCEPTION_ASSIGNMENT"); Map<Integer, List<Row>> exceptionAssignmentMap = m_reader.createExceptionAssignmentMap(rows); rows = getTable("TIME_ENTRY"); Map<Integer, List<Row>> timeEntryMap = m_reader.createTimeEntryMap(rows); rows = getTable("CALENDAR"); Collections.sort(rows, CALENDAR_COMPARATOR); for (Row row : rows) { m_reader.processCalendar(row, workPatternMap, workPatternAssignmentMap, exceptionAssignmentMap, timeEntryMap, exceptionMap); } // // Update unique counters at this point as we will be generating // resource calendars, and will need to auto generate IDs // m_reader.getProject().getProjectConfig().updateUniqueCounters(); } /** * Process resources. * * @throws SQLException */ private void processResources() throws SQLException { List<Row> permanentRows = getTable("PERMANENT_RESOURCE"); List<Row> consumableRows = getTable("CONSUMABLE_RESOURCE"); Collections.sort(permanentRows, PERMANENT_RESOURCE_COMPARATOR); Collections.sort(consumableRows, CONSUMABLE_RESOURCE_COMPARATOR); m_reader.processResources(permanentRows, consumableRows); } /** * Process tasks. * * @throws SQLException */ private void processTasks() throws SQLException { List<Row> barRows = getTable("BAR"); List<Row> expandedTaskRows = getTable("EXPANDED_TASK"); List<Row> bars = join(barRows, "EXPANDED_TASK", "EXPANDED_TASK", expandedTaskRows, "EXPANDED_TASKID"); filterNotNull(bars, "STARV"); Collections.sort(bars, BAR_COMPARATOR); List<Row> tasks = getTable("TASK"); Collections.sort(tasks, TASK_COMPARATOR); List<Row> milestones = getTable("MILESTONE"); m_reader.processTasks(bars, tasks, milestones); } /** * Process predecessors. * * @throws SQLException */ private void processPredecessors() throws SQLException { List<Row> rows = getTable("LINK"); Collections.sort(rows, LINK_COMPARATOR); m_reader.processPredecessors(rows); } /** * Process resource assignments. * * @throws SQLException */ private void processAssignments() throws SQLException { List<Row> allocationRows = getTable("PERMANENT_SCHEDUL_ALLOCATION"); List<Row> skillRows = getTable("PERM_RESOURCE_SKILL"); List<Row> permanentAssignments = join(allocationRows, "ALLOCATIOP_OF", "PERM_RESOURCE_SKILL", skillRows, "PERM_RESOURCE_SKILLID"); Collections.sort(permanentAssignments, ALLOCATION_COMPARATOR); m_reader.processAssignments(permanentAssignments); } /** * Cleans up the structure, removes unnecessary summary tasks and * ensures tasks with blank names inherit their names from the * parent task. * * @param project ProjectFile instance */ private void updateStructure(ProjectFile project) { // // Build the hierarchy // project.updateStructure(); // // Ensure tasks with blank names inherit parent task names // for (Task task : project.getChildTasks()) { updateBlankNames(null, task); } // // Create a list of tasks to prune // List<Task> tasks = new LinkedList<Task>(); for (Task task : project.getAllTasks()) { if (task.getChildTasks().size() == 1 && task.getChildTasks().get(0).getChildTasks().size() == 0 && task.getWBS().equals("-")) { tasks.add(task); } } // // Prune these tasks // for (Task task : tasks) { Task child = task.getChildTasks().get(0); Task parent = task.getParentTask(); if (parent == null) { List<Task> parentList = project.getChildTasks(); int parentListIndex = parentList.indexOf(task); if (parentListIndex == -1) { parentList.add(child); } else { parentList.add(parentListIndex, child); } } else { parent.addChildTaskBefore(child, task); } task.getChildTasks().clear(); task.remove(); } // // Ensure we have no gaps in the ID sequence // project.renumberTaskIDs(); project.updateStructure(); } /** * Called recursively to replace blank task names * with names inherited from parent tasks. * * @param parent parent task * @param task current task */ private void updateBlankNames(Task parent, Task task) { if (parent != null && (task.getName() == null || task.getName().length() == 0)) { task.setName(parent.getName()); } for (Task child : task.getChildTasks()) { updateBlankNames(task, child); } } /** * Very basic implementation of an inner join between two result sets. * * @param leftRows left result set * @param leftColumn left foreign key column * @param rightTable right table name * @param rightRows right result set * @param rightColumn right primary key column * @return joined result set */ private List<Row> join(List<Row> leftRows, String leftColumn, String rightTable, List<Row> rightRows, String rightColumn) { List<Row> result = new LinkedList<Row>(); RowComparator leftComparator = new RowComparator(new String[] { leftColumn }); RowComparator rightComparator = new RowComparator(new String[] { rightColumn }); Collections.sort(leftRows, leftComparator); Collections.sort(rightRows, rightComparator); ListIterator<Row> rightIterator = rightRows.listIterator(); Row rightRow = rightIterator.hasNext() ? rightIterator.next() : null; for (Row leftRow : leftRows) { Integer leftValue = leftRow.getInteger(leftColumn); boolean match = false; while (rightRow != null) { Integer rightValue = rightRow.getInteger(rightColumn); int comparison = leftValue.compareTo(rightValue); if (comparison == 0) { match = true; break; } if (comparison < 0) { if (rightIterator.hasPrevious()) { rightRow = rightIterator.previous(); } break; } rightRow = rightIterator.next(); } if (match && rightRow != null) { Map<String, Object> newMap = new HashMap<String, Object>(((MapRow) leftRow).getMap()); for (Entry<String, Object> entry : ((MapRow) rightRow).getMap().entrySet()) { String key = entry.getKey(); if (newMap.containsKey(key)) { key = rightTable + "." + key; } newMap.put(key, entry.getValue()); } result.add(new MapRow(newMap)); } } return result; } /** * Removes rows with a null value in a given column. * * @param rows result set * @param column column being tested for null */ private void filterNotNull(List<Row> rows, String column) { ListIterator<Row> iter = rows.listIterator(); while (iter.hasNext()) { MapRow row = (MapRow) iter.next(); if (row.getObject(column) == null) { iter.remove(); } } } /** * Retrieve table data, return an empty result set if no table data is present. * * @param name table name * @return table data */ private List<Row> getTable(String name) { List<Row> result = m_tables.get(name); if (result == null) { result = new LinkedList<Row>(); } return result; } private AstaReader m_reader; private List<ProjectListener> m_projectListeners; private Map<String, List<Row>> m_tables; private static final ColumnDefinition[] PROJECT_SUMMARY_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("PROJECT_SUMMARYID", Types.INTEGER), new ColumnDefinition("DURATIONTYPF", Types.INTEGER), new ColumnDefinition("DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("STARU", Types.TIMESTAMP), new ColumnDefinition("ENE", Types.TIMESTAMP), new ColumnDefinition("FISCAL_YEAR_START", Types.TIMESTAMP), new ColumnDefinition("LAST_ID_USED_IN_BASELINE", Types.INTEGER), new ColumnDefinition("DS_ID_BOOKED_FROM", Types.INTEGER), new ColumnDefinition("WBN_CONSTRAINT", Types.INTEGER), new ColumnDefinition("WBN_RANGE_FROM", Types.INTEGER), new ColumnDefinition("WBN_RANGE_TO", Types.INTEGER), new ColumnDefinition("WBN_INCREMENT", Types.INTEGER), new ColumnDefinition("WBN_MINIMUM_WIDTH", Types.INTEGER), new ColumnDefinition("SPARF_INTEGER", Types.INTEGER), new ColumnDefinition("UTID_CONSTRAINT", Types.INTEGER), new ColumnDefinition("UTID_START_VALUE", Types.INTEGER), new ColumnDefinition("UTID_INCREMENT", Types.INTEGER), new ColumnDefinition("UTID_SUB_INCREMENT", Types.INTEGER), new ColumnDefinition("UTID_MINIMUM_WIDTH", Types.INTEGER), new ColumnDefinition("INITIAL_VIEW", Types.INTEGER), new ColumnDefinition("POINT_RELEASE", Types.INTEGER), new ColumnDefinition("TIMESHEET_PROJECT_ID", Types.INTEGER), new ColumnDefinition("LAST_ID_USED_IN_ARCHIVES", Types.INTEGER), new ColumnDefinition("PROJECT_VERSION", Types.INTEGER), new ColumnDefinition("STANDARD_WORK_MIN_FADE", Types.INTEGER), new ColumnDefinition("BOOKOUT_SET_UNIQUE_ID", Types.INTEGER), new ColumnDefinition("NUMBER_BOOKED_OUT_SETS", Types.INTEGER), new ColumnDefinition("SHORT_NAME", Types.VARCHAR), new ColumnDefinition("LONG_NAME", Types.VARCHAR), new ColumnDefinition("LOCAL_FILE_BOOKED_FROM", Types.VARCHAR), new ColumnDefinition("WBN_START_VALUE", Types.VARCHAR), new ColumnDefinition("WBN_PATHNAME_SEPARATOR", Types.VARCHAR), new ColumnDefinition("WBN_TASK_SEPARATOR", Types.VARCHAR), new ColumnDefinition("WBN_PREFIX", Types.VARCHAR), new ColumnDefinition("LAST_WBN_USED", Types.VARCHAR), new ColumnDefinition("PROJECT_FOR", Types.VARCHAR), new ColumnDefinition("PROJECT_BY", Types.VARCHAR), new ColumnDefinition("PATH_SEPARATOR", Types.VARCHAR), new ColumnDefinition("CHART_PATH_SEPARATOR", Types.VARCHAR), new ColumnDefinition("UTID_PREFIX", Types.VARCHAR), new ColumnDefinition("TIMESHEET_CONNECTION", Types.VARCHAR), new ColumnDefinition("WBS_PATH_SEPARATOR", Types.VARCHAR), new ColumnDefinition("PROJECT_GUID", Types.VARCHAR), new ColumnDefinition("DURATION_TIME_UNIT", Types.INTEGER), new ColumnDefinition("SECURITY_CODELIBRARY", Types.INTEGER), new ColumnDefinition("BOOKOUT_COUNTER", Types.INTEGER), new ColumnDefinition("PROGRESS_METHOD", Types.INTEGER), new ColumnDefinition("FORMULA_DATE_FORMAT", Types.INTEGER), new ColumnDefinition("WBN_ENABLED", Types.BIT), new ColumnDefinition("OLD_START_VALUE", Types.BIT), new ColumnDefinition("IGNORE_SATISFIED_COSTS", Types.BIT), new ColumnDefinition("UTID_ENABLE_SUB_INCREMENTS", Types.BIT), new ColumnDefinition("EXCLUSIVE_CUSTOM_TIME_UNITS", Types.BIT), new ColumnDefinition("IS_AN_ARCHIVE", Types.BIT), new ColumnDefinition("SORT_BY_SORT_ORDER", Types.BIT), new ColumnDefinition("USE_PROJECT_BASELINES_FOR_JP", Types.BIT), new ColumnDefinition("USE_ROLLED_UP_OPC_WEIGHTINGS", Types.BIT), new ColumnDefinition("DISPLAY_WBS_BY_CODE", Types.BIT), new ColumnDefinition("INHERIT_FROM_NEIGHBOUR", Types.BIT), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] BAR_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("BARID", Types.INTEGER), new ColumnDefinition("STARV", Types.TIMESTAMP), new ColumnDefinition("ENF", Types.TIMESTAMP), new ColumnDefinition("NATURAL_ORDER", Types.INTEGER), new ColumnDefinition("SPARI_INTEGER", Types.INTEGER), new ColumnDefinition("NAMH", Types.VARCHAR), new ColumnDefinition("EXPANDED_TASK", Types.INTEGER), new ColumnDefinition("PRIORITY", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLE", Types.BIT), new ColumnDefinition("MARK_FOR_HIDING", Types.BIT), new ColumnDefinition("TASKS_MAY_OVERLAP", Types.BIT), new ColumnDefinition("SUBPROJECT_ID", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) // Followed by user defined columns which differ by project }; private static final ColumnDefinition[] CALENDAR_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("CALENDARID", Types.INTEGER), new ColumnDefinition("SPARL_INTEGER", Types.INTEGER), new ColumnDefinition("NAMK", Types.VARCHAR), new ColumnDefinition("DOMINANT_WORK_PATTERN", Types.INTEGER), new ColumnDefinition("CALENDAR", Types.INTEGER), new ColumnDefinition("DISPLAY_THRESHOLD", Types.TIMESTAMP), new ColumnDefinition("NO_WORKING_TIME_COLOUR", Types.INTEGER), new ColumnDefinition("WORKING_TIME_COLOUR", Types.INTEGER), new ColumnDefinition("NUMBERING", Types.INTEGER), new ColumnDefinition("SHOW_PAST_DATES", Types.BIT), new ColumnDefinition("ISO8601_WEEK_NUMBERING", Types.BIT), new ColumnDefinition("CREATED_AS_FOLDER", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] EXCEPTIONN_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("EXCEPTIONNID", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDARROW_TYPE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDLENGTH", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDEDGE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDBORDET_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDINSIDG_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STAPPANDPLACEMENW", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDBLIP_TYPE", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDSCALEY", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDSCALEZ", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDGAP", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDBORDES_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDINSIDF_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STAPPANDPLACEMENV", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STAPPANDSCALEX", Types.DOUBLE), new ColumnDefinition("LIN_STOUT_STAPPANDWIDTH", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STAPPANDBORDER_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STAPPANDINSIDE_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STAPPANDLINE_TYPE", Types.INTEGER), new ColumnDefinition("APPANDFOREGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("APPANDBACKGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("APPANDPATTERN", Types.INTEGER), new ColumnDefinition("UNIQUE_BIT_FIELD", Types.INTEGER), new ColumnDefinition("NAML", Types.VARCHAR), new ColumnDefinition("TYPG", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] EXCEPTION_ASSIGNMENT_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("EXCEPTION_ASSIGNMENTID", Types.INTEGER), //new ColumnDefinition("ORDF", Types.INTEGER), new ColumnDefinition("STARU_DATE", Types.TIMESTAMP), new ColumnDefinition("ENE_DATE", Types.TIMESTAMP), new ColumnDefinition("EXCEPTIOO", Types.INTEGER) }; private static final ColumnDefinition[] TIME_ENTRY_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("TIME_ENTRYID", Types.INTEGER), new ColumnDefinition("EXCEPTIOP", Types.INTEGER), new ColumnDefinition("START_TIME", Types.TIMESTAMP), new ColumnDefinition("END_TIME", Types.TIMESTAMP) }; private static final ColumnDefinition[] WORK_PATTERN_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("WORK_PATTERNID", Types.INTEGER), new ColumnDefinition("DEFAULT_OFFSET", Types.INTEGER), new ColumnDefinition("NAMN", Types.VARCHAR), new ColumnDefinition("DEFAULT_ALIGNMENT_DATE", Types.TIMESTAMP), new ColumnDefinition("CREATED_AS_FOLDER", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] TASK_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("TASKID", Types.INTEGER), new ColumnDefinition("GIVEN_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("GIVEN_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("GIVEN_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("RESUME", Types.TIMESTAMP), new ColumnDefinition("GIVEN_START", Types.TIMESTAMP), new ColumnDefinition("LATEST_PROGRESS_PERIOD", Types.INTEGER), new ColumnDefinition("TASK_WORK_RATE_TIME_UNIT", Types.INTEGER), new ColumnDefinition("TASK_WORK_RATE", Types.DOUBLE), new ColumnDefinition("PLACEMENT", Types.INTEGER), new ColumnDefinition("BEEN_SPLIT", Types.BIT), new ColumnDefinition("INTERRUPTIBLE", Types.BIT), new ColumnDefinition("HOLDING_PIN", Types.BIT), new ColumnDefinition("ACTUAL_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("EARLY_START_DATE", Types.TIMESTAMP), new ColumnDefinition("LATE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("FREE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("START_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("END_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("EFFORT_BUDGET", Types.DOUBLE), new ColumnDefinition("NATURAO_ORDER", Types.INTEGER), new ColumnDefinition("LOGICAL_PRECEDENCE", Types.INTEGER), new ColumnDefinition("SPAVE_INTEGER", Types.INTEGER), new ColumnDefinition("SWIM_LANE", Types.INTEGER), new ColumnDefinition("USER_PERCENT_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENV_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENT_COMPL_WEIGHT", Types.DOUBLE), new ColumnDefinition("NARE", Types.VARCHAR), new ColumnDefinition("WBN_CODE", Types.VARCHAR), new ColumnDefinition("NOTET", Types.LONGVARCHAR), new ColumnDefinition("UNIQUE_TASK_ID", Types.VARCHAR), new ColumnDefinition("CALENDAU", Types.INTEGER), new ColumnDefinition("WBT", Types.INTEGER), new ColumnDefinition("EFFORT_TIMI_UNIT", Types.INTEGER), new ColumnDefinition("WORL_UNIT", Types.INTEGER), new ColumnDefinition("LATEST_ALLOC_PROGRESS_PERIOD", Types.INTEGER), new ColumnDefinition("WORN", Types.DOUBLE), new ColumnDefinition("BAR", Types.INTEGER), new ColumnDefinition("CONSTRAINU", Types.INTEGER), new ColumnDefinition("PRIORITB", Types.INTEGER), new ColumnDefinition("CRITICAM", Types.BIT), new ColumnDefinition("USE_PARENU_CALENDAR", Types.BIT), new ColumnDefinition("BUFFER_TASK", Types.BIT), new ColumnDefinition("MARK_FOS_HIDING", Types.BIT), new ColumnDefinition("OWNED_BY_TIMESHEEV_X", Types.BIT), new ColumnDefinition("START_ON_NEX_DAY", Types.BIT), new ColumnDefinition("LONGEST_PATH", Types.BIT), new ColumnDefinition("DURATIOTTYPF", Types.INTEGER), new ColumnDefinition("DURATIOTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOTHOURS", Types.DOUBLE), new ColumnDefinition("STARZ", Types.TIMESTAMP), new ColumnDefinition("ENJ", Types.TIMESTAMP), new ColumnDefinition("DURATION_TIMJ_UNIT", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLG", Types.BIT), new ColumnDefinition("SUBPROJECT_ID", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] MILESTONE_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("MILESTONEID", Types.INTEGER), new ColumnDefinition("GIVEN_DATE_TIME", Types.TIMESTAMP), new ColumnDefinition("PROGREST_PERIOD", Types.INTEGER), new ColumnDefinition("SYMBOL_APPEARANCE", Types.INTEGER), new ColumnDefinition("MILESTONE_TYPE", Types.INTEGER), new ColumnDefinition("PLACEMENU", Types.INTEGER), new ColumnDefinition("COMPLETED", Types.BIT), new ColumnDefinition("INTERRUPTIBLE_X", Types.BIT), new ColumnDefinition("ACTUAL_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("EARLY_START_DATE", Types.TIMESTAMP), new ColumnDefinition("LATE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("FREE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("START_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("END_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("EFFORT_BUDGET", Types.DOUBLE), new ColumnDefinition("NATURAO_ORDER", Types.INTEGER), new ColumnDefinition("LOGICAL_PRECEDENCE", Types.INTEGER), new ColumnDefinition("SPAVE_INTEGER", Types.INTEGER), new ColumnDefinition("SWIM_LANE", Types.INTEGER), new ColumnDefinition("USER_PERCENT_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENV_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENT_COMPL_WEIGHT", Types.DOUBLE), new ColumnDefinition("NARE", Types.VARCHAR), new ColumnDefinition("WBN_CODE", Types.VARCHAR), new ColumnDefinition("NOTET", Types.LONGVARCHAR), new ColumnDefinition("UNIQUE_TASK_ID", Types.VARCHAR), new ColumnDefinition("CALENDAU", Types.INTEGER), new ColumnDefinition("WBT", Types.INTEGER), new ColumnDefinition("EFFORT_TIMI_UNIT", Types.INTEGER), new ColumnDefinition("WORL_UNIT", Types.INTEGER), new ColumnDefinition("LATEST_ALLOC_PROGRESS_PERIOD", Types.INTEGER), new ColumnDefinition("WORN", Types.DOUBLE), new ColumnDefinition("BAR", Types.INTEGER), new ColumnDefinition("CONSTRAINU", Types.INTEGER), new ColumnDefinition("PRIORITB", Types.INTEGER), new ColumnDefinition("CRITICAM", Types.BIT), new ColumnDefinition("USE_PARENU_CALENDAR", Types.BIT), new ColumnDefinition("BUFFER_TASK", Types.BIT), new ColumnDefinition("MARK_FOS_HIDING", Types.BIT), new ColumnDefinition("OWNED_BY_TIMESHEEV_X", Types.BIT), new ColumnDefinition("START_ON_NEX_DAY", Types.BIT), new ColumnDefinition("LONGEST_PATH", Types.BIT), new ColumnDefinition("DURATIOTTYPF", Types.INTEGER), new ColumnDefinition("DURATIOTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOTHOURS", Types.DOUBLE), new ColumnDefinition("STARZ", Types.TIMESTAMP), new ColumnDefinition("ENJ", Types.TIMESTAMP), new ColumnDefinition("DURATION_TIMJ_UNIT", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLG", Types.BIT), new ColumnDefinition("SUBPROJECT_ID", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] EXPANDED_TASK_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("EXPANDED_TASKID", Types.INTEGER), new ColumnDefinition("VAR_DATE1COMM_ATTSFIXED_DATE", Types.TIMESTAMP), new ColumnDefinition("VAR_DATE1COMM_ATTSBASE_DATE", Types.INTEGER), new ColumnDefinition("VAR_DATE2COMM_ATTSFIXED_DATE", Types.TIMESTAMP), new ColumnDefinition("VAR_DATE2COMM_ATTSBASE_DATE", Types.INTEGER), new ColumnDefinition("VAR_DATE3COMM_ATTSFIXED_DATE", Types.TIMESTAMP), new ColumnDefinition("VAR_DATE3COMM_ATTSBASE_DATE", Types.INTEGER), new ColumnDefinition("COMM_ATTSSCALE1", Types.DOUBLE), new ColumnDefinition("COMM_ATTSSCALE2", Types.DOUBLE), new ColumnDefinition("COMM_ATTSSCALE3", Types.DOUBLE), new ColumnDefinition("COMM_ATTSNSCALES", Types.INTEGER), new ColumnDefinition("PERCENTAGE_LIKELIHOOD", Types.DOUBLE), new ColumnDefinition("PROJ_RISK", Types.DOUBLE), new ColumnDefinition("PROJ_PRIORITY", Types.DOUBLE), new ColumnDefinition("SUM_WEIGHTS", Types.DOUBLE), new ColumnDefinition("ISSUE_DATE", Types.TIMESTAMP), new ColumnDefinition("REVISION_DATE", Types.TIMESTAMP), new ColumnDefinition("PROJECT_BASELINE_ID", Types.INTEGER), new ColumnDefinition("DRAWN_BY", Types.VARCHAR), new ColumnDefinition("REVISION_COMMENT", Types.VARCHAR), new ColumnDefinition("CHART_MANAGER", Types.VARCHAR), new ColumnDefinition("REVISION_NUMBER", Types.VARCHAR), new ColumnDefinition("PROGRAMME_NUMBER", Types.VARCHAR), new ColumnDefinition("COMMENU", Types.VARCHAR), new ColumnDefinition("PROJ_TYPE", Types.VARCHAR), new ColumnDefinition("PROJ_STATUS", Types.VARCHAR), new ColumnDefinition("PROGRESU_PERIOD", Types.INTEGER), new ColumnDefinition("MANAGER_RESOURCE", Types.INTEGER), new ColumnDefinition("TYPH", Types.INTEGER), new ColumnDefinition("TAG_FIELD", Types.INTEGER), new ColumnDefinition("IS_PROJECT", Types.BIT), new ColumnDefinition("CONTAINS_PROJECTS", Types.BIT), new ColumnDefinition("CUMULATIVH_COSTCURRENCZ", Types.INTEGER), new ColumnDefinition("CUMULATIVH_COSTAMOUNT", Types.DOUBLE), new ColumnDefinition("CUMULATIVH_INCOMECURRENCZ", Types.INTEGER), new ColumnDefinition("CUMULATIVH_INCOMEAMOUNT", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_ACTU_COSTCURRENCZ", Types.INTEGER), new ColumnDefinition("CUMULATIVE_ACTU_COSTAMOUNT", Types.DOUBLE), new ColumnDefinition("CUMULATIV_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("CUMULATIV_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("CUMULATIV_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("ACTUAL_CU_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("ACTUAL_CU_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("ACTUAL_CU_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("ACTUAL_CUMULATIVE_QUANTITY", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_QUANTIT_REMAINING", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_EFFORT_P_COMPLETE", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_WORK_PER_COMPLETE", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_QUANTITY_COMPLETE", Types.DOUBLE), new ColumnDefinition("MILESTONE_PERCENT_COMPLETE", Types.DOUBLE), new ColumnDefinition("FIRST_PREFERRED_START", Types.TIMESTAMP), new ColumnDefinition("CALCULATED_PROGRESS_DATE", Types.TIMESTAMP), new ColumnDefinition("EARLIEST_PROGRESS_DATE", Types.TIMESTAMP), new ColumnDefinition("LATEST_PROGRESS_DATE", Types.TIMESTAMP), new ColumnDefinition("EARLY_END_DATE_RT", Types.TIMESTAMP), new ColumnDefinition("LATE_END_DATE_RT", Types.TIMESTAMP), new ColumnDefinition("FREE_END_DATE_RT", Types.TIMESTAMP), new ColumnDefinition("CUMULATIVE_DEMANE_EFFORT", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_SCHEDULEE_EFFORT", Types.DOUBLE), new ColumnDefinition("ACTUAL_CUMULATIVF_EFFORT", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_EFFORU_REMAINING", Types.DOUBLE), new ColumnDefinition("ACTUAL_CUMULATIVE_WORK", Types.DOUBLE), new ColumnDefinition("CUMULATIVE_WORK_REMAINING", Types.DOUBLE), new ColumnDefinition("MILESTONES_DONE", Types.INTEGER), new ColumnDefinition("MILESTONES_REMAINING", Types.INTEGER), new ColumnDefinition("CUMULATIVE_EFFORT_TIME_UNIT", Types.INTEGER), new ColumnDefinition("CUMULATIVE_LATEST_PRO_PERIOD", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("ACTUAL_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("EARLY_START_DATE", Types.TIMESTAMP), new ColumnDefinition("LATE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("FREE_START_DATE", Types.TIMESTAMP), new ColumnDefinition("START_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("END_CONSTRAINT_DATE", Types.TIMESTAMP), new ColumnDefinition("EFFORT_BUDGET", Types.DOUBLE), new ColumnDefinition("NATURAO_ORDER", Types.INTEGER), new ColumnDefinition("LOGICAL_PRECEDENCE", Types.INTEGER), new ColumnDefinition("SPAVE_INTEGER", Types.INTEGER), new ColumnDefinition("SWIM_LANE", Types.INTEGER), new ColumnDefinition("USER_PERCENT_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENV_COMPLETE", Types.DOUBLE), new ColumnDefinition("OVERALL_PERCENT_COMPL_WEIGHT", Types.DOUBLE), new ColumnDefinition("NARE", Types.VARCHAR), new ColumnDefinition("WBN_CODE", Types.VARCHAR), new ColumnDefinition("NOTET", Types.LONGVARCHAR), new ColumnDefinition("UNIQUE_TASK_ID", Types.VARCHAR), new ColumnDefinition("CALENDAU", Types.INTEGER), new ColumnDefinition("WBT", Types.INTEGER), new ColumnDefinition("EFFORT_TIMI_UNIT", Types.INTEGER), new ColumnDefinition("WORL_UNIT", Types.INTEGER), new ColumnDefinition("LATEST_ALLOC_PROGRESS_PERIOD", Types.INTEGER), new ColumnDefinition("WORN", Types.DOUBLE), new ColumnDefinition("BAR", Types.INTEGER), new ColumnDefinition("CONSTRAINU", Types.INTEGER), new ColumnDefinition("PRIORITB", Types.INTEGER), new ColumnDefinition("CRITICAM", Types.BIT), new ColumnDefinition("USE_PARENU_CALENDAR", Types.BIT), new ColumnDefinition("BUFFER_TASK", Types.BIT), new ColumnDefinition("MARK_FOS_HIDING", Types.BIT), new ColumnDefinition("OWNED_BY_TIMESHEEV_X", Types.BIT), new ColumnDefinition("START_ON_NEX_DAY", Types.BIT), new ColumnDefinition("LONGEST_PATH", Types.BIT), new ColumnDefinition("DURATIOTTYPF", Types.INTEGER), new ColumnDefinition("DURATIOTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOTHOURS", Types.DOUBLE), new ColumnDefinition("STARZ", Types.TIMESTAMP), new ColumnDefinition("ENJ", Types.TIMESTAMP), new ColumnDefinition("DURATION_TIMJ_UNIT", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLG", Types.BIT), new ColumnDefinition("SUBPROJECT_ID", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER), }; private static final ColumnDefinition[] LINK_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("LINKID", Types.INTEGER), new ColumnDefinition("START_LAG_TIMETYPF", Types.INTEGER), new ColumnDefinition("START_LAG_TIMEELA_MONTHS", Types.INTEGER), new ColumnDefinition("START_LAG_TIMEHOURS", Types.DOUBLE), new ColumnDefinition("END_LAG_TIMETYPF", Types.INTEGER), new ColumnDefinition("END_LAG_TIMEELA_MONTHS", Types.INTEGER), new ColumnDefinition("END_LAG_TIMEHOURS", Types.DOUBLE), new ColumnDefinition("MAXIMUM_LAGTYPF", Types.INTEGER), new ColumnDefinition("MAXIMUM_LAGELA_MONTHS", Types.INTEGER), new ColumnDefinition("MAXIMUM_LAGHOURS", Types.DOUBLE), new ColumnDefinition("STARV_DATE", Types.TIMESTAMP), new ColumnDefinition("ENF_DATE", Types.TIMESTAMP), new ColumnDefinition("CURVATURE_PERCENTAGE", Types.INTEGER), new ColumnDefinition("START_LAG_PERCENT_FLOAT", Types.DOUBLE), new ColumnDefinition("END_LAG_PERCENT_FLOAT", Types.DOUBLE), new ColumnDefinition("COMMENTS", Types.VARCHAR), new ColumnDefinition("LINK_CATEGORY", Types.INTEGER), new ColumnDefinition("START_LAG_TIME_UNIT", Types.INTEGER), new ColumnDefinition("END_LAG_TIME_UNIT", Types.INTEGER), new ColumnDefinition("MAXIMUM_LAG_TIME_UNIT", Types.INTEGER), new ColumnDefinition("START_TASK", Types.INTEGER), new ColumnDefinition("END_TASK", Types.INTEGER), new ColumnDefinition("TYPI", Types.INTEGER), new ColumnDefinition("START_LAG_TYPE", Types.INTEGER), new ColumnDefinition("END_LAG_TYPE", Types.INTEGER), new ColumnDefinition("MAINTAIN_TASK_OFFSETS", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLF", Types.BIT), new ColumnDefinition("CRITICAL", Types.BIT), new ColumnDefinition("ON_LOOP", Types.BIT), new ColumnDefinition("MAXIMUM_LAG_MODE", Types.BIT), new ColumnDefinition("ANNOTATE_LEAD_LAG", Types.BIT), new ColumnDefinition("START_REPOSITION_ON_TAS_MOVE", Types.BIT), new ColumnDefinition("END_REPOSITION_ON_TASK_MOVE", Types.BIT), new ColumnDefinition("DRAW_CURVED_IF_VERTICAL", Types.BIT), new ColumnDefinition("AUTOMATIC_CURVED_LI_SETTINGS", Types.BIT), new ColumnDefinition("DRAW_CURVED_LINK_TO_LEFT", Types.BIT), new ColumnDefinition("LOCAL_LINK", Types.BIT), new ColumnDefinition("DRIVING", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) }; private static final ColumnDefinition[] CONSUMABLE_RESOURCE_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("CONSUMABLE_RESOURCEID", Types.INTEGER), new ColumnDefinition("COST_PER_UNITCURRENCZ", Types.INTEGER), new ColumnDefinition("COST_PER_UNITAMOUNT", Types.DOUBLE), new ColumnDefinition("INCOME_PER_UNITCURRENCZ", Types.INTEGER), new ColumnDefinition("INCOME_PER_UNITAMOUNT", Types.DOUBLE), new ColumnDefinition("COST_PER_USEDEFAULTSCURRENCZ", Types.INTEGER), new ColumnDefinition("COST_PER_USEDEFAULTSAMOUNT", Types.DOUBLE), new ColumnDefinition("INCOME_P_USEDEFAULTSCURRENCZ", Types.INTEGER), new ColumnDefinition("INCOME_P_USEDEFAULTSAMOUNT", Types.DOUBLE), new ColumnDefinition("DURATIOPDEFAULTSTYPF", Types.INTEGER), new ColumnDefinition("DURATIOPDEFAULTSELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOPDEFAULTSHOURS", Types.DOUBLE), new ColumnDefinition("DELAZDEFAULTSTYPF", Types.INTEGER), new ColumnDefinition("DELAZDEFAULTSELA_MONTHS", Types.INTEGER), new ColumnDefinition("DELAZDEFAULTSHOURS", Types.DOUBLE), new ColumnDefinition("DEFAULTSQUANTITY", Types.DOUBLE), new ColumnDefinition("DEFAULTSACTIVITY_CONV_FACTOR", Types.DOUBLE), new ColumnDefinition("DEFAULTSCONSUMPTION_RATE", Types.DOUBLE), new ColumnDefinition("DEFAULTSCONSUMPTION_RAT_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTSDURATION_TIMG_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTSDELAY_TIMF_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTSEXPENDITURE_C_CENTRE", Types.INTEGER), new ColumnDefinition("DEFAULTSINCOME_COST_CENTRE", Types.INTEGER), new ColumnDefinition("DEFAULTSTYPM", Types.INTEGER), new ColumnDefinition("DEFAULTSCALCULATEE_PARAMETER", Types.INTEGER), new ColumnDefinition("DEFAULTSBALANCINH_PARAMETER", Types.INTEGER), new ColumnDefinition("DEFAULTSCONSUMPTION_RAT_TYPE", Types.INTEGER), new ColumnDefinition("DEFAULTSUSE_TASL_CALENDAR", Types.BIT), new ColumnDefinition("DEFAULTSALLOD_PROPORTIONALLY", Types.BIT), new ColumnDefinition("DEFAULTSCONSUMED", Types.BIT), new ColumnDefinition("DEFAULTSACCOUNTEDA_ELSEWHERE", Types.BIT), new ColumnDefinition("DEFAULTSMAY_BE_SHORTERA_TASK", Types.BIT), new ColumnDefinition("AVAILABLE_FROM", Types.TIMESTAMP), new ColumnDefinition("AVAILABLE_TO", Types.TIMESTAMP), new ColumnDefinition("MEASUREMENT", Types.VARCHAR), new ColumnDefinition("CONSUMABLE_RESOURCE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APARROW_TYPE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APLENGTH", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APEDGE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APBORDET_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APINSIDG_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APPLACEMENW", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APBLIP_TYPE", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APSCALEY", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APSCALEZ", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APGAP", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APBORDES_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APINSIDF_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APPLACEMENV", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APSCALEX", Types.DOUBLE), new ColumnDefinition("LIN_STOUT_STRES_APWIDTH", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APBORDER_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APINSIDE_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APLINE_TYPE", Types.INTEGER), new ColumnDefinition("RES_APFOREGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("RES_APBACKGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("RES_APPATTERN", Types.INTEGER), new ColumnDefinition("AVAILABILITY", Types.DOUBLE), new ColumnDefinition("TOTAL_AVAILABILITY", Types.DOUBLE), new ColumnDefinition("SPAWE_INTEGER", Types.INTEGER), new ColumnDefinition("NASE", Types.VARCHAR), new ColumnDefinition("SHORT_NAME_SINGLE", Types.VARCHAR), new ColumnDefinition("SHORT_NAME_PLURAL", Types.VARCHAR), new ColumnDefinition("CALENDAV", Types.INTEGER), new ColumnDefinition("USE_PARENV_CALENDAR", Types.BIT), new ColumnDefinition("USE_LINE_STYLE_P_ALLOCATIONS", Types.BIT), new ColumnDefinition("CREATED_AS_FOLDER", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER), }; private static final ColumnDefinition[] PERMANENT_RESOURCE_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("PERMANENT_RESOURCEID", Types.INTEGER), new ColumnDefinition("EMAIL_ADDRESS", Types.VARCHAR), new ColumnDefinition("EFFORT_TIME_UNIT", Types.INTEGER), new ColumnDefinition("PURE_TREE", Types.BIT), new ColumnDefinition("EXCLUDED_FROM_TIMESHEET", Types.BIT), new ColumnDefinition("ARR_STOUT_STRES_APARROW_TYPE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APLENGTH", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APEDGE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APBORDET_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APINSIDG_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STRES_APPLACEMENW", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APBLIP_TYPE", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APSCALEY", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APSCALEZ", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APGAP", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APBORDES_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APINSIDF_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STRES_APPLACEMENV", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APSCALEX", Types.DOUBLE), new ColumnDefinition("LIN_STOUT_STRES_APWIDTH", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APBORDER_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APINSIDE_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STRES_APLINE_TYPE", Types.INTEGER), new ColumnDefinition("RES_APFOREGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("RES_APBACKGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("RES_APPATTERN", Types.INTEGER), new ColumnDefinition("AVAILABILITY", Types.DOUBLE), new ColumnDefinition("TOTAL_AVAILABILITY", Types.DOUBLE), new ColumnDefinition("SPAWE_INTEGER", Types.INTEGER), new ColumnDefinition("NASE", Types.VARCHAR), new ColumnDefinition("SHORT_NAME_SINGLE", Types.VARCHAR), new ColumnDefinition("SHORT_NAME_PLURAL", Types.VARCHAR), new ColumnDefinition("CALENDAV", Types.INTEGER), new ColumnDefinition("USE_PARENV_CALENDAR", Types.BIT), new ColumnDefinition("USE_LINE_STYLE_P_ALLOCATIONS", Types.BIT), new ColumnDefinition("CREATED_AS_FOLDER", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER) // Followed by user defined columns which differ by project }; private static final ColumnDefinition[] PERM_RESOURCE_SKILL_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("PERM_RESOURCE_SKILLID", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APARROW_TYPE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APLENGTH", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APEDGE", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APBORDET_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APINSIDG_COL", Types.INTEGER), new ColumnDefinition("ARR_STOUT_STSKI_APPLACEMENW", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APBLIP_TYPE", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APSCALEY", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APSCALEZ", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APGAP", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APBORDES_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APINSIDF_COL", Types.INTEGER), new ColumnDefinition("BLI_STOUT_STSKI_APPLACEMENV", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STSKI_APSCALEX", Types.DOUBLE), new ColumnDefinition("LIN_STOUT_STSKI_APWIDTH", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STSKI_APBORDER_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STSKI_APINSIDE_COL", Types.INTEGER), new ColumnDefinition("LIN_STOUT_STSKI_APLINE_TYPE", Types.INTEGER), new ColumnDefinition("SKI_APFOREGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("SKI_APBACKGROUND_FILL_COLOUR", Types.INTEGER), new ColumnDefinition("SKI_APPATTERN", Types.INTEGER), new ColumnDefinition("DURATIOODEFAULTTTYPF", Types.INTEGER), new ColumnDefinition("DURATIOODEFAULTTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOODEFAULTTHOURS", Types.DOUBLE), new ColumnDefinition("DELAYDEFAULTTTYPF", Types.INTEGER), new ColumnDefinition("DELAYDEFAULTTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DELAYDEFAULTTHOURS", Types.DOUBLE), new ColumnDefinition("DEFAULTTALLOCATION", Types.DOUBLE), new ColumnDefinition("DEFAULTTWORK_FROM_ACT_FACTOR", Types.DOUBLE), new ColumnDefinition("DEFAULTTEFFORT", Types.DOUBLE), new ColumnDefinition("DEFAULTTWORL", Types.DOUBLE), new ColumnDefinition("DEFAULTTWORK_RATE", Types.DOUBLE), new ColumnDefinition("DEFAULTTWORK_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTTWORK_RATE_TIME_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTTEFFORT_TIMG_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTTDURATION_TIMF_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTTDELAY_TIME_UNIT", Types.INTEGER), new ColumnDefinition("DEFAULTTTYPL", Types.INTEGER), new ColumnDefinition("DEFAULTTCALCULATED_PARAMETER", Types.INTEGER), new ColumnDefinition("DEFAULTTBALANCING_PARAMETER", Types.INTEGER), new ColumnDefinition("DEFAULTTWORK_RATE_TYPE", Types.INTEGER), new ColumnDefinition("DEFAULTTUSE_TASK_CALENDAR", Types.BIT), new ColumnDefinition("DEFAULTTALLOC_PROPORTIONALLY", Types.BIT), new ColumnDefinition("DEFAULTTCAN_BE_SPLIT", Types.BIT), new ColumnDefinition("DEFAULTTCAN_BE_DELAYED", Types.BIT), new ColumnDefinition("DEFAULTTCAN_BE_STRETCHED", Types.BIT), new ColumnDefinition("DEFAULTTACCOUNTED__ELSEWHERE", Types.BIT), new ColumnDefinition("DEFAULTTCONTRIBUTES_T_EFFORT", Types.BIT), new ColumnDefinition("DEFAULTTMAY_BE_SHORTER__TASK", Types.BIT), new ColumnDefinition("DEFAULTTSHARED_EFFORT", Types.BIT), new ColumnDefinition("ABILITY", Types.DOUBLE), new ColumnDefinition("EFFECTIVENESS", Types.DOUBLE), new ColumnDefinition("AVAILABLF_FROM", Types.TIMESTAMP), new ColumnDefinition("AVAILABLF_TO", Types.TIMESTAMP), new ColumnDefinition("SPARO_INTEGER", Types.INTEGER), new ColumnDefinition("EFFORT_TIMF_UNIT", Types.INTEGER), new ColumnDefinition("ROLE", Types.INTEGER), new ColumnDefinition("PLAYER", Types.INTEGER), new ColumnDefinition("CREATED_AS_FOLDER", Types.BIT), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER), }; private static final ColumnDefinition[] PERMANENT_SCHEDUL_ALLOCATION_COLUMNS = new ColumnDefinition[] { new ColumnDefinition("PERMANENT_SCHEDUL_ALLOCATIONID", Types.INTEGER), new ColumnDefinition("REQUIREE_BY", Types.INTEGER), new ColumnDefinition("OWNED_BY_TIMESHEET_X", Types.BIT), new ColumnDefinition("EFFORW", Types.DOUBLE), new ColumnDefinition("GIVEN_EFFORT", Types.DOUBLE), new ColumnDefinition("WORK_FROM_TASK_FACTOR", Types.DOUBLE), new ColumnDefinition("ALLOCATIOO", Types.DOUBLE), new ColumnDefinition("GIVEN_ALLOCATION", Types.DOUBLE), new ColumnDefinition("ALLOCATIOP_OF", Types.INTEGER), new ColumnDefinition("WORM_UNIT", Types.INTEGER), new ColumnDefinition("WORK_RATE_TIMF_UNIT", Types.INTEGER), new ColumnDefinition("EFFORT_TIMJ_UNIT", Types.INTEGER), new ColumnDefinition("WORO", Types.DOUBLE), new ColumnDefinition("GIVEN_WORK", Types.DOUBLE), new ColumnDefinition("WORL_RATE", Types.DOUBLE), new ColumnDefinition("GIVEN_WORK_RATE", Types.DOUBLE), new ColumnDefinition("TYPV", Types.INTEGER), new ColumnDefinition("CALCULATEG_PARAMETER", Types.INTEGER), new ColumnDefinition("BALANCINJ_PARAMETER", Types.INTEGER), new ColumnDefinition("SHAREE_EFFORT", Types.BIT), new ColumnDefinition("CONTRIBUTES_TO_ACTIVI_EFFORT", Types.BIT), new ColumnDefinition("DELAATYPF", Types.INTEGER), new ColumnDefinition("DELAAELA_MONTHS", Types.INTEGER), new ColumnDefinition("DELAAHOURS", Types.DOUBLE), new ColumnDefinition("GIVEO_DURATIONTYPF", Types.INTEGER), new ColumnDefinition("GIVEO_DURATIONELA_MONTHS", Types.INTEGER), new ColumnDefinition("GIVEO_DURATIONHOURS", Types.DOUBLE), new ColumnDefinition("DELAY_TIMI_UNIT", Types.INTEGER), new ColumnDefinition("RATE_TYPE", Types.INTEGER), new ColumnDefinition("USE_TASM_CALENDAR", Types.BIT), new ColumnDefinition("IGNORF", Types.BIT), new ColumnDefinition("ELAPSEE", Types.BIT), new ColumnDefinition("MAY_BE_SHORTER_THAN_TASK", Types.BIT), new ColumnDefinition("RESUMF", Types.TIMESTAMP), new ColumnDefinition("SPAXE_INTEGER", Types.INTEGER), new ColumnDefinition("PERCENT_COMPLETE", Types.DOUBLE), new ColumnDefinition("USER_PERCENU_COMPLETE", Types.DOUBLE), new ColumnDefinition("ALLOCATIOR_GROUP", Types.INTEGER), new ColumnDefinition("ALLOCATEE_TO", Types.INTEGER), new ColumnDefinition("PRIORITC", Types.INTEGER), new ColumnDefinition("ACCOUNTED_FOR_ELSEWHERE", Types.BIT), new ColumnDefinition("DURATIOTTYPF", Types.INTEGER), new ColumnDefinition("DURATIOTELA_MONTHS", Types.INTEGER), new ColumnDefinition("DURATIOTHOURS", Types.DOUBLE), new ColumnDefinition("STARZ", Types.TIMESTAMP), new ColumnDefinition("ENJ", Types.TIMESTAMP), new ColumnDefinition("DURATION_TIMJ_UNIT", Types.INTEGER), new ColumnDefinition("UNSCHEDULABLG", Types.BIT), new ColumnDefinition("SUBPROJECT_ID", Types.INTEGER), new ColumnDefinition("ALT_ID", Types.INTEGER), new ColumnDefinition("LAST_EDITED_DATE", Types.TIMESTAMP), new ColumnDefinition("LAST_EDITED_BY", Types.INTEGER), }; private static final Map<Integer, TableDefinition> TABLE_DEFINITIONS = new HashMap<Integer, TableDefinition>(); static { TABLE_DEFINITIONS.put(Integer.valueOf(2), new TableDefinition("PROJECT_SUMMARY", PROJECT_SUMMARY_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(7), new TableDefinition("BAR", BAR_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(11), new TableDefinition("CALENDAR", CALENDAR_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(12), new TableDefinition("EXCEPTIONN", EXCEPTIONN_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(14), new TableDefinition("EXCEPTION_ASSIGNMENT", EXCEPTION_ASSIGNMENT_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(15), new TableDefinition("TIME_ENTRY", TIME_ENTRY_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(17), new TableDefinition("WORK_PATTERN", WORK_PATTERN_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(21), new TableDefinition("TASK", TASK_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(22), new TableDefinition("MILESTONE", MILESTONE_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(23), new TableDefinition("EXPANDED_TASK", EXPANDED_TASK_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(25), new TableDefinition("LINK", LINK_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(61), new TableDefinition("CONSUMABLE_RESOURCE", CONSUMABLE_RESOURCE_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(62), new TableDefinition("PERMANENT_RESOURCE", PERMANENT_RESOURCE_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(63), new TableDefinition("PERM_RESOURCE_SKILL", PERM_RESOURCE_SKILL_COLUMNS)); TABLE_DEFINITIONS.put(Integer.valueOf(67), new TableDefinition("PERMANENT_SCHEDUL_ALLOCATION", PERMANENT_SCHEDUL_ALLOCATION_COLUMNS)); } private static final char DELIMITER = ','; private static final RowComparator CALENDAR_COMPARATOR = new RowComparator("CALENDARID"); private static final RowComparator PERMANENT_RESOURCE_COMPARATOR = new RowComparator("PERMANENT_RESOURCEID"); private static final RowComparator CONSUMABLE_RESOURCE_COMPARATOR = new RowComparator("CONSUMABLE_RESOURCEID"); private static final RowComparator BAR_COMPARATOR = new RowComparator("NATURAL_ORDER"); private static final RowComparator TASK_COMPARATOR = new RowComparator("WBT", "NATURAO_ORDER"); private static final RowComparator LINK_COMPARATOR = new RowComparator("LINKID"); private static final RowComparator ALLOCATION_COMPARATOR = new RowComparator("PERMANENT_SCHEDUL_ALLOCATIONID"); }