org.seasar.mayaa.impl.source.SystemIDFileSearchIterator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mayaa Show documentation
Show all versions of mayaa Show documentation
Mayaa is server side web template engine that is strongly aware of work sharing between programmers and designers based on HTML based templates.
The newest version!
/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/package org.seasar.mayaa.impl.source;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Iterator;
import org.seasar.mayaa.impl.util.FileSearchIterator;
import org.seasar.mayaa.impl.util.StringUtil;
/**
* 指定フォルダ以下のファイルのSystemIDを順番に返すIterator。
* フォルダ内のファイルを全て返したら、次はサブフォルダを処理します。
* 見つけたファイルのうち、ファイル名がフィルタに合致するファイルのみを対象とします。
* ただし隠しファイルは対象としません。
*
* フィルタはセミコロン(";")で区切ることで複数指定できます。
* フィルタの指定方法は2パターンあります。
*
* - "."で始まる英数字のみの文字列の場合は拡張子とみなし、一致するものを対象とします。
* (大文字小文字を区別しない)
* - 1以外の場合は正規表現とみなし、絶対パスがマッチするものを対象とします。
*
*
* @author Taro Kato (Gluegent, Inc.)
* @author Koji Suga (Gluegent Inc.)
*/
public class SystemIDFileSearchIterator extends FileSearchIterator implements Iterator {
/**
* filtersにnullを渡すと、".html"というフィルタが指定されたものとみなす。
*
* @param rootDir 探索を開始するフォルダ
* @param filters フィルタ文字列の配列
*/
public SystemIDFileSearchIterator(File rootDir, final String[] filters) {
super(rootDir, new FilenameFilter() {
public boolean accept(File dir, String name) {
File file = new File(dir.getPath() + File.separatorChar + name);
if (file.isHidden()) {
return false;
}
if (file.isDirectory()) {
return true;
}
if (filters == null) {
return name.toLowerCase().endsWith(".html");
}
for (int i = 0; i < filters.length; i++) {
String filter = filters[i].trim();
// 拡張子のフィルタか?
if (filter.matches("^\\.[a-zA-Z0-9]+")) {
if (name.toLowerCase().endsWith(filter.toLowerCase())) {
return true;
}
} else {
// それ以外は正規表現とみなす
String absolutePath =
file.getAbsolutePath().replace(File.separatorChar, '/');
if (absolutePath.matches(filter)) {
return true;
}
}
}
return false;
}
public String toString() {
if (filters != null) {
return "[" + StringUtil.join(filters, ",") + "]";
}
return "";
}
});
}
@Override
public boolean hasNext() {
return super.hasNextFile();
}
@Override
public String next() {
return makeSystemID((File) super.nextFile());
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
protected String makeSystemID(File current) {
String rootPath = getRoot().getPath();
String filePath = current.getPath();
filePath = filePath.substring(rootPath.length());
filePath = filePath.replace(File.separatorChar, '/');
if (filePath.length() > 0 && filePath.startsWith("/")) {
filePath = filePath.substring(1);
}
return filePath;
}
}