This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new fdf997b5938 catalog: make catalog more type safe fdf997b5938 is described below commit fdf997b5938b76b5b4bd893f9bd76ae7d8c42773 Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Mon Mar 18 13:48:16 2024 +0100 catalog: make catalog more type safe --- .../apache/camel/catalog/DefaultCamelCatalog.java | 75 +++----------- .../catalog/impl/AbstractCachingCamelCatalog.java | 110 +++++++++++++++++++++ .../camel/catalog/impl/AbstractCamelCatalog.java | 1 - .../catalog/impl/DefaultRuntimeCamelCatalog.java | 50 ++-------- .../org/apache/camel/tooling/model/BaseModel.java | 2 +- .../apache/camel/tooling/model/ComponentModel.java | 4 +- .../camel/tooling/model/DataFormatModel.java | 4 +- .../camel/tooling/model/DevConsoleModel.java | 4 +- .../org/apache/camel/tooling/model/EipModel.java | 4 +- .../java/org/apache/camel/tooling/model/Kind.java | 28 +++++- .../apache/camel/tooling/model/LanguageModel.java | 4 +- .../org/apache/camel/tooling/model/OtherModel.java | 4 +- .../camel/tooling/model/TransformerModel.java | 4 +- 13 files changed, 177 insertions(+), 117 deletions(-) diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java index 0d4e0b1a4a4..58fe3b1dbde 100644 --- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java +++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java @@ -33,7 +33,7 @@ import java.util.function.Supplier; import java.util.regex.PatternSyntaxException; import java.util.stream.Stream; -import org.apache.camel.catalog.impl.AbstractCamelCatalog; +import org.apache.camel.catalog.impl.AbstractCachingCamelCatalog; import org.apache.camel.catalog.impl.CatalogHelper; import org.apache.camel.tooling.model.ArtifactModel; import org.apache.camel.tooling.model.BaseModel; @@ -56,7 +56,7 @@ import org.apache.camel.util.json.Jsoner; /** * Default {@link CamelCatalog}. */ -public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCatalog { +public class DefaultCamelCatalog extends AbstractCachingCamelCatalog implements CamelCatalog { private static final String MODELS_CATALOG = "org/apache/camel/catalog/models.properties"; private static final String SCHEMAS_XML = "org/apache/camel/catalog/schemas"; @@ -99,10 +99,6 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa private final Map<String, String> extraDataFormats = new HashMap<>(); private final Map<String, String> extraDataFormatsJSonSchema = new HashMap<>(); - // cache of operation -> result - private final Map<String, Object> cache = new HashMap<>(); - - private boolean caching; private VersionManager versionManager = new DefaultVersionManager(this); private RuntimeProvider runtimeProvider = new DefaultRuntimeProvider(this); @@ -119,7 +115,8 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa * @param caching whether to use cache */ public DefaultCamelCatalog(boolean caching) { - this.caching = caching; + super(caching); + setJSonSchemaResolver(new CamelCatalogJSonSchemaResolver( this, extraComponents, extraComponentsJSonSchema, extraDataFormats, extraDataFormatsJSonSchema)); } @@ -136,17 +133,17 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa this.runtimeProvider.setCamelCatalog(this); // invalidate the cache - cache.clear(); + super.clearCache(); } @Override public void enableCache() { - caching = true; + super.setCaching(true); } @Override public boolean isCaching() { - return caching; + return super.isCaching(); } @Override @@ -163,11 +160,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa public void addComponent(String name, String className) { extraComponents.put(name, className); // invalidate the cache - cache.remove(FIND_COMPONENT_NAMES); - cache.remove(FIND_COMPONENT_LABELS); - cache.remove(LIST_COMPONENTS_AS_JSON); + getCache().remove(FIND_COMPONENT_NAMES); + getCache().remove(FIND_COMPONENT_LABELS); + getCache().remove(LIST_COMPONENTS_AS_JSON); - cache.remove(SUMMARY_AS_JSON); + getCache().remove(SUMMARY_AS_JSON); } @Override @@ -182,11 +179,11 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa public void addDataFormat(String name, String className) { extraDataFormats.put(name, className); // invalidate the cache - cache.remove(FIND_DATA_FORMAT_NAMES); - cache.remove(FIND_DATA_FORMAT_LABELS); - cache.remove(LIST_DATA_FORMATS_AS_JSON); + getCache().remove(FIND_DATA_FORMAT_NAMES); + getCache().remove(FIND_DATA_FORMAT_LABELS); + getCache().remove(LIST_DATA_FORMATS_AS_JSON); - cache.remove(SUMMARY_AS_JSON); + getCache().remove(SUMMARY_AS_JSON); } @Override @@ -208,7 +205,7 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa return true; } else if (versionManager.loadVersion(version)) { // invalidate existing cache if we loaded a new version - cache.clear(); + super.clearCache(); return true; } return false; @@ -640,46 +637,6 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa && (version == null || version.isBlank() || version.equals(am.getVersion())); } - @SuppressWarnings("unchecked") - private <T> T cache(String name, Supplier<T> loader) { - if (caching) { - T t = (T) cache.get(name); - if (t == null) { - t = loader.get(); - if (t != null) { - cache.put(name, t); - } - } - return t; - } else { - return loader.get(); - } - } - - private <T> T cache(String key, String name, Function<String, T> loader) { - return doGetCache(key, name, loader); - } - - @SuppressWarnings("unchecked") - private <T> T doGetCache(String key, String name, Function<String, T> loader) { - if (caching) { - T t = (T) cache.get(key); - if (t == null) { - t = loader.apply(name); - if (t != null) { - cache.put(key, t); - } - } - return t; - } else { - return loader.apply(name); - } - } - - private <T> T cache(String name, Function<String, T> loader) { - return doGetCache(name, name, loader); - } - private String loadResource(String file) { try (InputStream is = versionManager.getResourceAsStream(file)) { return is != null ? CatalogHelper.loadText(is) : null; diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java new file mode 100644 index 00000000000..de788819f92 --- /dev/null +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCachingCamelCatalog.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.catalog.impl; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Supplier; + +@SuppressWarnings("unused") +public abstract class AbstractCachingCamelCatalog extends AbstractCamelCatalog { + private final Map<String, Object> cache = new ConcurrentHashMap<>(); + private boolean caching; + + /** + * Creates the {@link AbstractCachingCamelCatalog} without caching enabled. + */ + protected AbstractCachingCamelCatalog() { + this(false); + } + + /** + * Creates the {@link AbstractCachingCamelCatalog} + * + * @param caching whether to use cache + */ + protected AbstractCachingCamelCatalog(boolean caching) { + this.caching = caching; + } + + /** + * To turn caching on or off + */ + public boolean isCaching() { + return caching; + } + + /** + * To turn caching on or off + */ + public void setCaching(boolean caching) { + this.caching = caching; + + if (!this.caching) { + clearCache(); + } + } + + protected Map<String, Object> getCache() { + return this.cache; + } + + protected void clearCache() { + cache.clear(); + } + + protected <T> T cache(String key, String name, Function<String, T> loader) { + return doGetCache(key, name, loader); + } + + protected <T> T cache(String name, Function<String, T> loader) { + return doGetCache(name, name, loader); + } + + @SuppressWarnings("unchecked") + protected <T> T cache(String name, Supplier<T> loader) { + if (caching) { + T t = (T) cache.get(name); + if (t == null) { + t = loader.get(); + if (t != null) { + cache.put(name, t); + } + } + return t; + } else { + return loader.get(); + } + } + + @SuppressWarnings("unchecked") + protected <T> T doGetCache(String key, String name, Function<String, T> loader) { + if (caching) { + T t = (T) cache.get(key); + if (t == null) { + t = loader.apply(name); + if (t != null) { + cache.put(key, t); + } + } + return t; + } else { + return loader.apply(name); + } + } +} diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java index 534ea288a17..6975cd34da0 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java @@ -63,7 +63,6 @@ import org.apache.camel.util.URISupport; /** * Base class for both the runtime RuntimeCamelCatalog from camel-core and the complete CamelCatalog from camel-catalog. */ -@SuppressWarnings("unused") public abstract class AbstractCamelCatalog { private static final Pattern SYNTAX_PATTERN = Pattern.compile("([\\w.]+)"); diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java index 0523b0d46fc..4bc751cf5a0 100644 --- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java +++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/DefaultRuntimeCamelCatalog.java @@ -16,10 +16,6 @@ */ package org.apache.camel.catalog.impl; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - import org.apache.camel.CamelContext; import org.apache.camel.catalog.RuntimeCamelCatalog; import org.apache.camel.spi.annotations.JdkService; @@ -35,12 +31,17 @@ import org.apache.camel.tooling.model.TransformerModel; * Default {@link RuntimeCamelCatalog}. */ @JdkService(RuntimeCamelCatalog.FACTORY) -public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements RuntimeCamelCatalog { +public class DefaultRuntimeCamelCatalog extends AbstractCachingCamelCatalog implements RuntimeCamelCatalog { private CamelContext camelContext; - // cache of operation -> result - private final Map<String, Object> cache = new HashMap<>(); - private boolean caching = true; + + public DefaultRuntimeCamelCatalog() { + this(true); + } + + public DefaultRuntimeCamelCatalog(boolean caching) { + super(caching); + } @Override public CamelContext getCamelContext() { @@ -53,20 +54,6 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements this.setJSonSchemaResolver(new CamelContextJSonSchemaResolver(camelContext)); } - /** - * To turn caching on or off - */ - public boolean isCaching() { - return caching; - } - - /** - * To turn caching on or off - */ - public void setCaching(boolean caching) { - this.caching = caching; - } - @Override public void start() { // noop @@ -74,7 +61,7 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements @Override public void stop() { - cache.clear(); + super.clearCache(); } @Override @@ -146,21 +133,4 @@ public class DefaultRuntimeCamelCatalog extends AbstractCamelCatalog implements public MainModel mainModel() { return cache("main-model", "main-model", k -> super.mainModel()); } - - @SuppressWarnings("unchecked") - private <T> T cache(String key, String name, Function<String, T> loader) { - if (caching) { - T t = (T) cache.get(key); - if (t == null) { - t = loader.apply(name); - if (t != null) { - cache.put(key, t); - } - } - return t; - } else { - return loader.apply(name); - } - } - } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java index b50c195d035..8c7db5b36b8 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/BaseModel.java @@ -42,7 +42,7 @@ public abstract class BaseModel<O extends BaseOptionModel> { return (m1, m2) -> m1.getTitle().compareToIgnoreCase(m2.getTitle()); } - public abstract String getKind(); + public abstract Kind getKind(); public String getName() { return name; diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java index 7439f06eebd..423d9c91375 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ComponentModel.java @@ -46,8 +46,8 @@ public class ComponentModel extends ArtifactModel<ComponentModel.ComponentOption } @Override - public String getKind() { - return "component"; + public Kind getKind() { + return Kind.component; } public String getScheme() { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java index 54446369c31..9099d18492d 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DataFormatModel.java @@ -29,8 +29,8 @@ public class DataFormatModel extends ArtifactModel<DataFormatModel.DataFormatOpt } @Override - public String getKind() { - return "dataformat"; + public Kind getKind() { + return Kind.dataformat; } public String getModelName() { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java index 214b958a40d..adc9652f6f9 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/DevConsoleModel.java @@ -32,8 +32,8 @@ public class DevConsoleModel extends ArtifactModel<BaseOptionModel> { } @Override - public String getKind() { - return "console"; + public Kind getKind() { + return Kind.console; } } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java index 88b8676ec08..1999bda2cbb 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/EipModel.java @@ -30,8 +30,8 @@ public class EipModel extends BaseModel<EipModel.EipOptionModel> { } @Override - public String getKind() { - return "model"; + public Kind getKind() { + return Kind.model; } public boolean isAbstractModel() { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java index 371c1060310..f18e9d0df8c 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/Kind.java @@ -16,15 +16,39 @@ */ package org.apache.camel.tooling.model; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +import org.apache.camel.util.json.Jsonable; +import org.apache.camel.util.json.Jsoner; + /** * Kind of a Camel part, such as component, dataformat, language, etc. */ -public enum Kind { +public enum Kind implements Jsonable { component, dataformat, language, transformer, console, other, - eip + eip, + model; + + @Override + public String toJson() { + final StringWriter writable = new StringWriter(); + try { + this.toJson(writable); + } catch (final IOException caught) { + /* See java.io.StringWriter. */ + } + return writable.toString(); + } + + @Override + public void toJson(final Writer writable) throws IOException { + writable.write(Jsoner.serialize(name())); + } } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java index 1136a230380..f4bb4ddb395 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/LanguageModel.java @@ -29,8 +29,8 @@ public class LanguageModel extends ArtifactModel<LanguageModel.LanguageOptionMod } @Override - public String getKind() { - return "language"; + public Kind getKind() { + return Kind.language; } public String getModelName() { diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java index 5383f932f7c..6d07302ae2a 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/OtherModel.java @@ -22,8 +22,8 @@ public class OtherModel extends ArtifactModel<BaseOptionModel> { } @Override - public String getKind() { - return "other"; + public Kind getKind() { + return Kind.other; } } diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java index 3e6db9254ca..4f26a694241 100644 --- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java +++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/TransformerModel.java @@ -41,8 +41,8 @@ public class TransformerModel extends ArtifactModel<BaseOptionModel> { } @Override - public String getKind() { - return "transformer"; + public Kind getKind() { + return Kind.transformer; } }