org.apache.provisionr.api.util.BuilderWithOptions.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.provisionr.api.util.BuilderWithOptions.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.provisionr.api.util;

import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.Closeables;
import com.google.common.io.Resources;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;

/**
 * Base class useful for creating builders for objects that accept
 * an arbitrary map of options (key, value string pairs)
 */
public abstract class BuilderWithOptions<P extends BuilderWithOptions<P>> {

    private ImmutableMap.Builder<String, String> options = ImmutableMap.builder();

    /**
     * Override this method to return 'this' to allow builder method chaining
     */
    protected abstract P getThis();

    /**
     * Replace options with the ones supplied as argument
     */
    public P options(Map<String, String> options) {
        this.options = ImmutableMap.<String, String>builder().putAll(options);
        return getThis();
    }

    /**
     * Replace options with the ones extracted from the Properties object
     */
    public P options(Properties properties) {
        this.options = ImmutableMap.builder();
        for (String key : properties.stringPropertyNames()) {
            options.put(key, properties.getProperty(key));
        }
        return getThis();
    }

    /**
     * Load options from a properties file available as a resource on the classpath
     */
    public P optionsFromResource(String resource) {
        Properties properties = new Properties();
        ByteArrayInputStream in = null;
        try {
            in = new ByteArrayInputStream(Resources.toByteArray(Resources.getResource(resource)));
            properties.load(in);
            return options(properties);

        } catch (IOException e) {
            throw Throwables.propagate(e);
        } finally {
            Closeables.closeQuietly(in);
        }
    }

    /**
     * Add a new option
     */
    public P option(String key, String value) {
        this.options.put(key, value);
        return getThis();
    }

    protected Map<String, String> buildOptions() {
        return options.build();
    }
}