/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* For information about the authors of this project Have a look
* at the AUTHORS file in the root of this project.
*/
package net.sourceforge.fullsync.rules.filefilter;
import net.sourceforge.fullsync.rules.filefilter.values.AgeValue;
import net.sourceforge.fullsync.rules.filefilter.values.DateValue;
import net.sourceforge.fullsync.rules.filefilter.values.FilterValue;
import net.sourceforge.fullsync.rules.filefilter.values.OperandValue;
import net.sourceforge.fullsync.rules.filefilter.values.SizeValue;
import net.sourceforge.fullsync.rules.filefilter.values.TextValue;
import net.sourceforge.fullsync.rules.filefilter.values.TypeValue;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class FileFilterManager {
public Element serializeFileFilter(FileFilter fileFilter, Document document, String elementName, String ruleElementName) {
Element filterElement = document.createElement(elementName);
filterElement.setAttribute("matchtype", String.valueOf(fileFilter.getMatchType()));
filterElement.setAttribute("filtertype", String.valueOf(fileFilter.getFilterType()));
filterElement.setAttribute("appliestodir", String.valueOf(fileFilter.appliesToDirectories()));
FileFilterRule[] rules = fileFilter.getFileFiltersRules();
for (FileFilterRule rule : rules) {
Element ruleElement = serializeRule(rule, document, ruleElementName);
filterElement.appendChild(ruleElement);
}
return filterElement;
}
public Element serializeRule(FileFilterRule fileFilterRule, Document document, String elementName) {
Element ruleElement = document.createElement(elementName);
String ruleType = (fileFilterRule != null) ? fileFilterRule.getRuleType() : null;
ruleElement.setAttribute("ruletype", ruleType);
serializeRuleAttributes(fileFilterRule, ruleElement);
return ruleElement;
}
public FileFilter unserializeFileFilter(Element fileFilterElement, String ruleElementName) {
FileFilter fileFilter = new FileFilter();
int matchType = 0;
try {
matchType = Integer.parseInt(fileFilterElement.getAttribute("matchtype"));
}
catch (NumberFormatException e) {
e.printStackTrace();
}
fileFilter.setMatchType(matchType);
int filterType = 0;
try {
filterType = Integer.parseInt(fileFilterElement.getAttribute("filtertype"));
}
catch (NumberFormatException e) {
e.printStackTrace();
}
fileFilter.setFilterType(filterType);
boolean applies = Boolean.valueOf(fileFilterElement.getAttribute("appliestodir")).booleanValue();
fileFilter.setAppliesToDirectories(applies);
NodeList ruleList = fileFilterElement.getElementsByTagName(ruleElementName);
int numOfRules = ruleList.getLength();
FileFilterRule[] rules = new FileFilterRule[numOfRules];
for (int i = 0; i < rules.length; i++) {
rules[i] = unserializeFileFilterRule((Element) ruleList.item(i));
}
fileFilter.setFileFilterRules(rules);
return fileFilter;
}
private void serializeRuleAttributes(FileFilterRule fileFilterRule, Element ruleElement) {
if (fileFilterRule instanceof FileNameFileFilterRule) {
FileNameFileFilterRule rule = (FileNameFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("pattern", rule.getValue().toString());
}
if (fileFilterRule instanceof FilePathFileFilterRule) {
FilePathFileFilterRule rule = (FilePathFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("pattern", rule.getValue().toString());
}
if (fileFilterRule instanceof FileTypeFileFilterRule) {
FileTypeFileFilterRule rule = (FileTypeFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("type", rule.getValue().toString());
}
if (fileFilterRule instanceof FileSizeFileFilterRule) {
FileSizeFileFilterRule rule = (FileSizeFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("size", rule.getValue().toString());
}
if (fileFilterRule instanceof FileModificationDateFileFilterRule) {
FileModificationDateFileFilterRule rule = (FileModificationDateFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("modificationdate", rule.getValue().toString());
}
if (fileFilterRule instanceof FileAgeFileFilterRule) {
FileAgeFileFilterRule rule = (FileAgeFileFilterRule) fileFilterRule;
ruleElement.setAttribute("op", String.valueOf(rule.getOperator()));
ruleElement.setAttribute("age", rule.getValue().toString());
}
if (fileFilterRule instanceof SubfilterFileFilerRule) {
SubfilterFileFilerRule rule = (SubfilterFileFilerRule) fileFilterRule;
FileFilter subfilter = ((FilterValue) rule.getValue()).getValue();
Element subfilterElement = serializeFileFilter(subfilter, ruleElement.getOwnerDocument(), "NestedFileFilter",
"NestedFileFilterRule");
ruleElement.appendChild(subfilterElement);
}
}
public FileFilterRule unserializeFileFilterRule(Element fileFilterRuleElement) {
FileFilterRule rule = null;
String ruleType = fileFilterRuleElement.getAttribute("ruletype");
if (ruleType.equals(FileNameFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String pattern = fileFilterRuleElement.getAttribute("pattern");
rule = new FileNameFileFilterRule(new TextValue(pattern), op);
}
if (ruleType.equals(FilePathFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String pattern = fileFilterRuleElement.getAttribute("pattern");
rule = new FilePathFileFilterRule(new TextValue(pattern), op);
}
if (ruleType.equals(FileTypeFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String type = fileFilterRuleElement.getAttribute("type");
rule = new FileTypeFileFilterRule(new TypeValue(type), op);
}
if (ruleType.equals(FileSizeFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String size = fileFilterRuleElement.getAttribute("size");
rule = new FileSizeFileFilterRule(new SizeValue(size), op);
}
if (ruleType.equals(FileModificationDateFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String date = fileFilterRuleElement.getAttribute("modificationdate");
rule = new FileModificationDateFileFilterRule(new DateValue(date), op);
}
if (ruleType.equals(FileAgeFileFilterRule.TYPE_NAME)) {
int op = Integer.parseInt(fileFilterRuleElement.getAttribute("op"));
String age = fileFilterRuleElement.getAttribute("age");
rule = new FileAgeFileFilterRule(new AgeValue(age), op);
}
if (ruleType.equals(SubfilterFileFilerRule.TYPE_NAME)) {
NodeList filterList = fileFilterRuleElement.getElementsByTagName("NestedFileFilter");
Element subfileFilerElement = (Element) filterList.item(0);
FileFilter fileFiler = unserializeFileFilter(subfileFilerElement, "NestedFileFilterRule");
rule = new SubfilterFileFilerRule(fileFiler);
}
return rule;
}
public FileFilterRule createFileFilterRule(String ruleType, int op, OperandValue value) {
FileFilterRule rule = null;
if (ruleType.equals(FileNameFileFilterRule.TYPE_NAME)) {
TextValue textValue = (TextValue) value;
rule = new FileNameFileFilterRule(textValue, op);
}
if (ruleType.equals(FilePathFileFilterRule.TYPE_NAME)) {
TextValue textValue = (TextValue) value;
rule = new FilePathFileFilterRule(textValue, op);
}
if (ruleType.equals(FileTypeFileFilterRule.TYPE_NAME)) {
TypeValue fileTypeValue = (TypeValue) value;
rule = new FileTypeFileFilterRule(fileTypeValue, op);
}
if (ruleType.equals(FileSizeFileFilterRule.TYPE_NAME)) {
SizeValue size = (SizeValue) value;
rule = new FileSizeFileFilterRule(size, op);
}
if (ruleType.equals(FileModificationDateFileFilterRule.TYPE_NAME)) {
DateValue date = (DateValue) value;
rule = new FileModificationDateFileFilterRule(date, op);
}
if (ruleType.equals(FileAgeFileFilterRule.TYPE_NAME)) {
AgeValue age = (AgeValue) value;
rule = new FileAgeFileFilterRule(age, op);
}
if (ruleType.equals(SubfilterFileFilerRule.TYPE_NAME)) {
FilterValue filterValue = (FilterValue) value;
rule = new SubfilterFileFilerRule(filterValue.getValue());
}
return rule;
}
public String[] getOperatorsForRuleType(String ruleType) {
if (ruleType.equals(FileNameFileFilterRule.TYPE_NAME)) {
return FileNameFileFilterRule.getAllOperators();
}
if (ruleType.equals(FilePathFileFilterRule.TYPE_NAME)) {
return FilePathFileFilterRule.getAllOperators();
}
if (ruleType.equals(FileTypeFileFilterRule.TYPE_NAME)) {
return FileTypeFileFilterRule.getAllOperators();
}
if (ruleType.equals(FileSizeFileFilterRule.TYPE_NAME)) {
return FileSizeFileFilterRule.getAllOperators();
}
if (ruleType.equals(FileModificationDateFileFilterRule.TYPE_NAME)) {
return FileModificationDateFileFilterRule.getAllOperators();
}
if (ruleType.equals(FileAgeFileFilterRule.TYPE_NAME)) {
return FileAgeFileFilterRule.getAllOperators();
}
if (ruleType.equals(SubfilterFileFilerRule.TYPE_NAME)) {
return new String[0];
}
return new String[] { "N/A" };
}
}