1
/*******************************************************************************
2
* Copyright (c) 2007, 2011 Intel Corporation and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Intel Corporation - Initial API and implementation
11
*******************************************************************************/
12
package org.eclipse.cdt.build.internal.core.scannerconfig2;
14
import java.lang.ref.SoftReference;
15
import java.util.HashMap;
17
import java.util.Map.Entry;
19
import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext;
20
import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set;
21
import org.eclipse.cdt.build.internal.core.scannerconfig.CfgScannerConfigUtil;
22
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
23
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
24
import org.eclipse.cdt.make.core.MakeCorePlugin;
25
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
26
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2Set;
27
import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
28
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
29
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
30
import org.eclipse.cdt.managedbuilder.core.IFileInfo;
31
import org.eclipse.cdt.managedbuilder.core.IFolderInfo;
32
import org.eclipse.cdt.managedbuilder.core.IInputType;
33
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
34
import org.eclipse.cdt.managedbuilder.core.ITool;
35
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
36
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
37
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
38
import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildConfigurationData;
39
import org.eclipse.core.runtime.CoreException;
40
import org.eclipse.core.runtime.Preferences;
41
import org.eclipse.core.runtime.QualifiedName;
43
public class CfgScannerConfigInfoFactory2 {
44
private static final QualifiedName CONTAINER_INFO_PROPERTY = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "ScannerConfigBuilderInfo2Container"); //$NON-NLS-1$
46
private static class ContainerInfo{
48
IScannerConfigBuilderInfo2Set fContainer;
50
ContainerInfo(ICProjectDescription des, IScannerConfigBuilderInfo2Set container){
51
this.fCode = des.hashCode();
52
this.fContainer = container;
55
public boolean matches(ICProjectDescription des){
56
return des.hashCode() == fCode;
59
private static class CfgInfo implements ICfgScannerConfigBuilderInfo2Set {
60
private Configuration cfg;
61
private SoftReference<IScannerConfigBuilderInfo2Set> fContainer;
62
// private HashMap map;
64
CfgInfo(Configuration cfg){
69
public CfgInfoContext[] getContexts() {
70
Map<CfgInfoContext, IScannerConfigBuilderInfo2> map = createMap();
71
return map.keySet().toArray(new CfgInfoContext[map.size()]);
74
public IScannerConfigBuilderInfo2 getInfo(CfgInfoContext context) {
75
return createMap().get(context);
76
// IScannerConfigBuilderInfo2 info = null;
77
// if(!isPerRcTypeDiscovery()){
78
// info = cfg.getScannerConfigInfo();
80
// info = ScannerConfigInfoFactory2.create(cfg, ManagedBuilderCorePlugin.getDefault().getPluginPreferences());
83
// Tool tool = (Tool)context.getTool();
85
// info = tool.getScannerConfigInfo(context.getInputType());
87
//// info = getDefaultInfo();
92
public boolean isPerRcTypeDiscovery() {
93
return cfg.isPerRcTypeDiscovery();
96
private IScannerConfigBuilderInfo2Set getContainer() throws CoreException{
97
IScannerConfigBuilderInfo2Set container = fContainer != null ? fContainer.get() : null;
98
if(container == null){
99
if(!cfg.isPreference()){
100
ICConfigurationDescription cfgDes = ManagedBuildManager.getDescriptionForConfiguration(cfg);
102
ICProjectDescription projDes = cfgDes.getProjectDescription();
104
ContainerInfo cInfo = (ContainerInfo)projDes.getSessionProperty(CONTAINER_INFO_PROPERTY);
105
if(cInfo != null && cInfo.matches(projDes)){
106
container = cInfo.fContainer;
108
container = ScannerConfigProfileManager.createScannerConfigBuildInfo2Set(cfg.getOwner().getProject());
109
cInfo = new ContainerInfo(projDes, container);
110
projDes.setSessionProperty(CONTAINER_INFO_PROPERTY, cInfo);
115
if(container == null){
116
container = ScannerConfigProfileManager.createScannerConfigBuildInfo2Set(cfg.getOwner().getProject());
119
Preferences prefs = MakeCorePlugin.getDefault().getPluginPreferences();
120
container = ScannerConfigProfileManager.createScannerConfigBuildInfo2Set(prefs, false);
124
if(fContainer == null) {
125
fContainer = new SoftReference<IScannerConfigBuilderInfo2Set>(container);
130
private Map<CfgInfoContext, IScannerConfigBuilderInfo2> createMap(){
131
HashMap<CfgInfoContext, IScannerConfigBuilderInfo2> map = new HashMap<CfgInfoContext, IScannerConfigBuilderInfo2>();
133
IScannerConfigBuilderInfo2Set container = getContainer();
135
boolean isPerRcType = cfg.isPerRcTypeDiscovery();
136
Map<InfoContext, IScannerConfigBuilderInfo2> baseMap = container.getInfoMap();
138
CfgInfoContext c = new CfgInfoContext(cfg);
139
InfoContext baseContext = c.toInfoContext();
140
IScannerConfigBuilderInfo2 info = container.getInfo(baseContext);
143
String id = cfg.getDiscoveryProfileId();
145
id = CfgScannerConfigUtil.getFirstProfileId(cfg.getFilteredTools());
147
IScannerConfigBuilderInfo2 prefInfo = null;
148
if(!cfg.isPreference()){
149
IConfiguration prefCfg = ManagedBuildManager.getPreferenceConfiguration(false);
150
ICfgScannerConfigBuilderInfo2Set prefContainer = create(prefCfg);
151
prefInfo = prefContainer.getInfo(new CfgInfoContext(prefCfg));
153
if(prefInfo == null){
155
info = container.createInfo(baseContext, id);
157
info = container.createInfo(baseContext);
160
info = container.createInfo(baseContext, prefInfo, id);
162
info = container.createInfo(baseContext, prefInfo, prefInfo.getSelectedProfileId());
165
map.put(new CfgInfoContext(cfg), info);
167
Map<CfgInfoContext, IScannerConfigBuilderInfo2> configMap = getConfigInfoMap(baseMap);
169
IResourceInfo[] rcInfos = cfg.getResourceInfos();
170
for (IResourceInfo rcInfo : rcInfos) {
172
if(rcInfo instanceof IFolderInfo) {
173
tools = ((IFolderInfo)rcInfo).getFilteredTools();
175
tools = ((IFileInfo)rcInfo).getToolsToInvoke();
177
for (ITool tool : tools) {
178
IInputType types[] = tool.getInputTypes();
179
if(types.length != 0){
180
for (IInputType inputType : types) {
181
CfgInfoContext context = new CfgInfoContext(rcInfo, tool, inputType);
182
context = CfgScannerConfigUtil.adjustPerRcTypeContext(context);
183
if(context != null && context.getResourceInfo() != null){
184
IScannerConfigBuilderInfo2 info = configMap.get(context);
185
if(info == null && !inputType.isExtensionElement() && inputType.getSuperClass() != null){
186
CfgInfoContext superContext = new CfgInfoContext(rcInfo, tool, inputType.getSuperClass());
187
superContext = CfgScannerConfigUtil.adjustPerRcTypeContext(superContext);
188
if(superContext != null && superContext.getResourceInfo() != null){
189
info = configMap.get(superContext);
191
String id = CfgScannerConfigUtil.getDefaultProfileId(context, true);
192
InfoContext baseContext = context.toInfoContext();
195
info = container.createInfo(baseContext, id);
197
info = container.createInfo(baseContext);
201
info = container.createInfo(baseContext, info, id);
203
info = container.createInfo(baseContext, info);
208
map.put(context, info);
213
if(cfg.isPreference())
215
CfgInfoContext context = new CfgInfoContext(rcInfo, tool, null);
216
context = CfgScannerConfigUtil.adjustPerRcTypeContext(context);
217
if(context != null && context.getResourceInfo() != null){
218
IScannerConfigBuilderInfo2 info = configMap.get(context);
220
String id = CfgScannerConfigUtil.getDefaultProfileId(context, true);
221
InfoContext baseContext = context.toInfoContext();
223
info = container.createInfo(baseContext, id);
225
info = container.createInfo(baseContext);
229
map.put(context, info);
236
if(!configMap.isEmpty()){
237
for (Entry<CfgInfoContext, IScannerConfigBuilderInfo2> entry : configMap.entrySet()) {
238
if(map.containsKey(entry.getKey()))
240
CfgInfoContext c = entry.getKey();
241
if(c.getResourceInfo() != null || c.getTool() != null || c.getInputType() != null){
242
InfoContext baseC = c.toInfoContext();
243
if(!baseC.isDefaultContext())
244
container.removeInfo(baseC);
249
} catch (CoreException e){
250
ManagedBuilderCorePlugin.log(e);
256
private Map<CfgInfoContext, IScannerConfigBuilderInfo2> getConfigInfoMap(Map<InfoContext, IScannerConfigBuilderInfo2> baseMap){
257
Map<CfgInfoContext, IScannerConfigBuilderInfo2> map = new HashMap<CfgInfoContext, IScannerConfigBuilderInfo2>();
259
for (Entry<InfoContext, IScannerConfigBuilderInfo2> entry : baseMap.entrySet()) {
260
InfoContext baseContext = entry.getKey();
261
CfgInfoContext c = CfgInfoContext.fromInfoContext(cfg, baseContext);
263
IScannerConfigBuilderInfo2 info = entry.getValue();
271
public Map<CfgInfoContext,IScannerConfigBuilderInfo2> getInfoMap() {
275
public void setPerRcTypeDiscovery(boolean on) {
276
cfg.setPerRcTypeDiscovery(on);
279
public IScannerConfigBuilderInfo2 applyInfo(CfgInfoContext context,
280
IScannerConfigBuilderInfo2 base) {
282
IScannerConfigBuilderInfo2 newInfo;
283
IScannerConfigBuilderInfo2Set container = getContainer();
284
InfoContext baseContext = context.toInfoContext();
286
newInfo = container.createInfo(baseContext, base);
288
if(!baseContext.isDefaultContext())
289
container.removeInfo(baseContext);
290
newInfo = getInfo(context);
294
} catch (CoreException e) {
295
ManagedBuilderCorePlugin.log(e);
300
public IConfiguration getConfiguration() {
304
public boolean isProfileSupported(CfgInfoContext context,
306
if(!isPerRcTypeDiscovery())
309
return CfgScannerConfigProfileManager.isPerFileProfile(profileId);
313
public static ICfgScannerConfigBuilderInfo2Set create(IConfiguration cfg){
314
Configuration c = (Configuration)cfg;
315
ICfgScannerConfigBuilderInfo2Set container = c.getCfgScannerConfigInfo();
316
if(container == null){
317
container = new CfgInfo(c);
318
c.setCfgScannerConfigInfo(container);
323
public static void save(BuildConfigurationData data, ICProjectDescription des, ICProjectDescription baseDescription, boolean force) throws CoreException{
324
ContainerInfo info = (ContainerInfo)des.getSessionProperty(CONTAINER_INFO_PROPERTY);
326
if(info.matches(baseDescription)){
327
IScannerConfigBuilderInfo2Set baseContainer = info.fContainer;
328
baseContainer.save();
330
des.setSessionProperty(CONTAINER_INFO_PROPERTY, null);
332
Configuration cfg = (Configuration)data.getConfiguration();
333
CfgInfo cfgInfo = new CfgInfo(cfg);
334
cfg.setCfgScannerConfigInfo(cfgInfo);
335
cfgInfo.getInfoMap();
336
cfgInfo.getContainer().save();
337
des.setSessionProperty(CONTAINER_INFO_PROPERTY, null);
341
public static void savePreference(IConfiguration cfg) throws CoreException{
342
ICfgScannerConfigBuilderInfo2Set container = ((Configuration)cfg).getCfgScannerConfigInfo();
343
if(container != null){
344
IScannerConfigBuilderInfo2Set baseContainer = ((CfgInfo)container).getContainer();
345
if(baseContainer != null){
346
baseContainer.save();