Skip to content

Instantly share code, notes, and snippets.

@danielpassos
Last active December 8, 2018 11:56
Show Gist options
  • Save danielpassos/3973193 to your computer and use it in GitHub Desktop.
Save danielpassos/3973193 to your computer and use it in GitHub Desktop.
[Builder for Pipe creation] A builder proposal for AeroGear Android Pipe creation #aerogear #agdroid

Builder for Pipe creation

// http://myServer/myProject/foo
Pipe<Foo> fooPipe = pipeline.pipe(Foo.class).buildAndAdd();

// http://myServer/myProject/my-crazy-endpoint
Pipe<Bar> barPipe = pipeline.pipe(Bar.class)
        .endpoint("my-crazy-endpoint")
        .name("bad name")
        .buildAndAdd();
public class Pipeline {

    private URL baseURL;

    public Pipeline(URL baseURL) {
        this.baseURL = baseURL;
    }

    public PipeBuilder pipe(Class klass) {
        return new BuilderImpl(klass, baseURL);
    }

    private final class BuilderImpl implements PipeBuilder {

        private final Class klass;
        private URL url;
        private String name;
        private String endpoint;
        private Type type = REST;

        public BuilderImpl(Class klass, URL baseURL) {
            this.klass = klass;
            this.url = baseURL;
            this.name = klass.getSimpleName().toLowerCase();
            this.endpoint = name;
        }

        @Override
        public PipeBuilder name(String name) {
            this.name = name;
            return this;
        }

        @Override
        public PipeBuilder endpoint(String endpoint) {
            this.endpoint = endpoint;
            return this;
        }

        @Override
        public PipeBuilder type(Type type) {
            this.type = type;
            return this;
        }

        @Override
        public PipeBuilder url(URL url) {
            this.url = url;
            return this;
        }

        @Override
        public Pipe buildAndAdd() {
            Pipe pipe = AdapterFactory.createPipe(type, klass, appendEndpoint(url, endpoint));
            pipes.put(name, pipe);
            return pipe;
        }

        private URL appendEndpoint(URL baseURL, String endpoint) {

            try {
                if( !baseURL.toString().endsWith("/")) {
                    endpoint = "/" + endpoint;
                }
                return new URL(baseURL + endpoint + "/");
            } catch (MalformedURLException e) {
                Log.e("AeroGear", e.getMessage());
                return null;
            }
        }

    }

    public static interface PipeBuilder {
        public PipeBuilder name(String name);
        public PipeBuilder endpoint(String endpoint);
        public PipeBuilder type(Type type);
        public PipeBuilder url(URL url);
        public Pipe buildAndAdd();
    }

}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment