/*******************************************************************************
* 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.resources;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.InvalidPropertiesFormatException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.deved.antlride.core.AntlrCore;
import org.deved.antlride.core.AntlrLanguageTargetName;
import org.eclipse.core.runtime.IPath;
public class AntlrLanguageTargetRepository {
private static Properties defaults = null;
private static final String[] NO_KEYWORDS = new String[0];
private static final IPath LANG_HOME = AntlrCore.getDefault()
.getStateLocation().append("languages");
private static Map<String, AntlrLanguageTarget> languages = new HashMap<String, AntlrLanguageTarget>();
public static final String STRING_TEMPLATE_PATH = "org/antlr/codegen/templates";
public static AntlrLanguageTarget getLanguage(String name) {
return getLanguage(null, name);
}
public static boolean matchKeyword(String language, String keyword) {
AntlrLanguageTarget languageTarget = getLanguage(language);
if (languageTarget == null)
return false;
String[] keywords = languageTarget.getKeywords();
if (keywords == null)
return false;
for (String k : keywords) {
if (k.trim().equals(keyword.trim())) {
return true;
}
}
return false;
}
public static boolean likeLanguage(AntlrLanguageTargetName target, String language) {
String l1 = target.name().trim();
String l2 = String.valueOf(language).trim();
if(l1.equalsIgnoreCase(l2))
return true;
//check for derived language
AntlrLanguageTarget[] list = list();
for (AntlrLanguageTarget targets : list) {
if(l1.equals(targets.getParent())) {
return true;
}
}
return false;
}
public static AntlrLanguageTarget create(AntlrLanguageTarget parent,
String name, String path) {
AntlrLanguageTarget target = new AntlrLanguageTarget(parent.getName(),
name, parent.getKeywords(), path);
return target;
}
public static boolean exists(String language) {
return getLanguageTargetPath(language).toFile().exists();
}
private static IPath getLanguageTargetPath(String language) {
return LANG_HOME.append(language).addFileExtension("properties");
}
public static AntlrLanguageTarget[] list() {
List<AntlrLanguageTarget> langs = new ArrayList<AntlrLanguageTarget>();
File home = LANG_HOME.toFile();
if (home.exists()) {
File[] files = home.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".properties");
}
});
if (files != null) {
for (File file : files) {
try {
Properties properties = new Properties();
FileInputStream in = new FileInputStream(file);
properties.loadFromXML(in);
langs.add(new AntlrLanguageTarget(properties));
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InvalidPropertiesFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return langs.toArray(new AntlrLanguageTarget[langs.size()]);
}
public static void save(AntlrLanguageTarget target) {
try {
IPath path = getLanguageTargetPath(target.getName());
File file = path.toFile();
file.getParentFile().mkdirs();
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(file));
Properties properties = target.toProperties();
properties.storeToXML(out, target.getName());
out.close();
} catch (FileNotFoundException e) {
AntlrCore.error(e);
} catch (IOException e) {
AntlrCore.error(e);
}
}
public static AntlrLanguageTarget getLanguage(AntlrLanguageTarget parent,
String name) {
AntlrLanguageTarget targetLanguage = languages.get(name);
if (targetLanguage == null) {
AntlrLanguageTargetName includedTarget = AntlrLanguageTargetName.find(name);
if (includedTarget == null) {
AntlrLanguageTarget[] list = list();
for (AntlrLanguageTarget onelt : list) {
if (onelt.getName().equalsIgnoreCase(name)) {
targetLanguage = onelt;
}
}
} else {
Properties properties = getKeywords();
String allkeys = properties.getProperty(name + "_Keywords");
String[] keywords = NO_KEYWORDS;
if (allkeys != null) {
keywords = allkeys.split(",");
}
targetLanguage = new AntlrLanguageTarget(null, name, keywords,
null);
}
languages.put(name, targetLanguage);
}
return targetLanguage;
}
private static Properties getKeywords() {
if (defaults == null) {
InputStream in = AntlrLanguageTargetRepository.class
.getResourceAsStream("keywords.properties");
defaults = load(in);
}
return defaults;
}
private static Properties load(InputStream in) {
in = new BufferedInputStream(in);
Properties properties = new Properties();
try {
properties.load(in);
in.close();
} catch (IOException e) {
AntlrCore.error(e);
}
return properties;
}
public static void delete(AntlrLanguageTarget languageTarget) {
File file = getLanguageTargetPath(languageTarget.getName()).toFile();
file.delete();
}
}