blob: 5a18b55979c30b1ac798bbcac5e1d3c227ba9ca7 [file] [log] [blame]
/**
*
* Copyright 2005 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
*
* 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.gbean.spring;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.management.ObjectName;
import org.gbean.kernel.ServiceName;
import org.gbean.metadata.ClassMetadata;
import org.gbean.metadata.MetadataManager;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
/**
* @version $Revision$ $Date$
*/
public class ObjectNameBuilder implements BeanFactoryPostProcessor {
private static final String OBJECT_NAME_PROPERTY = "gbean-object-name";
private final MetadataManager metadataManager;
private final String domainName;
private final String serverName;
private final String moduleName;
private final Map objectNameMap = new HashMap();
public ObjectNameBuilder(MetadataManager metadataManager, String domainName, String serverName, String moduleName) {
this.metadataManager = metadataManager;
this.domainName = domainName;
this.serverName = serverName;
this.moduleName = moduleName;
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanNames = beanFactory.getBeanDefinitionNames();
if (beanNames == null) {
return;
}
for (int i = 0; i < beanNames.length; i++) {
String beanName = beanNames[i];
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (beanDefinition instanceof RootBeanDefinition) {
ObjectName objectName = buildObjectName(beanName, (RootBeanDefinition) beanDefinition);
objectNameMap.put(beanName, objectName);
}
}
}
private ObjectName buildObjectName(String beanName, RootBeanDefinition beanDefinition) {
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
if (propertyValues.contains(OBJECT_NAME_PROPERTY)) {
String objectNameString = (String) propertyValues.getPropertyValue(OBJECT_NAME_PROPERTY).getValue();
propertyValues.removePropertyValue(OBJECT_NAME_PROPERTY);
return ServiceName.createName(objectNameString);
} else {
ClassMetadata classMetadata = metadataManager.getClassMetadata(beanDefinition.getBeanClass());
String type = (String) classMetadata.get("j2eeType");
return createObjectName(beanName, type);
}
}
public Map getObjectNameMap() {
return objectNameMap;
}
public ObjectName getObjectName(String beanName) {
return (ObjectName) objectNameMap.get(beanName);
}
private ObjectName createObjectName(String name, String type) {
Properties props = new Properties();
if (type != null) {
props.put("j2eeType", type);
}
props.put("name", name);
props.put("J2EEApplication", "null");
props.put("J2EEModule", moduleName);
props.put("J2EEServer", serverName);
return ServiceName.createName(domainName, props);
}
}