/** * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.karaf.shell.console.completer; import java.io.File; import java.util.List; import org.apache.felix.service.command.CommandSession; import org.apache.karaf.shell.console.Completer; /** * <p>A file name completer takes the buffer and issues a list of * potential completions.</p> * * <p>This completer tries to behave as similar as possible to * <i>bash</i>'s file name completion (using GNU readline) * with the following exceptions:</p> * * <ul> * <li>Candidates that are directories will end with "/"</li> * <li>Wildcard regular expressions are not evaluated or replaced</li> * <li>The "~" character can be used to represent the user's home, * but it cannot complete to other users' homes, since java does * not provide any way of determining that easily</li> * </ul> * * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> * @since 2.3 */ @Deprecated public class FileCompleter implements Completer { private static String OS = System.getProperty("os.name").toLowerCase(); // TODO: Handle files with spaces in them private static final boolean OS_IS_WINDOWS = isWindows(); public FileCompleter(CommandSession session) { } public static boolean isWindows() { return (OS.indexOf("win") >= 0); } public int complete(String buffer, final int cursor, final List<String> candidates) { // buffer can be null if (candidates == null) { return 0; } if (buffer == null) { buffer = ""; } if (OS_IS_WINDOWS) { buffer = buffer.replace('/', '\\'); } String translated = buffer; File homeDir = getUserHome(); // Special character: ~ maps to the user's home directory if (translated.startsWith("~" + separator())) { translated = homeDir.getPath() + translated.substring(1); } else if (translated.startsWith("~")) { translated = homeDir.getParentFile().getAbsolutePath(); } else if (!(translated.startsWith(separator()))) { String cwd = getUserDir().getAbsolutePath(); translated = cwd + separator() + translated; } File file = new File(translated); final File dir; if (translated.endsWith(separator())) { dir = file; } else { dir = file.getParentFile(); } File[] entries = dir == null ? new File[0] : dir.listFiles(); return matchFiles(buffer, translated, entries, candidates); } protected String separator() { return File.separator; } protected File getUserHome() { return new File(System.getProperty("user.home")); } protected File getUserDir() { return new File("."); } protected int matchFiles(final String buffer, final String translated, final File[] files, final List<String> candidates) { if (files == null) { return -1; } int matches = 0; // first pass: just count the matches for (File file : files) { if (file.getAbsolutePath().startsWith(translated)) { matches++; } } for (File file : files) { if (file.getAbsolutePath().startsWith(translated)) { CharSequence name = file.getName() + (matches == 1 && file.isDirectory() ? separator() : " "); candidates.add(render(file, name).toString()); } } final int index = buffer.lastIndexOf(separator()); return index + separator().length(); } protected CharSequence render(final File file, final CharSequence name) { return name; } }