blob: eb4f375f1abff2c0e47d62bf6485cf35fa325a7a [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 com.sun.jmx.examples.scandir.config.DirectoryScannerConfig;
import com.sun.jmx.examples.scandir.config.ScanManagerConfig;
import java.io.IOException;
import javax.management.InstanceNotFoundException;
/**
* <p>The <code>ScanDirConfigMXBean</code> is in charge of the
* <i>scandir</i> application configuration.
* </p>
* <p>The <code>ScanDirConfigMXBean</code> is an MBean which is able to
* load and save the <i>scandir</i> application configuration to and from an
* XML file.
* </p>
* <p>
* It will let you also interactively modify that configuration, which you
* can later save to the file, by calling {@link #save}, or discard, by
* reloading the file without saving - see {@link #load}.
* </p>
* <p>
* There can be as many <code>ScanDirConfigMXBean</code> registered
* in the MBeanServer as you like, but only one of them will be identified as
* the current configuration of the {@link ScanManagerMXBean}.
* You can switch to another configuration by calling {@link
* ScanManagerMXBean#setConfigurationMBean
* ScanManagerMXBean.setConfigurationMBean}.
* </p>
* <p>
* Once the current configuration has been loaded (by calling {@link #load})
* or modified (by calling one of {@link #addDirectoryScanner
* addDirectoryScanner}, {@link #removeDirectoryScanner removeDirectoryScanner}
* or {@link #setConfiguration setConfiguration}) it can be pushed
* to the {@link ScanManagerMXBean} by calling {@link
* ScanManagerMXBean#applyConfiguration
* ScanManagerMXBean.applyConfiguration(true)} -
* <code>true</code> means that we apply the configuration from memory,
* without first reloading the file.
* </p>
*
* @author Sun Microsystems, 2006 - All rights reserved.
*/
public interface ScanDirConfigMXBean {
/**
* This state tells whether the configuration reflected by the
* {@link ScanDirConfigMXBean} was loaded in memory, saved to the
* configuration file, or modified since last saved.
* Note that this state doesn't tell whether the configuration was
* applied by the {@link ScanManagerMXBean}.
**/
public enum SaveState {
/**
* Initial state: the {@link ScanDirConfigMXBean} is created, but
* neither {@link #load} or {@link #save} was yet called.
**/
CREATED,
/**
* The configuration reflected by the {@link ScanDirConfigMXBean} has
* been loaded, but not modified yet.
**/
LOADED,
/**
* The configuration was modified. The modifications are held in memory.
* Call {@link #save} to save them to the file, or {@link #load} to
* reload the file and discard them.
**/
MODIFIED,
/**
* The configuration was saved.
**/
SAVED
};
/**
* Loads the configuration from the {@link
* #getConfigFilename configuration file}.
* <p>Any unsaved modification will be lost. The {@link #getSaveState state}
* is switched to {@link SaveState#LOADED LOADED}.
* </p>
* <p>
* This action has no effect on the {@link ScanManagerMXBean} until
* {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
* points to this MBean and {@link ScanManagerMXBean#applyConfiguration
* ScanManagerMXBean.applyConfiguration} is called.
* </p>
* @see #getSaveState()
* @throws IOException The configuration couldn't be loaded from the file,
* e.g. because the file doesn't exist or isn't
* readable.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void load()
throws IOException, InstanceNotFoundException;
/**
* Saves the configuration to the {@link
* #getConfigFilename configuration file}.
*
* <p>If the configuration file doesn't exists, this method will
* attempt to create it. Otherwise, the existing file will
* be renamed by appending a '~' to its name, and a new file
* will be created, in which the configuration will be saved.
* The {@link #getSaveState state}
* is switched to {@link SaveState#SAVED SAVED}.
* </p>
* <p>
* This action has no effect on the {@link ScanManagerMXBean}.
* </p>
* @see #getSaveState()
*
* @throws IOException The configuration couldn't be saved to the file,
* e.g. because the file couldn't be created.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public void save()
throws IOException, InstanceNotFoundException;
/**
* Gets the name of the configuration file.
* <p>If the configuration file doesn't exists, {@link #load} will fail
* and {@link #save} will attempt to create the file.
* </p>
*
* @return The configuration file name for this MBean.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public String getConfigFilename()
throws IOException, InstanceNotFoundException;
/**
* Gets the current configuration data.
* <p>
* This method returns the configuration data which is currently held
* in memory.
* </p>
* <p>Call {@link #load} to reload the data from the configuration
* file, and {@link #save} to save the data to the configuration
* file.
* </p>
* @see #getSaveState()
* @return The current configuration data in memory.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public ScanManagerConfig getConfiguration()
throws IOException, InstanceNotFoundException;
/**
* Sets the current configuration data.
* <p>
* This method replaces the configuration data in memory.
* The {@link #getSaveState state} is switched to {@link
* SaveState#MODIFIED MODIFIED}.
* </p>
* <p>Calling {@link #load} will reload the data from the configuration
* file, and all modifications will be lost.
* Calling {@link #save} will save the modified data to the configuration
* file.
* </p>
* <p>
* This action has no effect on the {@link ScanManagerMXBean} until
* {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
* points to this MBean and {@link ScanManagerMXBean#applyConfiguration
* ScanManagerMXBean.applyConfiguration} is called.
* </p>
* @param config The new configuration data.
* @see #getSaveState()
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
*/
public void setConfiguration(ScanManagerConfig config)
throws IOException, InstanceNotFoundException;
/**
* Adds a new directory scanner to the current configuration data.
* <p>
* This method updates the configuration data in memory, adding
* a {@link DirectoryScannerConfig} to the {@link
* ScanManagerConfig#getScanList directory scanner list}.
* The {@link #getSaveState state} is switched to {@link
* SaveState#MODIFIED MODIFIED}.
* </p>
* <p>Calling {@link #load} will reload the data from the configuration
* file, and all modifications will be lost.
* Calling {@link #save} will save the modified data to the configuration
* file.
* </p>
* <p>
* This action has no effect on the {@link ScanManagerMXBean} until
* {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
* points to this MBean and {@link ScanManagerMXBean#applyConfiguration
* ScanManagerMXBean.applyConfiguration} is called.
* </p>
* @param name A name for the new directory scanner. This is the value
* that will be later used in the {@link DirectoryScannerMXBean}
* ObjectName for the <code>name=</code> key.
* @param dir The root directory at which this scanner will start scanning.
* @param filePattern A {@link java.util.regex.Pattern regular expression}
* to match against a selected file name.
* @param sizeExceedsMaxBytes Only file whose size exceeds that limit will
* be selected. <code.0</code> or a
* negative value means no limit.
* @param sinceLastModified Select files which haven't been modified for
* that number of milliseconds - i.e.
* {@code sinceLastModified=3600000} will exclude files which
* have been modified in the last hour.
* The date of last modification is ignored if <code>0</code> or a
* negative value is provided.
* @see #getSaveState()
* @return The added <code>DirectoryScannerConfig</code>.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public DirectoryScannerConfig
addDirectoryScanner(String name, String dir, String filePattern,
long sizeExceedsMaxBytes, long sinceLastModified)
throws IOException, InstanceNotFoundException;
/**
* Removes a directory scanner from the current configuration data.
* <p>
* This method updates the configuration data in memory, removing
* a {@link DirectoryScannerConfig} from the {@link
* ScanManagerConfig#getScanList directory scanner list}.
* The {@link #getSaveState state} is switched to {@link
* SaveState#MODIFIED MODIFIED}.
* </p>
* <p>Calling {@link #load} will reload the data from the configuration
* file, and all modifications will be lost.
* Calling {@link #save} will save the modified data to the configuration
* file.
* </p>
* <p>
* This action has no effect on the {@link ScanManagerMXBean} until
* {@link ScanManagerMXBean#getConfigurationMBean ScanManagerMXBean}
* points to this MBean and {@link ScanManagerMXBean#applyConfiguration
* ScanManagerMXBean.applyConfiguration} is called.
* </p>
* @param name The name of the new directory scanner. This is the value
* that is used in the {@link DirectoryScannerMXBean}
* ObjectName for the <code>name=</code> key.
* @return The removed <code>DirectoryScannerConfig</code>.
* @throws IllegalArgumentException if there's no directory scanner by
* that name in the current configuration data.
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
**/
public DirectoryScannerConfig
removeDirectoryScanner(String name)
throws IOException, InstanceNotFoundException;
/**
* Gets the save state of the current configuration data.
* <p>
* {@link SaveState#CREATED CREATED} means that the configuration data was just
* created. It has not been loaded from the configuration file.
* Calling {@link #load} will load the data from the configuration file.
* Calling {@link #save} will write the empty data to the configuration
* file.
* </p>
* <p>
* {@link SaveState#LOADED LOADED} means that the configuration data
* was loaded from the configuration file.
* </p>
* <p>
* {@link SaveState#MODIFIED MODIFIED} means that the configuration data
* was modified since it was last loaded or saved.
* Calling {@link #load} will reload the data from the configuration file,
* and all modifications will be lost.
* Calling {@link #save} will write the modified data to the configuration
* file.
* </p>
* <p>
* {@link SaveState#SAVED SAVED} means that the configuration data
* was saved to the configuration file.
* </p>
* <p>
* This state doesn't indicate whether this MBean configuration data
* was {@link ScanManagerMXBean#applyConfiguration applied} by the
* {@link ScanManagerMXBean}.
* </p>
* @throws IOException A connection problem occurred when accessing
* the underlying resource.
* @throws InstanceNotFoundException The underlying MBean is not
* registered in the MBeanServer.
* @return The save state of the {@code ScanDirConfigMXBean}.
*/
public SaveState getSaveState()
throws IOException, InstanceNotFoundException;
}