/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.activemq.artemis.api.core.management;
import javax.json.JsonArray;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.JsonUtil;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
/**
* Helper class to use ActiveMQ Artemis Core messages to manage server resources.
*/
public final class ManagementHelper {
// Constants -----------------------------------------------------
public static final SimpleString HDR_RESOURCE_NAME = new SimpleString("_AMQ_ResourceName");
public static final SimpleString HDR_ATTRIBUTE = new SimpleString("_AMQ_Attribute");
public static final SimpleString HDR_OPERATION_NAME = new SimpleString("_AMQ_OperationName");
public static final SimpleString HDR_OPERATION_SUCCEEDED = new SimpleString("_AMQ_OperationSucceeded");
public static final SimpleString HDR_NOTIFICATION_TYPE = new SimpleString("_AMQ_NotifType");
public static final SimpleString HDR_NOTIFICATION_TIMESTAMP = new SimpleString("_AMQ_NotifTimestamp");
public static final SimpleString HDR_ROUTING_NAME = new SimpleString("_AMQ_RoutingName");
public static final SimpleString HDR_CLUSTER_NAME = new SimpleString("_AMQ_ClusterName");
public static final SimpleString HDR_ADDRESS = new SimpleString("_AMQ_Address");
public static final SimpleString HDR_BINDING_ID = new SimpleString("_AMQ_Binding_ID");
public static final SimpleString HDR_BINDING_TYPE = new SimpleString("_AMQ_Binding_Type");
public static final SimpleString HDR_FILTERSTRING = new SimpleString("_AMQ_FilterString");
public static final SimpleString HDR_DISTANCE = new SimpleString("_AMQ_Distance");
public static final SimpleString HDR_CONSUMER_COUNT = new SimpleString("_AMQ_ConsumerCount");
public static final SimpleString HDR_USER = new SimpleString("_AMQ_User");
public static final SimpleString HDR_CHECK_TYPE = new SimpleString("_AMQ_CheckType");
public static final SimpleString HDR_SESSION_NAME = new SimpleString("_AMQ_SessionName");
public static final SimpleString HDR_REMOTE_ADDRESS = new SimpleString("_AMQ_RemoteAddress");
public static final SimpleString HDR_PROPOSAL_GROUP_ID = new SimpleString("_JBM_ProposalGroupId");
public static final SimpleString HDR_PROPOSAL_VALUE = new SimpleString("_JBM_ProposalValue");
public static final SimpleString HDR_PROPOSAL_ALT_VALUE = new SimpleString("_JBM_ProposalAltValue");
public static final SimpleString HDR_CONSUMER_NAME = new SimpleString("_AMQ_ConsumerName");
public static final SimpleString HDR_CONNECTION_NAME = new SimpleString("_AMQ_ConnectionName");
// Attributes ----------------------------------------------------
// Static --------------------------------------------------------
/**
* Stores a resource attribute in a message to retrieve the value from the server resource.
*
* @param message message
* @param resourceName the name of the resource
* @param attribute the name of the attribute
* @see ResourceNames
*/
public static void putAttribute(final ICoreMessage message, final String resourceName, final String attribute) {
message.putStringProperty(ManagementHelper.HDR_RESOURCE_NAME, new SimpleString(resourceName));
message.putStringProperty(ManagementHelper.HDR_ATTRIBUTE, new SimpleString(attribute));
}
/**
* Stores an operation invocation in a message to invoke the corresponding operation the value from the server resource.
*
* @param message message
* @param resourceName the name of the resource
* @param operationName the name of the operation to invoke on the resource
* @see ResourceNames
*/
public static void putOperationInvocation(final ICoreMessage message,
final String resourceName,
final String operationName) throws Exception {
ManagementHelper.putOperationInvocation(message, resourceName, operationName, (Object[]) null);
}
/**
* Stores an operation invocation in a message to invoke the corresponding operation the value from the server resource.
*
* @param message message
* @param resourceName the name of the server resource
* @param operationName the name of the operation to invoke on the server resource
* @param parameters the parameters to use to invoke the server resource
* @see ResourceNames
*/
public static void putOperationInvocation(final ICoreMessage message,
final String resourceName,
final String operationName,
final Object... parameters) throws Exception {
// store the name of the operation in the headers
message.putStringProperty(ManagementHelper.HDR_RESOURCE_NAME, new SimpleString(resourceName));
message.putStringProperty(ManagementHelper.HDR_OPERATION_NAME, new SimpleString(operationName));
// and the params go in the body, since might be too large for header
String paramString;
if (parameters != null) {
JsonArray jsonArray = JsonUtil.toJSONArray(parameters);
paramString = jsonArray.toString();
} else {
paramString = null;
}
message.getBodyBuffer().writeNullableSimpleString(SimpleString.toSimpleString(paramString));
}
/**
* Used by ActiveMQ Artemis management service.
*/
public static Object[] retrieveOperationParameters(final Message message) throws Exception {
SimpleString sstring = message.toCore().getReadOnlyBodyBuffer().readNullableSimpleString();
String jsonString = (sstring == null) ? null : sstring.toString();
if (jsonString != null) {
JsonArray jsonArray = JsonUtil.readJsonArray(jsonString);
return JsonUtil.fromJsonArray(jsonArray);
} else {
return null;
}
}
/**
* Returns whether the JMS message corresponds to the result of a management operation invocation.
*/
public static boolean isOperationResult(final Message message) {
return message.containsProperty(ManagementHelper.HDR_OPERATION_SUCCEEDED);
}
/**
* Returns whether the JMS message corresponds to the result of a management attribute value.
*/
public static boolean isAttributesResult(final Message message) {
return !ManagementHelper.isOperationResult(message);
}
/**
* Used by ActiveMQ Artemis management service.
*/
public static void storeResult(final CoreMessage message, final Object result) throws Exception {
String resultString;
if (result != null) {
// Result is stored in body, also encoded as JSON array of length 1
JsonArray jsonArray = JsonUtil.toJSONArray(new Object[]{result});
resultString = jsonArray.toString();
} else {
resultString = null;
}
message.getBodyBuffer().writeNullableSimpleString(SimpleString.toSimpleString(resultString));
}
/**
* Returns the result of an operation invocation or an attribute value.
* <br>
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
public static Object[] getResults(final ICoreMessage message) throws Exception {
SimpleString sstring = message.getBodyBuffer().readNullableSimpleString();
String jsonString = (sstring == null) ? null : sstring.toString();
if (jsonString != null) {
JsonArray jsonArray = JsonUtil.readJsonArray(jsonString);
return JsonUtil.fromJsonArray(jsonArray);
} else {
return null;
}
}
/**
* Returns the result of an operation invocation or an attribute value.
* <br>
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
public static Object getResult(final ICoreMessage message) throws Exception {
return getResult(message, null);
}
/**
* Returns the result of an operation invocation or an attribute value.
* <br>
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
public static Object getResult(final ICoreMessage message, Class desiredType) throws Exception {
Object[] res = ManagementHelper.getResults(message);
if (res != null) {
return JsonUtil.convertJsonValue(res[0], desiredType);
} else {
return null;
}
}
/**
* Returns whether the invocation of the management operation on the server resource succeeded.
*/
public static boolean hasOperationSucceeded(final Message message) {
if (!ManagementHelper.isOperationResult(message)) {
return false;
}
if (message.containsProperty(ManagementHelper.HDR_OPERATION_SUCCEEDED)) {
return message.getBooleanProperty(ManagementHelper.HDR_OPERATION_SUCCEEDED);
}
return false;
}
private ManagementHelper() {
}
}