/** * Chooses tokens from the file cache that match the specified pattern. * * @param pattern file pattern * @param search search string * @param mode search mode (0-2) * @param results search result * @param exclude exclude file from content search * @param pathSearch path flag * @param pc file cache * @param id search id * @throws InterruptedException interruption */ private void filter( final String pattern, final int[] search, final int mode, final TreeSet<String> results, final HashSet<String> exclude, final boolean pathSearch, final ProjectCache pc, final long id) throws InterruptedException { if (results.size() >= MAXHITS) return; for (final String path : pc) { // check if current file matches the pattern final String lc = path.toLowerCase(Locale.ENGLISH).replace('\\', '/'); final int offset = offset(lc, pathSearch); if (mode == 0 ? lc.startsWith(pattern, offset) : mode == 1 ? (lc.indexOf(pattern, offset) != -1) : matches(lc, pattern, offset)) { if (!exclude.contains(path)) { exclude.add(path); if (filterContent(path, search)) { results.add(path); if (results.size() >= MAXHITS) return; } } } if (id != filterId) throw new InterruptedException(); } }
/** * Refreshes the view after a file has been saved. * * @param root root directory * @param ctx database context * @throws InterruptedException interruption */ void parse(final IOFile root, final Context ctx) throws InterruptedException { final long id = ++parseId; final HashSet<String> parsed = new HashSet<>(); final TreeMap<String, InputInfo> errs = new TreeMap<>(); // collect files to be parsed final ProjectCache pc = cache(root); final StringList mods = new StringList(), lmods = new StringList(); for (final String path : pc) { final IOFile file = new IOFile(path); if (file.hasSuffix(IO.XQSUFFIXES)) (file.hasSuffix(IO.XQMSUFFIX) ? lmods : mods).add(path); } mods.add(lmods); // parse modules for (final String path : mods) { if (id != parseId) throw new InterruptedException(); if (parsed.contains(path)) continue; final IOFile file = new IOFile(path); try (final TextInput ti = new TextInput(file)) { // parse query try (final QueryContext qc = new QueryContext(ctx)) { final String input = ti.cache().toString(); final boolean lib = QueryProcessor.isLibrary(input); qc.parse(input, lib, path, null); // parsing was successful: remember path parsed.add(path); for (final byte[] mod : qc.modParsed) parsed.add(Token.string(mod)); } catch (final QueryException ex) { // parsing failed: remember path final InputInfo ii = ex.info(); errs.put(path, ii); parsed.add(ii.path()); } } catch (final IOException ex) { // file may not be accessible Util.debug(ex); } } errors = errs; }