/* * Copyright 2016 Red Hat, Inc. and/or its affiliates * and other contributors as indicated by the @author tags. * * 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.keycloak.services.util; import com.fasterxml.jackson.databind.JsonNode; import org.keycloak.Config; import org.keycloak.common.util.StringPropertyReplacer; import java.util.Properties; /** * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> */ public class JsonConfigProvider implements Config.ConfigProvider { private Properties properties; private JsonNode config; public JsonConfigProvider(JsonNode config, Properties properties) { this.config = config; this.properties = properties; } @Override public String getProvider(String spi) { JsonNode n = getNode(config, spi, "provider"); return n != null ? replaceProperties(n.textValue()) : null; } @Override public Config.Scope scope(String... path) { return new JsonScope(getNode(config, path)); } private static JsonNode getNode(JsonNode root, String... path) { if (root == null) { return null; } JsonNode n = root; for (String p : path) { n = n.get(p); if (n == null) { return null; } } return n; } private String replaceProperties(String value) { return StringPropertyReplacer.replaceProperties(value, properties); } public class JsonScope implements Config.Scope { private JsonNode config; public JsonScope(JsonNode config) { this.config = config; } @Override public String get(String key) { return get(key, null); } @Override public String get(String key, String defaultValue) { if (config == null) { return defaultValue; } JsonNode n = config.get(key); if (n == null) { return defaultValue; } return replaceProperties(n.textValue()); } @Override public String[] getArray(String key) { if (config == null) { return null; } JsonNode n = config.get(key); if (n == null) { return null; } else if (n.isArray()) { String[] a = new String[n.size()]; for (int i = 0; i < a.length; i++) { a[i] = replaceProperties(n.get(i).textValue()); } return a; } else { return new String[] { replaceProperties(n.textValue()) }; } } @Override public Integer getInt(String key) { return getInt(key, null); } @Override public Integer getInt(String key, Integer defaultValue) { if (config == null) { return defaultValue; } JsonNode n = config.get(key); if (n == null) { return defaultValue; } if (n.isTextual()) { return Integer.parseInt(replaceProperties(n.textValue())); } else { return n.intValue(); } } @Override public Long getLong(String key) { return getLong(key, null); } @Override public Long getLong(String key, Long defaultValue) { if (config == null) { return defaultValue; } JsonNode n = config.get(key); if (n == null) { return defaultValue; } if (n.isTextual()) { return Long.parseLong(replaceProperties(n.textValue())); } else { return n.longValue(); } } @Override public Boolean getBoolean(String key) { return getBoolean(key, null); } @Override public Boolean getBoolean(String key, Boolean defaultValue) { if (config == null) { return defaultValue; } JsonNode n = config.get(key); if (n == null) { return defaultValue; } if (n.isTextual()) { return Boolean.parseBoolean(replaceProperties(n.textValue())); } else { return n.booleanValue(); } } @Override public Config.Scope scope(String... path) { return new JsonScope(getNode(config, path)); } } }