/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.editorinput; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.preference.IPreferenceStore; import org.python.pydev.editor.preferences.PydevEditorPrefs; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.shared_core.string.StringUtils; /** * Class used to deal with the source locator prefs (even though they're edited in the SourceLocatorPrefsPage that's in * org.python.pydev.debug * * @author Fabio */ public class PySourceLocatorPrefs { /** * Constant used to define that a path should not be asked for (so, the translation will return nothing and * the user won't be bothered by that) */ public static final String DONTASK = "DONTASK"; public static final String ON_SOURCE_NOT_FOUND = "ON_SOURCE_NOT_FOUND"; public static final String FILE_CONTENTS_TIMEOUT = "FILE_CONTENTS_TIMEOUT"; public static final int DEFAULT_FILE_CONTENTS_TIMEOUT = 1500; public static final int ASK_FOR_FILE = 0; public static final int ASK_FOR_FILE_GET_FROM_SERVER = 1; public static final int GET_FROM_SERVER = 2; public static final int DEFAULT_ON_FILE_NOT_FOUND_IN_DEBUGGER = ASK_FOR_FILE_GET_FROM_SERVER; /** * Checks if a translation path passed is valid. * * @param translation the translation path entered by the user * @return null if it's valid or the error message to be shown to the user */ public static String isValid(String[] translation) { if (translation.length != 2) { return "Input must have 2 elements."; } if (translation[1].equals(DONTASK)) { return null; } if (!new File(translation[1]).exists()) { return StringUtils.format( "The file: %s does not exist and doesn't match 'DONTASK'.", translation[1]); } return null; } /** * @see #addPathTranslation(String) -- with toOSString for each path and a comma separator */ public static void addPathTranslation(IPath path, IPath location) { addPathTranslation(new String[] { path.toOSString(), location.toOSString() }); } /** * Any request to the passed path translation will be ignored. * @param path the path that should have the translation ignored (silently) */ public static void setIgnorePathTranslation(IPath path) { addPathTranslation(new String[] { path.toOSString(), DONTASK }); } /** * Adds a path to the translation table. * * @param translation the translation path to be added. * E.g.: * path asked, new path -- means that a request for the "path asked" should return the "new path" * path asked, DONTASK -- means that if some request for that file was asked it should silently ignore it * * E.g.: * c:\foo\c.py,c:\temp\c.py * c:\foo\c.py,DONTASK */ private static void addPathTranslation(String[] translation) { String valid = isValid(translation); if (valid != null) { throw new RuntimeException(valid); } IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); String available = store.getString(PydevEditorPrefs.SOURCE_LOCATION_PATHS); if (available == null || available.trim().length() == 0) { available = StringUtils.join(",", translation); } else { String pathAsked = translation[0].trim(); String existent = getPathTranslation(pathAsked); if (existent != null) { List<String> splitted = StringUtils.splitAndRemoveEmptyTrimmed(available, '\n'); final int size = splitted.size(); for (int i = 0; i < size; i++) { String s = splitted.get(i); String initialPart = StringUtils.splitAndRemoveEmptyTrimmed(s, ',').get(0).trim(); if (initialPart.equals(pathAsked)) { splitted.set(i, StringUtils.join(",", translation)); break; } } available = StringUtils.join("\n", splitted); } else { available += "\n"; available += StringUtils.join(",", translation); } } store.putValue(PydevEditorPrefs.SOURCE_LOCATION_PATHS, available); } /** * @see #getPathTranslation(String) -- with toOSString from path. */ public static String getPathTranslation(IPath pathToTranslate) { return getPathTranslation(pathToTranslate.toOSString()); } /** * Translates a path given the current translation settings * * @param pathToTranslate the path to be translated * @return the translated path or DONTASK or null if no translation path was found for it */ public static String getPathTranslation(String pathToTranslate) { pathToTranslate = pathToTranslate.trim(); IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); String available = store.getString(PydevEditorPrefs.SOURCE_LOCATION_PATHS); if (available == null || available.trim().length() == 0) { return null; //nothing available } else { for (String string : StringUtils.splitAndRemoveEmptyTrimmed(available, '\n')) { List<String> translation = StringUtils.splitAndRemoveEmptyTrimmed(string, ','); if (translation.size() == 2) { if (translation.get(0).trim().equals(pathToTranslate)) { return translation.get(1).trim(); } } } } return null; } /** * @param words words to be gotten as string * @return a string with all the passed words separated by '\n' */ public static String wordsAsString(List<String[]> words) { StringBuffer buf = new StringBuffer(); for (String[] string : words) { buf.append(string[0].trim()); buf.append(','); buf.append(string[1].trim()); buf.append('\n'); } return buf.toString(); } /** * @param string the string that has to be returned as a list of strings * @return an array of strings from the passed string (reverse logic from wordsAsString) */ public static List<String[]> stringAsWords(String string) { ArrayList<String[]> strs = new ArrayList<String[]>(); for (String str : StringUtils.splitAndRemoveEmptyTrimmed(string, '\n')) { final List<String> temp = StringUtils.splitAndRemoveEmptyTrimmed(str, ','); strs.add(temp.toArray(new String[temp.size()])); } return strs; } public static int getOnSourceNotFound() { IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); int onSourceNotFound = store.getInt(ON_SOURCE_NOT_FOUND); //Make sure that it's a valid value. if (onSourceNotFound < ASK_FOR_FILE || onSourceNotFound > GET_FROM_SERVER) { onSourceNotFound = DEFAULT_ON_FILE_NOT_FOUND_IN_DEBUGGER; } return onSourceNotFound; } public static int getFileContentsTimeout() { IPreferenceStore store = PydevPlugin.getDefault().getPreferenceStore(); int timeout = store.getInt(FILE_CONTENTS_TIMEOUT); if (timeout < 1000) { //Always let at least 1 sec timeout. timeout = 1000; } return timeout; } }