5858import org .jabref .gui .util .DefaultTaskExecutor ;
5959import org .jabref .gui .util .TaskExecutor ;
6060import org .jabref .logic .ai .AiService ;
61+ import org .jabref .logic .ai .embeddings .EmbeddingsGenerationTaskManager ;
6162import org .jabref .logic .citationstyle .CitationStyleCache ;
6263import org .jabref .logic .importer .ParserResult ;
6364import org .jabref .logic .importer .util .FileFieldParser ;
@@ -153,6 +154,8 @@ private enum PanelMode { MAIN_TABLE, MAIN_TABLE_AND_ENTRY_EDITOR }
153154 private BackgroundTask <ParserResult > dataLoadingTask ;
154155
155156 private final IndexingTaskManager indexingTaskManager ;
157+ private EmbeddingsGenerationTaskManager embeddingsGenerationTaskManager ;
158+
156159 private final TaskExecutor taskExecutor ;
157160 private final DirectoryMonitorManager directoryMonitorManager ;
158161
@@ -176,6 +179,7 @@ private LibraryTab(BibDatabaseContext bibDatabaseContext,
176179 this .fileUpdateMonitor = fileUpdateMonitor ;
177180 this .entryTypesManager = entryTypesManager ;
178181 this .indexingTaskManager = new IndexingTaskManager (taskExecutor );
182+ this .embeddingsGenerationTaskManager = new EmbeddingsGenerationTaskManager (bibDatabaseContext , preferencesService .getFilePreferences (), aiService , taskExecutor );
179183 this .taskExecutor = taskExecutor ;
180184 this .directoryMonitorManager = new DirectoryMonitorManager (Globals .getDirectoryMonitor ());
181185
@@ -191,6 +195,7 @@ private LibraryTab(BibDatabaseContext bibDatabaseContext,
191195 setupAutoCompletion ();
192196
193197 this .getDatabase ().registerListener (new IndexUpdateListener ());
198+ this .getDatabase ().registerListener (new EmbeddingsUpdateListener ());
194199 this .getDatabase ().registerListener (new EntriesRemovedListener ());
195200
196201 // ensure that at each addition of a new entry, the entry is added to the groups interface
@@ -262,12 +267,16 @@ private void onDatabaseLoadingSucceed(ParserResult result) {
262267
263268 if (preferencesService .getFilePreferences ().shouldFulltextIndexLinkedFiles ()) {
264269 try {
265- indexingTaskManager .updateIndex (PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences (), preferencesService . getAiPreferences () ), bibDatabaseContext );
270+ indexingTaskManager .updateIndex (PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences ()), bibDatabaseContext );
266271 } catch (IOException e ) {
267272 LOGGER .error ("Cannot access lucene index" , e );
268273 }
269274 }
270275
276+ if (preferencesService .getAiPreferences ().getEnableChatWithFiles ()) {
277+ embeddingsGenerationTaskManager .updateEmbeddings (bibDatabaseContext );
278+ }
279+
271280 LOGGER .trace ("loading.set(false);" );
272281 loading .set (false );
273282 dataLoadingTask = null ;
@@ -308,11 +317,13 @@ private void setDatabaseContext(BibDatabaseContext bibDatabaseContext) {
308317 this .tableModel = new MainTableDataModel (getBibDatabaseContext (), preferencesService , stateManager );
309318 citationStyleCache = new CitationStyleCache (bibDatabaseContext );
310319 annotationCache = new FileAnnotationCache (bibDatabaseContext , preferencesService .getFilePreferences ());
320+ this .embeddingsGenerationTaskManager = new EmbeddingsGenerationTaskManager (bibDatabaseContext , preferencesService .getFilePreferences (), aiService , taskExecutor );
311321
312322 setupMainPanel ();
313323 setupAutoCompletion ();
314324
315325 this .getDatabase ().registerListener (new IndexUpdateListener ());
326+ this .getDatabase ().registerListener (new EmbeddingsUpdateListener ());
316327 this .getDatabase ().registerListener (new EntriesRemovedListener ());
317328
318329 // ensure that at each addition of a new entry, the entry is added to the groups interface
@@ -1064,7 +1075,7 @@ private class IndexUpdateListener {
10641075 public void listen (EntriesAddedEvent addedEntryEvent ) {
10651076 if (preferencesService .getFilePreferences ().shouldFulltextIndexLinkedFiles ()) {
10661077 try {
1067- PdfIndexer pdfIndexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences (), preferencesService . getAiPreferences () );
1078+ PdfIndexer pdfIndexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences ());
10681079 indexingTaskManager .addToIndex (pdfIndexer , addedEntryEvent .getBibEntries ());
10691080 } catch (IOException e ) {
10701081 LOGGER .error ("Cannot access lucene index" , e );
@@ -1076,7 +1087,7 @@ public void listen(EntriesAddedEvent addedEntryEvent) {
10761087 public void listen (EntriesRemovedEvent removedEntriesEvent ) {
10771088 if (preferencesService .getFilePreferences ().shouldFulltextIndexLinkedFiles ()) {
10781089 try {
1079- PdfIndexer pdfIndexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences (), preferencesService . getAiPreferences () );
1090+ PdfIndexer pdfIndexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences ());
10801091 for (BibEntry removedEntry : removedEntriesEvent .getBibEntries ()) {
10811092 indexingTaskManager .removeFromIndex (pdfIndexer , removedEntry );
10821093 }
@@ -1099,7 +1110,7 @@ public void listen(FieldChangedEvent fieldChangedEvent) {
10991110 removedFiles .removeAll (newFileList );
11001111
11011112 try {
1102- PdfIndexer indexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences (), preferencesService . getAiPreferences () );
1113+ PdfIndexer indexer = PdfIndexerManager .getIndexer (bibDatabaseContext , preferencesService .getFilePreferences ());
11031114 indexingTaskManager .addToIndex (indexer , fieldChangedEvent .getBibEntry (), addedFiles );
11041115 indexingTaskManager .removeFromIndex (indexer , removedFiles );
11051116 } catch (IOException e ) {
@@ -1114,6 +1125,44 @@ public IndexingTaskManager getIndexingTaskManager() {
11141125 return indexingTaskManager ;
11151126 }
11161127
1128+ private class EmbeddingsUpdateListener {
1129+ @ Subscribe
1130+ public void listen (EntriesAddedEvent event ) {
1131+ if (preferencesService .getAiPreferences ().getEnableChatWithFiles ()) {
1132+ embeddingsGenerationTaskManager .addToProcess (event .getBibEntries ());
1133+ }
1134+ }
1135+
1136+ @ Subscribe
1137+ public void listen (EntriesRemovedEvent event ) {
1138+ if (preferencesService .getAiPreferences ().getEnableChatWithFiles ()) {
1139+ embeddingsGenerationTaskManager .removeFromProcess (event .getBibEntries ());
1140+ }
1141+ }
1142+
1143+ @ Subscribe
1144+ public void listen (FieldChangedEvent event ) {
1145+ if (preferencesService .getAiPreferences ().getEnableChatWithFiles ()) {
1146+ if (event .getField ().equals (StandardField .FILE )) {
1147+ List <LinkedFile > oldFileList = FileFieldParser .parse (event .getOldValue ());
1148+ List <LinkedFile > newFileList = FileFieldParser .parse (event .getNewValue ());
1149+
1150+ List <LinkedFile > addedFiles = new ArrayList <>(newFileList );
1151+ addedFiles .removeAll (oldFileList );
1152+ List <LinkedFile > removedFiles = new ArrayList <>(oldFileList );
1153+ removedFiles .removeAll (newFileList );
1154+
1155+ embeddingsGenerationTaskManager .addToProcess (addedFiles );
1156+ embeddingsGenerationTaskManager .removeFromProcess (removedFiles );
1157+ }
1158+ }
1159+ }
1160+ }
1161+
1162+ public EmbeddingsGenerationTaskManager getEmbeddingsGenerationTaskManager () {
1163+ return embeddingsGenerationTaskManager ;
1164+ }
1165+
11171166 public static class DatabaseNotification extends NotificationPane {
11181167 public DatabaseNotification (Node content ) {
11191168 super (content );
0 commit comments