/*******************************************************************************
* 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.make.internal.core.scannerconfig;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.cdt.core.settings.model.ICSettingBase;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.settings.model.extension.CFileData;
import org.eclipse.cdt.core.settings.model.extension.CFolderData;
import org.eclipse.cdt.core.settings.model.extension.CLanguageData;
import org.eclipse.cdt.core.settings.model.extension.CResourceData;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer;
import org.eclipse.cdt.make.core.scannerconfig.PathInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.CDataDiscoveredInfoCalculator.DiscoveredSettingInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.CDataDiscoveredInfoCalculator.ILangSettingInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.CDataDiscoveredInfoCalculator.IRcSettingInfo;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
public abstract class CDataDiscoveredInfoProcessor {
public void applyDiscoveredInfo(CConfigurationData cfgData, DiscoveredSettingInfo dsIinfo){
Map<IPath, CResourceData> map = CDataUtil.createPathRcDataMap(cfgData);
IRcSettingInfo info;
PathSettingsContainer cr = PathSettingsContainer.createRootContainer();
IRcSettingInfo[] infos = dsIinfo.getRcSettingInfos();
for(int i = 0; i < infos.length; i++){
info = infos[i];
applyInfo(cfgData, info, cr);
map.remove(info.getResourceData().getPath());
}
if(map.size() != 0){
CResourceData rcData = map.get(Path.EMPTY);
if(rcData != null){
info = CDataDiscoveredInfoCalculator.createEmptyRcSettingInfo((CFolderData)rcData);
applyInfo(cfgData, info, cr);
map.remove(Path.EMPTY);
}
if(map.size() != 0){
Set<Entry<IPath, CResourceData>> entries = map.entrySet();
for (Entry<IPath, CResourceData> entry : entries) {
IPath path = entry.getKey();
PathSettingsContainer curCr = cr.getChildContainer(path, false, false);
rcData = entry.getValue();
info = (IRcSettingInfo)curCr.getValue();
applyInfo(cfgData, rcData, info);
}
}
}
}
protected void applyInfo(CConfigurationData cfgData, CResourceData rcData, IRcSettingInfo info){
CLanguageData[] lDatas = getLangDatas(rcData);
ILangSettingInfo lInfo;
ILangSettingInfo lInfos[] = info.getLangInfos();
CLanguageData lData;
for(int k = 0; k < lDatas.length; k++){
lData = lDatas[k];
lInfo = getMatch(lData, lInfos);
if(lInfo != null){
setInfoForData(cfgData,
rcData,
lData,
lInfo.getFilePathInfo(),
info.getResourceData(),
lInfo.getLanguageData());
} else {
setInfoForData(cfgData, rcData, lData, null, null, null);
}
}
}
protected CLanguageData[] getLangDatas(CResourceData rcData){
if(rcData.getType() == ICSettingBase.SETTING_FILE){
CLanguageData lData = ((CFileData)rcData).getLanguageData();
if(lData != null)
return new CLanguageData[]{lData};
return new CLanguageData[0];
}
return ((CFolderData)rcData).getLanguageDatas();
}
protected ILangSettingInfo getMatch(CLanguageData lData, ILangSettingInfo lInfos[]){
ILangSettingInfo lInfo;
for(int i = 0; i < lInfos.length; i++){
lInfo = lInfos[i];
if(langDatasMatch(lData, lInfo.getLanguageData()))
return lInfo;
}
return null;
}
protected CLanguageData getMatch(CLanguageData lData, CLanguageData[] datas){
for(int i = 0; i < datas.length; i++){
if(langDatasMatch(lData, datas[i]))
return datas[i];
}
return null;
}
protected boolean langDatasMatch(CLanguageData lData1, CLanguageData lData2){
if(!CDataUtil.objectsEqual(lData1.getLanguageId(), lData2.getLanguageId()))
return false;
String[] tmp = lData1.getSourceContentTypeIds();
if(tmp != null && tmp.length != 0){
if(!Arrays.equals(tmp, lData2.getSourceContentTypeIds()))
return false;
} else {
if(!Arrays.equals(lData1.getSourceExtensions(), lData2.getSourceExtensions()))
return false;
}
return true;
}
protected void applyInfo(CConfigurationData cfgData, IRcSettingInfo info, PathSettingsContainer cr){
CResourceData rcData;
CLanguageData lData;
ILangSettingInfo lInfo;
rcData = info.getResourceData();
IPath path = rcData.getPath();
PathSettingsContainer curCr = cr.getChildContainer(path, true, true);
curCr.setValue(info);
ILangSettingInfo lInfos[] = info.getLangInfos();
for(int k = 0; k < lInfos.length; k++){
lInfo = lInfos[k];
lData = lInfo.getLanguageData();
setInfoForData(cfgData, rcData, lData, lInfo.getFilePathInfo(), null, null);
}
}
protected abstract void setInfoForData(CConfigurationData cfgData,
CResourceData rcData,
CLanguageData lData,
PathInfo pi,
CResourceData baseRcData,
CLanguageData baseLangData);
}