Crossfire JXClient, Trunk
ScanDirConfig.java
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * - Neither the name of Oracle nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * This source code is provided to illustrate the usage of a given feature
34  * or technique and has been deliberately simplified. Additional steps
35  * required for a production-quality application, such as security checks,
36  * input validation and proper error handling, might not be present in
37  * this sample code.
38  */
39 
40 
41 package com.sun.jmx.examples.scandir;
42 
49 import java.io.File;
50 import java.io.IOException;
51 import java.io.InputStream;
52 import java.io.OutputStream;
53 import java.util.Date;
54 import java.util.logging.Level;
55 import java.util.logging.Logger;
56 import javax.management.*;
57 import javax.xml.bind.JAXBException;
58 
103 public class ScanDirConfig extends NotificationBroadcasterSupport
104  implements ScanDirConfigMXBean, MBeanRegistration {
105 
109  private static final Logger LOG =
110  Logger.getLogger(ScanDirConfig.class.getName());
111 
112  // We will emit a notification when the save state of this object
113  // chenges. We use directly the base notification class, with a
114  // notification type that indicates the new state at which the
115  // object has arrived.
116  //
117  // All these notification types will have the same prefix, which is
118  // 'com.sun.jmx.examples.scandir.config'.
119  //
120  private final static String NOTIFICATION_PREFIX =
121  ScanManagerConfig.class.getPackage().getName();
122 
127  public final static String NOTIFICATION_SAVED =
128  NOTIFICATION_PREFIX+".saved";
133  public final static String NOTIFICATION_LOADED =
134  NOTIFICATION_PREFIX+".loaded";
135 
140  public final static String NOTIFICATION_MODIFIED =
141  NOTIFICATION_PREFIX+".modified";
142 
143  // The array of MBeanNotificationInfo that will be exposed in the
144  // ScanDirConfigMXBean MBeanInfo.
145  // We will pass this array to the NotificationBroadcasterSupport
146  // constructor.
147  //
148  private static MBeanNotificationInfo[] NOTIFICATION_INFO = {
149  new MBeanNotificationInfo(
150  new String[] {NOTIFICATION_SAVED},
151  Notification.class.getName(),
152  "Emitted when the configuration is saved"),
153  new MBeanNotificationInfo(
154  new String[] {NOTIFICATION_LOADED},
155  Notification.class.getName(),
156  "Emitted when the configuration is loaded"),
157  new MBeanNotificationInfo(
158  new String[] {NOTIFICATION_MODIFIED},
159  Notification.class.getName(),
160  "Emitted when the configuration is modified"),
161  };
162 
163  // The ScanDirConfigMXBean configuration data.
164  private volatile ScanManagerConfig config;
165 
166  // The name of the configuration file
167  private String filename = null;
168 
169  // The name of this configuration. This is usually both equal to
170  // config.getName() and objectName.getKeyProperty(name).
171  private volatile String configname = null;
172 
173  // This object save state. CREATED is the initial state.
174  //
175  private volatile SaveState status = CREATED;
176 
202  public ScanDirConfig(String filename) {
203  this(filename,null);
204  }
205 
211  public ScanDirConfig(String filename, ScanManagerConfig initialConfig) {
212  super(NOTIFICATION_INFO);
213  this.filename = filename;
214  this.config = initialConfig;
215  }
216 
217 
218  // see ScanDirConfigMXBean
219  public void load() throws IOException {
220  if (filename == null)
221  throw new UnsupportedOperationException("load");
222 
223  synchronized(this) {
225  if (configname != null) config = config.copy(configname);
226  else configname = config.getName();
227 
228  status=LOADED;
229  }
231  }
232 
233  // see ScanDirConfigMXBean
234  public void save() throws IOException {
235  if (filename == null)
236  throw new UnsupportedOperationException("load");
237  synchronized (this) {
239  status = SAVED;
240  }
242  }
243 
244  // see ScanDirConfigMXBean
246  synchronized (this) {
248  }
249  }
250 
251 
252  // sends a notification indicating the new save state.
253  private void sendNotification(String type) {
254  final Object source = (objectName==null)?this:objectName;
255  final Notification n = new Notification(type,source,
256  getNextSeqNumber(),
257  "The configuration is "+
258  type.substring(type.lastIndexOf('.')+1));
259  sendNotification(n);
260  }
261 
262 
288  public ObjectName preRegister(MBeanServer server, ObjectName name)
289  throws Exception {
290  if (name == null) {
291  if (config == null) return null;
292  if (config.getName() == null) return null;
293  name = ScanManager.
294  makeMBeanName(ScanDirConfigMXBean.class,config.getName());
295  }
296  objectName = name;
298  synchronized (this) {
299  configname = name.getKeyProperty("name");
300  if (config == null) config = new ScanManagerConfig(configname);
301  else config = config.copy(configname);
302  }
303  return name;
304  }
305 
315  public void postRegister(Boolean registrationDone) {
316  // Nothing to do here.
317  }
318 
326  public void preDeregister() throws Exception {
327  // Nothing to do here.
328  }
329 
335  public void postDeregister() {
336  // Nothing to do here.
337  }
338 
339  // see ScanDirConfigMXBean
340  public String getConfigFilename() {
341  return filename;
342  }
343 
344  // see ScanDirConfigMXBean
346  synchronized (this) {
347  if (config == null) {
348  this.config = null;
349  return;
350  }
351 
352  if (configname == null)
354 
355  this.config = config.copy(configname);
356  status = MODIFIED;
357  }
359  }
360 
361  // see ScanDirConfigMXBean
363  addDirectoryScanner(String name, String dir, String filePattern,
364  long sizeExceedsMaxBytes, long sinceLastModified) {
365  final DirectoryScannerConfig scanner =
367  scanner.setRootDirectory(dir);
368  if (filePattern!=null||sizeExceedsMaxBytes>0||sinceLastModified>0) {
369  final FileMatch filter = new FileMatch();
370  filter.setFilePattern(filePattern);
371  filter.setSizeExceedsMaxBytes(sizeExceedsMaxBytes);
372  if (sinceLastModified > 0)
373  filter.setLastModifiedBefore(new Date(new Date().getTime()
374  -sinceLastModified));
375  scanner.addIncludeFiles(filter);
376  }
377  synchronized (this) {
378  config.putScan(scanner);
379  status = MODIFIED;
380  }
381  LOG.fine("config: "+config);
383  return scanner;
384  }
385 
386  // see ScanDirConfigMXBean
388  throws IOException, InstanceNotFoundException {
389  final DirectoryScannerConfig scanner;
390  synchronized (this) {
391  scanner = config.removeScan(name);
392  if (scanner == null)
393  throw new IllegalArgumentException(name+": scanner not found");
394  status = MODIFIED;
395  }
397  return scanner;
398  }
399 
400  // see ScanDirConfigMXBean
402  return status;
403  }
404 
405  // These methods are used by ScanManager to guess a configuration name from
406  // a configuration filename.
407  //
408  static String DEFAULT = "DEFAULT";
409 
410  private static String getBasename(String name) {
411  final int dot = name.indexOf('.');
412  if (dot<0) return name;
413  if (dot==0) return getBasename(name.substring(1));
414  return name.substring(0,dot);
415  }
416 
417  static String guessConfigName(String configFileName,String defaultFile) {
418  try {
419  if (configFileName == null) return DEFAULT;
420  final File f = new File(configFileName);
421  if (f.canRead()) {
422  final String confname = XmlConfigUtils.read(f).getName();
423  if (confname != null && confname.length()>0) return confname;
424  }
425  final File f2 = new File(defaultFile);
426  if (f.equals(f2)) return DEFAULT;
427  final String guess = getBasename(f.getName());
428  if (guess == null) return DEFAULT;
429  if (guess.length()==0) return DEFAULT;
430  return guess;
431  } catch (Exception x) {
432  return DEFAULT;
433  }
434  }
435 
436  // Set by preRegister()
437  private volatile MBeanServer mbeanServer;
438  private volatile ObjectName objectName;
439 
440 }
com.sun.jmx.examples.scandir.config
Definition: DirectoryScannerConfig.java:41
com.sun.jmx.examples.scandir.ScanDirConfig.postDeregister
void postDeregister()
Definition: ScanDirConfig.java:335
com.sun.jmx.examples.scandir.ScanDirConfig.load
void load()
Definition: ScanDirConfig.java:219
com.sun.jmx.examples.scandir.ScanDirConfig.addDirectoryScanner
DirectoryScannerConfig addDirectoryScanner(String name, String dir, String filePattern, long sizeExceedsMaxBytes, long sinceLastModified)
Definition: ScanDirConfig.java:363
com.sun.jmx.examples.scandir.config.FileMatch.setSizeExceedsMaxBytes
void setSizeExceedsMaxBytes(long sizeLimitInBytes)
Definition: FileMatch.java:196
com.sun.jmx.examples.scandir.ScanDirConfig.DEFAULT
static String DEFAULT
Definition: ScanDirConfig.java:408
com.sun.jmx.examples.scandir.ScanDirConfig.getSaveState
SaveState getSaveState()
Definition: ScanDirConfig.java:401
com.sun.jmx.examples.scandir.ScanDirConfig.getConfiguration
ScanManagerConfig getConfiguration()
Definition: ScanDirConfig.java:245
com.sun.jmx.examples.scandir
com.sun.jmx.examples.scandir.config.XmlConfigUtils.readFromFile
synchronized ScanManagerConfig readFromFile()
Definition: XmlConfigUtils.java:217
com.sun.jmx.examples.scandir.ScanDirConfig.getConfigFilename
String getConfigFilename()
Definition: ScanDirConfig.java:340
com.sun.jmx.examples.scandir.ScanDirConfig.config
volatile ScanManagerConfig config
Definition: ScanDirConfig.java:164
com.sun.jmx.examples.scandir.config.ScanManagerConfig.putScan
DirectoryScannerConfig putScan(DirectoryScannerConfig scan)
Definition: ScanManagerConfig.java:248
com.sun.jmx.examples.scandir.ScanManager
Definition: ScanManager.java:103
com.sun.jmx.examples.scandir.ScanDirConfig.NOTIFICATION_SAVED
static final String NOTIFICATION_SAVED
Definition: ScanDirConfig.java:127
com.sun.jmx.examples.scandir.ScanDirConfig.mbeanServer
volatile MBeanServer mbeanServer
Definition: ScanDirConfig.java:437
com.sun.jmx.examples.scandir.ScanDirConfig.guessConfigName
static String guessConfigName(String configFileName, String defaultFile)
Definition: ScanDirConfig.java:417
com.sun.jmx.examples.scandir.ScanDirConfig.LOG
static final Logger LOG
Definition: ScanDirConfig.java:109
server
in the editor and run the same with Tools Run menu You will see an alert box with the message world In addition to being a simple script editor scriptpad can be used to connect to a JMX MBean server("Tools->JMX Connect" menu). User can specify JMX hostname and port. After connecting
com.sun.jmx.examples.scandir.ScanDirConfig.objectName
volatile ObjectName objectName
Definition: ScanDirConfig.java:438
com.sun.jmx.examples.scandir.ScanDirConfig.status
volatile SaveState status
Definition: ScanDirConfig.java:175
com.sun.jmx.examples
com.sun.jmx.examples.scandir.config.FileMatch
Definition: FileMatch.java:72
com.sun.jmx.examples.scandir.ScanDirConfig.removeDirectoryScanner
DirectoryScannerConfig removeDirectoryScanner(String name)
Definition: ScanDirConfig.java:387
com.sun.jmx.examples.scandir.config.FileMatch.setFilePattern
void setFilePattern(String filePattern)
Definition: FileMatch.java:173
com.sun.jmx.examples.scandir.ScanDirConfig.preRegister
ObjectName preRegister(MBeanServer server, ObjectName name)
Definition: ScanDirConfig.java:288
com.sun
com.sun.jmx.examples.scandir.config.ScanManagerConfig.getName
String getName()
Definition: ScanManagerConfig.java:173
com.sun.jmx.examples.scandir.ScanDirConfig.NOTIFICATION_MODIFIED
static final String NOTIFICATION_MODIFIED
Definition: ScanDirConfig.java:140
com.sun.jmx.examples.scandir.ScanDirConfig.setConfiguration
void setConfiguration(ScanManagerConfig config)
Definition: ScanDirConfig.java:345
com.sun.jmx.examples.scandir.ScanDirConfig.save
void save()
Definition: ScanDirConfig.java:234
com.sun.jmx.examples.scandir.ScanDirConfig.postRegister
void postRegister(Boolean registrationDone)
Definition: ScanDirConfig.java:315
com.sun.jmx.examples.scandir.ScanDirConfig.getBasename
static String getBasename(String name)
Definition: ScanDirConfig.java:410
com.sun.jmx.examples.scandir.config.ScanManagerConfig.removeScan
DirectoryScannerConfig removeScan(String name)
Definition: ScanManagerConfig.java:266
com.sun.jmx.examples.scandir.config.XmlConfigUtils.writeToFile
synchronized void writeToFile(ScanManagerConfig bean)
Definition: XmlConfigUtils.java:103
com.sun.jmx.examples.scandir.ScanDirConfig.ScanDirConfig
ScanDirConfig(String filename)
Definition: ScanDirConfig.java:202
com.sun.jmx.examples.scandir.ScanDirConfig.ScanDirConfig
ScanDirConfig(String filename, ScanManagerConfig initialConfig)
Definition: ScanDirConfig.java:211
com.sun.jmx.examples.scandir.ScanDirConfig.preDeregister
void preDeregister()
Definition: ScanDirConfig.java:326
com.sun.jmx.examples.scandir.ScanDirConfig.filename
String filename
Definition: ScanDirConfig.java:167
com.sun.jmx.examples.scandir.config.ScanManagerConfig.copy
ScanManagerConfig copy(String newname)
Definition: ScanManagerConfig.java:292
com.sun.jmx.examples.scandir.ScanDirConfig.NOTIFICATION_PREFIX
static final String NOTIFICATION_PREFIX
Definition: ScanDirConfig.java:120
com.sun.jmx.examples.scandir.ScanManager.getNextSeqNumber
static synchronized long getNextSeqNumber()
Definition: ScanManager.java:961
com.sun.jmx.examples.scandir.config.FileMatch.setLastModifiedBefore
void setLastModifiedBefore(Date lastModifiedBefore)
Definition: FileMatch.java:245
com.sun.jmx.examples.scandir.ScanDirConfig.NOTIFICATION_LOADED
static final String NOTIFICATION_LOADED
Definition: ScanDirConfig.java:133
com
com.sun.jmx.examples.scandir.config.XmlConfigUtils.xmlClone
static ScanManagerConfig xmlClone(ScanManagerConfig bean)
Definition: XmlConfigUtils.java:165
com.sun.jmx.examples.scandir.ScanDirConfig.NOTIFICATION_INFO
static MBeanNotificationInfo[] NOTIFICATION_INFO
Definition: ScanDirConfig.java:148
com.sun.jmx
com.sun.jmx.examples.scandir.ScanDirConfigMXBean.SaveState
Definition: ScanDirConfigMXBean.java:91
com.sun.jmx.examples.scandir.ScanDirConfig.configname
volatile String configname
Definition: ScanDirConfig.java:171
com.sun.jmx.examples.scandir.ScanDirConfig.sendNotification
void sendNotification(String type)
Definition: ScanDirConfig.java:253
com.sun.jmx.examples.scandir.ScanDirConfigMXBean
Definition: ScanDirConfigMXBean.java:83
com.sun.jmx.examples.scandir.ScanDirConfig
Definition: ScanDirConfig.java:103
com.sun.jmx.examples.scandir.config.XmlConfigUtils
Definition: XmlConfigUtils.java:62
com.sun.jmx.examples.scandir.config.DirectoryScannerConfig
Definition: DirectoryScannerConfig.java:67
name
A Simple Chat Server Example the server takes input from a it handles the startup and handles incoming connections on the listening sockets It keeps a list of connected client and provides methods for sending a message to them Client represents a connected it provides methods for reading writing from to the underlying socket It also contains a buffer of input read from the user DataReader provides the interface of the two states a user can be in Waiting for a name(and not receiving any messages while doing so, implemented by NameReader) and waiting for messages from the user(implemented by MessageReader). ClientReader contains the "main loop" for a connected client. NameReader is the initial state for a new client
com.sun.jmx.examples.scandir.config.ScanManagerConfig
Definition: ScanManagerConfig.java:72
com.sun.jmx.examples.scandir.config.XmlConfigUtils.read
static ScanManagerConfig read(File f)
Definition: XmlConfigUtils.java:240