Untitled

 avatar
unknown
java
19 days ago
5.1 kB
2
Indexable
// Parent Node retrival
public class ParentNodeRetrival implements NodeRetrival {

    @Override
    public Node getNodeFromPath(String path, Directory root) throws Exception{
        String [] parsePath = PathParsingUtil.parsePath(path);
        int childIdx = 0;
        Directory currentRoot = root;
        String targetParentName = PathParsingUtil.getParentName(path);
        if("NA".equals(targetParentName)){
            return root;
        }

        while(!targetParentName.equals(currentRoot.getName())){
            String nextNodeName = parsePath[childIdx];
            childIdx++;
            Node nextNode = currentRoot.getChild(nextNodeName);

            if(!(nextNode instanceof Directory)){
                throw new Exception("Invalid Path!!");
            }

            currentRoot = (Directory) nextNode;
        }

        return currentRoot;
    }
}

// child node retirval

public class ChildRetrivalStrategy implements NodeRetrival {
    ParentNodeRetrival s = new ParentNodeRetrival();
    @Override
    public Node getNodeFromPath(String path, Directory root) throws Exception {
        String childNode = PathParsingUtil.getChildName(path);
        Directory d = (Directory) s.getNodeFromPath(path, root);
        return d.getChild(childNode);
    }
}


// Directory Class

public class Directory extends Node {
    private HashMap<String, Node> children;

    public Directory(String name){
        super(name, NodeType.DIRECTORY);
        this.children = new HashMap<>();
    }


    public void addChild(String name, NodeType type){
        // can use factory here for dynamic;
        Node newChild = switch (type){
            case FILE -> new File(name);
            case DIRECTORY -> new Directory(name);
        };
        this.children.putIfAbsent(newChild.getName(), newChild);
    }

    public Node getChild(String name){
        return this.children.getOrDefault(name, null);
    }


    public void listChildren(){
        System.out.println("Directory with name: "+ super.getName() + " contains ");
        for(String child: children.keySet()){
            System.out.print(child+ " ");
        }
        System.out.println();
    }
}

// File class

public class File extends Node {
    String content =  "";
    public File(String name){
        super(name, NodeType.FILE);
    }

    public void writeContent(String content){
        this.content = content;
    }

    public String readContent(){
        return this.content;
    }
}

// Node

public abstract class Node {
    private String name;
    private NodeType type;

    public Node(String name, NodeType type){
        this.name = name;
        this.type = type;
    }

    public String getName(){
        return this.name;
    }
}

// Path parsing

public class PathParsingUtil {
    public static String getChildName(String path){
        String [] parsedPath = parsePath(path);
        if(parsedPath.length == 0){
            return "NA";
        }
        return getStringFromIndex(parsedPath, parsedPath.length-1);
    }

    public static String getParentName(String path){
        String [] parsedPath = parsePath(path);
        if(parsedPath.length < 2){
            return "NA";
        }
        return getStringFromIndex(parsedPath, parsedPath.length-2);
    }

    private static String getStringFromIndex(String [] path, int idx){
        return path[idx];
    }

    public static String[] parsePath(String path){
        return Arrays.stream(path.split("/")).filter(p -> !p.isEmpty()).toArray(String[]::new);
    }
}

// File System main


public class FileSystem {
    private Directory root;
    private NodeRetrival strategy;
    FileSystem(){
        this.root = new Directory("/");
    }
    // supports mkdir, touch, ls, readFile and writeFile
    public void mkdir(String path) throws Exception {
        // get root node
        Directory parent = (Directory) new ParentNodeRetrival().getNodeFromPath(path, root);
        // get child node to be added
        String childNode = PathParsingUtil.getChildName(path);
        // add child node

        parent.addChild(childNode, NodeType.DIRECTORY);
    }

    public void touch(String path) throws Exception {
        // get root node
        Directory parent = (Directory) new ParentNodeRetrival().getNodeFromPath(path, root);
        // get child node to be added
        String childNode = PathParsingUtil.getChildName(path);
        // add child node

        parent.addChild(childNode, NodeType.FILE);
    }

    public void ls(String path) throws Exception {
        // get child node
        Directory dir = (Directory) new ParentNodeRetrival().getNodeFromPath(path, root);
        String childNode = PathParsingUtil.getChildName(path);
        if(childNode == "NA"){
            root.listChildren();
            return;
        }
        Node nodeToList = dir.getChild(childNode);

        if(!(nodeToList instanceof Directory)){
            throw new Exception("Blah blah");
        }
        dir = (Directory) nodeToList;
        dir.listChildren();
    }
}

Editor is loading...
Leave a Comment