Cannot open/save .bib file on Google Drive from linux

Here comes the feature description…‘’

Hello,
In the Linux (Ubuntu) app Files, I can see the .bib file and view it with Text Editor.
But nothing happens when I try to “Open with JabRef” from “Files”.
Then if I copy the .bib file to a local directory (say, ~/Desktop), I can open the file without any problem.
If I then try to write the file to the same Google Drive directory, I get a jabref error message “Could not save file” with the stacktrace below.

Any suggestions would be most appreciated,
Philip

org.jabref.logic.exporter.SaveException: Problems saving: java.io.IOException: Permission denied
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveDatabaseAction.save(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at java.base/java.util.Optional.ifPresent(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.exporter.SaveAction.execute(Unknown Source)
at org.jabref@5.9.6000/org.jabref.gui.actions.JabRefAction.lambda$new$3(Unknown Source)
at org.jabref.merged.module@5.9.6000/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.9.6000/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.scene.control.MenuItem.fire(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.scene.Scene.processMouseEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at org.jabref.merged.module@5.9.6000/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at org.jabref.merged.module@5.9.6000/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Permission denied
at java.base/sun.nio.ch.FileDispatcherImpl.lock0(Native Method)
at java.base/sun.nio.ch.FileDispatcherImpl.lock(Unknown Source)
at java.base/sun.nio.ch.FileChannelImpl.lock(Unknown Source)
at java.base/java.nio.channels.FileChannel.lock(Unknown Source)
at org.jabref@5.9.6000/org.jabref.logic.exporter.AtomicFileOutputStream.(Unknown Source)
at org.jabref@5.9.6000/org.jabref.logic.exporter.AtomicFileOutputStream.(Unknown Source)
at org.jabref@5.9.6000/org.jabref.logic.exporter.AtomicFileWriter.(Unknown Source)
… 51 more

Hi,

Thanks for reporting. Would it be possible to try out the latest development version? We fixed some issues regarding saving there.

Remember to make a backup of your library before trying out the new version

Hi Christoph,

I tried with the 5.10 version on the link that you sent and experienced the same problem (stacktrace below, looks similar if not identical).

BTW, I have used jabref for many years with Windows and using a backed up, always accessible R/W location on Google drive has worked fine. Something seems to be different with linux.

Many thanks,
Philip

org.jabref.logic.exporter.SaveException: Problems saving: java.nio.file.FileSystemException: /home/philip/Desktop/jabref_link/test.bib.tmp → /home/philip/Desktop/jabref_link/test.bib: Input/output error
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveDatabaseAction.saveDatabase(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveDatabaseAction.save(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at java.base/java.util.Optional.ifPresent(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveDatabaseAction.saveAs(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.exporter.SaveAction.execute(Unknown Source)
at org.jabref@5.10.1111/org.jabref.gui.actions.JabRefAction.lambda$new$3(Unknown Source)
at org.jabref.merged.module@5.10.1111/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.10.1111/org.controlsfx.control.action.Action.handle(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.scene.control.MenuItem.fire(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.doSelect(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.scene.control.ContextMenuContent$MenuItemContainer.lambda$createChildren$12(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.event.Event.fireEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.scene.Scene.processMouseEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at org.jabref.merged.module@5.10.1111/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at org.jabref.merged.module@5.10.1111/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.nio.file.FileSystemException: /home/philip/Desktop/jabref_link/test.bib.tmp → /home/philip/Desktop/jabref_link/test.bib: Input/output error
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystem.move(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystemProvider.move(Unknown Source)
at java.base/java.nio.file.Files.move(Unknown Source)
at org.jabref@5.10.1111/org.jabref.logic.exporter.AtomicFileOutputStream.close(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.implClose(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.lockedClose(Unknown Source)
at java.base/sun.nio.cs.StreamEncoder.close(Unknown Source)
at java.base/java.io.OutputStreamWriter.close(Unknown Source)
… 51 more

Maybe it is a JabRef problem, but maybe this could be a permissions problem too. Maybe your ubuntu default “files” folder has special permissions and does not work well with Google drive?

Having been inspired by command line - How do you view file permissions? - Ask Ubuntu
Please execute following command: ls -l /path/to/file

If you want to see the the permission of a file you can use ls -l /path/to/file command.

For example

   ls -l acroread 
   -rwxr-xr-x 1 10490 floppy 17242 May  8  2013 acroread

What does this mean ?

First - represents a regular file. It gives you a hint of the type of object it is. It can have following values.

  • d (directory)
  • c (character device)
  • l (symlink)
  • p (named pipe)
  • s (socket)
  • b (block device)
  • D (door)
  • - (regular file)

r represents read permission.
w represents write permission and
x represents executable permission.

First combination of rwx represents permission for the owner .
Second combination of rwx represents permission for the group .
Third combination of rwx represents permission for the other of the file.

Octal notation

Permission of file can also be represented in octal notation.
In octal notation

Read or r is represented by 4,
Write or w is represented by 2
Execute x is represented by 1.

Sum of these three is use to represent the permission.

stat command can be used to view file permission in octal notation

  stat -c "%a %n" /path/of/file

For example

   stat -c "%a %n" acroread 
   755 acroread

Here you can see

For owner it is 4+2+1=7 (111 in binary)
For group it is 4+0+1=5 (101 in binary) and
For other it is 4+0+1=5 (101 in binary).

I hope there are no leftover .tmp files lying around in the folder you store your library file (.bib) in. If so, please remove them. Here is explained what they are and why they exist: Automatic Backup (.sav and .bak) and Autosave - JabRef

Also, obviously since something is wrong with storing your library file, please create a backup of your library and store it somewhere save while you experiment.

Thanks for your responses!

Actually when I looked more carefully, the development 5.10 had fixed the problem.

Now, when I File | Open library

and expand the “Other Locations” on the left (not initially obvious), I see my google drive account under “Networks”.

Then I can drill down and open (and subsequently save) my .bib file.

The last small issue is that the file is displayed at the tope of the JafRef window in the Google Drive “mangled” file name format. Apparently this can be decoded with the gio command:

https://gitlab.gnome.org/GNOME/gvfs/-/issues/402

Many thanks,

Philip

2 Likes

Hi JabRef contributors,

I see that the latest version does not support Google drive mapping in Linux.

When I File|Open, the mapped drive does not appear, as it does in the “Files” app.

Did the fix mentioned below not make it into the latest release?

JabRef 5.12–2023-12-24–4233bad
Linux 6.2.0-39-generic amd64
Java 21.0.1
JavaFX 21.0.1+6

Many thanks,

Philip

@Philip_Warrick Hi, the fix mentioned here was about having errors saving files on a google drive.
For opening, we didn’t change anything recently… So I am wondering a bit.
Which version of JabRef did you use? Snap? Flatpak or the deb?