View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17
    18  // Contributors:  Mathias Bogaert
    19
    20  package org.apache.log4j.helpers;
    21
    22  import java.io.File;
    23  import org.apache.log4j.helpers.LogLog;
    24
    25  /***
    26     Check every now and then that a certain file has not changed. If it
    27     has, then call the {@link #doOnChange} method.
    28
    29
    30     @author Ceki G&uuml;lc&uuml;
    31     @since version 0.9.1 */
    32  public abstract class FileWatchdog extends Thread {
    33
    34    /***
    35       The default delay between every file modification check, set to 60
    36       seconds.  */
    37    static final public long DEFAULT_DELAY = 60000;
    38    /***
    39       The name of the file to observe  for changes.
    40     */
    41    protected String filename;
    42
    43    /***
    44       The delay to observe between every check. By default set {@link
    45       #DEFAULT_DELAY}. */
    46    protected long delay = DEFAULT_DELAY;
    47
    48    File file;
    49    long lastModif = 0;
    50    boolean warnedAlready = false;
    51    boolean interrupted = false;
    52
    53    protected
    54    FileWatchdog(String filename) {
    55      this.filename = filename;
    56      file = new File(filename);
    57      setDaemon(true);
    58      checkAndConfigure();
    59    }
    60
    61    /***
    62       Set the delay to observe between each check of the file changes.
    63     */
    64    public
    65    void setDelay(long delay) {
    66      this.delay = delay;
    67    }
    68
    69    abstract
    70    protected
    71    void doOnChange();
    72
    73    protected
    74    void checkAndConfigure() {
    75      boolean fileExists;
    76      try {
    77        fileExists = file.exists();
    78      } catch(SecurityException  e) {
    79        LogLog.warn("Was not allowed to read check file existance, file:["+
    80  		  filename+"].");
    81        interrupted = true; // there is no point in continuing
    82        return;
    83      }
    84
    85      if(fileExists) {
    86        long l = file.lastModified(); // this can also throw a SecurityException
    87        if(l > lastModif) {           // however, if we reached this point this
    88  	lastModif = l;              // is very unlikely.
    89  	doOnChange();
    90  	warnedAlready = false;
    91        }
    92      } else {
    93        if(!warnedAlready) {
    94  	LogLog.debug("["+filename+"] does not exist.");
    95  	warnedAlready = true;
    96        }
    97      }
    98    }
    99
    100   public
    101   void run() {
    102     while(!interrupted) {
    103       try {
    104 	    Thread.sleep(delay);
    105       } catch(InterruptedException e) {
    106 	// no interruption expected
    107       }
    108       checkAndConfigure();
    109     }
    110   }
    111 }