/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.core;
import java.text.MessageFormat;
import java.util.Collection;
import org.deved.antlride.core.integration.AntlrLanguageTargetService;
import org.deved.antlride.core.util.AntlrCoreExtensionPointHelper;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.AbstractLanguageToolkit;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IModelStatus;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
public class AntlrLanguageToolkit extends AbstractLanguageToolkit implements
IDLTKLanguageToolkit {
public static final String[] FILE_EXTENSIONS = { AntlrConstants.ANTLR_GRAMMAR_FILE_EXTENSION };
private static AntlrLanguageToolkit instance;
private Collection<AntlrLanguageTargetService> languageTargetServices;
private AntlrConsole console;
private Status ERROR_STATUS = new Status(IStatus.ERROR,
AntlrCore.PLUGIN_ID, -1, MessageFormat.format(
AntlrCoreMessages.convention_unit_notScriptName,
new Object[] { AntlrConstants.ANTLR_GRAMMAR_FILE_EXTENSION,
getLanguageName() }), null);
public AntlrLanguageToolkit() {
languageTargetServices = AntlrCoreExtensionPointHelper.loadExtensions(
AntlrCore.PLUGIN_ID,
AntlrCoreExtensionPointHelper.LANGUAGE_TARGET);
}
public AntlrLanguageTargetService getLanguageTargetService(String name) {
if (name == null)
return null;
AntlrLanguageTargetName languageTargetName = AntlrLanguageTargetName
.find(name);
if (languageTargetName == null)
return null;
for (AntlrLanguageTargetService languageTargetService : languageTargetServices) {
if (languageTargetName.equals(languageTargetService.getName())) {
return languageTargetService;
}
}
return null;
}
public boolean validResource(IResource resource) {
for (AntlrLanguageTargetService languageTargetService : languageTargetServices) {
if (!languageTargetService.accept(resource)) {
return false;
}
}
return true;
}
public static AntlrLanguageToolkit getDefault() {
if (instance == null) {
try {
instance = (AntlrLanguageToolkit) DLTKLanguageManager
.getLanguageToolkit(AntlrNature.NATURE_ID);
} catch (Throwable t) {
t.printStackTrace();
}
}
return instance;
}
public AntlrConsole getConsole() {
if (console == null) {
try {
BundleContext bundleContext = AntlrCore.getDefault()
.getContext();
ServiceReference serviceReference = bundleContext
.getServiceReference(AntlrConsole.class.getName());
console = (AntlrConsole) bundleContext
.getService(serviceReference);
} catch (Throwable t) {
AntlrCore.error("Can't access to the console", t);
}
}
return console;
}
public String getLanguageName() {
return "ANTLR";
}
public String getNatureId() {
return AntlrNature.NATURE_ID;
}
public boolean languageSupportZIPBuildpath() {
return false;
}
public IStatus validateSourceModule(IResource resource) {
String name = resource.getName();
if (!isGrammarFileName(name)) {
return ERROR_STATUS;
}
return validResource(resource) ? IModelStatus.VERIFIED_OK
: ERROR_STATUS;
}
private boolean isGrammarFileName(String name) {
String[] extensions = FILE_EXTENSIONS;
for (int i = 0; i < extensions.length; i++) {
if (name.endsWith("." + extensions[i])) {
return true;
}
}
return false;
}
public String getLanguageContentType() {
return "org.deved.antlride.antlrContentType";
}
}