License text

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER 
 * Copyright  2008, 2010 Oracle and/or its affiliates.  All rights reserved. 
 * Use is subject to license terms.
 * 
 * This file is available and licensed under the following license:
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met: 
 * 
 *   * Redistributions of source code must retain the above copyright notice, 
 *     this list of conditions and the following disclaimer. 
 *
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *
 *   * Neither the name of Oracle Corporation nor the names of its contributors 
 *     may be used to endorse or promote products derived from this software 
 *     without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

    

/*
 * DataHandler.fx
 *
 * Created on Apr 24, 2009, 5:54:56 PM
 */

package projectmanager;

import projectmanager.ProjectModel;
import projectmanager.TaskModel;

/**
 * DataHandler which takes care of the data manipulation and data initialization.
 * This class takes care of deleting the data, adding new data, updating the
 * existing data and synchronizing the corresponding view when the data changes.
 *
 * Takes care of task as well as project data and also populates the mock data.
 * This class can be suitably enhanced when interfacing the real-data from
 * the data base or from a web source.
 */
public var projectCategories: ProjectModel[];
public var projectTasks: TaskModel[];

public class DataHandler {

    var taskKeyGenerator: Integer  = 100;
    var projKeyGenerator: Integer  = 100;

    // To synchronize the project views
    public var updateProjectView: Boolean = false;

    // To synchronize the task views
    public var updateTaskView: Boolean = false;

    init {
        addProjectCategories(
            [
            ProjectModel {
                name: "Test Dev for Marina"
                description: "QA Tasks"
                key: 0
            },
            ProjectModel {
                name: "QA Tasks"
                description: "QA Tasks"
                key: 1
            },
            ProjectModel {
                name: "Functional Specs"
                description: "Specification need to complete"
                key: 2
            },
            ProjectModel {
                name: "Marina PRD Updates"
                description: "Requirements specifications"
                key: 3
            },
            ProjectModel {
                name: "FX UI Controls Dev"
                description: "QA Tasks"
                key: 4
            },
            ]
        );

        addProjectTasks(
            [
            TaskModel {
                category: "QA Tasks"
                name: "SoMa Test Execution"
                priority: 3
                notes: "Testing need to complete by next week"
                key: 0
            },
            TaskModel {
                category: "Functiona Specs"
                name: "SoMa Functional  Specs dev"
                priority: 3
                notes: "Testing need to complete by next week"
                key: 1
            },
            TaskModel {
                category: "FX UI Controls Dev"
                name: "Reliabilty Testing"
                priority: 2
                notes: "Testing need to complete by next week"
                key: 2
            },
            TaskModel {
                category: "FX UI Controls Dev"
                name: "Function Testing"
                priority: 1
                notes: "Testing need to complete by next week"
                key: 3
            },
            TaskModel {
                category: "QA Tasks"
                name: "PIT Testing"
                priority: 1
                notes: "Testing need to complete by next week"
                key: 4
            },
            TaskModel {
                category: "QA Tasks"
                name: "Promotion Testing"
                priority: 1
                notes: "Testing need to complete by next week"
                key: 5
            },
            ]
        );
        populateData();
    }


    public function getProjectCategory(): ProjectModel[] {
        return projectCategories;
    }

    function getTaskKey(): Integer {
        return taskKeyGenerator ++;
    }

    function getProjectKey(): Integer {
        return projKeyGenerator ++;
    }


    public function addProjectTask(pt: TaskModel):Void {
        updateTaskView = false;
        var i: Integer = 0; var pos: Integer = 0;
        var key = getTaskKey();
        pt.key = key;
        if(projectTasks.size() > 0) {
            
            for(projTask in projectTasks){
                if (projTask.name == null or projTask.name == "") {
                    pos = i;
                    break;
                }
                   
                if(pt.name.compareTo(projTask.name) > 0 ) {
                    i++;
                    continue;
                } else if(pt.name.compareTo(projTask.name) <= 0) {
                    pos = i;
                    break;
                }
            }
            if(i == 0 ){
               insert pt before projectTasks[0];
            } else if( pos == 0 ){
                insert pt into projectTasks;
            } else {
                insert pt before projectTasks[pos];
            }

        } else {
            insert pt into projectTasks;
        }
        updateTaskView = true;
    }

    public function addProjectTasks(tasks: TaskModel[]):Void {
        for (task in tasks) {
            addProjectTask(task);
        }
    }

    function populateData() {
        for (x in [1..AppView.screenHeight/21]) {
            insert TaskModel { key: getTaskKey()} into projectTasks;
            insert ProjectModel { key: getProjectKey()} into projectCategories;
        }
    }


    public function addProjectCategory(pc: ProjectModel): Void {
        updateProjectView = false;
        var i: Integer = 0; var pos: Integer = 0;
        var key = getProjectKey();
        pc.key = key;
        if( projectCategories.size() > 0 ) {
            for( projCate in projectCategories ){
                 if (projCate.name == null or projCate.name == "") {
                    pos = i;
                    break;
                }
                if( pc.name.compareTo(projCate.name) > 0 ) {
                    i++;
                    continue;
                } else if(pc.name.compareTo(projCate.name) <= 0) {
                    pos = i;
                    break;
                }
            }
            if(i == 0 ){
               insert pc before projectCategories[0];
            } else if( pos == 0 ){
                insert pc into projectCategories;
            } else {
                insert pc before projectCategories[pos];
            }
        } else {
            insert pc into projectCategories;
        }
        updateProjectView = true;
    }

    public function addProjectCategories(cats: ProjectModel[]):Void {
        for (cat in cats) {
            addProjectCategory(cat);
        }
    }

    public function updateProjectCategory(pCat: ProjectModel){
        for(projCat in projectCategories) {
            if(projCat.key == pCat.key) {
                delete projCat from projectCategories;
                break;
            }
        }
        addProjectCategory(pCat);
    }

    public function updateProjectTask(pTask: TaskModel){
        for(projTas in projectTasks) {
            if(projTas.key == pTask.key) {
                delete projTas from projectTasks;
                break;
            }
        }
        addProjectTask(pTask);
    }

    public function getProjectTasks(): TaskModel[] {
        return projectTasks;
    }

    public function getProjectTasks(pr: Integer): TaskModel[] {
        var projTsks: TaskModel[];
        for(proj in projectTasks){
            if( proj.priority == pr or proj.name == null) {
                insert proj into projTsks;
            }
        }
        return projTsks;
    }

    public function getProjectTask(projName: String): TaskModel {
        for(proj in projectTasks){
            if( proj.name == projName) {
                return proj;
            }
        }
        return null;
    }
    
    public function getProjectTask(key: Integer): TaskModel {
        for (proj in projectTasks) {
            if (proj.key == key) {
                return proj;
            }
        }
        return null;
    }

    public function getProjectCategoriesNames(): String[] {
        var prCatNames: String[];
        for(projCat in projectCategories) {
            insert projCat.name into prCatNames;
        }
        return prCatNames;
    }

    public function getProjectCategory(catName: String): ProjectModel {
        for(projCat in projectCategories) {
            if( projCat.name == catName )
            return projCat;
        }
        return null;
    }

    public function getProjectCategory(key: Integer): ProjectModel {
        for(projCat in projectCategories) {
            if( projCat.key == key )
            return projCat;
        }
        return null;
    }
    
    public function getProjectTasksNames(): String[] {
        var prTNames: String[];
        for(projTask in projectTasks) {
            insert projTask.name into prTNames;
        }
        return prTNames;
    }

    public function getProjectTasksNames(projCat: String): String[] {
        var prTNames: String[];
        for(projTask in projectTasks) {
            if (projTask.category == projCat) {
                insert projTask.name into prTNames;
            }
        }
        return prTNames;
    }

    public function getProjectTasksNames(pr: Integer, projCat: String): String[] {
        var prTNames: String[];
        for(projTask in projectTasks) {
            if (projTask.category == projCat) {
                if( projTask.priority == pr or projTask.name == null ) {
                    insert projTask.name into prTNames;
                }
            }
        }
        return prTNames;
    }
    public function getProjectTasksNames(pr: Integer): String[] {

        var prTNames: String[];
        for(projTask in projectTasks) {
            if( projTask.priority == pr ){
                insert projTask.name into prTNames;
            }
        }
        return prTNames;
    }

    public function deleteProjectCategory(pc: ProjectModel): Boolean {
        deleteProjectCategory(pc.key);
    }

    public function deleteProjectCategory(key: Integer) {
        updateProjectView = false;
        if(projectCategories.size() > 0){
            for( pcat in projectCategories) {
                if(pcat.key == key) {
                    for (task in projectTasks) {
                        if (task.category == pcat.name) {
                            return false;
                        }
                    }
                    delete pcat from projectCategories;
                    updateProjectView = true;
                    return true;
                }
            }
        }
        return false;
    }

    public function deleteProjectCategory(catName: String) {
        updateProjectView = false;
        if(projectCategories.size() > 0){
            for( pcat in projectCategories) {
                if(pcat.name == catName) {
                    for (task in projectTasks) {
                        if (task.category == pcat.name) {
                            return false;
                        }
                    }
                    delete pcat from projectCategories;
                    updateProjectView = true;
                    return true;
                }
            }
        }
        return false;
    }
    
    public function deleteProjectTask(pt: TaskModel): Void {
        updateTaskView = false;
        if(projectTasks.size() > 0){
            for( pTask in projectTasks) {
                if(pTask.key == pt.key) {
                    delete pTask from projectTasks;
                    updateTaskView = true;
                    break;
                }
            }
        }
    }

    public function deleteProjectTask(ptName: String): Void {
        updateTaskView = false;
        if(projectTasks.size() > 0){
            for( pTask in projectTasks) {
                if(pTask.name == ptName) {
                    delete pTask from projectTasks;
                    updateTaskView = true;
                    break;
                }
            }
        }
    }
}