This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b6d5a81f437e07fd1d94bf93ba928cc877f00468
Author: Luca Burgazzoli <[email protected]>
AuthorDate: Fri Oct 2 17:11:27 2020 +0200

    CAMEL-15607: camel-core - When resolving language then only resolve via 
registry once (#4348)
---
 .../camel/impl/engine/AbstractCamelContext.java    | 73 +++++++++-------------
 1 file changed, 28 insertions(+), 45 deletions(-)

diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 93c92b5..3387765 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -1636,60 +1636,43 @@ public abstract class AbstractCamelContext extends 
BaseService
     }
 
     @Override
-    public Language resolveLanguage(String language) {
-        LOG.debug("Resolving language: {}", language);
-
-        Language answer;
-        synchronized (languages) {
-            // as first iteration, check if there is a language instance for 
the given name
-            // bound to the registry
-            answer = 
ResolverHelper.lookupLanguageInRegistryWithFallback(getCamelContextReference(), 
language);
-            if (answer != null) {
-                Language old = languages.put(language, answer);
-                // if the language has already been loaded, thus it is already 
registered
-                // in the local language cache, we can return it as it has 
already been
-                // initialized and configured
-                if (old == answer) {
-                    return answer;
-                }
-            } else {
-                answer = languages.get(language);
+    public Language resolveLanguage(String name) {
+        LOG.debug("Resolving language: {}", name);
 
-                // check if the language is singleton, if so return the shared
-                // instance
-                if (IsSingleton.test(answer)) {
-                    return answer;
-                } else {
-                    answer = null;
-                }
-            }
+        return languages.computeIfAbsent(name, new Function<String, 
Language>() {
+            @Override
+            public Language apply(String s) {
+                final CamelContext camelContext = getCamelContextReference();
 
-            if (answer == null) {
-                // language not known or not singleton, then use resolver
-                answer = getLanguageResolver().resolveLanguage(language, 
getCamelContextReference());
-            }
+                // as first iteration, check if there is a language instance 
for the given name
+                // bound to the registry
+                Language language = 
ResolverHelper.lookupLanguageInRegistryWithFallback(camelContext, name);
 
-            if (answer != null) {
-                // inject CamelContext if aware
-                CamelContextAware.trySetCamelContext(answer, 
getCamelContextReference());
+                if (language == null) {
+                    // language not known, then use resolver
+                    language = getLanguageResolver().resolveLanguage(name, 
camelContext);
+                }
 
-                if (answer instanceof Service) {
-                    try {
-                        startService((Service) answer);
-                    } catch (Exception e) {
-                        throw 
RuntimeCamelException.wrapRuntimeCamelException(e);
+                if (language != null) {
+                    if (language instanceof Service) {
+                        try {
+                            startService((Service) language);
+                        } catch (Exception e) {
+                            throw 
RuntimeCamelException.wrapRuntimeCamelException(e);
+                        }
                     }
-                }
 
-                for (LifecycleStrategy strategy : lifecycleStrategies) {
-                    strategy.onLanguageCreated(language, answer);
+                    // inject CamelContext if aware
+                    CamelContextAware.trySetCamelContext(language, 
camelContext);
+
+                    for (LifecycleStrategy strategy : lifecycleStrategies) {
+                        strategy.onLanguageCreated(name, language);
+                    }
                 }
 
-                languages.put(language, answer);
+                return language;
             }
-        }
-
-        return answer;
+        });
     }
 
     // Properties

Reply via email to