/******************************************************************************* * 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.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.core.runtime.preferences.InstanceScope; public class AntlrConfiguration { private IPreferencesService service; private IScopeContext[] contexts; private IPath fFile; private IPath fFolder; private IPath fAbsoluteFile; private IPath fAbsoluteFolder; private Map<String, String> runtimePrefs; public AntlrConfiguration(IResource file) { IProject project = file.getProject(); service = Platform.getPreferencesService(); contexts = new IScopeContext[] { new ProjectScope(project), new InstanceScope(), new DefaultScope() }; fFile = file.getFullPath(); fFolder = fFile.removeLastSegments(1); fAbsoluteFile = file.getLocation(); fAbsoluteFolder = fAbsoluteFile.removeLastSegments(1); runtimePrefs = new HashMap<String, String>(); } public boolean getIncludeStackStraceOnInternalErrors() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_BUILDER_INCLUDE_STACK_TRACE_ON_INTERNAL_ERRORS)); } public boolean getNfa() { return Boolean.valueOf(getOption(AntlrConstants.ANTLR_BUILDER_NFA)); } public boolean getDfa() { return Boolean.valueOf(getOption(AntlrConstants.ANTLR_BUILDER_DFA)); } public boolean getReport() { return Boolean.valueOf(getOption(AntlrConstants.ANTLR_BUILDER_REPORT)); } public boolean getMarkResourcesAsDerived() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_GENERAL_MARK_GENERATED_RESOURCES_AS_DERIVED)); } public boolean getProfile() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_CODE_GENERATOR_PROFILE)); } public boolean getXDfaVerbose() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_BUILDER_X_DFA_VERBOSE)); } public boolean getXNoPrune() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_BUILDER_X_NO_PRUNE)); } public String getXmx() { return getOption(AntlrConstants.ANTLR_CODE_GENERATOR_MAX_MEMORY); } public String getXMaxSwitchCaseLabels() { return getOption(AntlrConstants.ANTLR_CODE_GENERATOR_X_MAX_SWITCH_CASE_LABELS); } public String getXMinSwitchAlts() { return getOption(AntlrConstants.ANTLR_CODE_GENERATOR_X_MIN_SWITCH_ALTS); } public boolean getXNoCollapse() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_BUILDER_X_NO_COLLAPSE)); } public boolean getXNoMergeStopStates() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_BUILDER_X_NO_MERGE_STOP_STATES)); } public boolean getDebug() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_CODE_GENERATOR_DEBUG)); } public boolean getTrace() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_CODE_GENERATOR_TRACE)); } public boolean getXdbgSt() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_CODE_GENERATOR_X_DBG_ST)); } public boolean getAppendJavaPackage() { return Boolean .valueOf(getOption(AntlrConstants.ANTLR_CODE_GENERATOR_APPEND_JAVA_PACKAGE_TO_OUTPUT_FOLDER)); } public boolean isOutputFolderRelativeToWorkspace() { if (getOption( AntlrConstants.ANTLR_SAVE_ACTIONS_GENERATE_RESOURCES_ENABLED) .equals("false")) return false; String outputOption = getOption(AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_OPTION); if (AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_OPTION_ABSOLUTE_FOLDER .equals(outputOption)) return false; return true; } public String getExternalOption(String name) { String value = runtimePrefs.get(name); if (name.equals("-o")) { value = getOutputOption(false); } else if (name.equals("-ro")) { value = getOutputOption(true); } return value; } public void setOption(String name, String value) { runtimePrefs.put(name, value); } public String getOption(String name) { String value = null; IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IResource resource = root.getFile(fFile); try { value = resource.getPersistentProperty(new QualifiedName( AntlrCore.PLUGIN_ID, name)); } catch (CoreException ex) { ex.printStackTrace(); } if (value == null) { value = service.getString(AntlrConstants.ANTLR_CORE, name, null, contexts); } if (value == null) { value = getExternalOption(name); } return value; } private String getOutputOption(boolean relative) { String generateResources = getOption(AntlrConstants.ANTLR_SAVE_ACTIONS_GENERATE_RESOURCES_ENABLED); String outputOption = getOption(AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_OPTION); String outputFolder = getOption(AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_FOLDER); if ("false".equals(generateResources)) { outputFolder = System.getProperty("java.io.tmpdir"); } else if (outputOption .equals(AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_OPTION_SAME_AS_GRAMMAR)) { if (relative) { outputFolder = fFolder.toOSString(); } else { outputFolder = fAbsoluteFolder.toOSString(); } } else if (outputOption .equals(AntlrConstants.ANTLR_CODE_GENERATOR_OUTPUT_OPTION_RELATIVE_FOLDER)) { String projectName = fFolder.segment(0); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IPath path = null; if (relative) { path = new Path(projectName); } else { path = root.getProject(projectName).getLocation(); } if (outputFolder != null && outputFolder.length() > 0) { String[] paths = outputFolder.replace('\\', '/').split("/"); for (String p : paths) { path = path.append(p); } } outputFolder = path.toOSString(); } return outputFolder; } }