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

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.compatibilityanalyser.ui.actions.ProjectViewPopupAction.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 project..."
*
*/
package com.nokia.s60tools.compatibilityanalyser.ui.actions;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
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.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
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.DefaultViewConfiguration;
import com.nokia.carbide.cdt.builder.EpocEngineHelper;
import com.nokia.carbide.cdt.builder.EpocEnginePathHelper;
import com.nokia.carbide.cdt.builder.ICarbideBuildManager;
import com.nokia.carbide.cdt.builder.project.ICarbideProjectInfo;
import com.nokia.carbide.cpp.epoc.engine.model.BldInfModelFactory;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IBldInfData;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IBldInfOwnedModel;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IBldInfView;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IExport;
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 project..."
 * 
 */
public class ProjectViewPopupAction implements IWorkbenchWindowActionDelegate {

    //private ICarbideProjectInfo prjInfo;

    private CompatibilityAnalyserEngine engine;
    private ISelection selection;
    private boolean isCancelled = false;

    public ProjectViewPopupAction() {
    }

    public void dispose() {
    }

    public void init(IWorkbenchWindow window) {
    }

    public void run(IAction action) {

        engine = new CompatibilityAnalyserEngine();
        ProductSdkData currentSdk = new ProductSdkData();
        engine.setCurrentSdkData(currentSdk);
        isCancelled = false;

        IRunnableWithProgress projProgInfo = new IRunnableWithProgress() {

            public void run(IProgressMonitor monitor) {

                try {
                    getSettingsForGivenSelection(selection, engine, monitor);

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

            }

        };

        try {
            new ProgressMonitorDialog(Display.getDefault().getActiveShell()).run(true, true, projProgInfo);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        if (isCancelled)
            return;

        if (engine.isLibraryAnalysisChecked()) {
            currentSdk.analyzeAllLibs = false;
        }
        engine.setCurrentSdkData(currentSdk);

        Runnable showWizardRunnable = new Runnable() {
            public void run() {
                WizardDialog wizDialog;
                //CompatibilityAnalyserEngine engine = new CompatibilityAnalyserEngine();

                AnalysisWizard wiz = new AnalysisWizard(engine);
                wizDialog = new WizardDialog(Display.getCurrent().getActiveShell(), wiz);
                wizDialog.create();
                wizDialog.getShell().setSize(wizDialog.getShell().getSize().x,
                        wizDialog.getShell().getSize().y + 70);
                wizDialog.addPageChangedListener(wiz);
                try {
                    wizDialog.open();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        Display.getDefault().syncExec(showWizardRunnable);

    }

    /**
     * Adds .dso file to the list,If the corresponding dso file of dll project exists. 
     * @param filePath path of dll file.
     */
    public static boolean addLibIfThisMMPisDll(IPath filePath, ICarbideProjectInfo prjInfo,
            ArrayList<String> libsList) {
        String epocRoot = FileMethods
                .convertForwardToBackwardSlashes(prjInfo.getDefaultConfiguration().getSDK().getEPOCROOT());

        String targetPath = FileMethods.appendPathSeparator(epocRoot) + CompatibilityAnalyserEngine.ARMV5_PATH;
        targetPath = FileMethods.appendPathSeparator(targetPath);

        java.io.File armv5lib = new File(targetPath + filePath.removeFileExtension()
                .addFileExtension(Messages.getString("ProjectViewPopupAction.dso")).toFile().getName()); //$NON-NLS-1$

        if (filePath.getFileExtension().equalsIgnoreCase(Messages.getString("ProjectViewPopupAction.dll"))) //$NON-NLS-1$
        {
            if (armv5lib.exists())
                libsList.add(armv5lib.getName());

            return true;
        } else
            return false;

    }

    private void getSettingsForGivenSelection(ISelection selection, CompatibilityAnalyserEngine engine,
            IProgressMonitor monitor) {
        ProductSdkData currentSdk = engine.getCurrentSdkData();
        //isCancelled = false;

        IProject project = null;
        ICarbideProjectInfo prjInfo = null;

        IPath mmpPath = null;

        ArrayList<String> usrIncList = new ArrayList<String>();
        ArrayList<String> sysIncList = new ArrayList<String>();
        ArrayList<String> hdrsList = new ArrayList<String>();
        ArrayList<String> libsList = new ArrayList<String>();

        if (selection instanceof IStructuredSelection) {
            Object firstElem = ((IStructuredSelection) selection).getFirstElement();

            if (firstElem instanceof IProject) {
                project = (IProject) firstElem;
            } else if (firstElem instanceof IFolder) {
                project = ((IFolder) firstElem).getProject();
            } else if (firstElem instanceof IFile) {
                project = ((IFile) firstElem).getProject();

                mmpPath = ((IFile) firstElem).getProjectRelativePath();
            }
        }

        ICarbideBuildManager mngr = CarbideBuilderPlugin.getBuildManager();
        prjInfo = mngr.getProjectInfo(project);
        if (project != null && !project.isOpen()) {
            MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                    Messages.getString("ProjectViewPopupAction.CompatibilityAnalyserError"),
                    "Selected Project is not opened.");
            return;
        }
        if (project != null && mngr.isCarbideProject(project))
            prjInfo = mngr.getProjectInfo(project);
        else {
            MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
                    Messages.getString("ProjectViewPopupAction.CompatibilityAnalyserError"),
                    Messages.getString("ProjectViewPopupAction.CouldNotReadInfoFromProject"));
            return;
        }

        if (monitor != null)
            monitor.beginTask("Reading Project Data ...", 10);

        if (selection instanceof TextSelection || ((selection instanceof IStructuredSelection)
                && (((IStructuredSelection) selection).getFirstElement() instanceof IFile))) {

            getIncludesFromThisMMP(prjInfo, mmpPath, usrIncList, sysIncList);

            if (monitor != null && monitor.isCanceled()) {
                isCancelled = true;
                monitor.done();
                return;
            } else if (monitor != null)
                monitor.worked(2);

            getHeadersFromUsrIncPaths(usrIncList, hdrsList, monitor);
            if (containsDllsAsTargets(prjInfo, mmpPath, libsList))
                engine.setLibraryAnalysis(true);

            if (monitor != null) {
                if (monitor.isCanceled()) {
                    isCancelled = true;
                    monitor.done();
                } else
                    monitor.worked(8);
            }
        } else {
            getIncludesFromThisProject(prjInfo, usrIncList, sysIncList);

            if (monitor != null && monitor.isCanceled()) {
                isCancelled = true;
                monitor.done();
                return;
            } else if (monitor != null)
                monitor.worked(2);

            getHeadersFromUsrIncPaths(usrIncList, hdrsList, monitor);
            if (projectContainsDllsAsTargets(prjInfo, libsList))
                engine.setLibraryAnalysis(true);

            if (monitor != null) {
                if (monitor.isCanceled()) {
                    isCancelled = true;
                    monitor.done();
                } else
                    monitor.worked(8);
            }

            getExportPathsAndFiles(prjInfo, usrIncList, hdrsList);
            if (monitor != null) {
                if (monitor.isCanceled()) {
                    isCancelled = true;
                    monitor.done();
                } else
                    monitor.worked(10);
            }
        }

        if (monitor != null) {
            monitor.done();

        }
        currentSdk.isOpenedFromProject = true;
        currentSdk.productSdkName = prjInfo.getDefaultConfiguration().getSDK().getUniqueId();
        currentSdk.projectName = project.getName();
        currentSdk.forcedHeaders = CompatibilityAnalyserEngine.getIncludesFromSrcFiles(project);
        currentSdk.currentHeaderDir = usrIncList.toArray(new String[0]);
        Collections.sort(hdrsList);
        currentSdk.HeaderFilesList = hdrsList.toArray(new String[0]);
        currentSdk.currentIncludes = sysIncList.toArray(new String[0]);

        currentSdk.defaultHeaderDir = false;
        currentSdk.analyseAll = false;
        currentSdk.useRecursive = true;
        currentSdk.usePlatformData = false;

        if (currentSdk.forcedHeaders != null)
            currentSdk.isForcedProvided = true;

        engine.setHeaderAnalysis(true);

        if (engine.isLibraryAnalysisChecked())
            currentSdk.libraryFilesList = libsList.toArray(new String[0]);
    }

    public void selectionChanged(IAction action, ISelection selection) {
        this.selection = selection;
    }

    private static void getIncludesFromThisMMP(ICarbideProjectInfo prjInfo, IPath mmpPath,
            ArrayList<String> usrIncList, ArrayList<String> sysIncList) {
        ArrayList<File> usrIncFiles = new ArrayList<File>();
        ArrayList<File> sysFiles = new ArrayList<File>();

        EpocEngineHelper.getMMPIncludePaths(prjInfo.getProject(), mmpPath, prjInfo.getDefaultConfiguration(),
                usrIncFiles, sysFiles);

        Iterator<File> i = usrIncFiles.iterator();

        if (usrIncFiles.size() > 0) {
            while (i.hasNext()) {
                File usrInc = i.next();

                if (usrInc.exists()) {
                    String userDir = FileMethods.convertForwardToBackwardSlashes(usrInc.toString());
                    if (!usrIncList.contains(userDir))
                        usrIncList.add(userDir);
                }
            }
        }

        i = sysFiles.iterator();

        String parentProjPath = FileMethods
                .convertForwardToBackwardSlashes(prjInfo.getProject().getLocation().toString());

        while (i.hasNext()) {
            File sysInc = i.next();

            if (sysInc.exists()) {
                String sysPath = FileMethods.convertForwardToBackwardSlashes(sysInc.toString());

                if (sysPath.startsWith(parentProjPath) && !usrIncList.contains(sysPath))
                    usrIncList.add(sysPath);

                sysIncList.add(sysPath);
            }
        }

    }

    private void getHeadersFromUsrIncPaths(ArrayList<String> inputPaths, ArrayList<String> filesList,
            IProgressMonitor monitor) {
        for (String input : inputPaths) {
            if (monitor.isCanceled()) {
                monitor.done();
                isCancelled = true;
                return;
            }
            ArrayList<String> prjHdrs = CompatibilityAnalyserEngine.getHeaderFilesFromDir(input);

            for (String s : prjHdrs) {
                if (!filesList.contains(s))
                    filesList.add(s);
            }
            processSubDirs(input, filesList, monitor);
        }
        monitor.worked(6);
    }

    private static boolean containsDllsAsTargets(ICarbideProjectInfo prjInfo, IPath mmpPath,
            ArrayList<String> libsList) {
        EpocEnginePathHelper helper = new EpocEnginePathHelper(prjInfo.getProject());

        boolean dllExists = false;

        IPath dllPath = EpocEngineHelper.getTargetPathForExecutable(prjInfo.getDefaultConfiguration(),
                helper.convertToFilesystem(mmpPath));

        if (dllPath != null)
            dllExists = addLibIfThisMMPisDll(dllPath, prjInfo, libsList);

        return dllExists;
    }

    private static boolean projectContainsDllsAsTargets(ICarbideProjectInfo prjInfo, ArrayList<String> libsList) {
        boolean dllExists = false;

        List<IPath> mmpList = EpocEngineHelper.getMMPFilesForProject(prjInfo);
        Iterator<IPath> mmpitr = mmpList.iterator();

        while (mmpitr.hasNext()) {
            if (containsDllsAsTargets(prjInfo, mmpitr.next(), libsList))
                dllExists = true;
        }
        return dllExists;
    }

    public static void getIncludesFromThisProject(ICarbideProjectInfo prjInfo, ArrayList<String> usrIncList,
            ArrayList<String> sysIncList) {
        ArrayList<File> usrFiles = new ArrayList<File>();
        ArrayList<File> sysFiles = new ArrayList<File>();

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

        Iterator<File> i = usrFiles.iterator();

        if (usrFiles.size() > 0) {
            while (i.hasNext()) {
                File usrIncFile = i.next();

                if (usrIncFile.exists()) {
                    String userDir = FileMethods.convertForwardToBackwardSlashes(usrIncFile.toString());
                    if (!usrIncList.contains(userDir))
                        usrIncList.add(userDir);
                }
            }
        }

        i = sysFiles.iterator();

        String parentProjPath = FileMethods
                .convertForwardToBackwardSlashes(prjInfo.getProject().getLocation().toString());

        while (i.hasNext()) {
            File sysInc = i.next();

            if (sysInc.exists()) {
                String sysPath = FileMethods.convertForwardToBackwardSlashes(sysInc.toString());

                if (sysPath.startsWith(parentProjPath) && !usrIncList.contains(sysPath))
                    usrIncList.add(sysPath);

                sysIncList.add(sysPath);
            }
        }
    }

    private static void getExportPathsAndFiles(ICarbideProjectInfo prjInfo, ArrayList<String> usrIncList,
            ArrayList<String> hdrsList) {
        DefaultViewConfiguration viewConfig = new DefaultViewConfiguration(prjInfo);

        EpocEnginePathHelper pathHelper = new EpocEnginePathHelper(prjInfo.getProject());
        IDocument doc = viewConfig.getViewParserConfiguration().getModelDocumentProvider()
                .getDocument(prjInfo.getAbsoluteBldInfPath().toFile());

        BldInfModelFactory factory = new BldInfModelFactory();

        IPath wsPath = prjInfo.getAbsoluteBldInfPath();
        IBldInfOwnedModel bldInfModel = factory.createModel(wsPath, doc);

        bldInfModel.parse();

        IBldInfView view = bldInfModel.createView(viewConfig);

        IBldInfData data = view.getData();

        List<IExport> exports = data.getExports();

        for (IExport xport : exports) {
            IPath exportPath = pathHelper.convertToFilesystem(xport.getSourcePath());

            if (exportPath.toFile().exists()) {
                String parentPath = exportPath.toFile().getParent();
                String fileName = exportPath.toFile().getName();

                if (!usrIncList.contains(parentPath))
                    usrIncList.add(parentPath);
                if (!hdrsList.contains(fileName) && CompatibilityAnalyserEngine.isSupportedType(fileName))
                    hdrsList.add(fileName);
            }

        }
    }

    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);
                }
            }

        }
    }
}