package org.tmatesoft.svn.core.internal.wc17.db.statement; import java.io.File; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.db.SVNSqlJetDb; import org.tmatesoft.svn.core.internal.db.SVNSqlJetSelectStatement; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.ACTUAL_NODE__Fields; import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.NODES__Fields; import org.tmatesoft.svn.core.internal.wc17.db.statement.SVNWCDbSchema.NODES__Indices; public class SVNWCDbCollectTargets extends SVNWCDbNodesCurrent { private SVNDepth depth; private File target; private Collection<String> changelists; private SVNSqlJetSelectStatement selectChangelist; private Set<String> receivedPaths; public SVNWCDbCollectTargets(SVNSqlJetDb sDb, long wcId, File target, SVNDepth depth, Collection<String> changelists) throws SVNException { super(sDb); setDepth(depth); setTarget(target); setChangelists(changelists); if (getChangelists() != null && !getChangelists().isEmpty()) { selectChangelist = new SVNSqlJetSelectStatement(sDb, SVNWCDbSchema.ACTUAL_NODE); } if (getDepth() == SVNDepth.FILES || getDepth() == SVNDepth.IMMEDIATES) { setIndexName(NODES__Indices.I_NODES_PARENT.toString()); receivedPaths = new HashSet<String>(); } if (getDepth() == SVNDepth.FILES || getDepth() == SVNDepth.IMMEDIATES || getDepth() == SVNDepth.EMPTY) { bindf("is", wcId, getTarget()); } else { bindf("i", wcId); } } @Override protected boolean isFilterPassed() throws SVNException { if (getDepth() == SVNDepth.FILES || getDepth() == SVNDepth.IMMEDIATES) { // test if we had one with that name. if (!receivedPaths.add(getColumnString(NODES__Fields.local_relpath))) { return false; } } else if (!super.isFilterPassed()) { return false; } if (getDepth() == SVNDepth.FILES) { String kind = getColumnString(NODES__Fields.kind); return "file".equals(kind) && matchesChangelist(); } else if (getDepth() == SVNDepth.INFINITY) { String targetPath = SVNFileUtil.getFilePath(getTarget()); if ("".equals(targetPath)) { return matchesChangelist(); } String rowPath = getColumnString(NODES__Fields.local_relpath); return (targetPath.equals(rowPath) || rowPath.startsWith(targetPath + '/')) && matchesChangelist(); } return matchesChangelist(); } private boolean matchesChangelist() throws SVNException { if (getChangelists() == null || getChangelists().isEmpty()) { return true; } try { selectChangelist.bindf("is", getColumnLong(NODES__Fields.wc_id), getColumnString(NODES__Fields.local_relpath)); if (selectChangelist.next()) { return changelists.contains(selectChangelist.getColumnString(ACTUAL_NODE__Fields.changelist)); } } finally { selectChangelist.reset(); } return false; } private File getTarget() { return target; } private SVNDepth getDepth() { return depth; } private Collection<String> getChangelists() { return changelists; } private void setDepth(SVNDepth depth) { this.depth = depth; } private void setTarget(File target) { this.target = target; } private void setChangelists(Collection<String> changelists) { this.changelists = changelists == null ? changelists : new HashSet<String>(changelists); } }