/*******************************************************************************
* Copyright (c) 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.internal.core.settings.model;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
public class CConfigurationDataProviderDescriptor {
final static String DATA_PROVIDER_EXTPOINT_ID = CCorePlugin.PLUGIN_ID + "." + "CConfigurationDataProvider"; //$NON-NLS-1$ //$NON-NLS-2$
final static String DATA_PROVIDER = "provider"; //$NON-NLS-1$
final static String CLASS = "class"; //$NON-NLS-1$
final static String NATURES = "natures"; //$NON-NLS-1$
final static String CONFLICTING_NATURES = "conflictingNatures"; //$NON-NLS-1$
final static String ECLIPSE_BUILDERS = "eclipseBuilders"; //$NON-NLS-1$
final static String DELIMITER = ";"; //$NON-NLS-1$
private String fId;
private CConfigurationDataProvider fProvider;
private IExtension fExtension;
private IConfigurationElement fProviderElement;
// private String[] fBuilderIds;
private String[] fNatureIds;
private String[] fConflictingNatureIds;
public CConfigurationDataProviderDescriptor(IExtension extension){
fId = extension.getUniqueIdentifier();
fExtension = extension;
fProviderElement = getProviderElement(extension);
if(fProviderElement != null){
fNatureIds = toArray(fProviderElement.getAttribute(NATURES));
fConflictingNatureIds = toArray(fProviderElement.getAttribute(CONFLICTING_NATURES));
// fBuilderIds = toArray(fProviderElement.getAttribute(ECLIPSE_BUILDERS));
} else {
//fBuilderIds =
fNatureIds = new String[0];
fConflictingNatureIds = new String[0];
}
try {
fProvider = createProvider(extension);
} catch (CoreException e) {
CCorePlugin.log(e.getStatus());
}
}
private static String[] toArray(String value){
if(value == null)
return new String[0];
StringTokenizer t = new StringTokenizer(value, DELIMITER);
int num = t.countTokens();
List<String> list = new ArrayList<String>(num);
for(int i = 0; i < num; i++){
String v = t.nextToken().trim();
if(v.length() != 0)
list.add(v);
}
return list.toArray(new String[list.size()]);
}
public CConfigurationDataProvider getProvider() throws CoreException{
if(fProvider == null) {
fProvider = createProvider(fExtension);
}
return fProvider;
}
private static IConfigurationElement getProviderElement(IExtension ext){
IConfigurationElement elements[] = ext.getConfigurationElements();
for(int i = 0; i < elements.length; i++){
IConfigurationElement element = elements[i];
if(DATA_PROVIDER.equals(element.getName())){
return element;
}
}
return null;
}
private static CConfigurationDataProvider createProvider(IExtension ext) throws CoreException{
IConfigurationElement elements[] = ext.getConfigurationElements();
for(int i = 0; i < elements.length; i++){
IConfigurationElement element = elements[i];
if(DATA_PROVIDER.equals(element.getName())){
Object obj = element.createExecutableExtension(CLASS);
if(obj instanceof CConfigurationDataProvider){
return (CConfigurationDataProvider)obj;
} else
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CConfigurationDataProviderDescriptor.1")); //$NON-NLS-1$
}
}
throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CConfigurationDataProviderDescriptor.2")); //$NON-NLS-1$
}
public String getId(){
return fId;
}
public String[] getNatureIds(){
return fNatureIds.clone();
}
public String[] getConflictingNatureIds(){
return fConflictingNatureIds.clone();
}
/* public String[] getBuilderIds(){
return (String[])fBuilderIds.clone();
}
*/
}