All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ebay.jetstream.management.BeanController Maven / Gradle / Ivy

/*******************************************************************************
 *  Copyright © 2012-2015 eBay Software Foundation
 *  This program is dual licensed under the MIT and Apache 2.0 licenses.
 *  Please see LICENSE for more information.
 *******************************************************************************/
package com.ebay.jetstream.management;

import java.beans.PropertyDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;

import com.ebay.jetstream.util.CommonUtils;
import com.ebay.jetstream.xmlser.IXmlDeserializer;
import com.ebay.jetstream.xmlser.XMLSerializationManager;

public class BeanController {
	private final String m_prefix;
	private final String m_path;
	private final Object m_bean;

	private String m_format;

	private ManagedResourceFormatter m_formatter;
	private Set m_filterFields;

	public BeanController(String prefix, String path) {
		m_prefix = prefix;
		m_path = path;
		m_bean = Management.getBeanOrFolder(path);
	}

	public Object getBean() {
		return m_bean;
	}

	public String getContentType() {
		return m_formatter == null ? "text/plain" : m_formatter.getContentType();
	}

	public String getFormat() {
		return m_format;
	}

	public String getPath() {
		return m_path;
	}

	public String getPrefix() {
		return m_prefix;
	}

	public Object process(Map parameters) throws Exception {
		Object result = null;
		if (m_bean instanceof ControlBean) {
			result = ((ControlBean) m_bean).process(parameters);
		}
		else {
			for (Entry entry : parameters.entrySet()) {
				String name = entry.getKey();
				String values[] = entry.getValue();
				if (values == null || values.length == 0 || CommonUtils.isEmptyTrimmed(values[0])) {
					executeAction(name);
				}
				else {
					setProperty(name, values);
				}
			}
		}
		return result;
	}

	void setRequestedFields(String[] aFields) {
		if (aFields != null && aFields.length > 0) {
			m_filterFields = new HashSet();
			for (String strField : aFields)
				m_filterFields.add(strField.toLowerCase());
		}
	}
	
	public void setFormat(String format) throws Exception {
		m_formatter = Management.getResourceFormatter(m_format = format);
	}

	public void write(PrintWriter writer) throws Exception {
		if (m_formatter == null)
			throw new IllegalArgumentException("no formatter found for " + getFormat());
		m_formatter.format(getPrefix(), getPath(), m_filterFields, writer);
	}

	protected Method checkMethodForAnnotation(Method method, Class annotationClass)
	throws IllegalAccessException {
		if (method == null)
			throw new IllegalArgumentException("No method");
		if (!method.isAnnotationPresent(annotationClass))
			throw new IllegalAccessException("Missing " + annotationClass.getSimpleName() + " annotation");
		return method;
	}

	protected void executeAction(String name) throws Exception {
		checkMethodForAnnotation(m_bean.getClass().getMethod(name), ManagedOperation.class).invoke(m_bean);
	}

	protected void setProperty(String name, String values[]) throws Exception {
		PropertyDescriptor pd = new PropertyDescriptor(name, m_bean.getClass());
		Method setter = checkMethodForAnnotation(pd.getWriteMethod(), ManagedAttribute.class);
		Object value = null;
		if (values.length == 1) {
			value = CommonUtils.getObjectFromString(pd.getPropertyType(), values[0]);
		}
		else {
			IXmlDeserializer xs = XMLSerializationManager.getDeserializer(values[0]);
			if (xs == null)
				throw new IllegalArgumentException(values[0] + " is not a supported write format");
			Map deserialized = xs.deserialize(values[1]);
			// String setter = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
			value = deserialized.values().toArray()[0];
		}
		setter.invoke(m_bean, value);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy