package org.zstack.header.core; import org.zstack.header.exception.CloudRuntimeException; import org.zstack.utils.FieldUtils; import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeType; import java.io.Serializable; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** */ public abstract class AbstractCompositeType implements CompositeData, Serializable { protected abstract String[] getFieldNames(); public abstract CompositeType getCompositeType(); @Override public Object get(String key) { Field f = FieldUtils.getField(key, this.getClass()); if (f == null) { return null; } f.setAccessible(true); try { return f.get(this); } catch (IllegalAccessException e) { throw new CloudRuntimeException(e); } } @Override public Object[] getAll(String[] keys) { Object[] ret = new Object[keys.length]; for (int i = 0; i < keys.length; i++) { ret[i] = get(keys[i]); } return ret; } @Override public boolean containsKey(String key) { String[] fieldNames = getFieldNames(); for (String fname : fieldNames) { if (fname.equals(key)) { return true; } } return false; } @Override public boolean containsValue(Object value) { Collection values = values(); return values.contains(value); } @Override public Collection<?> values() { List<Object> ret = new ArrayList<Object>(); for (String fname : getFieldNames()) { ret.add(get(fname)); } return ret; } }