blob: 31f44ce0d0e9cf322deb41d5ff83f64945f2608e [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.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());
}
}