/* * 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.config; import java.io.File; import java.io.FileFilter; import java.util.Arrays; import java.util.Date; import java.util.logging.Logger; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** * The <code>FileMatch</code> Java Bean is used to model * the configuration of a {@link FileFilter} which * matches {@link File files} against a set of criteria. * <p> * The <code>FileMatch</code> class also implements * {@link FileFilter} - applying an {@code AND} on all * its conditions. {@code OR} conditions can be obtained * by supplying several instances of <code>FileMatch</code> * to the encapsulating {@link DirectoryScannerConfig}, which * respectively applies an {@code OR} on all its * {@code <FileFilter>} elements. * </p> * * <p> * This class is annotated for XML binding. * </p> * @author Sun Microsystems, 2006 - All rights reserved. */ @XmlRootElement(name="FileFilter", namespace=XmlConfigUtils.NAMESPACE) public class FileMatch implements FileFilter { // // A logger for this class. // // private static final Logger LOG = // Logger.getLogger(FileMatch.class.getName()); /** * A regular expression against which directory names should be matched. */ private String directoryPattern; /** * A regular expression against which file names should be matched. */ private String filePattern; /** * File whose size in bytes exceeds this limit will be selected. */ private long sizeExceedsMaxBytes; /** * A file which will be selected only if it was last modified after * this date */ private Date lastModifiedAfter; /** * A file which will be selected only if it was last modified before * this date */ private Date lastModifiedBefore; /** * Creates a new instance of FileMatch */ public FileMatch() { } /** * Getter for property directoryPattern. This is a regular expression * against which directory names should be matched. * Applies only to directory, and tells whether a directory should be * included or excluded from the search. * <p>If File.isDirectory() && directoryPattern!=null && * File.getName().matches(directoryPattern), * then File matches this filter.<br> * If File.isDirectory() && directoryPattern!=null && * File.getName().matches(directoryPattern)==false, * then File doesn't match this filter.<br> * </p> * @see java.util.regex.Pattern * @see java.lang.String#matches(java.lang.String) * @return Value of property directoryPattern. */ @XmlElement(name="DirectoryPattern",namespace=XmlConfigUtils.NAMESPACE) public String getDirectoryPattern() { return this.directoryPattern; } /** * Setter for property directoryPattern. * @param directoryPattern New value of property directoryPattern. * This is a regular expression * against which directory names should be {@link #getDirectoryPattern * matched}. * @see java.util.regex.Pattern * @see java.lang.String#matches(java.lang.String) */ public void setDirectoryPattern(String directoryPattern) { this.directoryPattern = directoryPattern; } /** * Getter for property filePattern. This is a regular expression * against which file names should be matched. * Applies only to files. * <p> * If File.isDirectory()==false && filePattern!=null && * File.getName().matches(filePattern)==false, * then File doesn't match this filter. * </p> * @see java.util.regex.Pattern * @see java.lang.String#matches(java.lang.String) * @return Value of property filePatern. */ @XmlElement(name="FilePattern",namespace=XmlConfigUtils.NAMESPACE) public String getFilePattern() { return this.filePattern; } /** * Setter for property filePattern. * @param filePattern New value of property filePattern. * This is a regular expression * against which file names should be {@link #getFilePattern matched}. * @see java.util.regex.Pattern * @see java.lang.String#matches(java.lang.String) */ public void setFilePattern(String filePattern) { this.filePattern = filePattern; } /** * Getter for property sizeExceedsMaxBytes. * Ignored if 0 or negative. Otherwise, files whose size in bytes does * not exceed this limit will be excluded by this filter. * * @return Value of property sizeExceedsMaxBytes. */ @XmlElement(name="SizeExceedsMaxBytes",namespace=XmlConfigUtils.NAMESPACE) public long getSizeExceedsMaxBytes() { return this.sizeExceedsMaxBytes; } /** * Setter for property sizeExceedsMaxBytes. * @param sizeLimitInBytes New value of property sizeExceedsMaxBytes. * Ignored if 0 or negative. Otherwise, files whose size in bytes does * not exceed this limit will be excluded by this filter. * */ public void setSizeExceedsMaxBytes(long sizeLimitInBytes) { this.sizeExceedsMaxBytes = sizeLimitInBytes; } /** * Getter for property {@code lastModifiedAfter}. * A file will be selected only if it was last modified after * {@code lastModifiedAfter}. * <br>This condition is ignored if {@code lastModifiedAfter} is * {@code null}. * @return Value of property {@code lastModifiedAfter}. */ @XmlElement(name="LastModifiedAfter",namespace=XmlConfigUtils.NAMESPACE) public Date getLastModifiedAfter() { return (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone(); } /** * Setter for property {@code lastModifiedAfter}. * @param lastModifiedAfter A file will be selected only if it was * last modified after {@code lastModifiedAfter}. * <br>This condition is ignored if {@code lastModifiedAfter} is * {@code null}. */ public void setLastModifiedAfter(Date lastModifiedAfter) { this.lastModifiedAfter = (lastModifiedAfter==null)?null:(Date)lastModifiedAfter.clone(); } /** * Getter for property {@code lastModifiedBefore}. * A file will be selected only if it was last modified before * {@code lastModifiedBefore}. * <br>This condition is ignored if {@code lastModifiedBefore} is * {@code null}. * @return Value of property {@code lastModifiedBefore}. */ @XmlElement(name="LastModifiedBefore",namespace=XmlConfigUtils.NAMESPACE) public Date getLastModifiedBefore() { return (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone(); } /** * Setter for property {@code lastModifiedBefore}. * @param lastModifiedBefore A file will be selected only if it was * last modified before {@code lastModifiedBefore}. * <br>This condition is ignored if {@code lastModifiedBefore} is * {@code null}. */ public void setLastModifiedBefore(Date lastModifiedBefore) { this.lastModifiedBefore = (lastModifiedBefore==null)?null:(Date)lastModifiedBefore.clone(); } // Accepts or rejects a file with regards to the values of the fields // configured in this bean. The accept() method is the implementation // of FileFilter.accept(File); // /** * A file is accepted when all the criteria that have been set * are matched. * @param f The file to match against the configured criteria. * @return {@code true} if the file matches all criteria, * {@code false} otherwise. */ public boolean accept(File f) { // Directories are accepted if they match against the directory pattern. // if (f.isDirectory()) { if (directoryPattern != null && !f.getName().matches(directoryPattern)) return false; else return true; } // If we reach here, the f is not a directory. // // Files are accepted if they match all other conditions. // Check whether f matches filePattern if (filePattern != null && !f.getName().matches(filePattern)) return false; // Check whether f exceeeds size limit if (sizeExceedsMaxBytes > 0 && f.length() <= sizeExceedsMaxBytes) return false; // Check whether f was last modified after lastModifiedAfter if (lastModifiedAfter != null && lastModifiedAfter.after(new Date(f.lastModified()))) return false; // Check whether f was last modified before lastModifiedBefore if (lastModifiedBefore != null && lastModifiedBefore.before(new Date(f.lastModified()))) return false; // All conditions were met: accept file. return true; } // used by equals() private Object[] toArray() { final Object[] thisconfig = { directoryPattern, filePattern, lastModifiedAfter, lastModifiedBefore, sizeExceedsMaxBytes }; return thisconfig; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof FileMatch)) return false; final FileMatch other = (FileMatch)o; final Object[] thisconfig = toArray(); final Object[] otherconfig = other.toArray(); return Arrays.deepEquals(thisconfig,otherconfig); } @Override public int hashCode() { return Arrays.deepHashCode(toArray()); } }