diff --git a/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java b/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java index c47dcc463eb..8f5db6e96a2 100644 --- a/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java +++ b/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java @@ -15,6 +15,7 @@ package ch.cyberduck.cli; import ch.cyberduck.core.DisabledConnectionTimeout; +import ch.cyberduck.core.Local; import ch.cyberduck.core.Permission; import ch.cyberduck.core.cryptomator.CryptoVault; import ch.cyberduck.core.cryptomator.random.FastSecureRandomProvider; @@ -46,6 +47,7 @@ public TerminalPreferences(final Preferences persistence) { protected void setFactories() { super.setFactories(); + this.setDefault("factory.local.class", Local.class.getName()); this.setDefault("factory.certificatestore.class", TerminalCertificateStore.class.getName()); this.setDefault("factory.logincallback.class", TerminalLoginCallback.class.getName()); this.setDefault("factory.passwordcallback.class", TerminalPasswordCallback.class.getName()); diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java index 46d8d4898cc..db577ad9ad6 100644 --- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java +++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java @@ -97,9 +97,6 @@ protected void setFactories() { this.setDefault("factory.badgelabeler.class", WorkspaceApplicationBadgeLabeler.class.getName()); this.setDefault("factory.watchservice.class", FSEventWatchService.class.getName()); this.setDefault("factory.editorfactory.class", FSEventWatchEditorFactory.class.getName()); - if(null == this.getDefault("SUExpectsDSASignature")) { - this.setDefault("factory.licensefactory.class", ReceiptFactory.class.getName()); - } this.setDefault("factory.notification.class", NotificationCenter.class.getName()); this.setDefault("factory.iconservice.class", WorkspaceIconService.class.getName()); this.setDefault("factory.filedescriptor.class", LaunchServicesFileDescriptor.class.getName()); @@ -122,4 +119,12 @@ protected void setFactories() { this.setDefault("factory.urlfilewriter.class", WeblocFileWriter.class.getName()); this.setDefault("factory.quicklook.class", QuartzQuickLook.class.getName()); } + + @Override + protected void setDefaults() { + super.setDefaults(); + if(null == this.getDefault("SUExpectsDSASignature")) { + this.setDefault("factory.licensefactory.class", ReceiptFactory.class.getName()); + } + } } diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java index 9abab7cb3b9..5dd5030f0b4 100644 --- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java +++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java @@ -53,10 +53,7 @@ public class UserDefaultsPreferences extends DefaultPreferences { private static final Logger log = LogManager.getLogger(UserDefaultsPreferences.class); - private final NSBundle bundle = new BundleApplicationResourcesFinder().bundle(); - - private final LRUCache cache = LRUCache.usingLoader(this::loadProperty, - PreferencesFactory.get().getLong("preferences.cache.size")); + private final LRUCache cache = LRUCache.usingLoader(this::loadProperty, 1000); private static final String MISSING_PROPERTY = String.valueOf(StringUtils.INDEX_NOT_FOUND); @@ -73,6 +70,7 @@ public String getDefault(final String property) { // Lookup in the default map final String value = super.getDefault(property); if(null == value) { + final NSBundle bundle = new BundleApplicationResourcesFinder().bundle(); // Missing in default. Lookup in Info.plist NSObject plist = bundle.infoDictionary().objectForKey(property); if(null == plist) { @@ -171,6 +169,7 @@ protected void setDefaults() { this.setDefault("local.user.home", SystemB.INSTANCE.getpwuid(LibC.INSTANCE.getuid()).pw_dir); } + final NSBundle bundle = new BundleApplicationResourcesFinder().bundle(); if(null != bundle) { if(bundle.objectForInfoDictionaryKey("CFBundleName") != null) { this.setDefault("application.name", bundle.objectForInfoDictionaryKey("CFBundleName").toString()); @@ -273,6 +272,7 @@ public String locale() { @Override public List applicationLocales() { + final NSBundle bundle = new BundleApplicationResourcesFinder().bundle(); return this.toList(bundle.localizations()); } diff --git a/core/src/main/java/ch/cyberduck/core/Local.java b/core/src/main/java/ch/cyberduck/core/Local.java index 5b78d78e749..510de4a378d 100644 --- a/core/src/main/java/ch/cyberduck/core/Local.java +++ b/core/src/main/java/ch/cyberduck/core/Local.java @@ -478,6 +478,9 @@ private static FileChannel getWriteChannel(final String path, final boolean appe } public Object lock(final boolean interactive) throws AccessDeniedException { + if(log.isWarnEnabled()) { + log.warn(String.format("No lock support in %s", this)); + } return null; } diff --git a/core/src/main/java/ch/cyberduck/core/LocalFactory.java b/core/src/main/java/ch/cyberduck/core/LocalFactory.java index dc1e7b69640..0ce25cb1f3e 100644 --- a/core/src/main/java/ch/cyberduck/core/LocalFactory.java +++ b/core/src/main/java/ch/cyberduck/core/LocalFactory.java @@ -21,11 +21,14 @@ import ch.cyberduck.core.preferences.PreferencesFactory; import org.apache.commons.lang3.reflect.ConstructorUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public final class LocalFactory extends Factory { + private static final Logger log = LogManager.getLogger(LocalFactory.class); private Constructor constructorCreateFromString; private Constructor constructorCreateFromParentString; @@ -43,6 +46,9 @@ private Local create(final String path) { try { if(null == constructorCreateFromString) { constructorCreateFromString = ConstructorUtils.getMatchingAccessibleConstructor(clazz, String.class); + if(log.isWarnEnabled()) { + log.warn(String.format("Caching constructor %s for class %s", constructorCreateFromString, clazz)); + } } return constructorCreateFromString.newInstance(path); } @@ -55,6 +61,9 @@ private Local create(final Local parent, final String path) { try { if(null == constructorCreateFromParentString) { constructorCreateFromParentString = ConstructorUtils.getMatchingAccessibleConstructor(clazz, parent.getClass(), path.getClass()); + if(log.isWarnEnabled()) { + log.warn(String.format("Caching constructor %s for class %s", constructorCreateFromParentString, clazz)); + } } return constructorCreateFromParentString.newInstance(parent, path); } @@ -68,6 +77,10 @@ private Local create(final Local parent, final String path) { public static synchronized Local get(final Local parent, final String name) { if(null == singleton) { singleton = new LocalFactory(); + if(log.isDebugEnabled()) { + log.debug(String.format("Using implementation %s", singleton.getClass())); + } + } return singleton.create(parent, name); } @@ -75,6 +88,9 @@ public static synchronized Local get(final Local parent, final String name) { public static synchronized Local get(final String parent, final String name) { if(null == singleton) { singleton = new LocalFactory(); + if(log.isDebugEnabled()) { + log.debug(String.format("Using implementation %s", singleton.getClass())); + } } return singleton.create(singleton.create(parent), name); } @@ -82,6 +98,9 @@ public static synchronized Local get(final String parent, final String name) { public static synchronized Local get(final String path) { if(null == singleton) { singleton = new LocalFactory(); + if(log.isDebugEnabled()) { + log.debug(String.format("Using implementation %s", singleton.getClass())); + } } return singleton.create(path); } @@ -89,6 +108,9 @@ public static synchronized Local get(final String path) { public static synchronized Local get() { if(null == singleton) { singleton = new LocalFactory(); + if(log.isDebugEnabled()) { + log.debug(String.format("Using implementation %s", singleton.getClass())); + } } return singleton.create(); } diff --git a/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java b/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java index f292d4373c2..9e37d957b79 100644 --- a/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java +++ b/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java @@ -14,6 +14,8 @@ package ch.cyberduck.core.preferences; +import ch.cyberduck.core.Local; + import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -60,4 +62,11 @@ public List applicationLocales() { public List systemLocales() { return Collections.singletonList("en"); } + + @Override + protected void setFactories() { + super.setFactories(); + + this.setDefault("factory.local.class", Local.class.getName()); + } } diff --git a/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java b/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java index 79cc46d1c42..25ae285ccf8 100755 --- a/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java +++ b/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java @@ -499,7 +499,6 @@ protected void setFactories() { this.setDefault("factory.writer.host.class", PlistWriter.class.getName()); this.setDefault("factory.locale.class", DisabledLocale.class.getName()); - this.setDefault("factory.local.class", Local.class.getName()); this.setDefault("factory.certificatestore.class", DisabledCertificateStore.class.getName()); this.setDefault("factory.logincallback.class", DisabledLoginCallback.class.getName()); this.setDefault("factory.passwordcallback.class", DisabledPasswordCallback.class.getName()); diff --git a/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java b/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java index 86dc0f50487..b47cfda041a 100644 --- a/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java +++ b/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java @@ -24,6 +24,8 @@ import org.apache.logging.log4j.Logger; public final class PreferencesFactory { + private static final Logger log = LogManager.getLogger(PreferencesFactory.class); + private PreferencesFactory() { // } @@ -46,6 +48,7 @@ public static synchronized void set(final Preferences p) { public static synchronized Preferences get() { if(null == preferences) { + log.error("No application preferences registered"); set(new MemoryPreferences()); } return preferences; diff --git a/defaults/src/main/resources/default.properties b/defaults/src/main/resources/default.properties index 38772875f4d..9692efc5e28 100644 --- a/defaults/src/main/resources/default.properties +++ b/defaults/src/main/resources/default.properties @@ -73,7 +73,6 @@ profiles.discovery.updater.url=s3://profiles.cyberduck.io browser.cache.size=1000 transfer.cache.size=100 icon.cache.size=200 -preferences.cache.size=1000 fileid.cache.size=10000 # Caching NS* proxy instances.