com.nokia.s60tools.compatibilityanalyser.ui.actions.AnalyseDirOnlyAction.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.compatibilityanalyser.ui.actions.AnalyseDirOnlyAction.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: Action class for the menu item, 
* "Run static analysis for this directory in project..."
*
*/
package com.nokia.s60tools.compatibilityanalyser.ui.actions;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;

import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
import com.nokia.carbide.cdt.builder.EpocEngineHelper;
import com.nokia.carbide.cdt.builder.ICarbideBuildManager;
import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
import com.nokia.s60tools.compatibilityanalyser.CompatibilityAnalyserPlugin;
import com.nokia.s60tools.compatibilityanalyser.data.ProductSdkData;
import com.nokia.s60tools.compatibilityanalyser.model.CompatibilityAnalyserEngine;
import com.nokia.s60tools.compatibilityanalyser.resources.Messages;
import com.nokia.s60tools.compatibilityanalyser.ui.wizards.AnalysisWizard;
import com.nokia.s60tools.compatibilityanalyser.utils.FileMethods;

/**
 * This is the action class bound with the popup menu action
 * "Run static analysis for this directory in project..."
 * 
 */

public class AnalyseDirOnlyAction implements IWorkbenchWindowActionDelegate {

    private CompatibilityAnalyserEngine engine;
    private String folderPath = null;
    private ArrayList<String> filesList;
    private ArrayList<String> libsList;
    private boolean isCancelled = false;
    private ICarbideProjectInfo prjInfo = null;
    private ProductSdkData currentSdk;

    public void dispose() {
    }

    public void init(IWorkbenchWindow window) {
    }

    /**
     * This method gets invoked when user selects the option,
     * 'Run static analysis for this directory in project...' from
     * the submenu of a folder.
     */
    public void run(IAction action) {

        IWorkbenchWindow window = CompatibilityAnalyserPlugin.getDefault().getWorkbench()
                .getActiveWorkbenchWindow();
        ISelection selection = (ISelection) window.getSelectionService().getSelection();

        engine = new CompatibilityAnalyserEngine();
        currentSdk = new ProductSdkData();

        currentSdk.isOpenedFromProject = true;

        try {
            isCancelled = false;
            engine.setHeaderAnalysis(true);
            if (selection instanceof TreeSelection) {
                IStructuredSelection treeSelection = (IStructuredSelection) selection;

                //In Carbide, some folders are instances of ICContainer class. 
                if (treeSelection.getFirstElement() instanceof IFolder
                        || treeSelection.getFirstElement() instanceof ICContainer) {
                    IFolder selectedFolder = null;
                    ICContainer container = null;
                    IProject parentProj = null;

                    if (treeSelection.getFirstElement() instanceof IFolder) {
                        selectedFolder = (IFolder) treeSelection.getFirstElement();
                        parentProj = selectedFolder.getProject();
                        folderPath = FileMethods
                                .convertForwardToBackwardSlashes(selectedFolder.getLocation().toString());
                    } else if (treeSelection.getFirstElement() instanceof ICContainer) {
                        container = (ICContainer) treeSelection.getFirstElement();
                        parentProj = container.getCProject().getProject();
                        folderPath = FileMethods
                                .convertForwardToBackwardSlashes(container.getResource().getLocation().toString());
                    }

                    ICarbideBuildManager mngr = CarbideBuilderPlugin.getBuildManager();

                    //Selected folder path is added to the list of
                    //directories, in Headers page of the wizard.

                    if (folderPath != null) {
                        currentSdk.defaultHeaderDir = false;
                        currentSdk.currentHeaderDir = new String[] { folderPath };
                        currentSdk.analyseAll = false;
                    } else {
                        MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                                Messages.getString("ProjectViewPopupAction.CompatibilityAnalyserError"),
                                "Unable to read selected Resource");
                        currentSdk.isOpenedFromProject = false;
                        return;
                    }
                    if (parentProj != null && mngr.isCarbideProject(parentProj)) {
                        prjInfo = mngr.getProjectInfo(parentProj);
                    } else {
                        MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                                Messages.getString("ProjectViewPopupAction.CompatibilityAnalyserError"),
                                Messages.getString("ProjectViewPopupAction.CouldNotReadInfoFromProject"));
                        currentSdk.isOpenedFromProject = false;
                        return;
                    }

                    currentSdk.projectName = parentProj.getName();
                    currentSdk.productSdkName = prjInfo.getDefaultConfiguration().getSDK().getUniqueId();

                    IRunnableWithProgress projProgInfo = new IRunnableWithProgress() {

                        public void run(IProgressMonitor monitor) {

                            try {
                                monitor.beginTask("Reading folder data...", 10);
                                filesList = getHeaderFilesFromFolder(folderPath, monitor);

                                ArrayList<String> sysIncList = new ArrayList<String>();

                                getSystemIncludesFromThisProject(prjInfo, sysIncList, monitor);

                                currentSdk.HeaderFilesList = filesList.toArray(new String[0]);
                                monitor.worked(6);
                                currentSdk.currentIncludes = sysIncList.toArray(new String[0]);

                                if (!isCancelled) {
                                    libsList = getCorrespondingDsos(filesList, monitor);
                                    monitor.worked(9);
                                }
                                if (libsList.size() != 0) {
                                    engine.setLibraryAnalysis(true);
                                    currentSdk.analyzeAllLibs = false;
                                    currentSdk.libraryFilesList = libsList.toArray(new String[0]);
                                }

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            monitor.done();
                        }
                    };

                    new ProgressMonitorDialog(Display.getDefault().getActiveShell()).run(true, true, projProgInfo);
                }
            }

            engine.setCurrentSdkData(currentSdk);

        } catch (Exception e) {
            e.printStackTrace();
        }

        if (isCancelled)
            return;

        Runnable showWizardRunnable = new Runnable() {
            public void run() {
                WizardDialog wizDialog;
                AnalysisWizard wiz = new AnalysisWizard(engine);
                wizDialog = new WizardDialog(Display.getCurrent().getActiveShell(), wiz);
                wizDialog.create();
                //wizDialog.getShell().setSize(550, 620);
                wizDialog.addPageChangedListener(wiz);
                try {
                    wizDialog.open();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        Display.getDefault().syncExec(showWizardRunnable);

    }

    /**
     * The method fetches system include paths for given project.
     * @param prjInfo specifies the details of selected carbide project.
     */
    private void getSystemIncludesFromThisProject(ICarbideProjectInfo prjInfo, ArrayList<String> sysIncList,
            IProgressMonitor monitor) {
        if (monitor != null)
            monitor.subTask("Getting System Include paths");

        ArrayList<File> usrFiles = new ArrayList<File>();
        ArrayList<File> sysFiles = new ArrayList<File>();

        EpocEngineHelper.getProjectIncludePaths(prjInfo, prjInfo.getDefaultConfiguration(), usrFiles, sysFiles);

        Iterator i = sysFiles.iterator();

        while (i.hasNext()) {
            String sysPath = i.next().toString();
            sysIncList.add(FileMethods.convertForwardToBackwardSlashes(sysPath));
        }
    }

    public void selectionChanged(IAction action, ISelection selection) {
    }

    private ArrayList<String> getHeaderFilesFromFolder(String folderPath, IProgressMonitor monitor) {
        if (monitor != null)
            monitor.subTask("Getting Headers List...");

        ArrayList<String> hdrsList = CompatibilityAnalyserEngine.getHeaderFilesFromDir(folderPath);
        processSubDirs(folderPath, hdrsList, monitor);

        if (monitor != null && !isCancelled)
            monitor.worked(5);

        return hdrsList;
    }

    private void processSubDirs(String folderPath, ArrayList<String> filesList, IProgressMonitor monitor) {
        if (monitor != null && monitor.isCanceled()) {
            isCancelled = true;
            monitor.done();
            return;
        }
        File selectedFolder = new File(folderPath);

        if (selectedFolder.exists()) {
            File[] subFolders = selectedFolder.listFiles(new FilenameFilter() {

                public boolean accept(File file, String name) {
                    File temp = new File(FileMethods.appendPathSeparator(file.getAbsolutePath()) + name);
                    if (temp.isDirectory())
                        return true;

                    return false;
                }

            });

            if (subFolders != null) {

                for (File file : subFolders) {
                    ArrayList<String> fileNames = CompatibilityAnalyserEngine
                            .getHeaderFilesFromDir(file.getAbsolutePath());

                    for (String s : fileNames) {
                        if (!filesList.contains(s))
                            filesList.add(s);
                    }

                    processSubDirs(file.getAbsolutePath(), filesList, monitor);
                }
            }

        }
    }

    private ArrayList<String> getCorrespondingDsos(ArrayList<String> filesList, IProgressMonitor monitor) {
        ArrayList<String> libsList = new ArrayList<String>();

        if (monitor != null)
            monitor.subTask("Getting Target Dso files...");

        for (String s : filesList) {

            if (monitor != null && monitor.isCanceled()) {
                isCancelled = true;
                monitor.done();
                return libsList;
            }
            ArrayList<String> targetDsos = CompatibilityAnalyserEngine.getTargetDsoForHeader(prjInfo, s);

            for (String dso : targetDsos) {
                if (!libsList.contains(dso))
                    libsList.add(dso);
            }

        }

        return libsList;
    }
}