/*
 * Copyright 2015 Red Hat, Inc.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *  The Eclipse Public License is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  The Apache License v2.0 is available at
 *  http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 *
 *
 * Copyright (c) 2015 The original author or authors
 * ------------------------------------------------------
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution.
 *
 *     The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 *
 *     The Apache License v2.0 is available at
 *     http://www.opensource.org/licenses/apache2.0.php
 *
 * You may elect to redistribute this code under either of these licenses.
 *
 */

package io.vertx.ext.shell.command.base;

import io.vertx.core.cli.annotations.Argument;
import io.vertx.core.cli.annotations.DefaultValue;
import io.vertx.core.cli.annotations.Description;
import io.vertx.core.cli.annotations.Name;
import io.vertx.core.cli.annotations.Option;
import io.vertx.core.cli.annotations.Summary;
import io.vertx.core.file.FileProps;
import io.vertx.ext.shell.cli.Completion;
import io.vertx.ext.shell.command.AnnotatedCommand;
import io.vertx.ext.shell.command.CommandProcess;

import java.util.AbstractMap;
import java.util.Date;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream;

Author:Julien Viet
/** * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */
@Name("ls") @Summary("List directory content") public class FileSystemLs extends AnnotatedCommand { private boolean ell; private String file; private boolean all; @Option(shortName = "l", flag = true) @Description("list in long format") public void setEll(boolean ell) { this.ell = ell; } @Argument(index = 0, argName = "file", required = false) @Description("the file to list") @DefaultValue(".") public void setFile(String file) { this.file = file; } @Option(longName = "all", shortName = "a", required = false) @Description("include files that begins with .") public void setAll(boolean all) { this.all = all; } @Override public void process(CommandProcess process) { new FsHelper().ls(process.vertx(), process.session().get("cwd"), file, ar -> { if (ar.succeeded()) { Map<String, FileProps> result = ar.result(); if (result.size() > 0) { Stream<Map.Entry<String, FileProps>> entries = result.entrySet().stream(); // Keep only name entries = entries.map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey().substring(entry.getKey().lastIndexOf('/') + 1), entry.getValue())); // Filter -a option if (!all) { entries = entries.filter(entry -> !entry.getKey().startsWith(".")); } // Format name Function<Map.Entry<String, FileProps>, String> formatter; if (ell) { int width = result.values().stream().map(FileProps::size).max(Long::compare).get().toString().length(); String format = "%1$s %2$" + width + "s %3$tb %3$2te %3$tH:%3$tM %4$s"; formatter = entry -> { FileProps props = entry.getValue(); String a; if (props.isDirectory()) { a = "d"; } else if (props.isSymbolicLink()) { a = "l"; } else { a = "-"; } return String.format(format, a, props.size(), new Date(props.lastModifiedTime()), entry.getKey()); }; } else { formatter = Map.Entry::getKey; } // Here we go entries.map(formatter).forEach(file -> { process.write(file + "\n"); }); } else { process.write("ls:" + ar.cause().getMessage() + "\n"); } } else { process.write("ls: " + ar.cause().getMessage() + "\n"); } process.end(); }); } @Override public void complete(Completion completion) { new FsHelper().completionHandler().handle(completion); } }