ModuleBuilder.java

package org.sterling.source.translator;

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

public class ModuleBuilder {

    private State state;

    public ModuleBuilder() {
        state = new BuildState();
    }

    public void acceptModule() {
        state = new AcceptState(state.getModule());
    }

    public void appendModule(String part) {
        state.appendModule(part);
    }

    public String getIdentifier() {
        return state.getModule();
    }

    public boolean isDeclared() {
        return state.isDeclared();
    }

    private interface State {

        void appendModule(String part);

        boolean isDeclared();

        String getModule();
    }

    private static final class AcceptState implements State {

        private final String module;

        public AcceptState(String module) {
            this.module = module;
        }

        @Override
        public void appendModule(String modulePart) {
            throw new IllegalStateException();
        }

        @Override
        public boolean isDeclared() {
            return true;
        }

        @Override
        public String getModule() {
            return module;
        }
    }

    private static final class BuildState implements State {

        private final List<String> parts;

        public BuildState() {
            parts = new ArrayList<>();
        }

        @Override
        public void appendModule(String modulePart) {
            parts.add(modulePart);
        }

        @Override
        public boolean isDeclared() {
            return false;
        }

        @Override
        public String getModule() {
            StringBuilder builder = new StringBuilder();
            Iterator<String> iterator = parts.iterator();
            if (iterator.hasNext()) {
                builder.append(iterator.next());
                while (iterator.hasNext()) {
                    builder.append('/');
                    builder.append(iterator.next());
                }
            }
            return builder.toString();
        }
    }
}