/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.el;
import static java.util.Collections.unmodifiableList;
import static java.util.Collections.unmodifiableMap;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import org.mule.runtime.api.el.Binding;
import org.mule.runtime.api.el.BindingContext;
import org.mule.runtime.api.el.ExpressionModule;
import org.mule.runtime.api.metadata.TypedValue;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class DefaultBindingContextBuilder implements BindingContext.Builder {
private Map<String, TypedValue> bindings;
private List<ExpressionModule> modules;
public DefaultBindingContextBuilder() {
this.bindings = new HashMap<>();
this.modules = new ArrayList<>();
}
public DefaultBindingContextBuilder(BindingContext bindingContext) {
this.bindings = bindingContext.identifiers().stream().collect(toMap(id -> id, id -> bindingContext.lookup(id).get()));
this.modules = new ArrayList<>(bindingContext.modules());
}
@Override
public BindingContext.Builder addBinding(String identifier, TypedValue value) {
bindings.put(identifier, value);
return this;
}
@Override
public BindingContext.Builder addAll(BindingContext context) {
context.identifiers().forEach(id -> bindings.put(id, context.lookup(id).get()));
modules.addAll(context.modules());
return this;
}
@Override
public BindingContext.Builder addModule(ExpressionModule expressionModule) {
this.modules.add(expressionModule);
return this;
}
@Override
public BindingContext build() {
return new BindingContextImplementation(bindings, modules);
}
private class BindingContextImplementation implements BindingContext {
private Map<String, TypedValue> bindings;
private List<ExpressionModule> modules;
private BindingContextImplementation(Map<String, TypedValue> bindings, List<ExpressionModule> modules) {
this.bindings = unmodifiableMap(new HashMap<>(bindings));
this.modules = unmodifiableList(new ArrayList<>(modules));
}
@Override
public Collection<Binding> bindings() {
return bindings.entrySet().stream().map(entry -> new Binding(entry.getKey(), entry.getValue())).collect(toList());
}
@Override
public Collection<String> identifiers() {
return bindings.keySet();
}
@Override
public Optional<TypedValue> lookup(String identifier) {
return ofNullable(bindings.get(identifier));
}
@Override
public Collection<ExpressionModule> modules() {
return modules;
}
}
}