package org.eclipse.buckminster.fetcher; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.buckminster.download.Installer; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; public class ArchivedResourceFetcher extends AbstractResourceFetcher { private static class PatternFileFilter implements FileFilter { private static final String SEP = System.getProperty("file.separator"); //$NON-NLS-1$ private List<String> patterns = new ArrayList<String>(); public PatternFileFilter(Iterable<String> patternsToInclude) { for (String p : patternsToInclude) { p = p.replace(SEP, "/"); //$NON-NLS-1$ p = p.replace(".", "\\."); //$NON-NLS-1$ //$NON-NLS-2$ p = p.replace("*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$ p = p.replace("?", ".?"); //$NON-NLS-1$ //$NON-NLS-2$ patterns.add(p); } } @Override public boolean accept(File pathname) { if (patterns.isEmpty()) return true; boolean ok = false; for (String p : patterns) { boolean subtract = isSubtract(p); p = rawPatt(p); boolean b = match(p, pathname); if (b && subtract) return false; if (b) ok = true; } return ok; } private boolean isSubtract(String patt) { return patt.startsWith("-"); //$NON-NLS-1$ } private boolean match(String p, File rel) { String s = rel.getName(); if (p.indexOf('/') >= 0) s = rel.toString(); s = s.replace(SEP, "/"); //$NON-NLS-1$ return s.matches(p); } private String rawPatt(String patt) { if (!isSubtract(patt)) return patt; return patt.substring(1); } } private final String filename; private final FileFilter filter; private final boolean flatten; public ArchivedResourceFetcher(URL url, String dir, boolean shouldFlatten, List<String> patternsToInclude) throws CoreException { super(url, dir); filename = url.getFile(); if (patternsToInclude.isEmpty()) filter = null; else filter = new PatternFileFilter(patternsToInclude); flatten = shouldFlatten; } @Override protected void consume(InputStream stream, IProgressMonitor monitor) throws IOException, CoreException { final Installer installer = Installer.getInstaller(filename, true); installer.install(stream, new File(getDestinationDir()), filter, flatten, monitor); } }