001: /*-
002: * See the file LICENSE for redistribution information.
003: *
004: * Copyright (c) 2002,2008 Oracle. All rights reserved.
005: *
006: * $Id: JEFileFilter.java,v 1.18.2.3 2008/01/07 15:14:13 cwl Exp $
007: */
008:
009: package com.sleepycat.je.log;
010:
011: import java.io.File;
012: import java.io.FilenameFilter;
013: import java.util.StringTokenizer;
014:
015: /**
016: * JEFileFilters are used for listing je files.
017: */
018: class JEFileFilter implements FilenameFilter {
019: String[] suffix;
020: long minFileNumber = 0;
021: long maxFileNumber = -1;
022:
023: JEFileFilter(String[] suffix) {
024: this .suffix = suffix;
025: }
026:
027: /**
028: * @param maxFileNumber this filter will only return
029: * files that are numbers <= maxFileNumber.
030: */
031: JEFileFilter(String[] suffix, long maxFileNumber) {
032: this .suffix = suffix;
033: this .maxFileNumber = maxFileNumber;
034: }
035:
036: /**
037: * @param minFileNumber this filter will only return files that are >=
038: * minFileNumber.
039: * @param maxFileNumber this filter will only return
040: * files that are numbers <= maxFileNumber.
041: */
042: JEFileFilter(String[] suffix, long minFileNumber, long maxFileNumber) {
043: this .suffix = suffix;
044: this .minFileNumber = minFileNumber;
045: this .maxFileNumber = maxFileNumber;
046: }
047:
048: private boolean matches(String fileSuffix) {
049: for (int i = 0; i < suffix.length; i++) {
050: if (fileSuffix.equalsIgnoreCase(suffix[i])) {
051: return true;
052: }
053: }
054: return false;
055: }
056:
057: /**
058: * A JE file has to be of the format nnnnnnnn.suffix.
059: */
060: public boolean accept(File dir, String name) {
061: boolean ok = false;
062: StringTokenizer tokenizer = new StringTokenizer(name, ".");
063: /* There should be two parts. */
064: int nTokens = tokenizer.countTokens();
065: if (nTokens == 2 || nTokens == 3) {
066: boolean hasVersion = (nTokens == 3);
067: String fileNumber = tokenizer.nextToken();
068: String fileSuffix = "." + tokenizer.nextToken();
069: String fileVersion = (hasVersion ? tokenizer.nextToken()
070: : null);
071:
072: /* Check the length and the suffix. */
073: if ((fileNumber.length() == 8) && matches(fileSuffix)) {
074: //(fileSuffix.equalsIgnoreCase(suffix))) {
075:
076: /* The first part should be a number. */
077: try {
078: long fileNum = Long.parseLong(fileNumber, 16);
079: if (fileNum < minFileNumber) {
080: ok = false;
081: } else if ((fileNum <= maxFileNumber)
082: || (maxFileNumber == -1)) {
083: ok = true;
084: }
085: } catch (NumberFormatException e) {
086: ok = false;
087: }
088: if (hasVersion) {
089: try {
090: Integer.parseInt(fileVersion);
091: ok = true;
092: } catch (NumberFormatException e) {
093: ok = false;
094: }
095: }
096: }
097: }
098:
099: return ok;
100: }
101: }
|