/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.factories.components;
import org.infinispan.jmx.annotations.MBean;
import org.infinispan.jmx.annotations.ManagedAttribute;
import org.infinispan.jmx.annotations.ManagedOperation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* A specialization of {@link ComponentMetadata}, this version also includes JMX related metadata, as expressed
* by {@link MBean}, {@link ManagedAttribute} and {@link ManagedOperation} annotations.
*
* @author Manik Surtani
* @since 5.1
*/
public class ManageableComponentMetadata extends ComponentMetadata {
private String jmxObjectName;
private String description;
private Set<JmxAttributeMetadata> attributeMetadata;
private Set<JmxOperationMetadata> operationMetadata;
public ManageableComponentMetadata(Class<?> component, List<Method> injectMethods, List<Method> startMethods, List<Method> stopMethods, boolean global, boolean survivesRestarts, List<Field> managedAttributeFields, List<Method> managedAttributeMethods, List<Method> managedOperationMethods, MBean mbean) {
super(component, injectMethods, startMethods, stopMethods, global, survivesRestarts);
if ((managedAttributeFields != null && !managedAttributeFields.isEmpty()) || (managedAttributeMethods != null && !managedAttributeMethods.isEmpty())) {
attributeMetadata = new HashSet<JmxAttributeMetadata>((managedAttributeFields == null ? 0 : managedAttributeFields.size()) + (managedAttributeMethods == null ? 0 : managedAttributeMethods.size()));
if (managedAttributeFields != null) {
for (Field f: managedAttributeFields) attributeMetadata.add(new JmxAttributeMetadata(f));
}
if (managedAttributeMethods != null) {
for (Method m: managedAttributeMethods) attributeMetadata.add(new JmxAttributeMetadata(m));
}
}
if (managedOperationMethods != null && !managedOperationMethods.isEmpty()) {
operationMetadata = new HashSet<JmxOperationMetadata>(managedOperationMethods.size());
for (Method m: managedOperationMethods) operationMetadata.add(new JmxOperationMetadata(m));
}
jmxObjectName = mbean.objectName();
description = mbean.description();
}
public String getJmxObjectName() {
return jmxObjectName;
}
public String getDescription() {
return description;
}
public Set<JmxAttributeMetadata> getAttributeMetadata() {
if (attributeMetadata == null) return Collections.emptySet();
return attributeMetadata;
}
public Set<JmxOperationMetadata> getOperationMetadata() {
if (operationMetadata == null) return Collections.emptySet();
return operationMetadata;
}
@Override
public boolean isManageable() {
return true;
}
@Override
public ManageableComponentMetadata toManageableComponentMetadata() {
return this;
}
@Override
public String toString() {
return "ManageableComponentMetadata{" +
"jmxObjectName='" + jmxObjectName + '\'' +
", description='" + description + '\'' +
", attributeMetadata=" + attributeMetadata +
", operationMetadata=" + operationMetadata +
'}';
}
}