blob: 1f6d4ff3a18bc654a684413f14a201c9e4b51c69 [file] [log] [blame]
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* This source code is provided to illustrate the usage of a given feature
* or technique and has been deliberately simplified. Additional steps
* required for a production-quality application, such as security checks,
* input validation and proper error handling, might not be present in
* this sample code.
*/
package com.sun.jmx.examples.scandir;
import java.io.IOException;
import java.util.Map;
import javax.management.InstanceNotFoundException;
import javax.management.JMException;
/**
* The <code>ScanManagerMXBean</code> is responsible for applying a
* configuration, starting and scheduling directory scans, and reporting
* application state.
* <p>
* The <code>ScanManagerMXBean</code> is a singleton MBean: there can be
* at most one instance of such an MBean registered in a given MBeanServer.
* The name of that MBean is a constant defined in
* {@link ScanManager#SCAN_MANAGER_NAME ScanManager.SCAN_MANAGER_NAME}.
* </p>
* <p>
* The <code>ScanManagerMXBean</code> is the entry point of the <i>scandir</i>
* application management interface. It is from this MBean that all other
* MBeans will be created and registered.
* </p>
*
* @author Sun Microsystems, 2006 - All rights reserved.
**/
public interface ScanManagerMXBean {
/**
* This state tells whether directory scans are running, scheduled,
* successfully completed, or stopped.
* <p>
* The {@link #CLOSED} state means
* that the {@link ScanManagerMXBean} was closed and is no longer usable.
* This state is used when the {@link ScanManagerMXBean} needs to be
* unregistered.
* </p>
**/
public enum ScanState {
/**
* Scanning of directories is in process.
**/
RUNNING,
/**
* Scanning of directories is not in process, but is scheduled
* for a later date.
**/
SCHEDULED,
/**
* Scanning is successfully completed.
**/
COMPLETED,
/**
* Scanning is stopped. No scanning is scheduled.
**/
STOPPED,
/**
* close() was called.
**/
CLOSED
}
/**
* Returns the current state of the application.
* @return the current state of the application.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public ScanState getState()
throws IOException, InstanceNotFoundException;
/**
* Schedule a scan session for a later date.
* <p>
* A scan session is a background task that will sequentially call {@link
* DirectoryScannerMXBean#scan scan()} on every {@link
* DirectoryScannerMXBean} configured for this MBean.
* </p>
* @see #getDirectoryScanners
* @param delay The first scan session will be started after
* the given delay. 0 means start now.
* @param interval Scan session will be rescheduled periodically
* at the specified interval. The interval starts at the
* the end of the scan session: if a scan session takes
* on average x milliseconds to complete, then a scan session will
* be started on average every x+interval milliseconds.
* if (interval == 0) then scan session will not be
* rescheduled, and will run only once.
* @throws IllegalStateException if a scan session is already
* running or scheduled, or the MBean is closed.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void schedule(long delay, long interval)
throws IOException, InstanceNotFoundException;
/**
* Stops current running or scheduled scan sessions if any.
* <p>
* A scan session is a background task that will sequentially call {@link
* DirectoryScannerMXBean#scan scan()} on every {@link
* DirectoryScannerMXBean} configured for this MBean.
* </p>
* <p>
* Scan sessions are started/scheduled by calls to {@link #start start} or
* {@link #schedule schedule}.
* </p>
* After this method completes the state of the application will
* be {@link ScanState#STOPPED}.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void stop()
throws IOException, InstanceNotFoundException;
/**
* Switches the state to CLOSED.
* When closed, this MBean cannot be used any more.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void close()
throws IOException, InstanceNotFoundException;
/**
* Starts a scan session immediately.
* This is equivalent to {@link #schedule(long,long) schedule(0,0)}.
* @throws IllegalStateException if a scan session is already
* running or scheduled, or the MBean is closed.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void start()
throws IOException, InstanceNotFoundException;
/**
* Gets the list of directory scanners configured for this MBean.
* @return A {@code Map<String,DirectoryScannerMXBean>} where the
* key in the map is the value of the <code>name=</code> key
* of the {@link DirectoryScannerMXBean} ObjectName.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws JMException The MBeanServer failed to call the underlying MBean.
**/
public Map<String,DirectoryScannerMXBean> getDirectoryScanners()
throws IOException, JMException;
/**
* Apply the configuration handled by the {@link
* #getConfigurationMBean configuration MBean}.
* <p>
* When the configuration is applied, all the {@link DirectoryScannerMXBean}
* created by this MBean will be unregistered, and new {@link
* DirectoryScannerMXBean} will be created and registered from the
* new {@link ScanDirConfigMXBean#getConfiguration configuration data}.
* </p>
* <p>
* The initial result log configuration held by the {@link
* #getConfigurationMBean configuration MBean} will also be pushed to the
* {@link ResultLogManagerMXBean}. If you don't want to lose your current
* {@link ResultLogManagerMXBean} configuration, you should therefore call
* {@link #applyCurrentResultLogConfig
* applyCurrentResultLogConfig} before calling
* {@link #applyConfiguration applyConfiguration}
* </p>
* @param fromMemory if {@code true}, the configuration will be applied
* from memory. if {@code false}, the {@code ScanManagerMXBean} will
* ask the {@link
* #getConfigurationMBean configuration MBean} to {@link
* ScanDirConfigMXBean#load reload its configuration} before applying
* it.
* @throws IllegalStateException if a scan session is
* running or scheduled, or the MBean is closed.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws JMException The MBeanServer failed to call the underlying MBean.
**/
public void applyConfiguration(boolean fromMemory)
throws IOException, JMException;
/**
* Replaces the {@link
* #getConfigurationMBean configuration MBean}'s {@link
* com.sun.jmx.examples.scandir.config.ScanManagerConfig#getInitialResultLogConfig
* initial result log configuration} with the current {@link
* ResultLogManagerMXBean}
* configuration. This prevents the <code>ResultLogManagerMXBean</code>
* current configuration from being reset when {@link #applyConfiguration
* applyConfiguration} is called.
* @param toMemory if {@code true} only replaces the initial result log
* configuration held in memory.
* if {@code false}, the {@link
* #getConfigurationMBean configuration MBean} will be asked to commit
* the whole configuration to the configuration file.
*
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws JMException The MBeanServer failed to call the underlying MBean.
**/
public void applyCurrentResultLogConfig(boolean toMemory)
throws IOException, JMException;
/**
* Instruct the {@code ScanManagerMXBean} to use another {@link
* ScanDirConfigMXBean configuration MBean}.
* <p>This method doesn't {@link #applyConfiguration apply} the new
* configuration. If you want to apply the new configuration, you should
* additionally call {@link #applyConfiguration
* applyConfiguration(true|false)}. Note that you cannot apply a
* configuration as long as a scan session is scheduled or running.
* In that case you will need to wait for that session to complete
* or call {@link #stop} to stop it.
* </p>
* @param config A proxy to the {@link ScanDirConfigMXBean} that holds
* the new configuration for the application.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
*/
public void setConfigurationMBean(ScanDirConfigMXBean config)
throws IOException, InstanceNotFoundException;
/**
* Gets the current configuration MBean.
* @return A proxy to the current configuration MBean.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public ScanDirConfigMXBean getConfigurationMBean()
throws IOException, InstanceNotFoundException;
/**
* This method creates a new alternate {@link ScanDirConfigMXBean}.
*
* <p>You will need to call {@link #setConfigurationMBean
* setConfigurationMBean} if you
* want this new {@link ScanDirConfigMXBean} to become the
* current configuration MBean.
* </p>
* <p>
* This new {@link ScanDirConfigMXBean} will be unregistered automatically
* by the {@code ScanManagerMXBean} when the {@code ScanManagerMXBean}
* is unregistered.
* </p>
* @param name The short name for the new {@link ScanDirConfigMXBean}.
* This name will be used in the ObjectName <code>name=</code> key
* of the new {@link ScanDirConfigMXBean}.
* @param filename The path of the file from which the new {@link
* ScanDirConfigMXBean} can {@link ScanDirConfigMXBean#load load} or
* {@link ScanDirConfigMXBean#save save} its configuration data.
* Note that even if the file exists and contain a valid
* configuration, you will still need to call {@link
* ScanDirConfigMXBean#load load} to make the {@link
* ScanDirConfigMXBean} load its configuration data.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws JMException The MBeanServer failed to call the underlying MBean.
* @return A proxy to the created {@link ScanDirConfigMXBean}.
*/
public ScanDirConfigMXBean createOtherConfigurationMBean(String name,
String filename)
throws JMException, IOException;
}