/*
 * 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.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

Represents a general context of data targeting an item of type Q. Contexts are used to add arbitrary data that cannot be be mapped in a standard way to the money API, e.g. use case or customer specific extensions or specialities.

Superclasses of this class must be final, immutable, serializable and thread-safe.

/** * Represents a general context of data targeting an item of type {@code Q}. Contexts are used to add arbitrary * data that cannot be be mapped in a standard way to the money API, e.g. use case or customer specific * extensions or specialities.<p> * Superclasses of this class must be final, immutable, serializable and thread-safe. */
@SuppressWarnings("unchecked") public abstract class AbstractContext implements Serializable { private static final long serialVersionUID = 1L;
Key for storing the target providers to be queried
/** * Key for storing the target providers to be queried */
protected static final String KEY_PROVIDER = "provider";
The data map containing all values.
/** * The data map containing all values. */
final Map<String, Object> data = new HashMap<>();
Private constructor, used by AbstractContextBuilder.
Params:
  • builder – the Builder.
/** * Private constructor, used by {@link AbstractContextBuilder}. * * @param builder the Builder. */
protected AbstractContext(AbstractContextBuilder<?, ?> builder) { data.putAll(builder.data); }
Get the present keys of all entries with a given type, checking hereby if assignable.
Params:
  • type – The attribute type, not null.
Returns:all present keys of attributes being assignable to the type, never null.
/** * Get the present keys of all entries with a given type, checking hereby if assignable. * * @param type The attribute type, not null. * @return all present keys of attributes being assignable to the type, never null. */
public Set<String> getKeys(Class<?> type) { return data.entrySet().stream().filter(val -> type.isAssignableFrom(val.getValue() .getClass())).map(Map.Entry::getKey).collect(Collectors .toSet()); }
Get the current attribute type.
Params:
  • key – the entry's key, not null
Returns:the current attribute type, or null, if no such attribute exists.
/** * Get the current attribute type. * @param key the entry's key, not null * @return the current attribute type, or null, if no such attribute exists. */
public Class<?> getType(String key) { Object val = this.data.get(key); return val == null ? null : val.getClass(); }
Access an attribute.
Params:
  • type – the attribute's type, not null
  • key – the attribute's key, not null
Returns:the attribute value, or null.
/** * Access an attribute. * * @param type the attribute's type, not {@code null} * @param key the attribute's key, not {@code null} * @return the attribute value, or {@code null}. */
public <T> T get(String key, Class<T> type) { Object value = this.data.get(key); if (value != null && type.isAssignableFrom(value.getClass())) { return (T) value; } return null; }
Access an attribute, hereby using the class name as key.
Params:
  • type – the type, not null
Returns:the type attribute value, or null.
/** * Access an attribute, hereby using the class name as key. * * @param type the type, not {@code null} * @return the type attribute value, or {@code null}. */
public <T> T get(Class<T> type) { return get(type.getName(), type); }
Access a Long attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access a Long attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public Long getLong(String key) { return get(key, Long.class); }
Access a Float attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access a Float attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public Float getFloat(String key) { return get(key, Float.class); }
Access an Integer attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access an Integer attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public Integer getInt(String key) { return get(key, Integer.class); }
Access a Boolean attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access a Boolean attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public Boolean getBoolean(String key) { return get(key, Boolean.class); }
Access a Double attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access a Double attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public Double getDouble(String key) { return get(key, Double.class); }
Access a String attribute.
Params:
  • key – the attribute's key, not null.
Returns:the value, or null.
/** * Access a String attribute. * * @param key the attribute's key, not null. * @return the value, or null. */
public String getText(String key) { return get(key, String.class); }
Get the provider name of this context.
Returns:the provider name, or null.
/** * Get the provider name of this context. * * @return the provider name, or null. */
public String getProviderName() { return getText(KEY_PROVIDER); }
Checks if the current instance has no attributes set. This is often the cases, when used in default cases.
Returns:true, if no attributes are set.
/** * Checks if the current instance has no attributes set. This is often the cases, when used in default cases. * * @return true, if no attributes are set. */
public boolean isEmpty() { return this.data.isEmpty(); } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return Objects.hash(data); } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof AbstractContext) { AbstractContext other = (AbstractContext) obj; return Objects.equals(data, other.data); } return false; } /* * (non-Javadoc) * * @see Object#toString() */ @Override public String toString() { return getClass().getSimpleName() + " (\n" + data + ')'; } }