Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Complete refactor of LibraryProperties to mvvm #6107

Merged
merged 15 commits into from
Mar 22, 2020

Conversation

calixtus
Copy link
Member

@calixtus calixtus commented Mar 12, 2020

This PR aims to refactor the LibraryPreferencesDialog to comply with the mvvm pattern.
Again, this PR is not so lightweight, as the pattern panels had to be reworked too, FieldFormattersCleanupsPanel had to be converted to mvvm-pattern, so the storeSettings-method could be placed into the ViewModel.

The package commonfxcontrols is introduced and should collect all panels used by several dialogs.
when it's done, it should also fix #6091
refs #6106

Reworked FieldFormatterCleanupsPanel (works in LibraryProperties as well as in CleanupDialog:
FieldFormatterCleanupsPanel

@calixtus calixtus changed the title Common fx controls Complete refactoring of LibraryProperties to mvvm Mar 12, 2020
@calixtus calixtus changed the title Complete refactoring of LibraryProperties to mvvm Complete refactor of LibraryProperties to mvvm Mar 12, 2020
Copy link
Member

@Siedlerchr Siedlerchr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks already good so far

@calixtus calixtus changed the title Complete refactor of LibraryProperties to mvvm [WIP] Complete refactor of LibraryProperties to mvvm Mar 12, 2020
@codecov
Copy link

codecov bot commented Mar 12, 2020

Codecov Report

❗ No coverage uploaded for pull request base (master@7e6a23e). Click here to learn what that means.
The diff coverage is 24.39%.

Impacted file tree graph

@@            Coverage Diff            @@
##             master    #6107   +/-   ##
=========================================
  Coverage          ?   41.69%           
  Complexity        ?     6909           
=========================================
  Files             ?     1093           
  Lines             ?    46395           
  Branches          ?     5552           
=========================================
  Hits              ?    19344           
  Misses            ?    25616           
  Partials          ?     1435
Impacted Files Coverage Δ Complexity Δ
.../gui/preferences/BibtexKeyPatternTabViewModel.java 0% <0%> (ø) 0 <0> (?)
src/main/java/org/jabref/gui/JabRefFrame.java 0.18% <0%> (ø) 1 <0> (?)
...mmonfxcontrols/BibtexKeyPatternPanelViewModel.java 0% <0%> (ø) 0 <0> (?)
...gui/libraryproperties/LibraryPropertiesAction.java 0% <0%> (ø) 0 <0> (?)
...ef/gui/commonfxcontrols/BibtexKeyPatternPanel.java 0% <0%> (ø) 0 <0> (?)
...abref/gui/preferences/BibtexKeyPatternTabView.java 0% <0%> (ø) 0 <0> (?)
...ref/gui/preferences/ExportSortingTabViewModel.java 0% <0%> (ø) 0 <0> (?)
...mmonfxcontrols/BibtexKeyPatternPanelItemModel.java 0% <0%> (ø) 0 <0> (?)
...ava/org/jabref/gui/cleanup/CleanupPresetPanel.java 0% <0%> (ø) 0 <0> (?)
...ryproperties/LibraryPropertiesDialogViewModel.java 0% <0%> (ø) 0 <0> (?)
... and 7 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 7e6a23e...94f931c. Read the comment docs.

@calixtus
Copy link
Member Author

There seems to be something wrong with the tests...

@tobiasdiez
Copy link
Member

The localization files read all fxml files, and apparently there is a problem with @Inject private StateManager stateManager;

@calixtus
Copy link
Member Author

So should i get rid of the DI? This would mean, the inclusion of FieldFormattersCleanupsPanel has to be hardcoded again...

@FXML private ComboBox<Field> addableFields;
@FXML private ComboBox<Formatter> addableFormatters;

@Inject private StateManager stateManager;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it should work if you pass the stateManager as ctor parameter instead of using the injection

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The FieldFormatterCleanupsPanel is instantiated by the fxml file. I could theoretically pass an argument here using the @NamedArg-annotation. But passing a StateManager seems to me not possible that way. So the alternative would be to hardcode this in the view.

@tobiasdiez
Copy link
Member

I think it's a good idea to include the statemanager via @inject. Just wanted to point out where the probem may come from. Probably a combination of @Inject with fx:root (I kind of remember that there were special code in the localization test to handle this case...). Sorry, don't have time right now to investigate this further.

@calixtus
Copy link
Member Author

calixtus commented Mar 14, 2020

According to the stack trace java can't initialize the Globals in DefaultInjector.

java.lang.ExceptionInInitializerError at org.jabref/org.jabref.gui.DefaultInjector.createDependency(DefaultInjector.java:42) at afterburner.fx/com.airhacks.afterburner.injection.Injector.instantiateModelOrService(Injector.java:115) at afterburner.fx/com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:160) at afterburner.fx/com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:137) at org.jabref/org.jabref.gui.DefaultInjector.injectMembers(DefaultInjector.java:78) at afterburner.fx/com.airhacks.afterburner.views.ViewLoader.lambda$controller$4(ViewLoader.java:116) at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:938) at javafx.fxml/javafx.fxml.FXMLLoader$RootElement.processAttribute(FXMLLoader.java:1301) at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227) at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752) at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435) at afterburner.fx/com.airhacks.afterburner.views.ViewLoader.load(ViewLoader.java:172) at org.jabref/org.jabref.gui.commonfxcontrols.FieldFormatterCleanupsPanel.(FieldFormatterCleanupsPanel.java:45) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:166) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404) at java.base/java.lang.Class.newInstance(Class.java:591) at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1019) at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754) at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435) at org.jabref/org.jabref.logic.l10n.LocalizationParser.getLanguageKeysInFxmlFile(LocalizationParser.java:218) at org.jabref/org.jabref.logic.l10n.LocalizationParser.lambda$findLocalizationEntriesInFxmlFiles$3(LocalizationParser.java:111) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at org.jabref/org.jabref.logic.l10n.LocalizationParser.findLocalizationEntriesInFxmlFiles(LocalizationParser.java:112) at org.jabref/org.jabref.logic.l10n.LocalizationParser.findLocalizationEntriesInFiles(LocalizationParser.java:77) at org.jabref/org.jabref.logic.l10n.LocalizationParser.findObsolete(LocalizationParser.java:56) at org.jabref/org.jabref.logic.l10n.LocalizationConsistencyTest.findObsoleteLocalizationKeys(LocalizationConsistencyTest.java:125) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.junit.platform.commons@1.6.0/org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy32.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = Test worker at javafx.graphics/com.sun.glass.ui.Application.checkEventThread(Application.java:441) at javafx.graphics/com.sun.glass.ui.ClipboardAssistance.(ClipboardAssistance.java:40) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.getSystemClipboard(QuantumToolkit.java:1262) at javafx.graphics/javafx.scene.input.Clipboard.getSystemClipboardImpl(Clipboard.java:432) at javafx.graphics/javafx.scene.input.Clipboard.getSystemClipboard(Clipboard.java:200) at org.jabref/org.jabref.gui.ClipBoardManager.(ClipBoardManager.java:51) at org.jabref/org.jabref.Globals.(Globals.java:75) ... 133 more

Could not initialize class org.jabref.Globals
java.lang.NoClassDefFoundError: Could not initialize class org.jabref.Globals
at org.jabref/org.jabref.gui.DefaultInjector.createDependency(DefaultInjector.java:42)
at afterburner.fx/com.airhacks.afterburner.injection.Injector.instantiateModelOrService(Injector.java:115)
at afterburner.fx/com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:160)
at afterburner.fx/com.airhacks.afterburner.injection.Injector.injectMembers(Injector.java:137)
at org.jabref/org.jabref.gui.DefaultInjector.injectMembers(DefaultInjector.java:78)
at afterburner.fx/com.airhacks.afterburner.views.ViewLoader.lambda$controller$4(ViewLoader.java:116)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:938)
at javafx.fxml/javafx.fxml.FXMLLoader$RootElement.processAttribute(FXMLLoader.java:1301)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at afterburner.fx/com.airhacks.afterburner.views.ViewLoader.load(ViewLoader.java:172)
at org.jabref/org.jabref.gui.commonfxcontrols.FieldFormatterCleanupsPanel.(FieldFormatterCleanupsPanel.java:45)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:166)
at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404)
at java.base/java.lang.Class.newInstance(Class.java:591)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1019)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at org.jabref/org.jabref.logic.l10n.LocalizationParser.getLanguageKeysInFxmlFile(LocalizationParser.java:218)
at org.jabref/org.jabref.logic.l10n.LocalizationParser.lambda$findLocalizationEntriesInFxmlFiles$3(LocalizationParser.java:111)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at org.jabref/org.jabref.logic.l10n.LocalizationParser.findLocalizationEntriesInFxmlFiles(LocalizationParser.java:112)
at org.jabref/org.jabref.logic.l10n.LocalizationParser.findLocalizationEntriesInFiles(LocalizationParser.java:77)
at org.jabref/org.jabref.logic.l10n.LocalizationParser.find(LocalizationParser.java:34)
at org.jabref/org.jabref.logic.l10n.LocalizationConsistencyTest.findMissingLocalizationKeys(LocalizationConsistencyTest.java:109)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.junit.platform.commons@1.6.0/org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:205)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:201)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine@5.6.0/org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine@1.6.0/org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher@1.6.0/org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
at com.sun.proxy.$Proxy32.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.base/java.lang.Thread.run(Thread.java:830)

�[0K�[1morg.jabref.logic.l10n.LocalizationConsistencyTest�[m
�[0K�[1m Test �[22mfindObsoleteLocalizationKeys()�[31m FAILED�[33m (1.1s)�[31m
java.lang.ExceptionInInitializerError
at org.jabref/org.jabref.logic.l10n.LocalizationConsistencyTest.findObsoleteLocalizationKeys(LocalizationConsistencyTest.java:125)
Caused by: java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = Test worker
at org.jabref/org.jabref.logic.l10n.LocalizationConsistencyTest.findObsoleteLocalizationKeys(LocalizationConsistencyTest.java:125)
�[m
�[0K�[1m Test �[22mfindMissingLocalizationKeys()�[31m FAILED�[31m
java.lang.NoClassDefFoundError: Could not initialize class org.jabref.Globals
at org.jabref/org.jabref.logic.l10n.LocalizationConsistencyTest.findMissingLocalizationKeys(LocalizationConsistencyTest.java:109)
�[m
23:12:29.908 [main] INFO org.gradle.api.internal.tasks.testing.worker.TestWorker - Gradle Test Executor 2 finished executing tests. -
�[0K�[1;31mFAILURE: �[39mExecuted 49 tests in 18.2s (2 failed)�[m

@tobiasdiez
Copy link
Member

loader.setControllerFactory(Mockito::mock);
should actually pretend that the DefaultInjector is used...strange

@calixtus
Copy link
Member Author

calixtus commented Mar 16, 2020

I changed the failing injection to a call on Globals as a temporary fix, so this PR is mergable, or at least ready for review.

@calixtus calixtus marked this pull request as ready for review March 16, 2020 00:13
@calixtus calixtus added the status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers label Mar 16, 2020
@calixtus calixtus changed the title [WIP] Complete refactor of LibraryProperties to mvvm Complete refactor of LibraryProperties to mvvm Mar 16, 2020
Copy link
Member

@tobiasdiez tobiasdiez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work! LGTM

# Conflicts:
#	src/main/resources/l10n/JabRef_en.properties
@koppor koppor merged commit 120a0af into JabRef:master Mar 22, 2020
@koppor koppor deleted the common_fx_controls branch March 22, 2020 15:32
Siedlerchr added a commit that referenced this pull request Mar 23, 2020
* upstream/master:
  Fix image path
  Check for secrets being present at GitHub workflows (#5973)
  Add "JabRef and Software Engineering"
  Make Java code acceptable for GitBook - and fix link to JUnit antipatterns
  Let "Contributing" be displayed
  Merge the reviewing steops of "Code Quality" to "Development Strategy"
  Try to include CONTRIBUTING.md in devdocs.jabref.org
  Minor improvments in CONTRIBUTING.md
  Update Codecov yaml with proper indentation (#6156)
  Complete refactor of LibraryProperties to mvvm (#6107)
  Try comment:false
  Remove duplicated line
  Fix: Only if `.sav` file has changes a recovery dialog is shown (#6116)
  Fix formatting for GitBook
  Add hint to scroll down
@Hugoo98
Copy link

Hugoo98 commented Apr 4, 2020

Hello @koppor ,
So I wanted to find out about bug #6091. Since we have already started working on it, is it possible to continue our work without going through bug #6107?
Thank you

@calixtus
Copy link
Member Author

calixtus commented Apr 4, 2020

I'm afraid #6107 is already merged in the master branch. Since there were some changes in the architecture of the code (we try to refactor the whole code base to the mvvm pattern), undoing this PR is something we do not really want to undo, since already other PRs were merged.

Why don't you upload your code as a draft (just like adding a PR, except in the before clicking the green button, choose "create a draft") and we can discuss it on GitHub. Maybe merging the latest master branch into yours is easier than you think. Free Software is all about collaboration.

@Hugoo98
Copy link

Hugoo98 commented Apr 4, 2020

@calixtus
So far we haven't done much but we have managed to understand a lot about the source code. So my question is: Can we continue to help you on # 6107 and if we have successfully corrected it, we will attack # 6091?

@calixtus
Copy link
Member Author

calixtus commented Apr 4, 2020

I think I misunderstood you. Sorry.
Of course you can start working on #6091. Please just make sure to use the latest master branch. As soon as you have made some progress you can upload your draft so we can help each other, if questions come up.

The problem in #6107 is some something different und should be indepentend of your work about issue #6091. But if you like, you could give this one a shot too. The remaining issue in #6107 is the about fxml and dependency injection, as @tobiasdiez pointed out. I put in this PR a workaround to move forward. But the right implementation would be to inject the stateManager.

@Hugoo98
Copy link

Hugoo98 commented Apr 21, 2020

@calixtus
Hello, I'm coming back to you regarding bug #6091. As we discussed it, we agreed to start working on #6091 and download our draft if there is progress. Finally, we managed to fix it with my colleagues, and now we don't know what the next step is, can you guide us please?
Thank you

@calixtus
Copy link
Member Author

you can push your changes to your origin repo and create a pull request at the jabref github page.

koppor pushed a commit that referenced this pull request Jul 1, 2022
3d3573c Update centre-de-recherche-sur-les-civilisations-de-l-asie-orientale.csl (#5988)
5de0fbe Update society-of-biblical-literature-fullnote-bibliography.csl (#5913)
04b6c7a Create revue-internationale-durbanisme.csl (#5974)
4a5bfe2 Update biological-reviews.csl (#6116)
957b2bc Update harvard-cite-them-right-no-et-al.csl (#6115)
e836a6c Update harvard-university-of-bath.csl (#6011)
b4a8dd7 Update and rename harvard-cite-them-right.csl to harvard-cite-them-ri… (#6113)
a198884 Update twentieth-century-music.csl (#6110)
81c1619 Update archaeonautica.csl (#5928)
fc46f1d Bump actions/cache from 2 to 3 (#6112)
fab57ed Bump actions/checkout from 2 to 3 (#6111)
519d594 [don't merge] chore: Included githubactions in the dependabot config (#6109)
a8aa898 Update universidade-estadual-de-alagoas-uneal-abnt.csl (#5915)
6191640 Update isnad-dipnotlu.csl (#5909)
d65a6ac Update isnad-metinici.csl (#5910)
830d337 Update technische-universitat-dresden-linguistik.csl (#6097)
81adc43 Update american-society-for-horticultural-science.csl (#6089)
b767623 Create south-african-law-journal.csl (#6092)
215e1e9 Create journal-of-lithic-studies.csl (#6080)
0740f8c Create eunomia-revista-en-cultura-de-la-legalidad.csl (#6095)
f93c809 Create endocrine-journal.csl (#6086)
3fdeb51 Revert "chore: Set permissions for GitHub actions (#6096)" (#6108)
35ebd1e chore: Set permissions for GitHub actions (#6096)
1cb8758 Create journal-fur-medienlinguistik (#6100)
f4b5f7f Update unified-style-sheet-for-linguistics.csl (#6098)
c3f856a Update advanced-materials.csl (#6103)
d1e7576 Bump diffy from 3.4.0 to 3.4.2 (#6107)
9e5e7ab Fix Dev Dynamics (#6099)
7234520 Add CSL style for the journal Developmental Dynamics (#6093)
ba8db05 Create independent style for vox-sanguinis.csl (#6085)
845dee0 Create meta.csl (#6088)
684bc3a Update universite-du-quebec-a-montreal.csl (#6087)
3602c18 Up-date & re-title pour-reussir/dionne (#6043)
0cc6e82 Fix Mainz Geography
cfc4cec Add DOI and fix printing author names in Population and Économie et statistique (#6079)
14e8b1d Update journal-of-neuroimaging.csl (#6084)
2c0e1f1 Update isnad-dipnotlu.csl (#6081)
02fdb9b Merge pull request #6082 from denismaier/patch-ube-muwi-note
9309378 removes default-locale

git-subtree-dir: buildres/csl/csl-styles
git-subtree-split: 3d3573c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Library sort order get lost
5 participants