/*
* 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.impl;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import net.sourceforge.fullsync.RuleSet;
import net.sourceforge.fullsync.RuleSetDescriptor;
import net.sourceforge.fullsync.rules.filefilter.FileFilter;
import net.sourceforge.fullsync.rules.filefilter.FileFilterManager;
import net.sourceforge.fullsync.rules.filefilter.FileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileNameFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.filefiltertree.FileFilterTree;
import net.sourceforge.fullsync.rules.filefilter.values.TextValue;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class SimplyfiedRuleSetDescriptor extends RuleSetDescriptor {
public static final String RULESET_TYPE = "simple";
private static final long serialVersionUID = 2L;
private boolean syncSubDirs = false;
private String ignorePattern;
private String takePattern;
private String patternsType;
private FileFilter fileFilter;
private boolean useFilter;
private FileFilterTree fileFilterTree;
public SimplyfiedRuleSetDescriptor() {
}
public SimplyfiedRuleSetDescriptor(boolean syncSubDirs, FileFilter fileFilter, boolean useFilter, FileFilterTree fileFilterTree) {
this.syncSubDirs = syncSubDirs;
this.ignorePattern = "";
this.takePattern = "";
this.patternsType = "";
this.fileFilter = fileFilter;
this.useFilter = useFilter;
this.fileFilterTree = fileFilterTree;
}
/**
* @see net.sourceforge.fullsync.RuleSetDescriptor#getType()
*/
@Override
public String getType() {
return RULESET_TYPE;
}
/**
* @see net.sourceforge.fullsync.RuleSetDescriptor#serializeDescriptor(org.w3c.dom.Document)
*/
@Override
public Element serializeDescriptor(Document document) {
Element simpleRuleSetElement = document.createElement("SimpleRuleSet");
simpleRuleSetElement.setAttribute("syncSubs", String.valueOf(isSyncSubDirs()));
simpleRuleSetElement.setAttribute("patternsType", getPatternsType());
simpleRuleSetElement.setAttribute("ignorePattern", getIgnorePattern());
simpleRuleSetElement.setAttribute("takePattern", getTakePattern());
simpleRuleSetElement.setAttribute("useFilter", String.valueOf(isUseFilter()));
FileFilterManager filterManager = new FileFilterManager();
if (fileFilter != null) {
Element fileFilterElement = filterManager.serializeFileFilter(getFileFilter(), document, "FileFilter", "FileFilterRule");
simpleRuleSetElement.appendChild(fileFilterElement);
}
if (fileFilterTree != null) {
Map<String, FileFilter> itemsMap = fileFilterTree.getItemsMap();
Set<Entry<String, FileFilter>> entrySet = itemsMap.entrySet();
for (Entry<String, FileFilter> entry : entrySet) {
String path = entry.getKey();
FileFilter filter = entry.getValue();
Element subdirFilterElement = document.createElement("SubdirectoryFileFilter");
subdirFilterElement.setAttribute("path", path);
Element fileFilterElement = filterManager.serializeFileFilter(filter, document, "FileFilter", "FileFilterRule");
subdirFilterElement.appendChild(fileFilterElement);
simpleRuleSetElement.appendChild(subdirFilterElement);
}
}
return simpleRuleSetElement;
}
/**
* @see net.sourceforge.fullsync.RuleSetDescriptor#unserializeDescriptor(org.w3c.dom.Element)
*/
@Override
protected void unserializeDescriptor(Element element) {
NodeList ruleSetConfigNodeList = element.getElementsByTagName("SimpleRuleSet");
if (ruleSetConfigNodeList.getLength() == 0) {
syncSubDirs = true;
useFilter = false;
ignorePattern = "";
takePattern = "";
fileFilter = null;
fileFilterTree = null;
}
else {
Element simpleRuleSetConfigElement = (Element) ruleSetConfigNodeList.item(0);
syncSubDirs = Boolean.valueOf(simpleRuleSetConfigElement.getAttribute("syncSubs")).booleanValue();
patternsType = simpleRuleSetConfigElement.getAttribute("patternsType");
ignorePattern = simpleRuleSetConfigElement.getAttribute("ignorePattern");
takePattern = simpleRuleSetConfigElement.getAttribute("takePattern");
String useFilterStr = simpleRuleSetConfigElement.getAttribute("useFilter");
if ((useFilterStr != null) && (!useFilterStr.equals(""))) {
useFilter = Boolean.valueOf(useFilterStr).booleanValue();
}
NodeList fileFilterNodeList = simpleRuleSetConfigElement.getElementsByTagName("FileFilter");
if (fileFilterNodeList.getLength() > 0) {
FileFilterManager filterManager = new FileFilterManager();
Element fileFilterElement = (Element) fileFilterNodeList.item(0);
fileFilter = filterManager.unserializeFileFilter(fileFilterElement, "FileFilterRule");
NodeList subdirFiltersNodeList = simpleRuleSetConfigElement.getElementsByTagName("SubdirectoryFileFilter");
int numOfDirs = subdirFiltersNodeList.getLength();
fileFilterTree = new FileFilterTree();
for (int i = 0; i < numOfDirs; i++) {
Element subDirElement = (Element) subdirFiltersNodeList.item(i);
String path = subDirElement.getAttribute("path");
fileFilterNodeList = subDirElement.getElementsByTagName("FileFilter");
if (fileFilterNodeList.getLength() > 0) {
Element subDirFileFilterElement = (Element) fileFilterNodeList.item(0);
FileFilter subDirFileFilter = filterManager.unserializeFileFilter(subDirFileFilterElement, "FileFilterRule");
fileFilterTree.addFileFilter(path, subDirFileFilter);
}
}
}
else {
fileFilter = null;
if (patternsType.equals("RegExp")) {
if (!ignorePattern.equals("") && (takePattern.equals(""))) {
fileFilter = new FileFilter();
fileFilter.setMatchType(FileFilter.MATCH_ALL);
fileFilter.setFilterType(FileFilter.EXCLUDE);
FileFilterRule[] rules = new FileFilterRule[] {
new FileNameFileFilterRule(new TextValue(ignorePattern), FileNameFileFilterRule.OP_MATCHES_REGEXP) };
fileFilter.setFileFilterRules(rules);
useFilter = true;
}
if (ignorePattern.equals("") && (!takePattern.equals(""))) {
fileFilter = new FileFilter();
fileFilter.setMatchType(FileFilter.MATCH_ALL);
fileFilter.setFilterType(FileFilter.INCLUDE);
FileFilterRule[] rules = new FileFilterRule[] {
new FileNameFileFilterRule(new TextValue(takePattern), FileNameFileFilterRule.OP_MATCHES_REGEXP) };
fileFilter.setFileFilterRules(rules);
useFilter = true;
}
if (!ignorePattern.equals("") && (!takePattern.equals(""))) {
fileFilter = new FileFilter();
fileFilter.setMatchType(FileFilter.MATCH_ALL);
fileFilter.setFilterType(FileFilter.EXCLUDE);
FileFilterRule[] rules = new FileFilterRule[] {
new FileNameFileFilterRule(new TextValue(ignorePattern), FileNameFileFilterRule.OP_MATCHES_REGEXP),
new FileNameFileFilterRule(new TextValue(takePattern), FileNameFileFilterRule.OP_DOESNT_MATCHES_REGEXP),
};
fileFilter.setFileFilterRules(rules);
useFilter = true;
}
}
}
}
}
/**
* @return Returns the syncSubDirs.
*/
public boolean isSyncSubDirs() {
return syncSubDirs;
}
/**
* @param syncSubDirs
* The syncSubDirs to set.
*/
public void setSyncSubDirs(boolean syncSubDirs) {
this.syncSubDirs = syncSubDirs;
}
/**
* @return Returns the patternsType.
*/
public String getPatternsType() {
return patternsType;
}
/**
* @param type
* type The patternsType to set.
*/
public void setPatternsType(String type) {
this.patternsType = type;
}
/**
* @return Returns the takePattern.
*/
public String getTakePattern() {
return takePattern;
}
/**
* @param takePattern
* The takePattern to set.
*/
public void setTakePattern(String takePattern) {
this.takePattern = takePattern;
}
/**
* @return Returns the ignorePattern.
*/
public String getIgnorePattern() {
return ignorePattern;
}
/**
* @param ignorePattern
* The ignorePattern to set.
*/
public void setIgnorePattern(String ignorePattern) {
this.ignorePattern = ignorePattern;
}
public FileFilter getFileFilter() {
return fileFilter;
}
public void setFileFilter(FileFilter filter) {
this.fileFilter = filter;
}
public boolean isUseFilter() {
return useFilter;
}
public FileFilterTree getFileFilterTree() {
return fileFilterTree;
}
public void setFileFilterTree(FileFilterTree fileFilterTree) {
this.fileFilterTree = fileFilterTree;
}
/**
* @see net.sourceforge.fullsync.RuleSetDescriptor#createRuleSet()
*/
@Override
public RuleSet createRuleSet() {
SimplyfiedSyncRules ruleSet = new SimplyfiedSyncRules();
ruleSet.setUsingRecursion(syncSubDirs);
if ((patternsType != null) && (!patternsType.equals(""))) {
ruleSet.setPatternsType(patternsType);
}
else {
ruleSet.setPatternsType("RegExp");
}
ruleSet.setIgnorePattern(ignorePattern);
ruleSet.setTakePattern(takePattern);
ruleSet.setFileFilter(fileFilter);
ruleSet.setUseFilter(useFilter);
ruleSet.setFileFilterTree(fileFilterTree);
return ruleSet;
}
}