package org.python.pydev.editor.codecompletion.shell; import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.python.pydev.core.IToken; import org.python.pydev.core.ObjectsInternPool; import org.python.pydev.core.ObjectsInternPool.ObjectsPoolMap; import org.python.pydev.core.log.Log; import org.python.pydev.logging.DebugSettings; import org.python.pydev.shared_core.string.FastStringBuffer; import org.python.pydev.shared_core.structure.Tuple; /*default*/class ShellConvert { private static final String TYPE_UNKNOWN_STR = String.valueOf(IToken.TYPE_UNKNOWN); private static final String ENCODING_UTF_8 = AbstractShell.ENCODING_UTF_8; /** * @return */ private static Tuple<String, List<String[]>> getInvalidCompletion() { List<String[]> l = new ArrayList<String[]>(); return new Tuple<String, List<String[]>>(null, l); } /** * @throws IOException */ static/*default*/Tuple<String, List<String[]>> convertStringToCompletions(FastStringBuffer read) throws IOException { if (read == null) { return getInvalidCompletion(); } ArrayList<String[]> list = new ArrayList<String[]>(); FastStringBuffer string = read.replaceAll("(", "").replaceAll(")", ""); StringTokenizer tokenizer = new StringTokenizer(string.toString(), ","); string = null; ObjectsPoolMap map = new ObjectsPoolMap(); //the first token is always the file for the module (no matter what) String file = ""; if (tokenizer.hasMoreTokens()) { file = URLDecoder.decode(tokenizer.nextToken(), ENCODING_UTF_8); while (tokenizer.hasMoreTokens()) { String token = ObjectsInternPool.internLocal(map, URLDecoder.decode(tokenizer.nextToken(), ENCODING_UTF_8)); if (!tokenizer.hasMoreTokens()) { return new Tuple<String, List<String[]>>(file, list); } String description = ObjectsInternPool.internLocal(map, URLDecoder.decode(tokenizer.nextToken(), ENCODING_UTF_8)); String args = ""; if (tokenizer.hasMoreTokens()) { args = ObjectsInternPool.internLocal(map, URLDecoder.decode(tokenizer.nextToken(), ENCODING_UTF_8)); } String type = TYPE_UNKNOWN_STR; if (tokenizer.hasMoreTokens()) { type = ObjectsInternPool.internLocal(map, URLDecoder.decode(tokenizer.nextToken(), ENCODING_UTF_8)); } //dbg(token); //dbg(description); if (!token.equals("ERROR:")) { list.add(new String[] { token, description, args, type }); } else { if (DebugSettings.DEBUG_CODE_COMPLETION) { Log.addLogLevel(); try { Log.toLogFile("Code completion shell error:", AbstractShell.class); Log.toLogFile(token, AbstractShell.class); Log.toLogFile(description, AbstractShell.class); Log.toLogFile(args, AbstractShell.class); Log.toLogFile(type, AbstractShell.class); } finally { Log.remLogLevel(); } } } } } return new Tuple<String, List<String[]>>(file, list); } }