danielpassos
10/29/2012 - 12:04 PM

Builder for Pipe creation

Builder for Pipe creation

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();
    }

}