/******************************************************************************* * Copyright (c) 2004, 2010 IBM 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: * IBM - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.make.internal.core.scannerconfig2; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector; import org.eclipse.cdt.make.core.scannerconfig.InfoContext; import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; /** * SCD Profile extension point object model * * @author vhirsl */ public class ScannerConfigProfile { /** * scannerInfoCollector element * * @author vhirsl */ public class ScannerInfoCollector { private IConfigurationElement configElem; public ScannerInfoCollector(IConfigurationElement configElem) { this.configElem = configElem; } public IScannerInfoCollector createScannerInfoCollector() { try { return (IScannerInfoCollector) configElem.createExecutableExtension("class"); //$NON-NLS-1$ } catch (CoreException e) { MakeCorePlugin.log(e); return null; } } public String getScope() { return configElem.getAttribute("scope"); //$NON-NLS-1$ } } /** * scannerInfoConsoleParser element * * @author vhirsl */ public final class ScannerInfoConsoleParser { private IConfigurationElement configElem; public ScannerInfoConsoleParser(IConfigurationElement configElem) { this.configElem = configElem; } public Object createScannerInfoConsoleParser() { try { return configElem.createExecutableExtension("class"); //$NON-NLS-1$ } catch (CoreException e) { MakeCorePlugin.log(e); return null; } } public String getCompilerCommands() { return configElem.getAttribute("compilerCommands"); //$NON-NLS-1$ } } /** * tag interface, a placeholder for either run or open element * * @author vhirsl */ protected abstract class Action { protected IConfigurationElement configElem; protected Action(IConfigurationElement configElem) { this.configElem = configElem; } public Object createExternalScannerInfoProvider() { if (configElem.getAttribute("class") != null) { //$NON-NLS-1$ try { return configElem.createExecutableExtension("class"); //$NON-NLS-1$ } catch (CoreException e) { MakeCorePlugin.log(e); } } return null; } public String getAttribute(String name) { return configElem.getAttribute(name); } } /** * run element * * @author vhirsl */ public final class Run extends Action { public Run(IConfigurationElement run) { super(run); } /* (non-Javadoc) * @see org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager.IAction#getNewExternalScannerInfoProvider() */ @Override public Object createExternalScannerInfoProvider() { Object provider = super.createExternalScannerInfoProvider(); if (provider == null) { // use the default one provider = new DefaultRunSIProvider(); } return provider; } } /** * open element * * @author vhirsl */ public final class Open extends Action { public Open(IConfigurationElement open) { super(open); } /* (non-Javadoc) * @see org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager.IAction#getNewExternalScannerInfoProvider() */ @Override public Object createExternalScannerInfoProvider() { Object provider = super.createExternalScannerInfoProvider(); if (provider == null) { // use the default one provider = new DefaultSIFileReader(); } return provider; } } /** * buildOutputProvider element * * @author vhirsl */ public final class BuildOutputProvider { private Open openFileAction; private ScannerInfoConsoleParser scannerInfoConsoleParser; public BuildOutputProvider(IConfigurationElement provider) { IConfigurationElement[] actions = provider.getChildren("open"); //$NON-NLS-1$ // take the first one if (actions.length > 0) { this.openFileAction = new ScannerConfigProfile.Open(actions[0]); } IConfigurationElement[] parsers = provider.getChildren("scannerInfoConsoleParser"); //$NON-NLS-1$ // take the first one this.scannerInfoConsoleParser = new ScannerConfigProfile.ScannerInfoConsoleParser(parsers[0]); } public Action getAction() { return openFileAction; } public ScannerInfoConsoleParser getScannerInfoConsoleParser() { return scannerInfoConsoleParser; } } /** * scannerInfoProvider element * * @author vhirsl */ public final class ScannerInfoProvider { public static final String RUN = "run";//$NON-NLS-1$ public static final String OPEN = "open";//$NON-NLS-1$ private String providerId; private String providerKind; // derived attribute private Action action; private ScannerInfoConsoleParser scannerInfoConsoleParser; public ScannerInfoProvider(IConfigurationElement provider) { providerId = provider.getAttribute("providerId"); //$NON-NLS-1$ IConfigurationElement[] actions = provider.getChildren(); providerKind = actions[0].getName(); if (providerKind.equals(RUN)) { this.action = new ScannerConfigProfile.Run(actions[0]); } else if (providerKind.equals(OPEN)) { this.action = new ScannerConfigProfile.Open(actions[0]); } else { // TODO Vmir generate an error } IConfigurationElement[] parsers = provider.getChildren("scannerInfoConsoleParser"); //$NON-NLS-1$ // take the first one scannerInfoConsoleParser = new ScannerConfigProfile.ScannerInfoConsoleParser(parsers[0]); } public String getProviderId() { return providerId; } public String getProviderKind() { return providerKind; } public Action getAction() { return action; } public ScannerInfoConsoleParser getScannerInfoConsoleParser() { return scannerInfoConsoleParser; } } // ScannerConfigProfile members private final String id; private ScannerInfoCollector scannerInfoCollector; private BuildOutputProvider buildOutputProvider; private Map<String, ScannerInfoProvider> scannerInfoProviders = new LinkedHashMap<String, ScannerInfoProvider>(); private Boolean supportsContext; public ScannerConfigProfile(String profileId) { id = profileId; load(); } /** * loads the profile from the manifest file. */ private void load() { IExtensionPoint extension = Platform.getExtensionRegistry(). getExtensionPoint(MakeCorePlugin.PLUGIN_ID, ScannerConfigProfileManager.SI_PROFILE_SIMPLE_ID); if (extension != null) { IExtension[] extensions = extension.getExtensions(); for (int i = 0; i < extensions.length; ++i) { String rProfileId = extensions[i].getUniqueIdentifier(); if (rProfileId != null && rProfileId.equals(getId())) { IConfigurationElement[] configElements = extensions[i].getConfigurationElements(); for (int j = 0; j < configElements.length; ++j) { String name = configElements[j].getName(); if (scannerInfoCollector == null && name.equals("scannerInfoCollector")) { //$NON-NLS-1$ scannerInfoCollector = new ScannerConfigProfile.ScannerInfoCollector(configElements[j]); } else if (name.equals("buildOutputProvider")) { //$NON-NLS-1$ buildOutputProvider = new ScannerConfigProfile.BuildOutputProvider(configElements[j]); } else if (name.equals("scannerInfoProvider")) { //$NON-NLS-1$ String providerId = configElements[j].getAttribute("providerId"); //$NON-NLS-1$ if (providerId != null && scannerInfoProviders.get(providerId) == null) { scannerInfoProviders.put(providerId, new ScannerConfigProfile.ScannerInfoProvider(configElements[j])); } } } break; } } } } /** * @return Returns the id. */ public String getId() { return id; } // access to model objects /** * @return Returns the list of providerIds */ public List<String> getSIProviderIds() { return new ArrayList<String>(scannerInfoProviders.keySet()); } /** * @return Returns the buildOutputProvider. */ public BuildOutputProvider getBuildOutputProviderElement() { return buildOutputProvider; } /** * @return Returns the scannerInfoCollector. */ public ScannerInfoCollector getScannerInfoCollectorElement() { return scannerInfoCollector; } public ScannerConfigScope getProfileScope() { ScannerConfigScope scope = null; if (scannerInfoCollector != null) { if (scannerInfoCollector.getScope().equals(ScannerConfigScope.PROJECT_SCOPE.toString())) { scope = ScannerConfigScope.PROJECT_SCOPE; } else if (scannerInfoCollector.getScope().equals(ScannerConfigScope.FILE_SCOPE.toString())) { scope = ScannerConfigScope.FILE_SCOPE; } } return scope; } /** * @return Returns the scannerInfoProviders. */ public ScannerInfoProvider getScannerInfoProviderElement(String providerId) { return scannerInfoProviders.get(providerId); } public boolean supportsContext(){ if(supportsContext == null){ ScannerInfoCollector cr = getScannerInfoCollectorElement(); if(cr != null){ IScannerInfoCollector collector = cr.createScannerInfoCollector(); if(collector != null){ Class<? extends IScannerInfoCollector> clazz = collector.getClass(); try { clazz.getMethod("setInfoContext", new Class[] {InfoContext.class}); //$NON-NLS-1$ supportsContext = Boolean.TRUE; } catch (SecurityException e) { } catch (NoSuchMethodException e) { } } } if(supportsContext == null) supportsContext = Boolean.FALSE; } return supportsContext.booleanValue(); } }