/*
 * Copyright 2012-2016 Credit Suisse
 * Copyright 2018-2020 Werner Keil, Otavio Santana, Trivadis AG
 *
 * 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 javax.money;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

This interface defines the common generic parts of a query. Queries are used to pass complex parameters sets to lookup monetary artifacts, e.g. MonetaryAmountFactory, MonetaryRounding, CurrencyUnit, ExchangeRateProvider and CurrencyConversion.

Instances of this class are not thread-safe and not serializable.

/** * This interface defines the common generic parts of a query. Queries are used to pass complex parameters sets * to lookup monetary artifacts, e.g. {@link MonetaryAmountFactory}, * {@link javax.money.MonetaryRounding}, * {@link javax.money.CurrencyUnit}, {@link javax.money.convert.ExchangeRateProvider} and {@link javax.money.convert * .CurrencyConversion}. * <p> * Instances of this class are not thread-safe and not serializable. */
@SuppressWarnings({ "unchecked", "rawtypes" }) public abstract class AbstractContextBuilder<B extends AbstractContextBuilder, C extends AbstractContext>{
The data map containing all values.
/** * The data map containing all values. */
final Map<String, Object> data = new HashMap<>();
Apply all attributes on the given context.
Params:
  • context – the context to be applied, not null.
  • overwriteDuplicates – flag, if existing entries should be overwritten.
Returns:this Builder, for chaining
/** * Apply all attributes on the given context. * * @param context the context to be applied, not null. * @param overwriteDuplicates flag, if existing entries should be overwritten. * @return this Builder, for chaining */
public B importContext(AbstractContext context, boolean overwriteDuplicates){ for (Map.Entry<String, Object> en : context.data.entrySet()) { if (overwriteDuplicates) { this.data.put(en.getKey(), en.getValue()); }else{ this.data.putIfAbsent(en.getKey(), en.getValue()); } } return (B) this; }
Apply all attributes on the given context, hereby existing entries are preserved.
Params:
  • context – the context to be applied, not null.
See Also:
Returns:this Builder, for chaining
/** * Apply all attributes on the given context, hereby existing entries are preserved. * * @param context the context to be applied, not null. * @return this Builder, for chaining * @see #importContext(AbstractContext, boolean) */
public B importContext(AbstractContext context){ Objects.requireNonNull(context); return importContext(context, false); }
Sets an Integer attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Integer attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, int value) { this.data.put(key, value); return (B) this; }
Sets an Boolean attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Boolean attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, boolean value) { this.data.put(key, value); return (B) this; }
Sets an Long attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Long attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, long value) { this.data.put(key, value); return (B) this; }
Sets an Float attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Float attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, float value) { this.data.put(key, value); return (B) this; }
Sets an Double attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Double attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, double value) { this.data.put(key, value); return (B) this; }
Sets an Character attribute.
Params:
  • key – the key, non null.
  • value – the value
Returns:the Builder, for chaining.
/** * Sets an Character attribute. * * @param key the key, non null. * @param value the value * @return the Builder, for chaining. */
public B set(String key, char value) { this.data.put(key, value); return (B) this; }
Sets an attribute, using attribute.getClass() as attribute type and attribute.getClass().getName() as attribute name.
Params:
  • value – the attribute value, not null.
Returns:this Builder, for chaining
/** * Sets an attribute, using {@code attribute.getClass()} as attribute * <i>type</i> and {@code attribute.getClass().getName()} as attribute * <i>name</i>. * * @param value the attribute value, not null. * @return this Builder, for chaining */
public B set(Object value) { data.put(value.getClass().getName(), Objects.requireNonNull(value)); return (B) this; }
Sets an attribute, using attribute.getClass() as attribute type.
Params:
  • value – the attribute value, not null.
  • key – the attribute's key, not null
Returns:this Builder, for chaining
/** * Sets an attribute, using {@code attribute.getClass()} as attribute * <i>type</i>. * * @param value the attribute value, not null. * @param key the attribute's key, not {@code null} * @return this Builder, for chaining */
public B set(String key, Object value) { data.put(key, Objects.requireNonNull(value)); return (B) this; }
Sets an attribute, using attribute.getClass() as attribute type.
Params:
  • value – the attribute value, not null.
  • key – the attribute's key, not null
Returns:this Builder, for chaining
/** * Sets an attribute, using {@code attribute.getClass()} as attribute * <i>type</i>. * * @param value the attribute value, not null. * @param key the attribute's key, not {@code null} * @return this Builder, for chaining */
public <T> B set(Class<T> key, T value) { Object old = set(key.getName(), Objects.requireNonNull(value)); if (old != null && old.getClass().isAssignableFrom(value.getClass())) { return (B) old; } return (B) this; }
Sets the provider.
Params:
  • provider – the provider, not null.
Returns:the Builder for chaining
/** * Sets the provider. * * @param provider the provider, not null. * @return the Builder for chaining */
public B setProviderName(String provider) { set(AbstractContext.KEY_PROVIDER, Objects.requireNonNull(provider)); return (B) this; }
Removes an entry of a certain keys. This can be useful, when a context is initialized with another existing context, but only subset of the entries should be visible. For example removeAttributes ("a", "b", "c") removes all attributes named 'a','b' and 'c'.
Params:
  • keys – the keys
Returns:this Builder, for chaining
/** * Removes an entry of a certain keys. This can be useful, when a context is initialized with another * existing context, but only subset of the entries should be visible. For example {@code removeAttributes * ("a", "b", "c")} removes all attributes named 'a','b' and 'c'. * * @param keys the keys * @return this Builder, for chaining */
public B removeAttributes(String... keys) { for (String key : keys) { this.data.remove(key); } return (B) this; }
Creates a new AbstractContext with the data from this Builder instance.
Returns:a new AbstractContext. never null.
/** * Creates a new {@link AbstractContext} with the data from this Builder * instance. * * @return a new {@link AbstractContext}. never {@code null}. */
public abstract C build(); @Override public String toString(){ return getClass().getSimpleName() + " [attributes:\n" + new TreeMap<>(data).toString() + ']'; } }