package org.jolokia.backend.executor;
/*
* Copyright 2009-2013 Roland Huss
*
* Licensed 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.
*/
import java.io.IOException;
import java.util.Set;
import javax.management.*;
/**
* An MBeanSever executor is responsible to perform actions on one or more MBeanServers which involve
* operations on one or more MBeans. It encapsulates completely all available MBeanServers, so no direct
* access to the MBeanServers are required. This interface is also suitable for implementations with
* remote {@link MBeanServerConnection}s, e.g. for implementing it with JSR-160 connections.
*
* A {@link MBeanServerExecutor} is used
*
* @author roland
* @since 17.01.13
*/
public interface MBeanServerExecutor {
/**
* Iterate over all MBeanServers managed and call the handler via a callback.
*
* If {@param pObjectName} is null or a pattern, the MBean names are queried on each MBeanServer and
* feed into the callback. If it is a full object name, then all MBeanServers are called with this object
* name in turn.
*
* @param pObjectName object name to lookup, which can be a pattern in which case a query is performed.
* @param pCallback the action to be called for each MBean found on every server
*
* @throws IOException
* @throws ReflectionException
* @throws MBeanException
*/
void each(ObjectName pObjectName, MBeanEachCallback pCallback)
throws IOException, ReflectionException, MBeanException;
/**
* Call an action an the first MBeanServer on which the action does not throw an InstanceNotFoundException
* will considered to be successful and this method returns with the return value of the succesful
* action. If no action was succesful, an {@link IllegalArgumentException} is raised (containing the last
* {@link InstanceNotFoundException} from the last tried server)
*
* @param pObjectName objectname given through to the action
* @param pMBeanAction the action to call
* @param pExtraArgs any extra args given also to the action
* @param <R> type of the return value
* @return the return value of the succesful action
*
* @throws IOException
* @throws ReflectionException
* @throws MBeanException if the JMX call causes an issue
*/
<R> R call(ObjectName pObjectName, MBeanAction<R> pMBeanAction, Object... pExtraArgs)
throws IOException, ReflectionException, MBeanException, AttributeNotFoundException, InstanceNotFoundException;
/**
* Query all MBeanServer and return the union of all results
*
* @param pObjectName pattern to query for. If null, then all MBean of all MBeanServers are returned
* @return the found MBeans
* @throws IOException if called remotely and an IOError occured.
*/
Set<ObjectName> queryNames(ObjectName pObjectName) throws IOException;
/**
* Check whether the set of MBeans in all managed MBeanServer has been changed
* since the given time. The input is the epoch time in seconds, however, milliseconds
* would be much more appropriate. However, the Jolokia responses contain
* currently time measured in seconds. This should be changed in a future version,
* but this implies a quite heavy API changed (and if this is changed, the key
* "timestamp" should be changed to "time", too, in order to fail early in case of
* problems).
*
* In order to avoid inconsistencies for sub-second updates, we are comparing
* conservatively (so hasBeenUpdated might return "true" more often than required).
*
* @param pTimestamp seconds since 1.1.1970
* @return true if the MBeans has been updated since this time, false otherwise
*/
boolean hasMBeansListChangedSince(long pTimestamp);
/**
* This callback is used together with {@link #each(ObjectName, MBeanEachCallback)} for iterating over all
* active MBeanServers. The callback is responsible on its own to collect the information queried.
*/
interface MBeanEachCallback {
/**
* Callback call for a specific MBeanServer for a given object name.
*
* @param pConn MBeanServer
* @param pName object name as given by the surrounding {@link #each(ObjectName, MBeanEachCallback)} call, which
* can be either a pattern or null (in which case the names are searched for before) or a direct name.
* @throws ReflectionException
* @throws InstanceNotFoundException if the provided full-ObjectName is not registered at the MBeanServer
* @throws IOException
* @throws MBeanException if an operation of an MBean fails
*/
void callback(MBeanServerConnection pConn, ObjectName pName)
throws ReflectionException, InstanceNotFoundException, IOException, MBeanException;
}
/**
* A MBeanAction represent a single action on a MBeanServer for a given object name. The action is free
* to throw a {@link InstanceNotFoundException} or {@link AttributeNotFoundException} if the object name or attribute
* is not contained in the give MBeanServer. In this case the next MBeanServer is tried, otherwise the result
* from the action is returned and no other MBeanServers are tried
*
* @param <R> return type for the execute method
*/
interface MBeanAction<R> {
/**
* Execute the action given to {@link #call(ObjectName, MBeanAction, Object...)}.
*
* @param pConn MBeanServer on which the action should be performed
* @param pName an objectname interpreted specifically by the action
* @param extraArgs any extra args given as context from the outside
* @return the return value
*
* @throws ReflectionException
* @throws InstanceNotFoundException if the MBean does not exist. For {@link #call(ObjectName, MBeanAction, Object...)} this
* implies to try the next MBeanServer.
* @throws IOException
* @throws MBeanException
* @throws AttributeNotFoundException if an attribute is read, this exception indicates, that the attribute is not
* known to the MBean specified (although the MBean has been found in the MBeanServer)
*/
R execute(MBeanServerConnection pConn, ObjectName pName, Object... extraArgs)
throws ReflectionException, InstanceNotFoundException, IOException, MBeanException, AttributeNotFoundException;
}
}