This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 180262
Collapse All | Expand All

(-)a/java.source/src/org/netbeans/modules/java/source/indexing/COSSynchronizingIndexer.java (-5 / +14 lines)
Lines 43-48 Link Here
43
package org.netbeans.modules.java.source.indexing;
43
package org.netbeans.modules.java.source.indexing;
44
44
45
import java.io.File;
45
import java.io.File;
46
import java.io.IOException;
46
import java.net.URISyntaxException;
47
import java.net.URISyntaxException;
47
import java.net.URL;
48
import java.net.URL;
48
import java.util.Collections;
49
import java.util.Collections;
Lines 51-62 Link Here
51
import java.util.List;
52
import java.util.List;
52
import java.util.Set;
53
import java.util.Set;
53
import org.netbeans.modules.java.source.usages.BuildArtifactMapperImpl;
54
import org.netbeans.modules.java.source.usages.BuildArtifactMapperImpl;
55
import org.netbeans.modules.parsing.impl.indexing.CacheFolder;
54
import org.netbeans.modules.parsing.impl.indexing.IndexerCache;
56
import org.netbeans.modules.parsing.impl.indexing.IndexerCache;
55
import org.netbeans.modules.parsing.impl.indexing.IndexerCache.IndexerInfo;
57
import org.netbeans.modules.parsing.impl.indexing.IndexerCache.IndexerInfo;
56
import org.netbeans.modules.parsing.spi.indexing.Context;
58
import org.netbeans.modules.parsing.spi.indexing.Context;
57
import org.netbeans.modules.parsing.spi.indexing.CustomIndexer;
59
import org.netbeans.modules.parsing.spi.indexing.CustomIndexer;
58
import org.netbeans.modules.parsing.spi.indexing.CustomIndexerFactory;
60
import org.netbeans.modules.parsing.spi.indexing.CustomIndexerFactory;
59
import org.netbeans.modules.parsing.spi.indexing.Indexable;
61
import org.netbeans.modules.parsing.spi.indexing.Indexable;
62
import org.openide.filesystems.FileObject;
60
import org.openide.util.Exceptions;
63
import org.openide.util.Exceptions;
61
64
62
/**
65
/**
Lines 71-77 Link Here
71
            return ;
74
            return ;
72
        }
75
        }
73
76
74
        Set<String> javaMimeTypes = gatherJavaMimeTypes();
77
        Set<String> javaMimeTypes = gatherJavaMimeTypes(context.getRootURI());
75
        List<File> updated = new LinkedList<File>();
78
        List<File> updated = new LinkedList<File>();
76
79
77
        for (Indexable i : files) {
80
        for (Indexable i : files) {
Lines 103-115 Link Here
103
        }
106
        }
104
    }
107
    }
105
108
106
    public static Set<String> gatherJavaMimeTypes() {
109
    public static Set<String> gatherJavaMimeTypes(final URL sourceRoot) {
107
        Set<String> mimeTypes = new HashSet<String>();
110
        Set<String> mimeTypes = new HashSet<String>();
108
111
109
        for (IndexerInfo<CustomIndexerFactory> i : IndexerCache.getCifCache().getIndexersByName(JavaIndex.NAME)) {
112
        try {
110
            mimeTypes.addAll(i.getMimeTypes());
113
            final FileObject cacheFolder = CacheFolder.getDataFolder(sourceRoot, true);
114
            if (cacheFolder != null) {
115
                for (IndexerInfo<CustomIndexerFactory> i : IndexerCache.getCifCache().getIndexersByName(cacheFolder.getURL(), JavaIndex.NAME)) {
116
                    mimeTypes.addAll(i.getMimeTypes());
117
                }
118
            }
119
        } catch (IOException ioe) {
120
            Exceptions.printStackTrace(ioe);
111
        }
121
        }
112
113
        return mimeTypes;
122
        return mimeTypes;
114
    }
123
    }
115
124
(-)a/java.source/src/org/netbeans/modules/java/source/usages/BuildArtifactMapperImpl.java (-1 / +1 lines)
Lines 280-286 Link Here
280
            copyRecursively(index, targetFolder);
280
            copyRecursively(index, targetFolder);
281
281
282
            if (copyResources) {
282
            if (copyResources) {
283
                Set<String> javaMimeTypes = COSSynchronizingIndexer.gatherJavaMimeTypes();
283
                Set<String> javaMimeTypes = COSSynchronizingIndexer.gatherJavaMimeTypes(sourceRoot);
284
                String[]    javaMimeTypesArr = javaMimeTypes.toArray(new String[0]);
284
                String[]    javaMimeTypesArr = javaMimeTypes.toArray(new String[0]);
285
285
286
                copyRecursively(sr, targetFolder, javaMimeTypes, javaMimeTypesArr);
286
                copyRecursively(sr, targetFolder, javaMimeTypes, javaMimeTypesArr);
(-)a/parsing.api/src/org/netbeans/modules/parsing/impl/indexing/IndexerCache.java (-57 / +85 lines)
Lines 45-54 Link Here
45
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeEvent;
46
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeListener;
47
import java.beans.PropertyChangeSupport;
47
import java.beans.PropertyChangeSupport;
48
import java.io.BufferedInputStream;
49
import java.io.BufferedOutputStream;
50
import java.io.File;
51
import java.io.FileInputStream;
52
import java.io.FileOutputStream;
48
import java.io.IOException;
53
import java.io.IOException;
49
import java.io.InputStream;
54
import java.io.InputStream;
50
import java.io.OutputStream;
55
import java.io.OutputStream;
51
import java.lang.reflect.Method;
56
import java.lang.reflect.Method;
57
import java.net.URISyntaxException;
58
import java.net.URL;
52
import java.text.DateFormat;
59
import java.text.DateFormat;
53
import java.util.ArrayList;
60
import java.util.ArrayList;
54
import java.util.Arrays;
61
import java.util.Arrays;
Lines 66-77 Link Here
66
import java.util.Set;
73
import java.util.Set;
67
import java.util.logging.Level;
74
import java.util.logging.Level;
68
import java.util.logging.Logger;
75
import java.util.logging.Logger;
76
import org.netbeans.api.annotations.common.NonNull;
69
import org.netbeans.api.editor.mimelookup.MimeLookup;
77
import org.netbeans.api.editor.mimelookup.MimeLookup;
70
import org.netbeans.modules.editor.settings.storage.api.EditorSettings;
78
import org.netbeans.modules.editor.settings.storage.api.EditorSettings;
71
import org.netbeans.modules.parsing.spi.indexing.CustomIndexerFactory;
79
import org.netbeans.modules.parsing.spi.indexing.CustomIndexerFactory;
72
import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory;
80
import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory;
73
import org.openide.filesystems.FileObject;
74
import org.openide.filesystems.FileUtil;
75
import org.openide.filesystems.MIMEResolver;
81
import org.openide.filesystems.MIMEResolver;
76
import org.openide.util.Lookup;
82
import org.openide.util.Lookup;
77
import org.openide.util.LookupEvent;
83
import org.openide.util.LookupEvent;
Lines 119-152 Link Here
119
        return instanceEIF;
125
        return instanceEIF;
120
    }
126
    }
121
127
122
    public Collection<? extends IndexerInfo<T>> getIndexers(Set<IndexerInfo<T>> changedIndexers) {
128
    public Collection<? extends IndexerInfo<T>> getIndexers(final URL cacheRoot, final Set<IndexerInfo<T>> changedIndexers) {
123
        final Object [] data = getData(changedIndexers);
129
        final State<T> data = getData(cacheRoot, changedIndexers);
124
        @SuppressWarnings("unchecked")
130
        return data.orderedInfos;
125
        List<IndexerInfo<T>> infos = (List<IndexerInfo<T>>) data[2];
126
        return infos;
127
    }
131
    }
128
132
129
    public Map<String, Set<IndexerInfo<T>>> getIndexersMap(Set<IndexerInfo<T>> changedIndexers) {
133
    public Map<String, Set<IndexerInfo<T>>> getIndexersMap(final URL cacheRoot, final Set<IndexerInfo<T>> changedIndexers) {
130
        final Object [] data = getData(changedIndexers);
134
        final State<T> data = getData(cacheRoot, changedIndexers);
131
        @SuppressWarnings("unchecked")
135
        return data.infosByMimeType;
132
        Map<String, Set<IndexerInfo<T>>> infosMap = (Map<String, Set<IndexerInfo<T>>>) data[1];
133
        return infosMap;
134
    }
136
    }
135
137
136
    public Collection<? extends IndexerInfo<T>> getIndexersFor(String mimeType) {
138
    public Collection<? extends IndexerInfo<T>> getIndexersFor(final URL cacheRoot, final String mimeType) {
137
        final Object [] data = getData(null);
139
        final State<T> data = getData(cacheRoot, null);
138
        @SuppressWarnings("unchecked")
140
        final Set<IndexerInfo<T>> infos = data.infosByMimeType.get(mimeType);
139
        Map<String, Set<IndexerInfo<T>>> infosMap = (Map<String, Set<IndexerInfo<T>>>) data[1];
140
        Set<IndexerInfo<T>> infos = infosMap.get(mimeType);
141
        return infos == null ? Collections.<IndexerInfo<T>>emptySet() : infos;
141
        return infos == null ? Collections.<IndexerInfo<T>>emptySet() : infos;
142
    }
142
    }
143
143
144
    public Collection<? extends IndexerInfo<T>> getIndexersByName(String indexerName) {
144
    public Collection<? extends IndexerInfo<T>> getIndexersByName(final URL cacheRoot, final String indexerName) {
145
        final Object [] data = getData(null);
145
        final State<T> data = getData(cacheRoot, null);
146
        @SuppressWarnings("unchecked")
146
        return data.infosByName.get(indexerName);
147
        Map<String, Set<IndexerInfo<T>>> infosMap = (Map<String, Set<IndexerInfo<T>>>) data[0];
148
        Set<IndexerInfo<T>> info = infosMap.get(indexerName);
149
        return info;
150
    }
147
    }
151
148
152
149
Lines 290-300 Link Here
290
    private final String infoFileName;
287
    private final String infoFileName;
291
    private final Tracker tracker = new Tracker();
288
    private final Tracker tracker = new Tracker();
292
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
289
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
293
290
    //@GuardedBy("this")
294
    private boolean firstGetData = true;
291
    private final Map<URL,State<T>> stateMap = new HashMap<URL, State<T>>();
295
    private Map<String, Set<IndexerInfo<T>>> infosByName = null;
296
    private Map<String, Set<IndexerInfo<T>>> infosByMimeType = null;
297
    private List<IndexerInfo<T>> orderedInfos = null;
298
292
299
    private IndexerCache(Class<T> type) {
293
    private IndexerCache(Class<T> type) {
300
        this.type = type;
294
        this.type = type;
Lines 340-354 Link Here
340
        }
334
        }
341
    }
335
    }
342
336
343
    private Object[] getData(Set<IndexerInfo<T>> changedIndexers) {
337
    private State getData(final URL cacheRoot, Set<IndexerInfo<T>> changedIndexers) {
344
        boolean fire = false;
338
        boolean fire = false;
345
339
346
        synchronized (this) {
340
        synchronized (this) {
347
            if (infosByName == null) {
341
            State<T> state = stateMap.get(cacheRoot);
348
                Map<String, IndexerInfo<T>> lastKnownInfos = readLastKnownIndexers();
342
            if (state == null) {
343
                state = new State();
344
                stateMap.put(cacheRoot, state);
345
            }
346
            if (state.infosByName == null) {
347
                Map<String, IndexerInfo<T>> lastKnownInfos = readLastKnownIndexers(cacheRoot);
349
                Set<String> mimeTypesToCheck = null;
348
                Set<String> mimeTypesToCheck = null;
350
                if (firstGetData) {
349
                if (state.firstGetData) {
351
                    firstGetData = false;
350
                    state.firstGetData = false;
352
                    if (changedIndexers != null) {
351
                    if (changedIndexers != null) {
353
                        mimeTypesToCheck = new HashSet<String>();
352
                        mimeTypesToCheck = new HashSet<String>();
354
                        for(IndexerInfo<T> ii : lastKnownInfos.values()) {
353
                        for(IndexerInfo<T> ii : lastKnownInfos.values()) {
Lines 404-417 Link Here
404
                // the comparator instance must not be cached, because it uses data
403
                // the comparator instance must not be cached, because it uses data
405
                // from the default lookup
404
                // from the default lookup
406
                Collections.sort(_orderedInfos, new C());
405
                Collections.sort(_orderedInfos, new C());
407
                infosByName = Collections.unmodifiableMap(_infosByName);
406
                state.infosByName = Collections.unmodifiableMap(_infosByName);
408
                infosByMimeType = Collections.unmodifiableMap(_infosByMimeType);
407
                state.infosByMimeType = Collections.unmodifiableMap(_infosByMimeType);
409
                orderedInfos = Collections.unmodifiableList(_orderedInfos);
408
                state.orderedInfos = Collections.unmodifiableList(_orderedInfos);
410
409
411
                writeLastKnownIndexers(infosByName);
410
                writeLastKnownIndexers(cacheRoot, state.infosByName);
412
                
411
                
413
                Map<String, Set<IndexerInfo<T>>> addedOrChangedInfosMap = new HashMap<String, Set<IndexerInfo<T>>>();
412
                Map<String, Set<IndexerInfo<T>>> addedOrChangedInfosMap = new HashMap<String, Set<IndexerInfo<T>>>();
414
                diff(lastKnownInfos, infosByName, addedOrChangedInfosMap);
413
                diff(lastKnownInfos, state.infosByName, addedOrChangedInfosMap);
415
                
414
                
416
                for(Set<IndexerInfo<T>> addedOrChangedInfos : addedOrChangedInfosMap.values()) {
415
                for(Set<IndexerInfo<T>> addedOrChangedInfos : addedOrChangedInfosMap.values()) {
417
                    if (changedIndexers == null) {
416
                    if (changedIndexers == null) {
Lines 423-429 Link Here
423
422
424
                if (LOG.isLoggable(Level.FINE)) {
423
                if (LOG.isLoggable(Level.FINE)) {
425
                    LOG.log(Level.FINE, "Ordered indexers of {0}: ", type.getName()); //NOI18N
424
                    LOG.log(Level.FINE, "Ordered indexers of {0}: ", type.getName()); //NOI18N
426
                    for (IndexerInfo<T> ii : orderedInfos) {
425
                    for (IndexerInfo<T> ii : state.orderedInfos) {
427
                        LOG.log(Level.FINE, "  {0} {1}: {2}", new Object[] { //NOI18N
426
                        LOG.log(Level.FINE, "  {0} {1}: {2}", new Object[] { //NOI18N
428
                            ii.getIndexerFactory(),
427
                            ii.getIndexerFactory(),
429
                            changedIndexers != null && changedIndexers.contains(ii) ? "(modified)" : "", //NOI18N
428
                            changedIndexers != null && changedIndexers.contains(ii) ? "(modified)" : "", //NOI18N
Lines 435-459 Link Here
435
                    RP.post(new Runnable() {
434
                    RP.post(new Runnable() {
436
                        public @Override void run() {
435
                        public @Override void run() {
437
                            resetCache();
436
                            resetCache();
438
                            getData(null);
437
                            getData(cacheRoot,null);
439
                        }
438
                        }
440
                    }, 321);
439
                    }, 321);
441
                }
440
                }
442
            }
441
            }
443
442
444
            if (fire && changedIndexers.size() > 0) {
443
            if (fire && changedIndexers.size() > 0) {
445
                pcs.firePropertyChange(type.getName(), null, changedIndexers);
444
                pcs.firePropertyChange(type.getName(), null, Pair.<URL,Set<IndexerInfo<T>>>of(cacheRoot,changedIndexers));
446
            }
445
            }
447
446
448
            return new Object [] { infosByName, infosByMimeType, orderedInfos };
447
            return new State(state);
449
        }
448
        }
450
    }
449
    }
451
450
452
    private void resetCache() {
451
    private void resetCache() {
453
        synchronized (IndexerCache.this) {
452
        synchronized (IndexerCache.this) {
454
            IndexerCache.this.infosByName = null;
453
            for (State<T> state : stateMap.values()) {
455
            IndexerCache.this.infosByMimeType = null;
454
                state.reset();
456
            IndexerCache.this.orderedInfos = null;
455
            }
457
            LOG.log(Level.FINE, "{0}: resetting indexer cache", type.getName()); //NOI18N
456
            LOG.log(Level.FINE, "{0}: resetting indexer cache", type.getName()); //NOI18N
458
        }
457
        }
459
    }
458
    }
Lines 493-507 Link Here
493
        }
492
        }
494
    }
493
    }
495
494
496
    private Map<String, IndexerInfo<T>> readLastKnownIndexers() {
495
    private Map<String, IndexerInfo<T>> readLastKnownIndexers(final URL cacheRoot) {
497
        Map<String, IndexerInfo<T>> lki = new HashMap<String, IndexerInfo<T>>();
496
        Map<String, IndexerInfo<T>> lki = new HashMap<String, IndexerInfo<T>>();
498
497
        File infoFile = null;
499
        FileObject cacheFolder = CacheFolder.getCacheFolder();
498
        try {
500
        FileObject infoFile = cacheFolder.getFileObject(infoFileName);
499
            infoFile = new File(new File(cacheRoot.toURI()),infoFileName);
501
        if (infoFile != null) {
500
        } catch (URISyntaxException use) {
501
            LOG.log(Level.FINE, "URISyntaxException: " + cacheRoot.toString(), use); //NOI18N
502
        }
503
        if (infoFile != null && infoFile.canRead()) {
502
            Properties props = new Properties();
504
            Properties props = new Properties();
503
            try {
505
            try {
504
                InputStream is = infoFile.getInputStream();
506
                final InputStream is = new BufferedInputStream(new FileInputStream(infoFile));
505
                try {
507
                try {
506
                    props.load(is);
508
                    props.load(is);
507
                } finally {
509
                } finally {
Lines 554-560 Link Here
554
        return lki;
556
        return lki;
555
    }
557
    }
556
558
557
    private void writeLastKnownIndexers(Map<String, Set<IndexerInfo<T>>> lki) {
559
    private void writeLastKnownIndexers(final URL cacheRoot, Map<String, Set<IndexerInfo<T>>> lki) {
558
        Properties props = new Properties();
560
        Properties props = new Properties();
559
        for(String indexerName : lki.keySet()) {
561
        for(String indexerName : lki.keySet()) {
560
            Set<IndexerInfo<T>> iinfos = lki.get(indexerName);
562
            Set<IndexerInfo<T>> iinfos = lki.get(indexerName);
Lines 590-607 Link Here
590
592
591
            props.put(indexerName, sb.toString());
593
            props.put(indexerName, sb.toString());
592
        }
594
        }
593
594
        FileObject cacheFolder = CacheFolder.getCacheFolder();
595
        try {
595
        try {
596
            FileObject infoFile = FileUtil.createData(cacheFolder, infoFileName);
596
            File infoFile = new File (new File(cacheRoot.toURI()), infoFileName);
597
            OutputStream os = infoFile.getOutputStream();
597
            final OutputStream os = new BufferedOutputStream(new FileOutputStream(infoFile));
598
            try {
598
            try {
599
                props.store(os, "Last known indexer " + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date())); //NOI18N
599
                props.store(os, "Last known indexer " + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date())); //NOI18N
600
            } finally {
600
            } finally {
601
                os.close();
601
                os.close();
602
            }
602
            }
603
        } catch (IOException ioe) {
603
        } catch (IOException ioe) {
604
            LOG.log(Level.FINE, "Can't write " + infoFileName + " file in " + cacheFolder.getPath(), ioe); //NOI18N
604
            LOG.log(Level.FINE, "Can't write " + infoFileName + " file in " + cacheRoot, ioe); //NOI18N
605
        } catch (URISyntaxException use) {
606
            LOG.log(Level.FINE, "Can't write " + infoFileName + " file in " + cacheRoot, use); //NOI18N
605
        }
607
        }
606
    }
608
    }
607
    
609
    
Lines 786-789 Link Here
786
            return highest;
788
            return highest;
787
        }
789
        }
788
    } // End of C class
790
    } // End of C class
791
792
    private static class State<T> {
793
        private boolean firstGetData;
794
        private Map<String, Set<IndexerInfo<T>>> infosByName;
795
        private Map<String, Set<IndexerInfo<T>>> infosByMimeType;
796
        private List<IndexerInfo<T>> orderedInfos;
797
798
        private State() {
799
            firstGetData = true;
800
        }
801
802
        private State(final @NonNull State other) {
803
            this.firstGetData = other.firstGetData;
804
            this.infosByName = other.infosByName;
805
            this.infosByMimeType = other.infosByMimeType;
806
            this.orderedInfos = other.orderedInfos;
807
        }
808
809
810
811
        private void reset() {
812
            infosByName = null;
813
            infosByMimeType = null;
814
            orderedInfos = null;
815
        }
816
    }
789
}
817
}
(-)a/parsing.api/src/org/netbeans/modules/parsing/impl/indexing/RepositoryUpdater.java (-84 / +113 lines)
Lines 52-58 Link Here
52
import java.net.URI;
52
import java.net.URI;
53
import java.net.URISyntaxException;
53
import java.net.URISyntaxException;
54
import java.net.URL;
54
import java.net.URL;
55
import java.security.InvalidParameterException;
56
import java.util.ArrayList;
55
import java.util.ArrayList;
57
import java.util.Arrays;
56
import java.util.Arrays;
58
import java.util.Collection;
57
import java.util.Collection;
Lines 146-151 Link Here
146
import org.openide.util.Parameters;
145
import org.openide.util.Parameters;
147
import org.openide.util.RequestProcessor;
146
import org.openide.util.RequestProcessor;
148
import org.openide.util.TopologicalSortException;
147
import org.openide.util.TopologicalSortException;
148
import org.openide.util.Union2;
149
import org.openide.util.lookup.ServiceProvider;
149
import org.openide.util.lookup.ServiceProvider;
150
150
151
/**
151
/**
Lines 345-358 Link Here
345
        if (LOGGER.isLoggable(Level.FINE)) {
345
        if (LOGGER.isLoggable(Level.FINE)) {
346
            LOGGER.fine("addIndexingJob: indexerName=" + indexerName); //NOI18N
346
            LOGGER.fine("addIndexingJob: indexerName=" + indexerName); //NOI18N
347
        }
347
        }
348
348
        
349
        Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos = IndexerCache.getCifCache().getIndexersByName(indexerName);
349
        Work w = new RefreshCifIndices(indexerName, scannedRoots2Dependencies.keySet(), sourcesForBinaryRoots);
350
        if (cifInfos == null) {
350
        scheduleWork(w, false);
351
            throw new InvalidParameterException("No CustomIndexerFactory with name: '" + indexerName + "'"); //NOI18N
352
        } else {
353
            Work w = new RefreshCifIndices(cifInfos, scannedRoots2Dependencies, sourcesForBinaryRoots);
354
            scheduleWork(w, false);
355
        }
356
    }
351
    }
357
352
358
    public void refreshAll(boolean fullRescan, boolean wait, boolean logStatistics, Object... filesOrFileObjects) {
353
    public void refreshAll(boolean fullRescan, boolean wait, boolean logStatistics, Object... filesOrFileObjects) {
Lines 688-702 Link Here
688
        if (evt.getPropertyName() != null && evt.getPropertyName().equals(CustomIndexerFactory.class.getName())) {
683
        if (evt.getPropertyName() != null && evt.getPropertyName().equals(CustomIndexerFactory.class.getName())) {
689
            if (!ignoreIndexerCacheEvents) {
684
            if (!ignoreIndexerCacheEvents) {
690
                @SuppressWarnings("unchecked")
685
                @SuppressWarnings("unchecked")
691
                Set<IndexerCache.IndexerInfo<CustomIndexerFactory>> changedIndexers = (Set<IndexerInfo<CustomIndexerFactory>>) evt.getNewValue();
686
                Pair<URL,Set<IndexerCache.IndexerInfo<CustomIndexerFactory>>> changedIndexers = (Pair<URL,Set<IndexerInfo<CustomIndexerFactory>>>) evt.getNewValue();
692
                scheduleWork(new RefreshCifIndices(changedIndexers, scannedRoots2Dependencies, sourcesForBinaryRoots), false);
687
                scheduleWork(new RefreshCifIndices(changedIndexers.second, Collections.<URL>singleton(changedIndexers.first), sourcesForBinaryRoots), false);
693
            }
688
            }
694
            return;
689
            return;
695
        } else if (evt.getPropertyName() != null && evt.getPropertyName().equals(EmbeddingIndexerFactory.class.getName())) {
690
        } else if (evt.getPropertyName() != null && evt.getPropertyName().equals(EmbeddingIndexerFactory.class.getName())) {
696
            if (!ignoreIndexerCacheEvents) {
691
            if (!ignoreIndexerCacheEvents) {
697
                @SuppressWarnings("unchecked")
692
                @SuppressWarnings("unchecked")
698
                Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> changedIndexers = (Set<IndexerInfo<EmbeddingIndexerFactory>>) evt.getNewValue();
693
                Pair<URL,Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>>> changedIndexers = (Pair<URL,Set<IndexerInfo<EmbeddingIndexerFactory>>>) evt.getNewValue();
699
                scheduleWork(new RefreshEifIndices(changedIndexers, scannedRoots2Dependencies, sourcesForBinaryRoots), false);
694
                scheduleWork(new RefreshEifIndices(changedIndexers.second, Collections.<URL>singleton(changedIndexers.first), sourcesForBinaryRoots), false);
700
            }
695
            }
701
            return;
696
            return;
702
        }
697
        }
Lines 973-1001 Link Here
973
968
974
                    Collection<? extends Indexable> dirty = Collections.singleton(SPIAccessor.getInstance().create(new FileObjectIndexable(root.second, docFile)));
969
                    Collection<? extends Indexable> dirty = Collections.singleton(SPIAccessor.getInstance().create(new FileObjectIndexable(root.second, docFile)));
975
                    String mimeType = DocumentUtilities.getMimeType(document);
970
                    String mimeType = DocumentUtilities.getMimeType(document);
976
971
                    try {
977
                    Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos = IndexerCache.getCifCache().getIndexersFor(mimeType);
972
                        final FileObject cacheFolder = CacheFolder.getDataFolder(root.first);
978
                    for(IndexerCache.IndexerInfo<CustomIndexerFactory> info : cifInfos) {
973
                        final URL cacheFolderURL = cacheFolder.getURL();
979
                        try {
974
                        Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos = IndexerCache.getCifCache().getIndexersFor(cacheFolderURL, mimeType);
980
                            CustomIndexerFactory factory = info.getIndexerFactory();
975
                        for(IndexerCache.IndexerInfo<CustomIndexerFactory> info : cifInfos) {
981
                            Context ctx = SPIAccessor.getInstance().createContext(CacheFolder.getDataFolder(root.first), root.first,
976
                            try {
982
                                    factory.getIndexerName(), factory.getIndexVersion(), null, false, true, false, null);
977
                                CustomIndexerFactory factory = info.getIndexerFactory();
983
                            factory.filesDirty(dirty, ctx);
978
                                Context ctx = SPIAccessor.getInstance().createContext(cacheFolder, root.first,
984
                        } catch (IOException ex) {
979
                                        factory.getIndexerName(), factory.getIndexVersion(), null, false, true, false, null);
985
                            LOGGER.log(Level.WARNING, null, ex);
980
                                factory.filesDirty(dirty, ctx);
981
                            } catch (IOException ex) {
982
                                LOGGER.log(Level.WARNING, null, ex);
983
                            }
986
                        }
984
                        }
987
                    }
985
988
986
                        Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos = IndexerCache.getEifCache().getIndexersFor(cacheFolderURL, mimeType);
989
                    Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos = IndexerCache.getEifCache().getIndexersFor(mimeType);
987
                        for(IndexerCache.IndexerInfo<EmbeddingIndexerFactory> info : eifInfos) {
990
                    for(IndexerCache.IndexerInfo<EmbeddingIndexerFactory> info : eifInfos) {
988
                            try {
991
                        try {
989
                                EmbeddingIndexerFactory factory = info.getIndexerFactory();
992
                            EmbeddingIndexerFactory factory = info.getIndexerFactory();
990
                                Context ctx = SPIAccessor.getInstance().createContext(cacheFolder, root.first,
993
                            Context ctx = SPIAccessor.getInstance().createContext(CacheFolder.getDataFolder(root.first), root.first,
991
                                        factory.getIndexerName(), factory.getIndexVersion(), null, false, true, false, null);
994
                                    factory.getIndexerName(), factory.getIndexVersion(), null, false, true, false, null);
992
                                factory.filesDirty(dirty, ctx);
995
                            factory.filesDirty(dirty, ctx);
993
                            } catch (IOException ex) {
996
                        } catch (IOException ex) {
994
                                LOGGER.log(Level.WARNING, null, ex);
997
                            LOGGER.log(Level.WARNING, null, ex);
995
                            }
998
                        }
996
                        }
997
                    } catch (IOException ioe) {
998
                        LOGGER.log(Level.WARNING, null, ioe);
999
                    }
999
                    }
1000
                }
1000
                }
1001
            } else {
1001
            } else {
Lines 1703-1709 Link Here
1703
            try {
1703
            try {
1704
                FileObject cacheRoot = CacheFolder.getDataFolder(root);
1704
                FileObject cacheRoot = CacheFolder.getDataFolder(root);
1705
1705
1706
                Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos = IndexerCache.getCifCache().getIndexers(null);
1706
                Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos = IndexerCache.getCifCache().getIndexers(cacheRoot.getURL(), null);
1707
                for(IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo : cifInfos) {
1707
                for(IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo : cifInfos) {
1708
                    CustomIndexerFactory factory = cifInfo.getIndexerFactory();
1708
                    CustomIndexerFactory factory = cifInfo.getIndexerFactory();
1709
                    Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, followUpJob, checkEditor, false, null);
1709
                    Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, followUpJob, checkEditor, false, null);
Lines 1711-1717 Link Here
1711
                    factory.filesDeleted(ci.getIndexablesFor(null), ctx);
1711
                    factory.filesDeleted(ci.getIndexablesFor(null), ctx);
1712
                }
1712
                }
1713
1713
1714
                Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos = IndexerCache.getEifCache().getIndexers(null);
1714
                Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos = IndexerCache.getEifCache().getIndexers(cacheRoot.getURL(), null);
1715
                for(IndexerCache.IndexerInfo<EmbeddingIndexerFactory> eifInfo : eifInfos) {
1715
                for(IndexerCache.IndexerInfo<EmbeddingIndexerFactory> eifInfo : eifInfos) {
1716
                    EmbeddingIndexerFactory factory = eifInfo.getIndexerFactory();
1716
                    EmbeddingIndexerFactory factory = eifInfo.getIndexerFactory();
1717
                    Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, followUpJob, checkEditor, false, null);
1717
                    Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, followUpJob, checkEditor, false, null);
Lines 2102-2108 Link Here
2102
                    if (crawler.isFinished()) {
2102
                    if (crawler.isFinished()) {
2103
                        final Map<SourceIndexerFactory,Boolean> invalidatedMap = new IdentityHashMap<SourceIndexerFactory, Boolean>();
2103
                        final Map<SourceIndexerFactory,Boolean> invalidatedMap = new IdentityHashMap<SourceIndexerFactory, Boolean>();
2104
                        final Map<Pair<String,Integer>,Pair<SourceIndexerFactory,Context>> ctxToFinish = new HashMap<Pair<String,Integer>,Pair<SourceIndexerFactory,Context>>();
2104
                        final Map<Pair<String,Integer>,Pair<SourceIndexerFactory,Context>> ctxToFinish = new HashMap<Pair<String,Integer>,Pair<SourceIndexerFactory,Context>>();
2105
                        final SourceIndexers indexers = SourceIndexers.load(false);
2105
                        final SourceIndexers indexers = SourceIndexers.load(root, false);
2106
                        invalidateSources(resources);
2106
                        invalidateSources(resources);
2107
                        scanStarted (root, sourceForBinaryRoot, indexers, invalidatedMap, ctxToFinish);
2107
                        scanStarted (root, sourceForBinaryRoot, indexers, invalidatedMap, ctxToFinish);
2108
                        delete(crawler.getDeletedResources(), root);
2108
                        delete(crawler.getDeletedResources(), root);
Lines 2442-2461 Link Here
2442
2442
2443
    private static class RefreshCifIndices extends Work {
2443
    private static class RefreshCifIndices extends Work {
2444
2444
2445
        private final Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos;
2445
        private final Union2<String,Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>>> cifUnion;
2446
        private final Map<URL, List<URL>> scannedRoots2Dependencies;
2446
        private final Set<URL> rootsToRefresh;
2447
        private final Set<URL> sourcesForBinaryRoots;
2447
        private final Set<URL> sourcesForBinaryRoots;
2448
2448
2449
        public RefreshCifIndices(Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos, Map<URL, List<URL>> scannedRoots2Depencencies, Set<URL> sourcesForBinaryRoots) {
2449
        public RefreshCifIndices(Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos, Set<URL> rootsToRefresh, Set<URL> sourcesForBinaryRoots) {
2450
            super(false, false, NbBundle.getMessage(RepositoryUpdater.class, "MSG_RefreshingIndices"),true); //NOI18N
2450
            super(false, false, NbBundle.getMessage(RepositoryUpdater.class, "MSG_RefreshingIndices"),true); //NOI18N
2451
            this.cifInfos = cifInfos;
2451
            this.cifUnion = Union2.<String,Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>>>createSecond(cifInfos);
2452
            this.scannedRoots2Dependencies = scannedRoots2Depencencies;
2452
            this.rootsToRefresh = rootsToRefresh;
2453
            this.sourcesForBinaryRoots = sourcesForBinaryRoots;
2453
            this.sourcesForBinaryRoots = sourcesForBinaryRoots;
2454
        }
2454
        }
2455
2455
2456
        public RefreshCifIndices(String indexerName, Set<URL> rootsToRefresh, Set<URL> sourcesForBinaryRoots) {
2457
            super(false, false, NbBundle.getMessage(RepositoryUpdater.class, "MSG_RefreshingIndices"),true); //NOI18N
2458
            this.cifUnion = Union2.<String,Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>>>createFirst(indexerName);
2459
            this.rootsToRefresh = rootsToRefresh;
2460
            this.sourcesForBinaryRoots = sourcesForBinaryRoots;
2461
        }
2462
2456
        protected @Override boolean getDone() {
2463
        protected @Override boolean getDone() {
2457
            switchProgressToDeterminate(scannedRoots2Dependencies.size());
2464
            switchProgressToDeterminate(rootsToRefresh.size());
2458
            for(URL root : scannedRoots2Dependencies.keySet()) {
2465
            for(URL root : rootsToRefresh) {
2459
                if (getShuttdownRequest().isRaised()) {
2466
                if (getShuttdownRequest().isRaised()) {
2460
                    // XXX: this only happens when the IDE is shutting down
2467
                    // XXX: this only happens when the IDE is shutting down
2461
                    return true;
2468
                    return true;
Lines 2480-2485 Link Here
2480
                            final LinkedList<Iterable<Indexable>> allIndexblesSentToIndexers = new LinkedList<Iterable<Indexable>>();
2487
                            final LinkedList<Iterable<Indexable>> allIndexblesSentToIndexers = new LinkedList<Iterable<Indexable>>();
2481
                            try {
2488
                            try {
2482
                                ClusteredIndexables ci = new ClusteredIndexables(resources);
2489
                                ClusteredIndexables ci = new ClusteredIndexables(resources);
2490
                                final FileObject cacheRoot = CacheFolder.getDataFolder(root);
2491
                                Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cifInfos =
2492
                                        cifUnion.hasSecond() ? cifUnion.second() : IndexerCache.getCifCache().getIndexersByName(cacheRoot.getURL(), cifUnion.first());
2483
                                for(IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo : cifInfos) {
2493
                                for(IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo : cifInfos) {
2484
                                    List<Iterable<Indexable>> indexerIndexablesList = new LinkedList<Iterable<Indexable>>();
2494
                                    List<Iterable<Indexable>> indexerIndexablesList = new LinkedList<Iterable<Indexable>>();
2485
                                    for(String mimeType : cifInfo.getMimeTypes()) {
2495
                                    for(String mimeType : cifInfo.getMimeTypes()) {
Lines 2493-2499 Link Here
2493
                                    }
2503
                                    }
2494
2504
2495
                                    final CustomIndexerFactory factory = cifInfo.getIndexerFactory();
2505
                                    final CustomIndexerFactory factory = cifInfo.getIndexerFactory();
2496
                                    final FileObject cacheRoot = CacheFolder.getDataFolder(root);
2506
                                    
2497
                                    final Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, false, false, sourceForBinaryRoot, getShuttdownRequest());
2507
                                    final Context ctx = SPIAccessor.getInstance().createContext(cacheRoot, root, factory.getIndexerName(), factory.getIndexVersion(), null, false, false, sourceForBinaryRoot, getShuttdownRequest());
2498
                                    SPIAccessor.getInstance().setAllFilesJob(ctx, true);
2508
                                    SPIAccessor.getInstance().setAllFilesJob(ctx, true);
2499
                                    transactionContexts.add(ctx);
2509
                                    transactionContexts.add(ctx);
Lines 2534-2548 Link Here
2534
2544
2535
        public @Override String toString() {
2545
        public @Override String toString() {
2536
            StringBuilder sb = new StringBuilder();
2546
            StringBuilder sb = new StringBuilder();
2537
            for(Iterator<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> it = cifInfos.iterator(); it.hasNext(); ) {
2547
            if (cifUnion.hasSecond()) {
2538
                IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo = it.next();
2548
                for(Iterator<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> it = cifUnion.second().iterator(); it.hasNext(); ) {
2539
                sb.append(" indexer=").append(cifInfo.getIndexerName()).append('/').append(cifInfo.getIndexerVersion()); //NOI18N
2549
                    IndexerCache.IndexerInfo<CustomIndexerFactory> cifInfo = it.next();
2540
                sb.append(" ("); //NOI18N
2550
                    sb.append(" indexer=").append(cifInfo.getIndexerName()).append('/').append(cifInfo.getIndexerVersion()); //NOI18N
2541
                printMimeTypes(cifInfo.getMimeTypes(), sb);
2551
                    sb.append(" ("); //NOI18N
2542
                sb.append(')'); //NOI18N
2552
                    printMimeTypes(cifInfo.getMimeTypes(), sb);
2543
                if (it.hasNext()) {
2553
                    sb.append(')'); //NOI18N
2544
                    sb.append(','); //NOI18N
2554
                    if (it.hasNext()) {
2555
                        sb.append(','); //NOI18N
2556
                    }
2545
                }
2557
                }
2558
            } else {
2559
                sb.append("indexerName=").append(cifUnion.first()); //NOI18N
2546
            }
2560
            }
2547
            return super.toString() + sb.toString();
2561
            return super.toString() + sb.toString();
2548
        }
2562
        }
Lines 2551-2569 Link Here
2551
    private static class RefreshEifIndices extends Work {
2565
    private static class RefreshEifIndices extends Work {
2552
2566
2553
        private final Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos;
2567
        private final Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos;
2554
        private final Map<URL, List<URL>> scannedRoots2Dependencies;
2568
        private final Set<URL> toRefresh;
2555
        private final Set<URL> sourcesForBinaryRoots;
2569
        private final Set<URL> sourcesForBinaryRoots;
2556
2570
2557
        public RefreshEifIndices(Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos, Map<URL, List<URL>> scannedRoots2Depencencies, Set<URL> sourcesForBinaryRoots) {
2571
        public RefreshEifIndices(Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> eifInfos, Set<URL> toRefresh, Set<URL> sourcesForBinaryRoots) {
2558
            super(false, false, NbBundle.getMessage(RepositoryUpdater.class, "MSG_RefreshingIndices"),true); //NOI18N
2572
            super(false, false, NbBundle.getMessage(RepositoryUpdater.class, "MSG_RefreshingIndices"),true); //NOI18N
2559
            this.eifInfos = eifInfos;
2573
            this.eifInfos = eifInfos;
2560
            this.scannedRoots2Dependencies = scannedRoots2Depencencies;
2574
            this.toRefresh = toRefresh;
2561
            this.sourcesForBinaryRoots = sourcesForBinaryRoots;
2575
            this.sourcesForBinaryRoots = sourcesForBinaryRoots;
2562
        }
2576
        }
2563
2577
2564
        protected @Override boolean getDone() {
2578
        protected @Override boolean getDone() {
2565
            switchProgressToDeterminate(scannedRoots2Dependencies.size());
2579
            switchProgressToDeterminate(toRefresh.size());
2566
            for(URL root : scannedRoots2Dependencies.keySet()) {
2580
            for(URL root : toRefresh) {
2567
                if (getShuttdownRequest().isRaised()) {
2581
                if (getShuttdownRequest().isRaised()) {
2568
                    // XXX: this only happens when the IDE is shutting down
2582
                    // XXX: this only happens when the IDE is shutting down
2569
                    return true;
2583
                    return true;
Lines 2859-2865 Link Here
2859
2873
2860
            boolean finished = scanBinaries(depCtx);
2874
            boolean finished = scanBinaries(depCtx);
2861
            if (finished) {
2875
            if (finished) {
2862
                finished = scanSources(depCtx, null,null);
2876
                finished = scanSources(depCtx, false, null);
2863
                if (finished) {
2877
                if (finished) {
2864
                    finished = scanRootFiles(fullRescanFiles);
2878
                    finished = scanRootFiles(fullRescanFiles);
2865
                    if (finished) {
2879
                    if (finished) {
Lines 2936-2942 Link Here
2936
        private boolean useInitialState;
2950
        private boolean useInitialState;
2937
2951
2938
        private DependenciesContext depCtx;
2952
        private DependenciesContext depCtx;
2939
        protected SourceIndexers indexers = null; // is only ever filled by InitialRootsWork
2940
2953
2941
        public RootsWork(
2954
        public RootsWork(
2942
                Map<URL, List<URL>> scannedRoots2Depencencies,
2955
                Map<URL, List<URL>> scannedRoots2Depencencies,
Lines 3076-3082 Link Here
3076
            switchProgressToDeterminate(depCtx.newBinariesToScan.size() + depCtx.newRootsToScan.size());
3089
            switchProgressToDeterminate(depCtx.newBinariesToScan.size() + depCtx.newRootsToScan.size());
3077
            boolean finished = scanBinaries(depCtx);
3090
            boolean finished = scanBinaries(depCtx);
3078
            if (finished) {
3091
            if (finished) {
3079
                finished = scanSources(depCtx, indexers, scannedRoots2Dependencies);
3092
                finished = scanSources(depCtx, true, scannedRoots2Dependencies);
3080
            }
3093
            }
3081
3094
3082
            final List<URL> missingRoots = new LinkedList<URL>();
3095
            final List<URL> missingRoots = new LinkedList<URL>();
Lines 3172-3186 Link Here
3172
            }
3185
            }
3173
3186
3174
            if (!sources.isEmpty()) {
3187
            if (!sources.isEmpty()) {
3175
                final Iterable<? extends URL> roots = Collections.unmodifiableSet(sources);
3188
                final IndexerCache<CustomIndexerFactory> cifCache = IndexerCache.getCifCache();
3176
                final Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> customIndexers = IndexerCache.getCifCache().getIndexers(null);
3189
                final IndexerCache<EmbeddingIndexerFactory> eifCache = IndexerCache.getEifCache();
3177
                for (IndexerCache.IndexerInfo<CustomIndexerFactory> customIndexer : customIndexers) {
3190
                Map<IndexerCache.IndexerInfo<? extends SourceIndexerFactory >,Collection<URL>> rootsByFactories = new HashMap<IndexerInfo<? extends SourceIndexerFactory>, Collection<URL>>();
3178
                    customIndexer.getIndexerFactory().rootsRemoved(roots);
3191
                for (URL source : sources) {
3192
                    try {
3193
                        final FileObject cacheFolder = CacheFolder.getDataFolder(source, true);
3194
                        final URL cacheFolderURL = cacheFolder.getURL();
3195
                        final Collection<? extends IndexerCache.IndexerInfo<CustomIndexerFactory>> cinfos = cifCache.getIndexers(cacheFolderURL, null);
3196
                        for (IndexerCache.IndexerInfo<CustomIndexerFactory> info : cinfos) {
3197
                            Collection<URL> rootsSet = rootsByFactories.get(info);
3198
                            if (rootsSet == null) {
3199
                                rootsSet = new HashSet<URL>();
3200
                                rootsByFactories.put(info, rootsSet);
3201
                            }
3202
                            rootsSet.add(source);
3203
                        }
3204
                        final Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> einfos = eifCache.getIndexers(cacheFolderURL, null);
3205
                        for (IndexerCache.IndexerInfo<EmbeddingIndexerFactory> info : einfos) {
3206
                            Collection<URL> rootsSet = rootsByFactories.get(info);
3207
                            if (rootsSet == null) {
3208
                                rootsSet = new HashSet<URL>();
3209
                                rootsByFactories.put(info, rootsSet);
3210
                            }
3211
                            rootsSet.add(source);
3212
                        }
3213
                    } catch (IOException ioe) {
3214
                        LOGGER.log(Level.WARNING, null, ioe);
3215
                    }
3179
                }
3216
                }
3180
3217
                for (Map.Entry<IndexerCache.IndexerInfo<? extends SourceIndexerFactory>,Collection<URL>> e : rootsByFactories.entrySet()) {
3181
                final Collection<? extends IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> embeddingIndexers = IndexerCache.getEifCache().getIndexers(null);
3218
                    e.getKey().getIndexerFactory().rootsRemoved(Collections.unmodifiableCollection(e.getValue()));
3182
                for (IndexerCache.IndexerInfo<EmbeddingIndexerFactory> embeddingIndexer : embeddingIndexers) {
3183
                    embeddingIndexer.getIndexerFactory().rootsRemoved(roots);
3184
                }
3219
                }
3185
                RepositoryUpdater.getDefault().rootsListeners.remove(sources, true);
3220
                RepositoryUpdater.getDefault().rootsListeners.remove(sources, true);
3186
            }
3221
            }
Lines 3301-3307 Link Here
3301
            return false;
3336
            return false;
3302
        }
3337
        }
3303
3338
3304
        protected final boolean scanSources(DependenciesContext ctx, SourceIndexers indexers, Map<URL, List<URL>> preregisterIn) {
3339
        protected final boolean scanSources(DependenciesContext ctx, boolean detectIndexerChanges, Map<URL, List<URL>> preregisterIn) {
3305
            assert ctx != null;
3340
            assert ctx != null;
3306
            long scannedRootsCnt = 0;
3341
            long scannedRootsCnt = 0;
3307
            long completeTime = 0;
3342
            long completeTime = 0;
Lines 3309-3319 Link Here
3309
            int totalDeletedFiles = 0;
3344
            int totalDeletedFiles = 0;
3310
            long totalRecursiveListenersTime = 0;
3345
            long totalRecursiveListenersTime = 0;
3311
            boolean finished = true;
3346
            boolean finished = true;
3312
3347
            
3313
            if (indexers == null) {
3314
                indexers = SourceIndexers.load(false);
3315
            }
3316
3317
            for (URL source : ctx.newRootsToScan) {
3348
            for (URL source : ctx.newRootsToScan) {
3318
                if (isCancelled()) {
3349
                if (isCancelled()) {
3319
                    finished = false;
3350
                    finished = false;
Lines 3333-3338 Link Here
3333
                        preregistered = true;
3364
                        preregistered = true;
3334
                    }
3365
                    }
3335
                    try {
3366
                    try {
3367
                        final SourceIndexers indexers = SourceIndexers.load(source, detectIndexerChanges);
3336
                        if (scanSource (source, ctx.fullRescanSourceRoots.contains(source), ctx.sourcesForBinaryRoots.contains(source), indexers, outOfDateFiles, deletedFiles, recursiveListenersTime)) {
3368
                        if (scanSource (source, ctx.fullRescanSourceRoots.contains(source), ctx.sourcesForBinaryRoots.contains(source), indexers, outOfDateFiles, deletedFiles, recursiveListenersTime)) {
3337
                            ctx.scannedRoots.add(source);
3369
                            ctx.scannedRoots.add(source);
3338
                            success = true;
3370
                            success = true;
Lines 3488-3497 Link Here
3488
        
3520
        
3489
        public @Override boolean getDone() {
3521
        public @Override boolean getDone() {
3490
            try {
3522
            try {
3491
                if (indexers == null) {
3492
                    indexers = SourceIndexers.load(true);
3493
                }
3494
3495
                if (waitForProjects) {
3523
                if (waitForProjects) {
3496
                    boolean retry = true;
3524
                    boolean retry = true;
3497
                    while (retry) {
3525
                    while (retry) {
Lines 3958-3965 Link Here
3958
3986
3959
    private static final class SourceIndexers {
3987
    private static final class SourceIndexers {
3960
3988
3961
        public static SourceIndexers load(boolean detectChanges) {
3989
        public static SourceIndexers load(final URL sourceRoot, final boolean detectChanges) throws IOException {
3962
            return new SourceIndexers(detectChanges);
3990
            return new SourceIndexers(sourceRoot, detectChanges);
3963
        }
3991
        }
3964
3992
3965
        public final Set<IndexerCache.IndexerInfo<CustomIndexerFactory>> changedCifs;
3993
        public final Set<IndexerCache.IndexerInfo<CustomIndexerFactory>> changedCifs;
Lines 3967-3973 Link Here
3967
        public final Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> changedEifs;
3995
        public final Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>> changedEifs;
3968
        public final Map<String, Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>>> eifInfosMap;
3996
        public final Map<String, Set<IndexerCache.IndexerInfo<EmbeddingIndexerFactory>>> eifInfosMap;
3969
3997
3970
        private SourceIndexers(boolean detectChanges) {
3998
        private SourceIndexers(final URL sourceRoot, final boolean detectChanges) throws IOException {
3971
            final long start = System.currentTimeMillis();
3999
            final long start = System.currentTimeMillis();
3972
            if (detectChanges) {
4000
            if (detectChanges) {
3973
                changedCifs = new HashSet<IndexerCache.IndexerInfo<CustomIndexerFactory>>();
4001
                changedCifs = new HashSet<IndexerCache.IndexerInfo<CustomIndexerFactory>>();
Lines 3976-3983 Link Here
3976
                changedCifs = null;
4004
                changedCifs = null;
3977
                changedEifs = null;
4005
                changedEifs = null;
3978
            }
4006
            }
3979
            cifInfos = IndexerCache.getCifCache().getIndexers(changedCifs);
4007
            final URL cacheRootURL = CacheFolder.getDataFolder(sourceRoot).getURL();
3980
            eifInfosMap = IndexerCache.getEifCache().getIndexersMap(changedEifs);
4008
            cifInfos = IndexerCache.getCifCache().getIndexers(cacheRootURL, changedCifs);
4009
            eifInfosMap = IndexerCache.getEifCache().getIndexersMap(cacheRootURL, changedEifs);
3981
            
4010
            
3982
            final long delta = System.currentTimeMillis() - start;
4011
            final long delta = System.currentTimeMillis() - start;
3983
            LOGGER.log(Level.FINE, "Loading indexers took {0} ms.", delta); // NOI18N
4012
            LOGGER.log(Level.FINE, "Loading indexers took {0} ms.", delta); // NOI18N

Return to bug 180262