/*******************************************************************************
* Copyright (c) 2007, 2010 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.build.core.scannerconfig;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
import org.eclipse.cdt.managedbuilder.core.IBuildObject;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.content.IContentType;
public final class CfgInfoContext{
private static final String DELIMITER = ";"; //$NON-NLS-1$
private static final int NULL_OBJ_CODE = 29;
private Configuration fCfg;
private IResourceInfo fRcInfo;
private ITool fTool;
private IInputType fInType;
private InfoContext fContext;
public CfgInfoContext(IResourceInfo rcInfo, ITool tool, IInputType inType){
this(rcInfo, tool, inType, null);
}
private CfgInfoContext(IResourceInfo rcInfo, ITool tool, IInputType inType, InfoContext baseContext){
this.fRcInfo = rcInfo;
this.fTool = tool;
this.fInType = inType;
this.fCfg = (Configuration)fRcInfo.getParent();
this.fContext = baseContext;
}
public CfgInfoContext(IConfiguration cfg){
this(cfg, null);
}
private CfgInfoContext(IConfiguration cfg, InfoContext baseContext){
this.fCfg = (Configuration)cfg;
this.fContext = baseContext;
}
public IConfiguration getConfiguration(){
return fCfg;
}
public IResourceInfo getResourceInfo(){
return fRcInfo;
}
public ITool getTool(){
return fTool;
}
public IInputType getInputType(){
return fInType;
}
public InfoContext toInfoContext(){
if(fContext == null){
IProject project = fCfg.isPreference() ? null : fCfg.getOwner().getProject();
StringBuffer buf = new StringBuffer();
buf.append(fCfg.getId());
if(fRcInfo != null){
buf.append(DELIMITER);
buf.append(fRcInfo.getId());
}
if(fTool != null){
buf.append(DELIMITER);
buf.append(fTool.getId());
}
if(fInType != null){
buf.append(DELIMITER);
buf.append(fInType.getId());
}
ILanguage language = null;
if (fInType!=null) {
IContentType contentType = fInType.getSourceContentType();
if (contentType!=null) {
language = LanguageManager.getInstance().getLanguage(contentType);
}
}
String instanceId = buf.toString();
fContext = new InfoContext(project, instanceId, language);
}
return fContext;
}
public static CfgInfoContext fromInfoContext(ICProjectDescription des, InfoContext context) {
IProject project = context.getProject();
if(project == null)
return null;
String instanceId = context.getInstanceId();
if(instanceId.length() == 0)
return null;
String[] ids = CDataUtil.stringToArray(instanceId, DELIMITER);
String cfgId = ids[0];
ICConfigurationDescription cfgDes = des.getConfigurationById(cfgId);
if(cfgDes == null)
return null;
IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(cfgDes);
if(cfg == null)
return null;
return doCreate(cfg, ids, context);
}
private static CfgInfoContext doCreate(IConfiguration cfg, String[] ids, InfoContext context){
String rcInfoId = null, toolId = null, inTypeId = null;
IResourceInfo rcInfo = null;
ITool tool = null;
IInputType inType = null;
switch(ids.length){
case 4:
inTypeId = ids[3];
case 3:
toolId = ids[2];
case 2:
rcInfoId = ids[1];
}
if(rcInfoId != null){
rcInfo = (IResourceInfo)find(cfg.getResourceInfos(), rcInfoId);
if(rcInfo == null){
return null;
}
}
if(toolId != null){
tool = (ITool)find(rcInfo.getTools(), toolId);
if(tool == null)
return null;
}
if(inTypeId != null){
inType = (IInputType)find(tool.getInputTypes(), inTypeId);
if(inType == null)
return null;
}
if(rcInfo != null)
return new CfgInfoContext(rcInfo, tool, inType, context);
return new CfgInfoContext(cfg, context);
}
public static CfgInfoContext fromInfoContext(IConfiguration cfg, InfoContext context) {
IProject project = context.getProject();
if(project == null)
return null;
String instanceId = context.getInstanceId();
if(instanceId.length() == 0)
return null;
String[] ids = CDataUtil.stringToArray(instanceId, DELIMITER);
String cfgId = ids[0];
if(!cfgId.equals(cfg.getId()))
return null;
return doCreate(cfg, ids, context);
}
private static IBuildObject find(IBuildObject objs[], String id){
for(int i = 0; i < objs.length; i++){
if(objs[i].getId().equals(id))
return objs[i];
}
return null;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof CfgInfoContext))
return false;
CfgInfoContext other = (CfgInfoContext)obj;
if(!checkBuildObjects(other.fCfg, fCfg))
return false;
if(!checkBuildObjects(other.fRcInfo, fRcInfo))
return false;
if(!checkBuildObjects(other.fTool, fTool))
return false;
if(!checkBuildObjects(other.fInType, fInType))
return false;
return true;
}
@Override
public int hashCode() {
int code = getCode(fCfg);
code += getCode(fRcInfo);
code += getCode(fTool);
code += getCode(fInType);
return code;
}
private boolean checkBuildObjects(IBuildObject bo1, IBuildObject bo2){
if(bo1 == null)
return bo2 == null;
if(bo2 == null)
return false;
return bo1.getId().equals(bo2.getId());
}
private int getCode(IBuildObject bo){
if(bo == null)
return NULL_OBJ_CODE;
return bo.getId().hashCode();
}
}