/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jabylon.properties.util.scanner;
import java.io.File;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.PatternSet.NameEntry;
import org.apache.tools.ant.types.selectors.SelectorUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
import org.jabylon.properties.ScanConfiguration;
import org.jabylon.properties.types.PropertyScanner;
public class WorkspaceScanner {
public WorkspaceScanner() {
// FileSet fs = Util.createFileSet(dir,includes,excludes);
}
public void fullScan(PropertyFileAcceptor acceptor, File baseDir, PropertyScanner scanner, ScanConfiguration config, IProgressMonitor monitor) {
FileSet fs = createFileSet(config);
fs.setDir(baseDir);
SubMonitor subMon = SubMonitor.convert(monitor, "Scanning", 100);
String masterLocale = config.getMasterLocale();
if (masterLocale != null && masterLocale.isEmpty())
masterLocale = null;
if (baseDir.exists()) {
DirectoryScanner ds = fs.getDirectoryScanner(new org.apache.tools.ant.Project());
subMon.worked(10);
String[] files = ds.getIncludedFiles();
subMon.setWorkRemaining(files.length);
for (String f : files) {
checkCanceled(monitor);
File file = new File(baseDir, f);
if(scanner.isTemplate(file, config.getMasterLocale())) {
subMon.subTask(f);
acceptor.newMatch(file);
subMon.worked(1);
}
}
}
if(monitor!=null)
monitor.done();
}
private void checkCanceled(IProgressMonitor monitor) {
if(monitor.isCanceled())
throw new OperationCanceledException();
}
public void partialScan(PropertyFileAcceptor acceptor, File baseDir, PropertyScanner scanner, ScanConfiguration config, File singleFile) {
Project antProject = new org.apache.tools.ant.Project();
FileSet fs = createFileSet(config);
String[] excludes = fs.mergeExcludes(antProject);
if(excludes!=null)
{
for (String exclude : excludes) {
if(SelectorUtils.match(normalizePattern(exclude), singleFile.getPath()))
return;
}
}
String[] includes = fs.mergeIncludes(antProject);
if(includes==null)
return;
for (String include : includes) {
if(SelectorUtils.match(normalizePattern(include), singleFile.getPath()))
{
if (baseDir.exists()) {
// if(scanner.isTemplate(singleFile, config)) {
acceptor.newMatch(singleFile);
// }
}
break;
}
}
}
public boolean partialScan(File baseDir, PropertyScanner scanner, ScanConfiguration config, File singleFile) {
SingleFileAcceptor acceptor = new SingleFileAcceptor();
partialScan(acceptor, baseDir, scanner, config, singleFile);
return acceptor.isMatch();
}
private FileSet createFileSet(ScanConfiguration config) {
FileSet fs = new FileSet();
fs.setProject(new Project());
for (String exclude : config.getExcludes()) {
NameEntry entry = fs.createExclude();
entry.setName(exclude);
}
for (String include : config.getIncludes()) {
NameEntry entry = fs.createInclude();
entry.setName(include);
}
return fs;
}
private static String normalizePattern(String p) {
return p.replace('/', File.separatorChar).replace('\\', File.separatorChar);
}
}