Skip to content

Commit 6395e72

Browse files
committed
ls command Update
-Handle Usage Pattern: ls [flags] [file/directory] - Update to Main: Handling only the Command Name & remaining parsing done is respective Command File.
1 parent 8331799 commit 6395e72

File tree

2 files changed

+74
-37
lines changed

2 files changed

+74
-37
lines changed

src/com/unixtools/Main.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.unixtools;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
63
import com.unixtools.core.CommandExecutor;
74

85
public class Main {
@@ -13,19 +10,8 @@ public static void main(String[] args) {
1310
}
1411

1512
String commandName = args[0];
16-
List<String> commandArgsList = new ArrayList<>();
17-
18-
for (int i = 1; i < args.length; i++) {
19-
if (args[i].startsWith("-") && args[i].length() > 1) {
20-
for (int j = 1; j < args[i].length(); j++) {
21-
commandArgsList.add("-" + args[i].charAt(j));
22-
}
23-
} else {
24-
commandArgsList.add(args[i]);
25-
}
26-
}
27-
28-
String[] commandArgs = commandArgsList.toArray(new String[0]);
13+
String[] commandArgs = new String[args.length - 1];
14+
System.arraycopy(args, 1, commandArgs, 0, args.length - 1);
2915

3016
CommandExecutor executor = new CommandExecutor();
3117
executor.executeCommand(commandName, commandArgs);
Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,104 @@
11
package com.unixtools.command.filemanagement;
22

3+
import com.unixtools.core.Command;
4+
35
import java.io.File;
6+
import java.nio.file.Path;
7+
import java.nio.file.Paths;
48
import java.text.SimpleDateFormat;
5-
import java.util.Arrays;
9+
import java.util.ArrayList;
610
import java.util.List;
711

8-
import com.unixtools.core.Command;
9-
1012
public class LsCommand implements Command {
11-
private static final String VALID_FLAGS = "-a, -l, -R";
13+
private static final String VALID_FLAGS = "alR";
1214

1315
@Override
1416
public void execute(String[] args) {
15-
List<String> arguments = Arrays.asList(args);
16-
if (!arguments.stream().allMatch(arg -> arg.equals("-a") || arg.equals("-l") || arg.equals("-R"))) {
17+
List<String> flags = new ArrayList<>();
18+
String path = parseArguments(args, flags);
19+
20+
if (!validateFlags(flags)) {
1721
System.out.println("Invalid flag(s). Valid flags are: " + VALID_FLAGS);
1822
return;
1923
}
2024

21-
File currentDir = new File(".");
22-
processDirectory(currentDir, arguments, 0, "");
25+
File directory = validatePath(path);
26+
if (directory == null)
27+
return;
28+
29+
processDirectory(directory, flags, 0, "");
2330
}
2431

25-
private void processDirectory(File dir, List<String> arguments, int level, String prefix) {
26-
boolean longListing = arguments.contains("-l");
27-
boolean recursive = arguments.contains("-R");
32+
private String parseArguments(String[] args, List<String> flags) {
33+
String path = ".";
34+
for (String arg : args) {
35+
if (arg.startsWith("-")) {
36+
for (char flag : arg.substring(1).toCharArray()) {
37+
flags.add(String.valueOf(flag));
38+
}
39+
} else {
40+
path = normalizePath(arg);
41+
break;
42+
}
43+
}
44+
return path;
45+
}
2846

29-
File[] filesList = dir.listFiles(file -> arguments.contains("-a") || !file.isHidden());
30-
if (filesList == null || filesList.length == 0) {
31-
if (level == 0) {
32-
System.out.println("..");
47+
private String normalizePath(String path) {
48+
String normalizedPath = path.replace("\\", "/");
49+
Path pathObj = Paths.get(normalizedPath).normalize();
50+
return pathObj.toString();
51+
}
52+
53+
private boolean validateFlags(List<String> flags) {
54+
for (String flag : flags) {
55+
if (!VALID_FLAGS.contains(flag)) {
56+
return false;
3357
}
58+
}
59+
return true;
60+
}
61+
62+
private File validatePath(String path) {
63+
File dir = new File(path);
64+
if (!dir.exists()) {
65+
System.out.println("The specified directory does not exist.");
66+
return null;
67+
}
68+
if (!dir.isDirectory()) {
69+
System.out.println("The specified path is not a directory.");
70+
return null;
71+
}
72+
return dir;
73+
}
74+
75+
private void processDirectory(File dir, List<String> flags, int level, String prefix) {
76+
boolean longListing = flags.contains("l");
77+
boolean recursive = flags.contains("R");
78+
79+
File[] filesList = dir.listFiles(file -> flags.contains("a") || !file.isHidden());
80+
if (filesList == null || filesList.length == 0) {
81+
System.out.println(prefix + "Empty directory.");
3482
return;
3583
}
3684

3785
for (int i = 0; i < filesList.length; i++) {
3886
File file = filesList[i];
39-
String connector = (i < filesList.length - 1) ? "├── " : "└── ";
40-
String childPrefix = (i < filesList.length - 1) ? "| " : " ";
41-
42-
System.out.print(prefix + connector);
87+
printTreeStructure(file, i, filesList.length, prefix);
4388
printFileInfo(file, longListing);
4489

4590
if (recursive && file.isDirectory()) {
46-
processDirectory(file, arguments, level + 1, prefix + childPrefix);
91+
String nextPrefix = prefix + (i < filesList.length - 1 ? "| " : " ");
92+
processDirectory(file, flags, level + 1, nextPrefix);
4793
}
4894
}
4995
}
5096

97+
private void printTreeStructure(File file, int index, int total, String prefix) {
98+
String connector = (index < total - 1) ? "├── " : "└── ";
99+
System.out.print(prefix + connector);
100+
}
101+
51102
private void printFileInfo(File file, boolean longListing) {
52103
if (longListing) {
53104
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
@@ -56,4 +107,4 @@ private void printFileInfo(File file, boolean longListing) {
56107
System.out.println(file.getName());
57108
}
58109
}
59-
}
110+
}

0 commit comments

Comments
 (0)