Search code examples
javacompositechain-of-responsibility

How print the entire data structure created with Composite?


I have class-Composite:

public class CompositeText implements ComponentText {
    private TypeComponent type;
    private String value;
    private final List<ComponentText> childComponents;

    private CompositeText() {
        childComponents = new ArrayList<>();
    }

    public CompositeText(String value, TypeComponent typeComponent) {
        this.value = value;
        this.type = typeComponent;
        childComponents = new ArrayList<>();
    }

    @Override
    public void add(ComponentText componentText) {
        childComponents.add(componentText);
    }

    @Override
    public void remove(ComponentText componentText) {
        childComponents.remove(componentText);
    }

    @Override
    public TypeComponent getComponentType() {
        return this.type;
    }

    @Override
    public ComponentText getChild(int index) {
        return childComponents.get(index);
    }

    @Override
    public int getCountChildElements() {
        return childComponents.size();
    }

    @Override
    public int getCountAllElements() {
        return childComponents.stream()
                .mapToInt(ComponentText::getCountAllElements)
                .sum();
    }

    @Override
    public String toString() {
        return null;
    }
}

I created classes that perform the same action - parsing, parsing text into paragraphs, into sentences, into tokens, into symbols.

public class IntoParagraphParser implements ActionParser {
    // call IntoSentenceParser
}
public class IntoSentenceParser implements ActionParser {
    // call IntoLexemeParser
}
public class IntoLexemeParser implements ActionParser {
    // call IntoSymbolParser
}
public class IntoSymbolParser implements ActionParser {
}

All data is stored in List <ComponentText> childComponents in class-Composite - CompositeText.

How to properly create a method so that it prints all the data that is inside the composite? I think this will be the method toString() in CompositeText.

Class IntoParagraphParser look:

public class IntoParagraphParser implements ActionParser {
    private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?=^\\s{4})";
    private static final IntoParagraphParser paragraphParser = new IntoParagraphParser();
    private static final IntoSentenceParser sentenceParser = IntoSentenceParser.getInstance();

    private IntoParagraphParser() {
    }

    public static IntoParagraphParser getInstance() {
        return paragraphParser;
    }

    public ComponentText parse(String text) throws TextException {
        ComponentText oneParagraph;
        ComponentText componentParagraph = new CompositeText(text, TypeComponent.PARAGRAPH);
        String[] arrayParagraph = text.split(PARAGRAPH_SPLIT_REGEX);

        for(String element: arrayParagraph) {
            oneParagraph = new CompositeText(element, TypeComponent.PARAGRAPH);
            oneParagraph.add(sentenceParser.parse(element));
            componentParagraph.add(oneParagraph);
        }
        return componentParagraph;
    }
}

Solution

  • Need @Override the method toString() in CompositeText like this:

        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
    
            for (ComponentText component : childComponents) {
                builder.append(component.toString());
            }
            return builder.toString();
        }