core/com.nokia.carbide.cpp.sdk.ui/src/com/nokia/carbide/cpp/sdk/ui/shared/BuildTargetTreeNode.java
when building SDK/Config tree and EPOCROOT is missing, update status with: (Building cache with bad EPOCROOT)
/*
* 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 + "]", "");
}
}