/*
* Copyright 2008-2014 the original author or authors
*
* Licensed 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.kaleidofoundry.core.context;
import java.io.Serializable;
import java.util.concurrent.ConcurrentMap;
import org.kaleidofoundry.core.config.Configuration;
/**
* Base class used for building {@link RuntimeContext} instance<br/>
* You can extends it, adding your own methods like: <br/>
*
* <pre>
* class YourContextBuilder extends AbstractRuntimeContextBuilder<YourType> {
* ... inherit constructor part from parent
*
* // your own method
* public YourContextBuilder withParameter(String parameter) {
* // handle parameter in your current context
* return this;
* }
* }
*
* new YourContextBuilder()
* .withParameter(String parameterValue)
* .withOtherParam(String otherParam)
* .asReadOnly()
* .build();
* </pre>
*
* @author jraduget
* @param <T>
*/
public abstract class AbstractRuntimeContextBuilder<T> {
/**
* the context you wish to interact with
*/
protected final RuntimeContext<T> context;
public AbstractRuntimeContextBuilder() {
this.context = new RuntimeContext<T>();
}
public AbstractRuntimeContextBuilder(final String name) {
this.context = new RuntimeContext<T>(name);
}
public AbstractRuntimeContextBuilder(final ConcurrentMap<String, Serializable> staticParameters, final Configuration... configurations) {
this.context = new RuntimeContext<T>(staticParameters, configurations);
}
public AbstractRuntimeContextBuilder(final String name, final String prefix) {
this.context = new RuntimeContext<T>(name, prefix);
}
public AbstractRuntimeContextBuilder(final String name, final Configuration... configurations) {
this.context = new RuntimeContext<T>(name, configurations);
}
public AbstractRuntimeContextBuilder(final String name, final String prefixProperty, final Configuration... configurations) {
this.context = new RuntimeContext<T>(name, prefixProperty, configurations);
}
public AbstractRuntimeContextBuilder(final String name, final String prefixProperty, final ConcurrentMap<String, Serializable> staticParameters,
final Configuration... configurations) {
this.context = new RuntimeContext<T>(name, prefixProperty, staticParameters, configurations);
}
public AbstractRuntimeContextBuilder(final Class<T> pluginInterface) {
this.context = new RuntimeContext<T>(pluginInterface);
}
public AbstractRuntimeContextBuilder(final Class<T> pluginInterface, final ConcurrentMap<String, Serializable> staticParameters) {
this.context = new RuntimeContext<T>(pluginInterface, staticParameters);
}
public AbstractRuntimeContextBuilder(final Class<T> pluginInterface, final Configuration... configurations) {
this.context = new RuntimeContext<T>(pluginInterface, configurations);
}
public AbstractRuntimeContextBuilder(final String name, final Class<T> pluginInterface, final Configuration... configurations) {
this.context = new RuntimeContext<T>(name, pluginInterface, configurations);
}
public AbstractRuntimeContextBuilder(final String name, final Class<T> pluginInterface, final ConcurrentMap<String, Serializable> staticParameters,
final Configuration... configurations) {
this.context = new RuntimeContext<T>(name, pluginInterface, configurations);
}
/**
* @return static parameters set by developer, which will overrides configuration items
* @see RuntimeContext#getParameters() protected delegate
*/
protected ConcurrentMap<String, Serializable> getContextParameters() {
return context.getParameters();
}
/**
* @return finalize the build processing, returning the build instance (that could not be modified after return)
*/
public final RuntimeContext<T> build() {
// mark context as injected (no more updates will be possible)
context.hasBeenBuildByContextBuilder = true;
context.hasBeenInjectedByAnnotationProcessing = false;
return context;
}
}