com.motorola.studio.android.codeutils.wizards.DatabaseManagementClassesCreationMainPage.java Source code

Java tutorial

Introduction

Here is the source code for com.motorola.studio.android.codeutils.wizards.DatabaseManagementClassesCreationMainPage.java

Source

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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 com.motorola.studio.android.codeutils.wizards;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PlatformUI;

import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.db.utils.DatabaseUtils;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.common.utilities.EclipseUtils;
import com.motorola.studio.android.manifest.AndroidProjectManifestFile;
import com.motorola.studio.android.model.manifest.AndroidManifestFile;
import com.motorola.studio.android.model.manifest.dom.ManifestNode;
import com.motorola.studio.android.wizards.elements.FileChooser;
import com.motorola.studio.android.wizards.elements.ProjectChooser;

/**
 * 
 * Wizard page to create classes which aids the database management. 
 *
 */
public class DatabaseManagementClassesCreationMainPage extends NewTypeWizardPage {
    private static final String CONTEXT_HELP_ID = CodeUtilsActivator.PLUGIN_ID + ".create_db_classes";

    /**
     * <p>
     * This listener is called when the Projects name is modified. Here
     * is checked whether the projects name represents any available project
     * in the current workspace. In case it does, the project of the wizard is updated and
     * the status is also checked. Otherwise, the status is checked and an error
     * message regarding this validation is displayed.
     * </p>
     * <p>
     * This listener also enables/disables components depending on whether the
     * chosen project is valid. Moreover, it populates the fields accordingly if
     * the selected project is valid.
     * </p>
     */
    private final class ProjectChooserModifyListener implements ModifyListener {
        public void modifyText(ModifyEvent e) {
            boolean isValidationOK = getProjectStatus(projectChooser.getText()) == null;
            // in case there is no status, the projects name is OK therefore update the project
            try {
                if (isValidationOK) {
                    //update fileChooser container
                    fileChooser.setContainer(projectChooser.getProject());
                    // update project
                    updateProject(projectChooser.getProject());
                } else {
                    fileChooser.setContainer(ResourcesPlugin.getWorkspace().getRoot());
                    // null the project
                    updateProject(null);
                }
            } catch (JavaModelException jme) {
                StudioLogger.error(this.getClass(), CodeUtilsNLS.Db_GenerateManagementClassesError, jme);
                IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, jme.getLocalizedMessage());
                EclipseUtils.showErrorDialog(CodeUtilsNLS.Db_GenerateManagementClassesError,
                        CodeUtilsNLS.Db_GenerateManagementClassesError, status);
            }

            // enable/disable this wizards group
            //setCompositeChildremEnabled(databaseFileGroup, isValidationOK);
            //ckbGenerateSQLOpenHelper.setEnabled(isValidationOK);
            //setCompositeChildremEnabled(sqlOpenHelperGroup, isValidationOK);
            //ckbCreateContentProviders.setEnabled(isValidationOK);
            //setCompositeChildremEnabled(contentProviderGroup, isValidationOK);

            // update status and page completion
            doStatusAndPageCompletionUpdate();
        }
    }

    /**
     * <p>
     * This class represents a listener which is called every time the
     * text field in the file chooser is modified. This listener intends
     * to validate whether the entered path is a valid path or not. To do so,
     * the {@link DatabaseManagementClassesCreationMainPage#doStatusAndPageCompletionUpdate()} is called.
     * </p>
     * <p>
     * This listener also enable/disables components depending on whether the
     * database file is validated correctly.
     * </p>
     */
    private final class DBFileChooserModifyListener implements ModifyListener {

        /*
         * (non-Javadoc)
         * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
         */
        public void modifyText(ModifyEvent e) {
            // validation flag
            boolean isValidationOK = ((getFileStatus(fileChooser.getText()) == null)
                    || (!getFileStatus(fileChooser.getText()).equals(IStatus.ERROR)));

            if (isValidationOK) {
                // set the database file
                selectedDatabasePath = getDatabaseFilePath();
            }

            // enable/disable this wizards group
            setCompositeChildremEnabled(sqlOpenHelperGroup, isValidationOK);
            ckbCreateContentProviders.setEnabled(isValidationOK);
            setCompositeChildremEnabled(contentProviderGroup, isValidationOK);

            // update status and page completion
            doStatusAndPageCompletionUpdate();
        }
    }

    /**
     * This listener is dispatched, from the inner part of Source/Package component - {@link SourcePackageChooserPartWizard}.
     * when a message inside it is thrown. This listener calls the {@link DatabaseManagementClassesCreationMainPage#doStatusAndPageCompletionUpdate()}
     * which gets the error message from the Source?Package element and displays it.
     */
    private final class ContentProviderPackageElementMessageActionListener implements ActionListener {
        /*
         * (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            // update status and page completion
            doStatusAndPageCompletionUpdate();
        }
    }

    /**
     * Listener which handles when a check box button is pressed.
     * Basically, it enables or disables all components stored in
     * the constructor parameter {@link Group}. It also
     * starts the event for validating this screen. 
     */
    private final class CkbPanelEnablementListener implements Listener {
        private final Group panelEnablementGroup;

        /*
         * Constructor
         * 
         * @param panelEnablementGroup SQL Helper group
         */
        private CkbPanelEnablementListener(Group panelEnablementGroup) {
            this.panelEnablementGroup = panelEnablementGroup;
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
         */
        public void handleEvent(Event event) {
            // get the check box which dispatched the event
            Button checkBox = event.widget != null ? (Button) event.widget : null;
            // proceed in case there is a check box
            if (checkBox != null) {
                // flag indicating whether to enable/disable the controls
                boolean enabled = checkBox.getSelection();
                // enable/disable the children of panelEnablementGroup field
                setCompositeChildremEnabled(panelEnablementGroup, enabled);
            }
            // update status and page completion
            doStatusAndPageCompletionUpdate();
        }
    }

    /* Constants */

    // max size of the database file in bytes
    private static final long MAX_FILE_SIZE = 1048576;

    private static final String MAX_FILE_CHAR_SIZE = "1MB"; //$NON-NLS-1$

    private static final String ASSESTS_FOLDER = "assets";

    private final String PLUGIN_ID = "com.motorola.studio.android.db"; //$NON-NLS-1$

    /* Fields */

    private IProject selectedProject;

    private Button ckbCreateContentProviders;

    private Button ckbOverrideContentProviders;

    private SourcePackageChooserPartWizard contentProviderPackageComposite;

    private Group sqlOpenHelperGroup;

    private Group contentProviderGroup;

    private Group databaseFileGroup;

    private FileChooser fileChooser;

    private Group projectGroup;

    private ProjectChooser projectChooser;

    private ScrolledComposite scroll;

    private Composite innerSchollComposite;

    IPath selectedDatabasePath;

    /**
     * Get the SQL Open Helper class name.
     * 
     * @return SQl Open Helper class name
     */
    public String getSQLOpenHelperClassName() {
        return getTypeName();
    }

    /**
     * Get the destination package of the Content Providers
     * 
     * @return Destination package of the Content Providers
     */
    public String getContentProviderPackage() {
        return contentProviderPackageComposite != null ? contentProviderPackageComposite.getPackageText() : ""; //$NON-NLS-1$
    }

    /**
     * Get the chosen project.
     * @return Selected {@link IProject}.
     */
    public IProject getSelectedProject() {
        return selectedProject;
    }

    /**
     * @return The {@link IPath} representing the selected Database file.
     */
    public IPath getDatabaseFilePath() {
        // file to be returned
        IPath dbFile = null;
        // text representing the file
        String fileText = fileChooser.getText();
        // get the database file in case there is a selected project
        if (selectedProject != null) {
            dbFile = (fileText != null) && (fileText.length() > 0) ? new Path(fileText) : null; //$NON-NLS-1$
        }
        return dbFile;
    }

    /**
     * Get the Database Open Helper Package.
     * 
     * @return Database Open Helper Package.
     */
    public String getDatabaseOpenHelperPackage() {
        return getPackageText();
    }

    /**
     * Returns <code>true</code> in case is is necessary to create
     * the Content Provider classes, <code>false</code> otherwise.
     * 
     * @return <code>true</code> in order to create Content Provider
     * classes, <code>false</code> otherwise.
     */
    public boolean isCreateContentProviders() {
        return ckbCreateContentProviders != null ? ckbCreateContentProviders.getSelection() : false;
    }

    /**
     * Returns <code>true</code> in case it is necessary to create
     * the Open SQL Helper classes, <code>false</code> otherwise.
     * 
     * @return <code>true</code> in case it is necessary to create SQL
     * Open Helper class, <code>false</code> otherwise.
     */
    public boolean isCreateSQLOpenHelperClass() {
        return true;
    }

    /**
     * Returns <code>true</code> in case one wishes to override existing
     * Content Provider classes, <code>false</code> otherwise.
     * 
     * @return <code>true</code> in case one wishes to override existing
     * Content Provider classes, <code>false</code> otherwise.
     */
    public boolean isOverrideExistingContentProviderClasses() {
        return ckbOverrideContentProviders != null ? ckbOverrideContentProviders.getSelection() : false;
    }

    /**
     * Create a new wizard page based on selection
     * 
     * @param pageName
     *            the page name
     * @param isDeployWaizard
     *            show deployment fields            
     */
    public DatabaseManagementClassesCreationMainPage(String pageName, IProject project, IResource database) {
        // call super
        super(true, pageName);
        // set description and title
        setDescription(CodeUtilsNLS.UI_PersistenceWizardPageDescriptionDeploy);
        setTitle(CodeUtilsNLS.UI_PersistenceWizardPageTitleDeploy);

        // update project
        try {
            updateProject(project);
        } catch (JavaModelException e) {
            StudioLogger.error(this.getClass(), CodeUtilsNLS.Db_GenerateManagementClassesError, e);
            IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, e.getLocalizedMessage());
            EclipseUtils.showErrorDialog(CodeUtilsNLS.Db_GenerateManagementClassesError,
                    CodeUtilsNLS.Db_GenerateManagementClassesError, status);
        }
        // update database
        if (database != null) {
            selectedDatabasePath = database.getLocation();
        }
        // update status and page completion
        doStatusAndPageCompletionUpdate();
    }

    /*
     * @see NewContainerWizardPage#handleFieldChanged
     */
    @Override
    protected void handleFieldChanged(String fieldName) {
        super.handleFieldChanged(fieldName);
        // update status and page completion
        doStatusAndPageCompletionUpdate();
    }

    /**
     * Creates page content.
     * 
     * @param parent wizard composite.
     */
    public void createControl(Composite parent) {
        try {
            // main control
            Composite mainComposite = new Composite(parent, SWT.FILL);
            PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, CONTEXT_HELP_ID);
            mainComposite.setLayout(new FillLayout(SWT.FILL));

            scroll = new ScrolledComposite(mainComposite, SWT.H_SCROLL | SWT.V_SCROLL);
            innerSchollComposite = new Composite(scroll, SWT.NONE);

            // set a grid layout with 1 column
            GridLayout layout = new GridLayout();
            layout.numColumns = 1;
            innerSchollComposite.setLayout(layout);
            innerSchollComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));

            // create Project selection stuff
            createProjectSelectionSession(innerSchollComposite);

            // create Database File stuff
            createDatabaseFileSession(innerSchollComposite);

            // retrieve package from manifest file
            String manifestPackage = null;
            try {
                AndroidManifestFile androidManifestFile = AndroidProjectManifestFile
                        .getFromProject(getSelectedProject());
                ManifestNode manifestNode = androidManifestFile.getManifestNode();
                manifestPackage = manifestNode.getNodeProperties().get(AndroidManifestFile.PROP_PACKAGE);
            } catch (Exception e) {
                // do nothing; default package value will be passed as null
            }

            // add SQL helper stuff
            createOpenHelperSession(innerSchollComposite, manifestPackage);

            // add content provider stuff
            createContentProviderSession(innerSchollComposite, manifestPackage);

            // add listeners
            addListeners();

            // set up scroll
            scroll.setContent(innerSchollComposite);

            scroll.setExpandHorizontal(true);
            scroll.setExpandVertical(true);

            scroll.addControlListener(new ControlAdapter() {
                @Override
                public void controlResized(ControlEvent e) {
                    scroll.setMinSize(innerSchollComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                }
            });

            // set control
            setControl(mainComposite);

            // update project text field
            if (selectedProject != null) {
                projectChooser.setText(selectedProject.getName());
            }

            // update database text field
            if (selectedDatabasePath != null) {
                fileChooser.setText(selectedDatabasePath.toOSString());
            }

            // set focus on the name text field
            setFocus();
        } catch (Exception e) {
            StudioLogger.error(this.getClass(), CodeUtilsNLS.Db_GenerateManagementClassesError, e);
            IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, e.getLocalizedMessage());
            EclipseUtils.showErrorDialog(CodeUtilsNLS.Db_GenerateManagementClassesError,
                    CodeUtilsNLS.Db_GenerateManagementClassesError, status);
        }
    }

    /**
     * Add Project Selection Section.
     * 
     * @param mainComposite Main Composite.
     */
    private void createProjectSelectionSession(Composite mainComposite) {
        // create layout for Content Provider class creation
        projectGroup = new Group(mainComposite, SWT.NONE);
        projectGroup.setText(CodeUtilsNLS.UI_PersistenceWizardPageSelectProjectTitle);

        projectGroup.setLayout(new GridLayout(5, false));
        projectGroup.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));

        // add project chooser
        projectChooser = new ProjectChooser(projectGroup, SWT.FILL);
    }

    /**
     * Create the Database File Session
     * 
     * @param mainComposite Main composite
     */
    private void createDatabaseFileSession(Composite mainComposite) {
        // create group for Database file
        databaseFileGroup = new Group(mainComposite, SWT.NONE);
        databaseFileGroup.setText(CodeUtilsNLS.UI_PersistenceWizardPageDatabaseFileGroupTitle);
        databaseFileGroup.setLayout(new GridLayout(3, false));
        databaseFileGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        // add file chooser
        fileChooser = new FileChooser(selectedProject, databaseFileGroup, SWT.NONE, null);
        fileChooser.setFilterExtensions(new String[] {

        });
        fileChooser.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
    }

    /**
     * Create the "Generate SQLOpenHelper" session 
     * 
     * @param mainComposite The Composite used as the main screen of
     * the page.
     * @param defaultPackageName The name of the default package to use
     * on the package field.
     */
    private void createOpenHelperSession(Composite mainComposite, String defaultPackageName) {
        // check box for generating SQL Open Helper
        sqlOpenHelperGroup = new Group(mainComposite, SWT.NONE);
        sqlOpenHelperGroup.setText(CodeUtilsNLS.UI_PersistenceWizardPageSQLOpenHelperGroupTitle);
        int numColumns = 5;
        sqlOpenHelperGroup.setLayout(new GridLayout(numColumns, false));
        sqlOpenHelperGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        /* Class selection for SQLOpenHelper */

        createTypeNameControls(sqlOpenHelperGroup, numColumns);

        /* Package selection for SQLOpenHelper */
        setPackageFragmentRoot(getPackageFragmentRoot(), true);
        createContainerControls(sqlOpenHelperGroup, numColumns);
        boolean defaultPackageUsed = false;
        if (defaultPackageName != null) {
            // try to use the manifest package, but if this fails, use the default getPackageFragment() logic
            try {
                setPackageFragment(getPackageFragmentRoot().getPackageFragment(defaultPackageName), true);
                defaultPackageUsed = true;
            } catch (Exception e) {
                // do nothing
            }
        }
        if (!defaultPackageUsed) {
            setPackageFragment(getPackageFragment(), true);
        }
        // create the controls for the package
        createPackageControls(sqlOpenHelperGroup, numColumns);
    }

    /**
     * Create the "Content Provider" session
     * 
     * @param mainComposite The Composite used as the main screen of
     * the page. 
     * @param defaultPackageName The name of the default package to use
     * on the package field.
     */
    private void createContentProviderSession(Composite mainComposite, String defaultPackageName) {
        // create the check for generating content providers
        ckbCreateContentProviders = new Button(mainComposite, SWT.CHECK);
        ckbCreateContentProviders.setText(CodeUtilsNLS.UI_PersistenceWizardGenerateContentProvidersForEachTable);
        ckbCreateContentProviders.setSelection(true);

        contentProviderGroup = new Group(mainComposite, SWT.NONE);
        contentProviderGroup.setText(CodeUtilsNLS.UI_PersistenceWizardPageContentProviderGroupTitle);
        int numColumns = 5;
        contentProviderGroup.setLayout(new GridLayout(numColumns, false));
        contentProviderGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        // add the Source/Package part
        contentProviderPackageComposite = new SourcePackageChooserPartWizard(getName(), selectedProject,
                defaultPackageName, contentProviderGroup, numColumns);

        // create the check for overriding content providers
        ckbOverrideContentProviders = new Button(contentProviderGroup, SWT.CHECK);
        ckbOverrideContentProviders
                .setText(CodeUtilsNLS.UI_PersistenceWizardOverrideContentProvidersIfAlreadyExists);
        ckbOverrideContentProviders.setSelection(true);
        ckbOverrideContentProviders
                .setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, numColumns, 1));
    }

    /**
     * Add listeners to the components
     */
    private void addListeners() {
        // add message listener
        contentProviderPackageComposite
                .addMessageNotificationActionListener(new ContentProviderPackageElementMessageActionListener());

        // add listener for content provider panel enablement
        ckbCreateContentProviders.addListener(SWT.Selection, new CkbPanelEnablementListener(contentProviderGroup));

        // add listener for DB file chooser
        fileChooser.addModifyListener(new DBFileChooserModifyListener());

        // add listener for the Project chooser
        projectChooser.addModifyListener(new ProjectChooserModifyListener());
    }

    /**
     * Update the status, related to this pages components,
     * which interferes with this wizard. Moreover, validate the page
     * and launch the {@link NewTypeWizardPage}{@link #setPageComplete(boolean)} method.
     */
    private void doStatusAndPageCompletionUpdate() {
        // variable which indicates whether there is any status with an error level
        boolean isAnyStatusWithError = false;
        // variable which indicates whether the wizard validation is OK
        boolean isPageValidated = false;
        // list to hold all status to validate
        List<IStatus> statusList = new ArrayList<IStatus>();
        // array list to be validated
        IStatus[] statusArray = new IStatus[0];

        // get the status from the project chooser
        if (projectChooser != null) {
            // get the project Name
            String projectName = projectChooser.getText();

            // validate projects name
            IStatus status = getProjectStatus(projectName);
            // add status to the list and check for error status, in case there is any
            if (status != null) {
                // add status to the list
                statusList.add(status);
                // verify status error
                isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
            }
        }

        // get the status from the database file chooser path, in case there is no error status
        if (!isAnyStatusWithError && (fileChooser != null)) {
            // get path
            String path = fileChooser.getText();

            // get the status
            IStatus status = getFileStatus(path);
            // in case it is not null, add it to the list and check error status
            if (status != null) {
                statusList.add(status);
                // check error status
                isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
            }
        }

        // get the status from Database helper name and package selection, in case it is required and there is no error status
        if (!isAnyStatusWithError) {
            for (IStatus status : getThisPageStatusList()) {
                // add the status to its list
                statusList.add(status);
                // verify error status
                isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
                // in case there is error status, quit the loop
                if (isAnyStatusWithError) {
                    break;
                }
            }
            // in case there are still no errors, check for the package name status
            if (!isAnyStatusWithError) {
                IStatus status = getDatabasePackageStatus();
                if (status != null) {
                    // add status to its list
                    statusList.add(status);
                    // verify whether there is no error status
                    isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
                }
            }
        }

        // get the status of the content provider part, in case it is required and there is no error status
        if (!isAnyStatusWithError && (ckbCreateContentProviders != null)
                && ckbCreateContentProviders.getSelection()) {
            if (this.contentProviderPackageComposite != null) {
                IStatus status = this.contentProviderPackageComposite.getMostSevereStatus();
                if (status != null) {
                    // add status to its list
                    statusList.add(status);
                    // verify whether there is no error status
                    isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
                }
            }
            // in case there are still no errors, check for the package name status
            if (!isAnyStatusWithError) {
                IStatus status = getContentProvidersPackageStatus();
                if (status != null) {
                    // add status to its list
                    statusList.add(status);
                    // verify whether there is no error status
                    isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
                }
            }
        }

        // get the status for minimum requirements of classes generation, if there is no error status
        if (!isAnyStatusWithError) {
            IStatus status = getMinimumClassesGenerationRequirementsStatus();
            if (status != null) {
                // add status to its list
                statusList.add(status);
                // verify whether there is no error status
                isAnyStatusWithError = status.getSeverity() == IStatus.ERROR;
            }
        }

        // convert to an array
        if (statusList.size() > 0) {
            statusArray = new IStatus[statusList.size()];
            for (int index = 0; index < statusList.size(); index++) {
                statusArray[index] = statusList.get(index);
            }
        } else {
            // in case there is no error, status, add an OK status with the default message
            statusArray = new IStatus[] {
                    new Status(IStatus.OK, PLUGIN_ID, CodeUtilsNLS.UI_PersistenceWizardPageDescriptionDeploy) };
        }

        // the most severe status will be displayed and the OK button enabled/disabled.
        updateStatus(statusArray);

        /*
         * The page is validated if:
         * 1 - There are no status errors
         * 2 - The SQL Helper creation and Content Provider creation check boxes exists 
         */
        isPageValidated = (!isAnyStatusWithError) && ((ckbCreateContentProviders != null));

        // set page completion
        setPageComplete(isPageValidated);
    }

    /**
     * Get the SQL Open Helper package name status. Basically, it points an error
     * in case there is no package.
     * 
     * @return SQL Open Helper package name status
     */
    private IStatus getDatabasePackageStatus() {
        IStatus status = null;

        // get the package name
        String packageName = getPackageText();
        // it must have a value
        if ((packageName == null) || (packageName.length() == 0)) {
            status = new Status(IStatus.ERROR, PLUGIN_ID,
                    CodeUtilsNLS.DatabaseManagementClassesCreationMainPage_UI_OpenHelperPackageNameMustNotBeEmpty);
        } else {
            status = new Status(IStatus.OK, PLUGIN_ID, ""); //$NON-NLS-1$
        }

        return status;
    }

    /**
     * Get the Content Providers package name status. Basically, it points an error
     * in case there is no package.
     * 
     * @return SQL Open Helper package name status
     */
    private IStatus getContentProvidersPackageStatus() {
        IStatus status = null;

        // get the package name
        String packageName = contentProviderPackageComposite != null
                ? contentProviderPackageComposite.getPackageText()
                : ""; //$NON-NLS-1$
        // it must have a value
        if ((packageName == null) || (packageName.length() == 0)) {
            status = new Status(IStatus.ERROR, PLUGIN_ID,
                    CodeUtilsNLS.DatabaseManagementClassesCreationMainPage_UI_ContentProvidersPackageNameMustNotBeEmpty);
        } else {
            status = new Status(IStatus.OK, PLUGIN_ID, ""); //$NON-NLS-1$
        }

        return status;
    }

    /**
     * Return the status regarding the mininum requirements
     * for the generation of classes. 
     * 
     * These requirements are simple:
     * there must be either the creation of SQL Open Helper classes.
     * 
     * @return Status regarding minimum requirements for the classes
     * generation. 
     */
    private IStatus getMinimumClassesGenerationRequirementsStatus() {
        IStatus status = null;
        status = new Status(IStatus.OK, PLUGIN_ID, ""); //$NON-NLS-1$        
        return status;
    }

    /**
     * Get this page Status list considering only
     * the {@link NewTypeWizardPage} inheritance. It means
     * that this method return status only related to elements
     * from {@link NewTypeWizardPage}. Other things associated, for instance,
     * with {@link FileChooser} or {@link ProjectChooser} are treated
     * some place else.
     * 
     * @return {@link NewTypeWizardPage} related status list
     */
    private IStatus[] getThisPageStatusList() {
        return new IStatus[] { fContainerStatus, isEnclosingTypeSelected() ? fEnclosingTypeStatus : fPackageStatus,
                fTypeNameStatus, };
    }

    /**
     * <p>
     * Check whether a Project Name refers to a Project. In case it does,
     * <code>null</code> is returned, otherwise, an {@link IStatus} is returned
     * indicating the error.
     * </p>
     * <p>
     * Note the the Project must belong to the current workspace.
     * </p>
     * 
     * @param projectName Project Name to be validated.
     * @return
     */
    private IStatus getProjectStatus(String projectName) {
        IStatus status = null;

        if ((projectName == null) || (projectName.length() == 0)) {
            // there must be a selected project
            status = new Status(IStatus.ERROR, PLUGIN_ID,
                    CodeUtilsNLS.UI_PersistenceWizardPageThereMustBeASelectedProject);
        } else {

            // get root workspace
            IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

            IProject[] projects = workspaceRoot.getProjects();

            // iterate through the projects
            if ((projects != null) && (projects.length > 0)) {
                // flag indicating whether the project was found
                boolean isProjectFound = false;

                for (IProject project : projects) {
                    if (project.getName().equals(projectName)) {
                        // the validation is OK, set the flag and quit the loop
                        isProjectFound = true;
                        break;
                    }
                }
                // in case the project was not found, set the flag
                if (!isProjectFound) {
                    status = new Status(IStatus.ERROR, PLUGIN_ID,
                            CodeUtilsNLS.UI_PersistenceWizardPageTheEnteredProjectIsInvalid);
                }
            } else {
                // there must be a selected project
                status = new Status(IStatus.ERROR, PLUGIN_ID,
                        CodeUtilsNLS.UI_PersistenceWizardPageThereMustBeASelectedProject);
            }
        }

        return status;
    }

    /**
     * Get a file validation status. In case the file is OK, <code>null</code>
     * is returned otherwise an error status is returned.
     * 
     * @param filePath The file path (including the file name) to be
     * validated
     * 
     * @return <code>null</code> in case the validation is OK, an error
     * status otherwise.
     */
    private IStatus getFileStatus(String filePath) {
        // get status
        IStatus status = null;
        // there must be a file path and it must not be empty
        if ((filePath == null) || filePath.equals("")) //$NON-NLS-1$
        {
            status = new Status(IStatus.ERROR, PLUGIN_ID,
                    CodeUtilsNLS.UI_PersistenceWizardPageThereMustBeASelectedDatabaseFile);
        } else {
            // validation result
            boolean isFileOK = false;
            // get path object
            Path path = new Path(filePath);

            // testing if the entered path is a folder
            isFileOK = path.toFile().isFile();
            if (!isFileOK) {
                status = new Status(IStatus.ERROR, PLUGIN_ID,
                        CodeUtilsNLS.UI_PersistenceWizardPageTheEnteredPathIsInvalid);
            } else {
                isFileOK = path.isValidPath(path.toString());

                if (!isFileOK) {
                    status = new Status(IStatus.ERROR, PLUGIN_ID,
                            CodeUtilsNLS.UI_PersistenceWizardPageTheEnteredPathIsInvalid);
                } else {
                    // Test if file exists
                    isFileOK = path.toFile().exists();
                    if (!isFileOK) {

                        status = new Status(IStatus.ERROR, PLUGIN_ID,
                                CodeUtilsNLS.UI_PersistenceWizardPageFileDoesNotExist);
                    } else {
                        try {
                            if (!DatabaseUtils.isValidSQLiteDatabase(path.toFile())) {
                                status = new Status(IStatus.ERROR, PLUGIN_ID,
                                        CodeUtilsNLS.UI_PersistenceWizardPageFileNotValid);

                            }
                        } catch (IOException e) {
                            status = new Status(IStatus.WARNING, PLUGIN_ID,
                                    CodeUtilsNLS.UI_PersistenceWizardPageFileNotEvaluated);
                        }

                        if (path.toFile().length() > MAX_FILE_SIZE) {
                            status = new Status(IStatus.WARNING, PLUGIN_ID, NLS
                                    .bind(CodeUtilsNLS.UI_PersistenceWizardPageFileTooLarge, MAX_FILE_CHAR_SIZE));
                        }
                    }

                }
            }
        }

        // in case there is no status, the validation went OK, or if the status is not an ERROR 
        // verify whether the file belongs to the project assets
        if ((status == null) || (status.getSeverity() != IStatus.ERROR)) {
            // verify whether the file is within assets folder
            if (!isFileWithinProjectAssets(new Path(filePath))) {
                // set the status
                status = new Status(IStatus.WARNING, PLUGIN_ID,
                        CodeUtilsNLS.UI_PersistenceWizardPageTheDatabaseFileWillBeCopiedToProjectsAssetsFolder);
            }
        }

        return status;
    }

    /**
     * Verifies whether a given file path belongs to the Projects assets
     * folder. <code>true</code> is returned in case it does, <code>false</code> otherwise.
     * 
     * @param path File path which will be verified whether it is in the Projects assets directory.
     * 
     * @return <code>true</code> in case the file path belongs to the Projects assets, <code>false</code>
     * otherwise.
     */
    private boolean isFileWithinProjectAssets(IPath path) {
        boolean isPathWithin = false;

        // proceed in case there is a project and a path
        if ((selectedProject != null) && (path != null)) {
            // make the assets path = project path + assets + file name
            IPath databaseInAssetsPath = selectedProject.getLocation().addTrailingSeparator().append(ASSESTS_FOLDER)
                    .addTrailingSeparator().append(path.toFile().getName());

            // the database path and the entered path must match
            isPathWithin = databaseInAssetsPath.toOSString().equals(path.toOSString());
        }

        return isPathWithin;
    }

    /**
     * Enable/disable children of the entered {@link Composite}.
     * 
     * @param composite Composite to have its children enabled/disabled
     * @param enabled <code>true</code> for enabling the elements, <code>false</code>
     * for disabling the elements.
     */
    private void setCompositeChildremEnabled(Composite composite, boolean enabled) {
        Control[] controls = composite.getChildren();
        if ((controls != null) && (controls.length > 0)) {
            for (Control control : controls) {
                control.setEnabled(enabled);
            }
        }
    }

    /**
     * Update project information within this wizard. Besides
     * the basic project field input update, the package fragment
     * root is determined and correctly updated in this wizard. Therefore,
     * use this method preferably to update the project so everything in the
     * wizard is updated accordingly.
     * 
     * @param project {@link IProject} information to update
     * @throws JavaModelException Exception thrown when there are problems retrieving
     * the projects fragment root.
     */
    private void updateProject(IProject project) throws JavaModelException {
        if (project != null) {
            // set selected project
            this.selectedProject = project;

            // update project text in case it is not already set correctly
            if ((projectChooser != null) && !projectChooser.getText().equals(project.getName())) {
                projectChooser.setText(project.getName());
            }

            // get the java project
            IJavaProject javaProject = JavaCore.create(project);
            IPackageFragmentRoot[] possibleRoots = null;
            // continue in case it does exist
            if (javaProject != null) {
                // get all possible roots
                possibleRoots = javaProject.getPackageFragmentRoots();
                // select the first one, in case it does exist
                if ((possibleRoots != null) && (possibleRoots.length > 0)) {
                    // set the first one
                    setPackageFragmentRoot(possibleRoots[0], true);
                    if (contentProviderPackageComposite != null) {
                        contentProviderPackageComposite.setPackageFragmentRoot(possibleRoots[0], true);
                    }
                }
            }
        } else {
            // update null information
            selectedProject = null;
            setPackageFragmentRoot(null, true);
            if (contentProviderPackageComposite != null) {
                contentProviderPackageComposite.setPackageFragmentRoot(null, true);
            }
        }
    }
}