/*
* 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.support.completers;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.apache.karaf.shell.api.console.Candidate;
import org.apache.karaf.shell.api.console.CommandLine;
import org.apache.karaf.shell.api.console.Completer;
import org.apache.karaf.shell.api.console.Session;
public class UriCompleter implements Completer {
@Override
public int complete(Session session, CommandLine commandLine, List<String> candidates) {
throw new UnsupportedOperationException();
}
@Override
public void completeCandidates(Session session, CommandLine commandLine, List<Candidate> candidates) {
String arg = commandLine.getCursorArgument();
if (arg != null) {
if (arg.startsWith("mvn:")) {
maven(session, commandLine, candidates);
} else if (arg.startsWith("file:")) {
file(session, commandLine, candidates);
}
}
}
private void file(Session session, CommandLine commandLine, List<Candidate> candidates) {
String buffer = commandLine.getCursorArgument();
String path = buffer.substring("file:".length(), commandLine.getArgumentPosition());
String rem = "";
try {
Path dir;
if (path.length() == 0) {
for (Path root : FileSystems.getDefault().getRootDirectories()) {
candidates.add(new Candidate(root.toString(), false));
}
dir = Paths.get(".");
} else {
dir = Paths.get(decode(path));
if (!path.endsWith("/")) {
rem = dir.getFileName().toString();
dir = dir.getParent();
if (dir == null) {
dir = Paths.get(".");
}
}
}
if (Files.isDirectory(dir)) {
try (DirectoryStream<Path> paths = Files.newDirectoryStream(dir, rem + "*")) {
for (Path child : paths) {
String name = encode(child.getFileName().toString());
boolean isDir = Files.isDirectory(child);
if (isDir) {
name += "/";
}
String dirstr = dir.endsWith("/") ? dir.toString() : dir.toString() + "/";
candidates.add(new Candidate("file:" + dirstr + name, !isDir));
}
}
}
} catch (Exception e) {
// Ignore
}
}
private String encode(String s) {
return s.replaceAll(" ", "%20");
}
private String decode(String s) {
return s.replaceAll("%20", " ");
}
private void maven(Session session, CommandLine commandLine, List<Candidate> candidates) {
String repo = System.getProperty("user.home") + "/.m2/repository";
String buffer = commandLine.getCursorArgument();
String mvn = buffer.substring("mvn:".length(), commandLine.getArgumentPosition());
String rem = "";
try {
String[] parts = mvn.split("/");
if (parts.length == 0 || parts.length == 1 && !mvn.endsWith("/")) {
String known = "";
String group = "";
String[] dirs = parts.length > 0 ? parts[0].split("\\.") : new String[] { "" };
if (parts.length > 0 && parts[0].endsWith(".")) {
for (int i = 0; i < dirs.length; i++) {
known += dirs[i] + "/";
group += dirs[i] + ".";
}
} else {
for (int i = 0; i < dirs.length - 1; i++) {
known += dirs[i] + "/";
group += dirs[i] + ".";
}
rem = dirs[dirs.length - 1];
}
Path rep = Paths.get(repo);
Path dir = rep.resolve(known);
try (DirectoryStream<Path> paths = Files.newDirectoryStream(dir, rem + "*")) {
for (Path path : paths) {
if (Files.isDirectory(path)) {
String name = path.getFileName().toString();
candidates.add(new Candidate("mvn:" + group + name, false));
}
}
}
rem = group + rem;
} else if (parts.length == 1 || parts.length == 2 && !mvn.endsWith("/")) {
rem = parts.length > 1 ? parts[1] : "";
Path dir = Paths.get(repo + "/" + parts[0].replace(".", "/"));
try (DirectoryStream<Path> paths = Files.newDirectoryStream(dir, rem + "*")) {
for (Path path : paths) {
if (Files.isDirectory(path)) {
String name = path.getFileName().toString();
candidates.add(new Candidate("mvn:" + parts[0] + "/" + name, false));
}
}
}
} else if (parts.length == 2 || parts.length == 3 && !mvn.endsWith("/")) {
rem = parts.length > 2 ? parts[2] : "";
Path dir = Paths.get(repo + "/" + parts[0].replace(".", "/") + "/" + parts[1]);
try (DirectoryStream<Path> paths = Files.newDirectoryStream(dir, rem + "*")) {
for (Path path : paths) {
if (Files.isDirectory(path)) {
String name = path.getFileName().toString();
candidates.add(new Candidate("mvn:" + parts[0] + "/" + parts[1] + "/" + name, true));
}
}
}
}
} catch (Exception e) {
// Ignore
}
}
}