/*
 * Copyright 2002-2018 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.jmx.export.naming;

import java.io.IOException;
import java.util.Properties;

import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.jmx.support.ObjectNameManager;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;

ObjectNamingStrategy implementation that builds ObjectName instances from the key used in the "beans" map passed to MBeanExporter.

Can also check object name mappings, given as Properties or as mappingLocations of properties files. The key used to look up is the key used in MBeanExporter's "beans" map. If no mapping is found for a given key, the key itself is used to build an ObjectName.

Author:Rob Harrop, Juergen Hoeller
See Also:
Since:1.2
/** * {@code ObjectNamingStrategy} implementation that builds * {@code ObjectName} instances from the key used in the * "beans" map passed to {@code MBeanExporter}. * * <p>Can also check object name mappings, given as {@code Properties} * or as {@code mappingLocations} of properties files. The key used * to look up is the key used in {@code MBeanExporter}'s "beans" map. * If no mapping is found for a given key, the key itself is used to * build an {@code ObjectName}. * * @author Rob Harrop * @author Juergen Hoeller * @since 1.2 * @see #setMappings * @see #setMappingLocation * @see #setMappingLocations * @see org.springframework.jmx.export.MBeanExporter#setBeans */
public class KeyNamingStrategy implements ObjectNamingStrategy, InitializingBean {
Log instance for this class.
/** * {@code Log} instance for this class. */
protected final Log logger = LogFactory.getLog(getClass());
Stores the mappings of bean key to ObjectName.
/** * Stores the mappings of bean key to {@code ObjectName}. */
@Nullable private Properties mappings;
Stores the Resources containing properties that should be loaded into the final merged set of Properties used for ObjectName resolution.
/** * Stores the {@code Resource}s containing properties that should be loaded * into the final merged set of {@code Properties} used for {@code ObjectName} * resolution. */
@Nullable private Resource[] mappingLocations;
Stores the result of merging the mappings Properties with the properties stored in the resources defined by mappingLocations.
/** * Stores the result of merging the {@code mappings} {@code Properties} * with the properties stored in the resources defined by {@code mappingLocations}. */
@Nullable private Properties mergedMappings;
Set local properties, containing object name mappings, e.g. via the "props" tag in XML bean definitions. These can be considered defaults, to be overridden by properties loaded from files.
/** * Set local properties, containing object name mappings, e.g. via * the "props" tag in XML bean definitions. These can be considered * defaults, to be overridden by properties loaded from files. */
public void setMappings(Properties mappings) { this.mappings = mappings; }
Set a location of a properties file to be loaded, containing object name mappings.
/** * Set a location of a properties file to be loaded, * containing object name mappings. */
public void setMappingLocation(Resource location) { this.mappingLocations = new Resource[] {location}; }
Set location of properties files to be loaded, containing object name mappings.
/** * Set location of properties files to be loaded, * containing object name mappings. */
public void setMappingLocations(Resource... mappingLocations) { this.mappingLocations = mappingLocations; }
Merges the Properties configured in the mappings and mappingLocations into the final Properties instance used for ObjectName resolution.
/** * Merges the {@code Properties} configured in the {@code mappings} and * {@code mappingLocations} into the final {@code Properties} instance * used for {@code ObjectName} resolution. */
@Override public void afterPropertiesSet() throws IOException { this.mergedMappings = new Properties(); CollectionUtils.mergePropertiesIntoMap(this.mappings, this.mergedMappings); if (this.mappingLocations != null) { for (Resource location : this.mappingLocations) { if (logger.isDebugEnabled()) { logger.debug("Loading JMX object name mappings file from " + location); } PropertiesLoaderUtils.fillProperties(this.mergedMappings, location); } } }
Attempts to retrieve the ObjectName via the given key, trying to find a mapped value in the mappings first.
/** * Attempts to retrieve the {@code ObjectName} via the given key, trying to * find a mapped value in the mappings first. */
@Override public ObjectName getObjectName(Object managedBean, @Nullable String beanKey) throws MalformedObjectNameException { Assert.notNull(beanKey, "KeyNamingStrategy requires bean key"); String objectName = null; if (this.mergedMappings != null) { objectName = this.mergedMappings.getProperty(beanKey); } if (objectName == null) { objectName = beanKey; } return ObjectNameManager.getInstance(objectName); } }