com.nokia.carbide.cpp.sdk.ui.shared.BuildTargetTreeNode.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.sdk.ui.shared.BuildTargetTreeNode.java

Source

/*
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*
*/

package com.nokia.carbide.cpp.sdk.ui.shared;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.TreeNode;

import com.nokia.carbide.cpp.internal.api.sdk.ISBSv2BuildContext;
import com.nokia.carbide.cpp.internal.api.sdk.SBSv2Utils;
import com.nokia.carbide.cpp.sdk.core.ISDKManager;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuildContext;
import com.nokia.carbide.cpp.sdk.core.ISymbianBuilderID;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.cpp.sdk.core.SDKCorePlugin;

/**
 * A tree node representing a Symbian OS SDK.  This node's children will be the
 * list of available build configurations.
 */
@SuppressWarnings("restriction")
public class BuildTargetTreeNode extends TreeNode {

    public static final String SDK_NODE_ERROR_EPOCROOT_INVALID = " SDK location does not exist! Check Symbian SDKs!"; //$NON-NLS

    /**
     * Constructs a new tree node for the given SDK
     * @param value the SDK to create the tree node for
     */
    public BuildTargetTreeNode(ISymbianSDK value) {
        this(value, false);
    }

    /**
     * Constructs a new tree node for the given SDK
     * @param value the SDK to create the tree node for
     * @since 1.4
     */
    public BuildTargetTreeNode(ISymbianSDK value, boolean sbsv2Project) {
        super(value);

        List<ISymbianBuildContext> configurations = sbsv2Project
                ? value.getBuildInfo(ISymbianBuilderID.SBSV2_BUILDER).getFilteredBuildConfigurations()
                : value.getBuildInfo(ISymbianBuilderID.SBSV1_BUILDER).getFilteredBuildConfigurations();

        if (configurations == null) {
            return;
        }
        TreeNode[] children = new TreeNode[configurations.size()];
        int index = 0;
        for (ISymbianBuildContext config : configurations) {
            children[index++] = new TreeNode(config) {
                @Override
                public String toString() {
                    ISymbianBuildContext context = (ISymbianBuildContext) getValue();
                    String sdkId = context.getSDK().getUniqueId();
                    String newDisplayString = stripSDKIDFromConfigName(context.getDisplayString(), sdkId);
                    if (context instanceof ISBSv2BuildContext) {
                        ISBSv2BuildContext v2Context = (ISBSv2BuildContext) context;
                        if (v2Context.getConfigQueryData().getConfigurationErrorMessage() != null
                                && v2Context.getConfigQueryData().getConfigurationErrorMessage().length() > 0) {
                            newDisplayString += " ERROR: "
                                    + v2Context.getConfigQueryData().getConfigurationErrorMessage();
                        }
                    }
                    return newDisplayString;
                }
            };
        }
        setChildren(children);
    }

    /**
     * Returns the unique id the SDK associated with this node
     */
    public String toString() {
        ISymbianSDK value = (ISymbianSDK) getValue();
        File f = new File(value.getEPOCROOT());
        if (!f.exists()) {
            return value.getUniqueId() + " (" + f.getAbsolutePath() + ") " + SDK_NODE_ERROR_EPOCROOT_INVALID;
        }
        return value.getUniqueId();
    }

    /**
     * Get the SDK for this node
     * @return the ISymbianSDK object for this tree node
     */
    public ISymbianSDK getSymbianSDK() {
        return (ISymbianSDK) getValue();
    }

    /**
     * Gets the list of SDK tree nodes for use in a tree viewer.  The SDK's are gathered
     * from the SDK preferences page.  Only enabled SDK's are used.  Each SDK node will
     * have build configurations for children appropriate for the SDK.  These configurations
     * are filtered based on the platform filtering preference panel.
     * @param sbsv2Project true if this is an SBSv2 project which affects how the build
     * configuration list is calculated
     * @param IRunnableContext - a runnable context for which to update a progress monitor. Cannot be null.
     * @return array of BuildTargetTreeNode, or null
     * @since 1.4
     */
    public static BuildTargetTreeNode[] getTreeViewerInput(final boolean sbsv2Project,
            IRunnableContext runnableContext) {

        final List<BuildTargetTreeNode> assembledInput = new ArrayList<BuildTargetTreeNode>();

        try {
            runnableContext.run(true, false, new IRunnableWithProgress() {

                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {

                    String msgPrefix = "Building SDK/Configuration Model: "; //$NON-NLS-N$

                    ISDKManager sdkMgr = SDKCorePlugin.getSDKManager();
                    List<ISymbianSDK> sdkList = sdkMgr.getSDKList();
                    monitor.beginTask(msgPrefix, sdkList.size() + 2);
                    if (sdkList == null)
                        return;

                    monitor.worked(1);
                    List<ISymbianSDK> sdkListCopy = new ArrayList<ISymbianSDK>();
                    // Only add SDKs that are enabled
                    for (ISymbianSDK currSDK : sdkList) {
                        if (currSDK.isEnabled()) {
                            sdkListCopy.add(currSDK);
                        }
                    }

                    if (sbsv2Project) {
                        // filter non-SBSv2 supported SDK's
                        sdkListCopy = SBSv2Utils.getSupportedSDKs(sdkListCopy);
                    }

                    BuildTargetTreeNode[] input = new BuildTargetTreeNode[sdkListCopy.size()];
                    int index = 0;
                    monitor.worked(1);
                    for (ISymbianSDK sdk : sdkListCopy) {
                        monitor.worked(1);
                        String sdkErr = ""; // If we are scanning due to errors in the SDK
                        if (!(new File(sdk.getEPOCROOT()).exists())) {
                            sdkErr = " (Building cache with bad EPOCROOT)";
                        }
                        monitor.setTaskName(msgPrefix + sdk.getUniqueId() + sdkErr);
                        BuildTargetTreeNode treeNode = new BuildTargetTreeNode(sdk, sbsv2Project);
                        if (treeNode.getChildren() != null || sbsv2Project) {
                            input[index++] = treeNode;
                        }
                    }

                    // Filter out any SDKs that don't have configs
                    monitor.worked(1);
                    for (BuildTargetTreeNode currNode : input) {
                        if (currNode != null) {
                            assembledInput.add(currNode);
                        }
                    }
                    monitor.done();
                }

            });
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if (assembledInput.size() == 0) {
            return null;
        }

        return assembledInput.toArray(new BuildTargetTreeNode[assembledInput.size()]);
    }

    private static String stripSDKIDFromConfigName(String configName, String sdkID) {
        return configName.replace("[" + sdkID + "]", "");
    }

}