Refs #1612 Make JMX console to work in complex deployment environments

This commit is contained in:
Yuriy Artamonov 2013-01-10 12:33:46 +00:00
parent 80f926a1e6
commit 4991afe75e
29 changed files with 156 additions and 125 deletions

View File

@ -770,8 +770,7 @@ create table SYS_JMX_INSTANCE (
DELETE_TS datetime,
DELETED_BY varchar(50),
--
CLUSTER_NODE_NAME varchar(255),
DESCRIPTION varchar(500),
NODE_NAME varchar(255),
ADDRESS varchar(500) not null,
LOGIN varchar(50) not null,
PASSWORD varchar(255) not null,
@ -800,12 +799,12 @@ insert into SEC_GROUP (ID, CREATE_TS, VERSION, NAME, PARENT_ID)
values ('0fa2b1a5-1d68-4d69-9fbd-dff348347f93', current_timestamp, 0, 'Company', null)^
insert into SEC_USER (ID, CREATE_TS, VERSION, LOGIN, LOGIN_LC, PASSWORD, NAME, GROUP_ID, ACTIVE, TYPE)
values ('60885987-1b61-4247-94c7-dff348347f93', current_timestamp, 'admin', 'admin',
values ('60885987-1b61-4247-94c7-dff348347f93', current_timestamp, 0, 'admin', 'admin',
'cc2229d1b8a052423d9e1c9ef0113b850086586a',
'Administrator', 0, '0fa2b1a5-1d68-4d69-9fbd-dff348347f93', 1, 'C')^
'Administrator', '0fa2b1a5-1d68-4d69-9fbd-dff348347f93', 1, 'C')^
insert into SEC_USER (ID, CREATE_TS, VERSION, LOGIN, LOGIN_LC, PASSWORD, NAME, GROUP_ID, ACTIVE, TYPE)
values ('60885987-1b61-4247-94c7-dff348347f94', current_timestamp, 'emailer', 'emailer', null,
values ('60885987-1b61-4247-94c7-dff348347f94', current_timestamp, 0, 'emailer', 'emailer', null,
'User for Email sending', '0fa2b1a5-1d68-4d69-9fbd-dff348347f93', 1, 'C')^
insert into SEC_ROLE (ID, CREATE_TS, VERSION, NAME, TYPE)

View File

@ -741,8 +741,7 @@ create table SYS_JMX_INSTANCE (
DELETE_TS timestamp,
DELETED_BY varchar(50),
--
CLUSTER_NODE_NAME varchar(255),
DESCRIPTION varchar(500),
NODE_NAME varchar(255),
ADDRESS varchar(500) not null,
LOGIN varchar(50) not null,
PASSWORD varchar(255) not null,

View File

@ -808,8 +808,7 @@ create table SYS_JMX_INSTANCE (
DELETE_TS timestamp,
DELETED_BY varchar(50),
--
CLUSTER_NODE_NAME varchar(255),
DESCRIPTION varchar(500),
NODE_NAME varchar(255),
ADDRESS varchar(500) not null,
LOGIN varchar(50) not null,
PASSWORD varchar(255) not null,

View File

@ -0,0 +1,6 @@
-- $Id$
-- Description: remove column DESCRIPTION from SYS_JMX_INSTANCE table
alter table SYS_JMX_INSTANCE drop column DESCRIPTION^
exec sp_rename 'SYS_JMX_INSTANCE.CLUSTER_NODE_NAME', 'NODE_NAME', 'COLUMN'^

View File

@ -0,0 +1,6 @@
-- $Id$
-- Description: remove column DESCRIPTION from SYS_JMX_INSTANCE table
alter table SYS_JMX_INSTANCE drop column DESCRIPTION^
alter table SYS_JMX_INSTANCE rename column CLUSTER_NODE_NAME to NODE_NAME^

View File

@ -20,15 +20,12 @@ import javax.persistence.Table;
*/
@Entity(name = "sys$JmxInstance")
@Table(name = "SYS_JMX_INSTANCE")
@NamePattern("#getCaption|clusterNodeName,address,description")
@NamePattern("#getCaption|nodeName,address,description")
@SystemLevel
public class JmxInstance extends StandardEntity {
@Column(name = "CLUSTER_NODE_NAME", length = 255, nullable = false)
protected String clusterNodeName;
@Column(name = "DESCRIPTION", length = 500)
protected String description;
@Column(name = "NODE_NAME", length = 255)
protected String nodeName;
@Column(name = "ADDRESS", length = 500, nullable = false)
protected String address;
@ -43,15 +40,15 @@ public class JmxInstance extends StandardEntity {
}
public JmxInstance(String clusterNodeName) {
this.clusterNodeName = clusterNodeName;
this.nodeName = clusterNodeName;
}
public String getClusterNodeName() {
return clusterNodeName;
public String getNodeName() {
return nodeName;
}
public void setClusterNodeName(String clusterNodeName) {
this.clusterNodeName = clusterNodeName;
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public String getAddress() {
@ -78,20 +75,10 @@ public class JmxInstance extends StandardEntity {
this.password = password;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCaption() {
StringBuilder sb = new StringBuilder();
if (StringUtils.isNotEmpty(description))
sb.append(description);
else
sb.append(clusterNodeName);
if (StringUtils.isNotEmpty(nodeName))
sb.append(nodeName);
if (StringUtils.isNotEmpty(address))
sb.append(" (").append(address).append(")");

View File

@ -86,8 +86,8 @@ ScheduledTaskDefinedBy.BEAN=Bean
ScheduledTaskDefinedBy.CLASS=Class
ScheduledTaskDefinedBy.SCRIPT=Script
JmxInstance.clusterNodeName=Cluster node name
JmxInstance.nodeName=Node name
JmxInstance.description=Description
JmxInstance.address=JMX Address
JmxInstance.address=JMX host:port
JmxInstance.login=Login
JmxInstance.password=Password

View File

@ -82,8 +82,8 @@ ScheduledTaskDefinedBy.BEAN=Bean
ScheduledTaskDefinedBy.CLASS=Класс
ScheduledTaskDefinedBy.SCRIPT=Скрипт
JmxInstance.clusterNodeName=Cluster node name
JmxInstance.nodeName=Node name
JmxInstance.description=Description
JmxInstance.address=JMX Address
JmxInstance.address=JMX host:port
JmxInstance.login=Login
JmxInstance.password=Password

View File

@ -36,6 +36,7 @@ public class ManagedBeanInfo extends AbstractNotPersistentEntity {
@MetaProperty
private String propertyList;
@MetaProperty
private JmxInstance jmxInstance;
private List<ManagedBeanAttribute> attributes;
@ -105,4 +106,4 @@ public class ManagedBeanInfo extends AbstractNotPersistentEntity {
public void setJmxInstance(JmxInstance jmxInstance) {
this.jmxInstance = jmxInstance;
}
}
}

View File

@ -7,10 +7,13 @@ package com.haulmont.cuba.gui.components;
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.client.ClientConfig;
import com.haulmont.cuba.core.app.DataService;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.entity.SoftDelete;
import com.haulmont.cuba.core.global.*;
import com.haulmont.cuba.gui.ServiceLocator;
import com.haulmont.cuba.core.global.AppBeans;
import com.haulmont.cuba.core.global.Configuration;
import com.haulmont.cuba.core.global.LoadContext;
import com.haulmont.cuba.core.global.View;
import com.haulmont.cuba.gui.WindowManager;
import com.haulmont.cuba.gui.data.CollectionDatasource;
import com.haulmont.cuba.gui.data.impl.DatasourceImplementation;
@ -94,8 +97,6 @@ public interface PickerField extends Field, Component.ActionsHolder {
public static abstract class StandardAction extends AbstractAction implements ShortcutAction{
private static final long serialVersionUID = 8103707056784950383L;
protected PickerField pickerField;
public StandardAction(String id, PickerField pickerField) {
@ -159,7 +160,7 @@ public interface PickerField extends Field, Component.ActionsHolder {
throw new IllegalStateException("Please specify metaclass or property for PickerField");
windowAlias = metaClass.getName() + ".lookup";
}
pickerField.getFrame().openLookup(
Window lookupWindow = pickerField.getFrame().openLookup(
windowAlias,
new Window.Lookup.Handler() {
@Override
@ -174,12 +175,21 @@ public interface PickerField extends Field, Component.ActionsHolder {
lookupScreenOpenType,
lookupScreenParams != null ? lookupScreenParams : Collections.<String, Object>emptyMap()
);
lookupWindow.addListener(new Window.CloseListener() {
@Override
public void windowClosed(String actionId) {
afterCloseLookup(actionId);
}
});
}
}
public void afterSelect(Collection items) {
}
public void afterCloseLookup(String actionId) {
}
@Override
public KeyCombination getKeyCombination() {
ClientConfig clientConfig = AppBeans.get(Configuration.class).getConfig(ClientConfig.class);
@ -257,7 +267,7 @@ public interface PickerField extends Field, Component.ActionsHolder {
if (entity instanceof SoftDelete && ((SoftDelete) entity).isDeleted()) {
pickerField.getFrame().showNotification(
MessageProvider.getMessage(ActionsFieldHelper.class, "ActionsFieldHelper.openMsg"),
messages.getMessage(ActionsFieldHelper.class, "ActionsFieldHelper.openMsg"),
IFrame.NotificationType.HUMANIZED);
return;
}
@ -265,7 +275,7 @@ public interface PickerField extends Field, Component.ActionsHolder {
LoadContext ctx = new LoadContext(entity.getClass());
ctx.setId(entity.getId());
ctx.setView(View.MINIMAL);
entity = ServiceLocator.getDataService().load(ctx);
entity = AppBeans.get(DataService.class).load(ctx);
if (entity != null) {
String windowAlias = editScreen;
@ -360,4 +370,4 @@ public interface PickerField extends Field, Component.ActionsHolder {
return KeyCombination.create(clientConfig.getPickerOpenShortcut());
}
}
}
}

View File

@ -634,6 +634,20 @@
padding-right: 10px;
}
/*
* JMX
*/
.v-table-cell-cuba-jmx-tree-table-domain,
.v-table-cell-content-cuba-jmx-tree-table-domain,
.v-table-row-cuba-jmx-tree-table-domain {
background-color: #c6cbcd;
}
.v-table-table td.v-table-cell-cuba-jmx-tree-table-domain {
border-right-color: #c6cbcd;
}
/*
* Menu separator
*/

View File

@ -612,6 +612,20 @@
padding-right: 10px;
}
/*
* JMX
*/
.v-table-cell-cuba-jmx-tree-table-domain,
.v-table-cell-content-cuba-jmx-tree-table-domain,
.v-table-row-cuba-jmx-tree-table-domain {
background-color: #c6cbcd;
}
.v-table-table td.v-table-cell-cuba-jmx-tree-table-domain {
border-right-color: #c6cbcd;
}
/*
* Menu separator
*/

View File

@ -21,6 +21,7 @@ import com.haulmont.cuba.web.app.ui.jmxinstance.edit.JmxInstanceEditor;
import com.haulmont.cuba.web.jmx.JmxControlAPI;
import org.apache.commons.lang.StringUtils;
import javax.annotation.Nullable;
import javax.annotation.Resource;
import javax.inject.Inject;
import java.util.*;
@ -41,7 +42,7 @@ public class MbeansDisplayWindow extends AbstractWindow {
protected TextField objectNameField;
@Inject
protected TextField localJmxField;
protected Label localJmxField;
@Resource(name = "mbeans")
protected TreeTable mbeansTable;
@ -83,7 +84,7 @@ public class MbeansDisplayWindow extends AbstractWindow {
@Override
public boolean isApplicableTo(Datasource.State state, Entity item) {
return super.isApplicableTo(state, item) &&
((ManagedBeanInfo)item).getObjectName() != null;
((ManagedBeanInfo) item).getObjectName() != null;
}
@Override
@ -114,7 +115,7 @@ public class MbeansDisplayWindow extends AbstractWindow {
jmxConnectionField.addAction(new PickerField.LookupAction(jmxConnectionField) {
@Override
public void afterSelect(Collection items) {
public void afterCloseLookup(String actionId) {
jmxInstancesDs.refresh();
}
});
@ -145,6 +146,25 @@ public class MbeansDisplayWindow extends AbstractWindow {
localJmxField.setValue(jmxControlAPI.getLocalNodeName());
localJmxField.setEditable(false);
mbeansTable.setStyleProvider(new Table.StyleProvider() {
@Nullable
@Override
public String getStyleName(@Nullable Entity entity, @Nullable String property) {
if (entity != null) {
if (entity instanceof ManagedBeanInfo &&
((ManagedBeanInfo) entity).getObjectName() == null)
return "cuba-jmx-tree-table-domain";
}
return null;
}
@Nullable
@Override
public String getItemIcon(@Nullable Entity entity) {
return null;
}
});
}
private class ObjectNameFieldListener implements ValueListener {

View File

@ -9,7 +9,7 @@
<collectionDatasource id="jmxInstancesDs" class="com.haulmont.cuba.core.entity.JmxInstance" view="_local">
<datasourceClass>com.haulmont.cuba.web.app.ui.jmxcontrol.ds.JmxInstancesDatasource</datasourceClass>
</collectionDatasource>
<collectionDatasource
id="mbeanDs"
class="com.haulmont.cuba.jmxcontrol.entity.ManagedBeanInfo"
@ -28,25 +28,23 @@
<rows>
<row>
<label value="msg://localJmxNode"/>
<textField id="localJmxField" width="400px" datatype="string"/>
<label id="localJmxField" stylename="h2" width="400px"/>
</row>
<row>
<label value="msg://targetJmxNode"/>
<lookupPickerField id="jmxConnectionField" optionsDatasource="jmxInstancesDs" width="400px"/>
</row>
<row>
<label value="msg://searchByObjectName"/>
<textField id="objectNameField" width="400px"/>
</row>
</rows>
</grid>
</groupBox>
<hbox spacing="true">
<button action="mbeans.refresh" icon="icons/refresh.png"/>
<button action="mbeans.inspect" icon="icons/edit.png"/>
<label value="msg://searchByObjectName"/>
<textField id="objectNameField" width="400px"/>
</hbox>
<treeTable id="mbeans" editable="false" width="100%">
<buttonsPanel>
<button action="mbeans.refresh" icon="icons/refresh.png"/>
<button action="mbeans.inspect" icon="icons/edit.png"/>
</buttonsPanel>
<columns>
<column id="domain" caption="msg://mbean.domain"/>
<column id="objectName" caption="msg://mbean.name"/>

View File

@ -13,7 +13,7 @@ import com.haulmont.cuba.core.entity.JmxInstance;
import com.haulmont.cuba.core.global.AppBeans;
import com.haulmont.cuba.gui.data.DataService;
import com.haulmont.cuba.gui.data.DsContext;
import com.haulmont.cuba.gui.data.impl.AbstractTreeTableDatasource;
import com.haulmont.cuba.gui.data.impl.AbstractTreeDatasource;
import com.haulmont.cuba.gui.logging.UIPerformanceLogger;
import com.haulmont.cuba.jmxcontrol.entity.ManagedBeanDomain;
import com.haulmont.cuba.jmxcontrol.entity.ManagedBeanInfo;
@ -28,7 +28,7 @@ import java.util.*;
* @author budarov
* @version $Id$
*/
public class ManagedBeanInfoDatasource extends AbstractTreeTableDatasource<ManagedBeanInfo, UUID> {
public class ManagedBeanInfoDatasource extends AbstractTreeDatasource<ManagedBeanInfo, UUID> {
private JmxInstance jmxInstance = null;
@ -100,18 +100,6 @@ public class ManagedBeanInfoDatasource extends AbstractTreeTableDatasource<Manag
return managedBeans;
}
@Override
public boolean isCaption(UUID itemId) {
ManagedBeanInfo mbi = (ManagedBeanInfo) data.get(itemId);
return mbi.getObjectName() == null;
}
@Override
public String getCaption(UUID itemId) {
ManagedBeanInfo mbi = (ManagedBeanInfo) data.get(itemId);
return mbi.getDomain();
}
public JmxInstance getJmxInstance() {
return jmxInstance;
}

View File

@ -80,7 +80,7 @@ public class MbeanInspectWindow extends AbstractEditor {
return;
}
final Window.Editor w = openEditor("jmxcontrol$EditAttribute", mba, WindowManager.OpenType.THIS_TAB);
final Window.Editor w = openEditor("jmxcontrol$EditAttribute", mba, WindowManager.OpenType.DIALOG);
w.addListener(new CloseListener() {
@Override
public void windowClosed(String actionId) {

View File

@ -5,9 +5,6 @@
datasource="attrDs"
caption="msg://editAttribute.title">
<metadataContext>
</metadataContext>
<dsContext>
<datasource id="attrDs" class="com.haulmont.cuba.jmxcontrol.entity.ManagedBeanAttribute" view="_local"/>
</dsContext>
@ -32,4 +29,4 @@
</vbox>
<iframe id="windowActions" src="/com/haulmont/cuba/gui/edit-window.actions.xml"/>
</layout>
</window>
</window>

View File

@ -25,6 +25,10 @@
<column flex="1"/>
</columns>
<rows>
<row>
<label value="msg://mbean.jmxConnection"/>
<label datasource="mbeanDs" property="jmxInstance" stylename="h2"/>
</row>
<row>
<label value="msg://mbean.name"/>
<label datasource="mbeanDs" property="objectName" id="domain" stylename="h2"/>

View File

@ -11,6 +11,7 @@ import com.haulmont.cuba.jmxcontrol.util.AttributeHelper;
import com.haulmont.cuba.web.gui.components.WebComponentsHelper;
import com.haulmont.cuba.web.gui.components.WebLabel;
import javax.inject.Inject;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.Map;
@ -20,6 +21,9 @@ import java.util.Map;
*/
public class OperationResultWindow extends AbstractWindow {
@Inject
protected Label resultLabel;
@Override
public void init(Map<String, Object> params) {
super.init(params);
@ -33,10 +37,6 @@ public class OperationResultWindow extends AbstractWindow {
ScrollBoxLayout container = (ScrollBoxLayout) getComponent("container");
if (ex != null) {
Label title = new WebLabel();
title.setStyleName("h2");
title.setValue(getMessage("operationResult.exception"));
if (ex instanceof UndeclaredThrowableException)
ex = ex.getCause();
@ -50,28 +50,18 @@ public class OperationResultWindow extends AbstractWindow {
Label trace = new WebLabel();
trace.setValue(msg);
container.add(title);
resultLabel.setValue(getMessage("operationResult.exception"));
container.add(trace);
}
else if (result != null) {
Label title = new WebLabel();
title.setStyleName("h2");
title.setValue(getMessage("operationResult.result"));
} else if (result != null) {
Label valueHolder = new WebLabel();
com.vaadin.ui.Label vaadinLbl = (com.vaadin.ui.Label) WebComponentsHelper.unwrap(valueHolder);
vaadinLbl.setContentMode(com.vaadin.ui.Label.CONTENT_PREFORMATTED);
valueHolder.setValue(AttributeHelper.convertToString(result));
container.add(title);
resultLabel.setValue(getMessage("operationResult.result"));
container.add(valueHolder);
}
else {
Label title = new WebLabel();
title.setStyleName("h2");
title.setValue(getMessage("operationResult.void"));
container.add(title);
} else {
resultLabel.setValue(getMessage("operationResult.void"));
}
Button closeBtn = getComponent("close");

View File

@ -4,15 +4,10 @@
messagesPack="com.haulmont.cuba.web.app.ui.jmxcontrol.inspect.operation"
caption="msg://operationResult.title">
<metadataContext>
</metadataContext>
<dsContext>
</dsContext>
<layout expand="container" spacing="true">
<scrollBox id="container">
<label id="resultLabel" stylename="h2"/>
<scrollBox id="container" width="100%">
</scrollBox>
<button id="close" icon="icons/ok.png"/>
</layout>
</window>
</window>

View File

@ -3,6 +3,7 @@ displayMbeans.title = JMX Console
inspectMbean.title = Inspect MBean
inspectMbean.title.format = Inspect MBean "%s"
mbean.jmxConnection = Connection
mbean.className = Class name
mbean.objectName = Object name
mbean.description = Description
@ -44,6 +45,6 @@ invokeOperation.conversionError = Failed to convert attributes
close = Close
refresh = Refresh
searchByObjectName = Search by ObjectName:
targetJmxNode = JMX Connection:
localJmxNode = Local node:
searchByObjectName = Search by ObjectName
targetJmxNode = JMX connection
localJmxNode = Local node

View File

@ -4,7 +4,7 @@
# Use is subject to license terms.
#
searchByObjectName = Recherche par ObjectName :
searchByObjectName = Recherche par ObjectName
mbean.domain = Domaine
mbean.operations = Opérations
mbean.attribute.access = Accès

View File

@ -3,6 +3,7 @@ displayMbeans.title = Консоль JMX
inspectMbean.title = Просмотр MBean объекта
inspectMbean.title.format = Просмотр MBean объекта "%s"
mbean.jmxConnection = Connection
mbean.className = Класс
mbean.description = Описание
mbean.domain = Домен
@ -43,6 +44,6 @@ invokeOperation.conversionError = Не удалось привести атри
close = Закрыть
refresh = Обновить
searchByObjectName = Поиск по ObjectName:
targetJmxNode = JMX Connection:
localJmxNode = Local node:
searchByObjectName = Поиск по ObjectName
targetJmxNode = JMX connection
localJmxNode = Local node

View File

@ -33,7 +33,7 @@
</buttonsPanel>
<rowsCount/>
<columns>
<column id="clusterNodeName"/>
<column id="nodeName"/>
<column id="description"/>
<column id="address"/>
<column id="login"/>

View File

@ -14,6 +14,7 @@ import com.haulmont.cuba.gui.components.TextField;
import com.haulmont.cuba.gui.data.Datasource;
import com.haulmont.cuba.gui.xml.layout.ComponentsFactory;
import com.haulmont.cuba.web.jmx.JmxControlAPI;
import org.apache.commons.lang.StringUtils;
import javax.inject.Inject;
import java.util.Map;
@ -64,7 +65,11 @@ public class JmxInstanceEditor extends AbstractEditor<JmxInstance> {
// try to connect to instance and assign cluster node name
try {
String remoteNodeName = jmxControlAPI.getRemoteNodeName(getItem());
getItem().setClusterNodeName(remoteNodeName);
if (StringUtils.isEmpty(getItem().getNodeName()))
getItem().setNodeName(remoteNodeName);
} catch (SecurityException e) {
showNotification(getMessage("invalidCredentials"), NotificationType.WARNING);
return false;
} catch (Exception e) {
showNotification(getMessage("unableToConnectToInterface"), NotificationType.WARNING);
return false;

View File

@ -16,11 +16,10 @@
<layout expand="windowActions">
<fieldGroup id="jmxFieldGroup" datasource="jmxInstanceDs">
<column width="350px">
<field id="clusterNodeName" editable="false"/>
<field id="description"/>
<field id="address"/>
<field id="login"/>
<field id="password" custom="true"/>
<field id="nodeName"/>
</column>
</fieldGroup>
<iframe id="windowActions" screen="editWindowActions"/>

View File

@ -4,8 +4,9 @@
# Use is subject to license terms.
#
browserCaption=JMX interfaces
editorCaption=JMX Connection
browserCaption=JMX connections
editorCaption=JMX connection
passwordRequiredMsg=Password isn't specified
unableToConnectToInterface=Unable to connect to specified JMX interface
unableToConnectToInterface=Unable to connect to specified JMX interface
invalidCredentials=Invalid user or password

View File

@ -4,8 +4,9 @@
# Use is subject to license terms.
#
browserCaption=JMX interfaces
editorCaption=JMX Connection
browserCaption=JMX connections
editorCaption=JMX connection
passwordRequiredMsg=Заполните поле "Password"
unableToConnectToInterface=Невозможно подключиться к указанному JMX интерфейсу
unableToConnectToInterface=Невозможно подключиться к указанному JMX интерфейсу
invalidCredentials=Неверный логин или пароль

View File

@ -54,7 +54,6 @@ public interface JmxControlAPI {
/**
* Loads attributes for managed bean descriptor
*
* @param instance JMX node descriptor
* @param info managed bean descriptor
* @return managed bean descriptor with attributes
*/
@ -63,7 +62,6 @@ public interface JmxControlAPI {
/**
* Loads attribute value for managed bean attribute
*
* @param instance JMX node descriptor
* @param attribute attribute descriptor
* @return attribute descriptor with value
*/
@ -72,7 +70,6 @@ public interface JmxControlAPI {
/**
* Saves attribute value to JMX node
*
* @param instance JMX node descriptor
* @param attribute attribute descriptor
*/
void saveAttributeValue(ManagedBeanAttribute attribute);
@ -80,7 +77,6 @@ public interface JmxControlAPI {
/**
* Invokes method of managed bean
*
* @param instance JMX node descriptor
* @param operation operation descriptor
* @param parameterValues array with parameter values
* @return invocation result