/*******************************************************************************
* Copyright (c) 2007, 2011 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.model;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ILanguageDescriptor;
import org.eclipse.cdt.internal.core.CExtensionDescriptor;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
public class LanguageDescriptor extends CExtensionDescriptor implements
ILanguageDescriptor {
private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
private static final String ELEMENT_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
private static final String NAMESPACE_SEPARATOR = "."; //$NON-NLS-1$
private ILanguage fLanguage;
private String fContentTypeIds[];
private String fId;
private IContentType[] fContentTypes;
public LanguageDescriptor(IConfigurationElement el) {
super(el);
}
@Override
public ILanguage getLanguage() {
if(fLanguage == null){
SafeRunner.run(new ISafeRunnable(){
@Override
public void handleException(Throwable exception) {
CCorePlugin.log(exception);
}
@Override
public void run() throws Exception {
fLanguage = (ILanguage)getConfigurationElement().createExecutableExtension(ATTRIBUTE_CLASS);
}
});
}
return fLanguage;
}
@Override
public String[] getContentTypeIds() {
if(fContentTypeIds == null){
fContentTypeIds = calculateCintentTypeIds();
}
return fContentTypeIds;
}
private String[] calculateCintentTypeIds(){
IConfigurationElement el = getConfigurationElement();
IConfigurationElement children[] = el.getChildren();
String ids[] = new String[children.length];
int num = 0;
String tmp;
if(children.length > 0){
for(int i = 0; i < children.length; i++){
if(ELEMENT_CONTENT_TYPE.equals(children[i].getName())){
tmp = children[i].getAttribute(ATTRIBUTE_ID);
if(tmp != null)
ids[num++] = tmp;
}
}
if(num < children.length){
String t[] = new String[num];
System.arraycopy(ids, 0, t, 0, num);
ids = t;
}
}
return ids;
}
@Override
public String getId(){
if(fId == null)
fId = getConfigurationElement().getNamespaceIdentifier() + NAMESPACE_SEPARATOR + super.getId();
return fId;
}
@Override
public IContentType[] getContentTypes() {
if(fContentTypes == null){
fContentTypes = calculateContentTypes(getContentTypeIds());
}
return fContentTypes;
}
private IContentType[] calculateContentTypes(String ids[]){
IContentType cTypes[] = new IContentType[ids.length];
if(ids.length > 0){
int num = 0;
IContentTypeManager manager = Platform.getContentTypeManager();
for (int k = 0; k < ids.length; ++k) {
IContentType langContType = manager.getContentType(ids[k]);
if(langContType != null)
cTypes[num++] = langContType;
}
if(num < ids.length){
IContentType tmp[] = new IContentType[num];
System.arraycopy(cTypes, 0, tmp, 0, num);
cTypes = tmp;
}
}
return cTypes;
}
}