/*******************************************************************************
* Copyright (c) 2007 Intel Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.core;
import org.eclipse.cdt.managedbuilder.core.IBuildObject;
import org.eclipse.cdt.managedbuilder.core.IFolderInfo;
import org.eclipse.cdt.managedbuilder.core.IModificationStatus;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
class ToolInfo {
private ITool fResultingTool;
private ITool fInitialTool;
private ITool fBaseTool;
private ITool fRealTool;
private IResourceInfo fRcInfo;
private int fFlag;
private ToolInfo fCorInfo;
private ConverterInfo fConverterInfo;
private IModificationStatus fModificationStatus;
public static final int ADDED = 1;
public static final int REMOVED = 1 << 1;
public static final int REMAINED = 1 << 2;
ToolInfo(IResourceInfo rcInfo, ITool tool, int flag){
fRcInfo = rcInfo;
updateInitialTool(tool);
fFlag = flag;
}
private static ITool calculateBaseTool(IResourceInfo rcInfo, ITool tool){
ITool baseTool = null;
if(tool.isExtensionElement()) {
IToolChain baseTc;
if(rcInfo instanceof IFolderInfo){
baseTc = ((IFolderInfo)rcInfo).getToolChain();
} else {
IFolderInfo foInfo = ((ResourceConfiguration)rcInfo).getParentFolderInfo();
baseTc = foInfo.getToolChain();
}
ITool realTool = ManagedBuildManager.getRealTool(tool);
if(realTool == null){
baseTool = tool;
} else {
// ITool[] tcTools = baseTc.getTools();
// baseTool = getBestMatchTool(realTool, tcTools);
//
// if(baseTool == null){
// IToolChain extTc = ManagedBuildManager.getExtensionToolChain(baseTc);
// if(extTc != null){
// baseTool = getBestMatchTool(realTool, extTc.getTools());
// }
// }
if(baseTool == null){
baseTool = tool;
}
}
} else if (rcInfo != tool.getParentResourceInfo()) {
baseTool = tool;
}
return baseTool;
}
public int getType(){
return fFlag;
}
public ITool getRealTool(){
if(fRealTool == null){
ITool baseTool = getBaseTool();
fRealTool = ManagedBuildManager.getRealTool(baseTool);
if(fRealTool == null)
fRealTool = fBaseTool;
}
return fRealTool;
}
void updateInitialTool(ITool tool){
if(fInitialTool == tool)
return;
fResultingTool = null;
fRealTool = null;
fInitialTool = tool;
fModificationStatus = null;
fBaseTool = calculateBaseTool(fRcInfo, tool);
}
public ITool getBaseTool(){
if(fBaseTool == null){
fBaseTool = ManagedBuildManager.getExtensionTool(fInitialTool);
if(fBaseTool == null)
fBaseTool = fInitialTool;
}
return fBaseTool;
}
public ITool getBaseExtensionTool(){
ITool tool = getBaseTool();
return ManagedBuildManager.getExtensionTool(tool);
}
public ITool getInitialTool(){
return fInitialTool;
}
public IModificationStatus getModificationStatus(){
if(fModificationStatus == null){
getResultingTool();
}
return fModificationStatus;
}
public ITool getResultingTool() {
switch(fFlag){
case ADDED:
if(fResultingTool == null || fResultingTool.getParentResourceInfo() != fRcInfo){
Tool result = null;
ModificationStatus status = null;
if(fConverterInfo != null){
IBuildObject resultBo = fConverterInfo.getConvertedFromObject();
if(!(resultBo instanceof Tool)) {
status = new ModificationStatus(ManagedMakeMessages.getString("ToolInfo.0")); //$NON-NLS-1$
} else {
result = (Tool)resultBo;
status = ModificationStatus.OK;
}
}
if(status != ModificationStatus.OK){
ITool baseTool = getBaseTool();
if(fRcInfo instanceof IFolderInfo){
IFolderInfo foInfo = (IFolderInfo)fRcInfo;
if(baseTool.isExtensionElement()){
result = new Tool((ToolChain)foInfo.getToolChain(), baseTool, ManagedBuildManager.calculateChildId(baseTool.getId(), null), baseTool.getName(), false);
} else {
ITool extTool = ManagedBuildManager.getExtensionTool(baseTool);
result = new Tool(foInfo.getToolChain(), extTool, ManagedBuildManager.calculateChildId(extTool.getId(), null), baseTool.getName(), (Tool)baseTool);
}
} else {
ResourceConfiguration fiInfo = (ResourceConfiguration)fRcInfo;
if(baseTool.isExtensionElement()){
result = new Tool(fiInfo, baseTool, ManagedBuildManager.calculateChildId(baseTool.getId(), null), baseTool.getName(), false);
} else {
ITool extTool = ManagedBuildManager.getExtensionTool(baseTool);
result = new Tool(fiInfo, extTool, ManagedBuildManager.calculateChildId(extTool.getId(), null), baseTool.getName(), (Tool)baseTool);
}
}
if(status == null)
status = ModificationStatus.OK;
}
result.updateParentResourceInfo(fRcInfo);
fResultingTool = result;
fModificationStatus = status;
}
return fResultingTool;
case REMOVED:
fModificationStatus = new ModificationStatus(ManagedMakeMessages.getString("ToolInfo.1")); //$NON-NLS-1$
return null;
case REMAINED:
default:
if(fResultingTool == null){
fModificationStatus = ModificationStatus.OK;
fResultingTool = fInitialTool;
}
return fResultingTool;
}
}
void setConversionInfo(ToolInfo corInfo, ConverterInfo converterInfo){
fCorInfo = corInfo;
fConverterInfo = converterInfo;
}
}