LanguageDriverRegistry.java

  1. /*
  2.  *    Copyright 2009-2024 the original author or authors.
  3.  *
  4.  *    Licensed under the Apache License, Version 2.0 (the "License");
  5.  *    you may not use this file except in compliance with the License.
  6.  *    You may obtain a copy of the License at
  7.  *
  8.  *       https://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  *    Unless required by applicable law or agreed to in writing, software
  11.  *    distributed under the License is distributed on an "AS IS" BASIS,
  12.  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  *    See the License for the specific language governing permissions and
  14.  *    limitations under the License.
  15.  */
  16. package org.apache.ibatis.scripting;

  17. import java.util.HashMap;
  18. import java.util.Map;

  19. import org.apache.ibatis.util.MapUtil;

  20. /**
  21.  * @author Frank D. Martinez [mnesarco]
  22.  */
  23. public class LanguageDriverRegistry {

  24.   private final Map<Class<? extends LanguageDriver>, LanguageDriver> languageDriverMap = new HashMap<>();

  25.   private Class<? extends LanguageDriver> defaultDriverClass;

  26.   public void register(Class<? extends LanguageDriver> cls) {
  27.     if (cls == null) {
  28.       throw new IllegalArgumentException("null is not a valid Language Driver");
  29.     }
  30.     MapUtil.computeIfAbsent(languageDriverMap, cls, k -> {
  31.       try {
  32.         return k.getDeclaredConstructor().newInstance();
  33.       } catch (Exception ex) {
  34.         throw new ScriptingException("Failed to load language driver for " + cls.getName(), ex);
  35.       }
  36.     });
  37.   }

  38.   public void register(LanguageDriver instance) {
  39.     if (instance == null) {
  40.       throw new IllegalArgumentException("null is not a valid Language Driver");
  41.     }
  42.     Class<? extends LanguageDriver> cls = instance.getClass();
  43.     if (!languageDriverMap.containsKey(cls)) {
  44.       languageDriverMap.put(cls, instance);
  45.     }
  46.   }

  47.   public LanguageDriver getDriver(Class<? extends LanguageDriver> cls) {
  48.     return languageDriverMap.get(cls);
  49.   }

  50.   public LanguageDriver getDefaultDriver() {
  51.     return getDriver(getDefaultDriverClass());
  52.   }

  53.   public Class<? extends LanguageDriver> getDefaultDriverClass() {
  54.     return defaultDriverClass;
  55.   }

  56.   public void setDefaultDriverClass(Class<? extends LanguageDriver> defaultDriverClass) {
  57.     register(defaultDriverClass);
  58.     this.defaultDriverClass = defaultDriverClass;
  59.   }

  60. }