Java tutorial
/* * Copyright 2002-2019 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 * * https://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.springframework.beans.factory.config; import java.util.Properties; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.InitializingBean; import org.springframework.lang.Nullable; /** * Subclass of PropertyPlaceholderConfigurer that supports JDK 1.4's * Preferences API ({@code java.util.prefs}). * * <p>Tries to resolve placeholders as keys first in the user preferences, * then in the system preferences, then in this configurer's properties. * Thus, behaves like PropertyPlaceholderConfigurer if no corresponding * preferences defined. * * <p>Supports custom paths for the system and user preferences trees. Also * supports custom paths specified in placeholders ("myPath/myPlaceholderKey"). * Uses the respective root node if not specified. * * @author Juergen Hoeller * @since 16.02.2004 * @see #setSystemTreePath * @see #setUserTreePath * @see java.util.prefs.Preferences * @deprecated as of 5.2, along with {@link PropertyPlaceholderConfigurer} */ @Deprecated public class PreferencesPlaceholderConfigurer extends PropertyPlaceholderConfigurer implements InitializingBean { @Nullable private String systemTreePath; @Nullable private String userTreePath; private Preferences systemPrefs = Preferences.systemRoot(); private Preferences userPrefs = Preferences.userRoot(); /** * Set the path in the system preferences tree to use for resolving * placeholders. Default is the root node. */ public void setSystemTreePath(String systemTreePath) { this.systemTreePath = systemTreePath; } /** * Set the path in the system preferences tree to use for resolving * placeholders. Default is the root node. */ public void setUserTreePath(String userTreePath) { this.userTreePath = userTreePath; } /** * This implementation eagerly fetches the Preferences instances * for the required system and user tree nodes. */ @Override public void afterPropertiesSet() { if (this.systemTreePath != null) { this.systemPrefs = this.systemPrefs.node(this.systemTreePath); } if (this.userTreePath != null) { this.userPrefs = this.userPrefs.node(this.userTreePath); } } /** * This implementation tries to resolve placeholders as keys first * in the user preferences, then in the system preferences, then in * the passed-in properties. */ @Override protected String resolvePlaceholder(String placeholder, Properties props) { String path = null; String key = placeholder; int endOfPath = placeholder.lastIndexOf('/'); if (endOfPath != -1) { path = placeholder.substring(0, endOfPath); key = placeholder.substring(endOfPath + 1); } String value = resolvePlaceholder(path, key, this.userPrefs); if (value == null) { value = resolvePlaceholder(path, key, this.systemPrefs); if (value == null) { value = props.getProperty(placeholder); } } return value; } /** * Resolve the given path and key against the given Preferences. * @param path the preferences path (placeholder part before '/') * @param key the preferences key (placeholder part after '/') * @param preferences the Preferences to resolve against * @return the value for the placeholder, or {@code null} if none found */ @Nullable protected String resolvePlaceholder(@Nullable String path, String key, Preferences preferences) { if (path != null) { // Do not create the node if it does not exist... try { if (preferences.nodeExists(path)) { return preferences.node(path).get(key, null); } else { return null; } } catch (BackingStoreException ex) { throw new BeanDefinitionStoreException("Cannot access specified node path [" + path + "]", ex); } } else { return preferences.get(key, null); } } }