Directory.java

package com.designpatterns.structural.composite.classic;

import java.util.ArrayList;
import java.util.List;

/**
 * A Directory's sizeBytes() sums its children's sizeBytes() - and since a child can itself be
 * a Directory, that sum recurses naturally through however many levels of nesting exist. The
 * caller never needs to know or check whether a given component is a file or a directory.
 */
public class Directory implements FileSystemComponent {

    private final String name;
    private final List<FileSystemComponent> children = new ArrayList<>();

    public Directory(String name) {
        this.name = name;
    }

    public void add(FileSystemComponent component) {
        children.add(component);
    }

    @Override
    public String name() {
        return name;
    }

    @Override
    public long sizeBytes() {
        return children.stream().mapToLong(FileSystemComponent::sizeBytes).sum();
    }
}