All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.protostuff.compiler.parser.ProtoWalker Maven / Gradle / Ivy

There is a newer version: 3.1.40
Show newest version
package io.protostuff.compiler.parser;

import io.protostuff.compiler.model.Enum;
import io.protostuff.compiler.model.*;

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

/**
 * @author Kostiantyn Shchepanovskyi
 */
public class ProtoWalker {

    private final ProtoContext context;
    private final Proto proto;

    private final List> protoProcessors = new ArrayList<>();
    private final List> messageProcessors = new ArrayList<>();
    private final List> enumProcessors = new ArrayList<>();
    private final List> serviceProcessors = new ArrayList<>();

    public ProtoWalker(ProtoContext protoContext) {
        this.context = protoContext;
        this.proto = protoContext.getProto();
    }

    public static ProtoWalker newInstance(ProtoContext proto) {
        return new ProtoWalker(proto);
    }

    public ProtoWalker onProto(Processor processor) {
        protoProcessors.add(processor);
        return this;
    }

    public ProtoWalker onMessage(Processor processor) {
        messageProcessors.add(processor);
        return this;
    }

    public ProtoWalker onEnum(Processor processor) {
        enumProcessors.add(processor);
        return this;
    }

    public ProtoWalker onService(Processor processor) {
        serviceProcessors.add(processor);
        return this;
    }

    public void walk() {
        for (Processor protoProcessor : protoProcessors) {
            protoProcessor.run(context, proto);
        }
        walk(proto);
    }

    private void walk(Proto container) {
        List services = container.getServices();
        for (Processor serviceProcessor : serviceProcessors) {
            for (Service service : services) {
                serviceProcessor.run(context, service);
            }
        }
        walk((UserTypeContainer) container);
    }

    private void walk(UserTypeContainer container) {
        List messages = container.getMessages();
        for (Processor messageProcessor : messageProcessors) {
            for (Message message : messages) {
                messageProcessor.run(context, message);
            }
        }
        List enums = container.getEnums();
        for (Processor enumProcessor : enumProcessors) {
            for (Enum anEnum : enums) {
                enumProcessor.run(context, anEnum);
            }
        }
    }

    public interface Processor {

        void run(ProtoContext context, T t);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy