Prolog.java

  1. /*
  2.  * #%L
  3.  * prolobjectlink-jpi
  4.  * %%
  5.  * Copyright (C) 2019 Prolobjectlink Project
  6.  * %%
  7.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  8.  * of this software and associated documentation files (the "Software"), to deal
  9.  * in the Software without restriction, including without limitation the rights
  10.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11.  * copies of the Software, and to permit persons to whom the Software is
  12.  * furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included in
  15.  * all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23.  * THE SOFTWARE.
  24.  * #L%
  25.  */
  26. package io.github.prolobjectlink.prolog;

  27. import java.lang.reflect.Constructor;
  28. import java.util.logging.Level;
  29. import java.util.logging.Logger;

  30. import javax.script.ScriptEngine;
  31. import javax.script.ScriptEngineManager;

  32. /**
  33.  * Bootstrap platform class. Contains {@link #getProvider(Class)} method that
  34.  * return an instance of Prolog Provider from the given class. Alternatively can
  35.  * be used {@link #getProvider()} for create and return a {@link PrologProvider}
  36.  * using Java Platform discovery pattern.
  37.  *
  38.  * @author Jose Zalacain
  39.  * @since 1.0
  40.  */
  41. public final class Prolog {

  42.     private Prolog() {
  43.     }

  44.     /**
  45.      * Create and return an instance of Prolog Provider using Java Platform
  46.      * discovery pattern.
  47.      *
  48.      * @return an instance of Prolog Provider from the given class.
  49.      * @since 1.1
  50.      */
  51.     public static PrologProvider getProvider() {
  52.         ScriptEngineManager manager = new ScriptEngineManager();
  53.         ScriptEngine engine = manager.getEngineByName("prolog");
  54.         return ((PrologScriptEngine) engine).getProvider();
  55.     }

  56.     /**
  57.      * Create and return an instance of Prolog Provider using the Prolog Provider
  58.      * class name.
  59.      *
  60.      * @return an instance of Prolog Provider from the given class.
  61.      * @since 1.1
  62.      */
  63.     public static PrologProvider getProvider(String className) {
  64.         PrologProvider provider = null;
  65.         try {
  66.             return getProvider(Class.forName(className));
  67.         } catch (ClassNotFoundException e) {
  68.             Logger.getLogger(Prolog.class.getName()).log(Level.FINEST, null, e);
  69.         }
  70.         return provider;
  71.     }

  72.     /**
  73.      * Create and return an instance of Prolog Provider from the given class.
  74.      *
  75.      * @param providerClass Prolog Provider class used to create a new instance.
  76.      * @return an instance of Prolog Provider from the given class.
  77.      * @since 1.0
  78.      */
  79.     public static PrologProvider getProvider(Class<?> providerClass) {
  80.         PrologProvider provider = null;
  81.         try {
  82.             Constructor<?> constructor = providerClass.getDeclaredConstructor();
  83.             constructor.setAccessible(true);
  84.             provider = (PrologProvider) providerClass.newInstance();
  85.             constructor.setAccessible(false);
  86.         } catch (InstantiationException e) {
  87.             Logger.getLogger(Prolog.class.getName()).log(Level.FINEST, null, e);
  88.         } catch (IllegalAccessException e) {
  89.             Logger.getLogger(Prolog.class.getName()).log(Level.FINEST, null, e);
  90.         } catch (NoSuchMethodException e) {
  91.             Logger.getLogger(Prolog.class.getName()).log(Level.FINEST, null, e);
  92.         } catch (SecurityException e) {
  93.             Logger.getLogger(Prolog.class.getName()).log(Level.FINEST, null, e);
  94.         }
  95.         return provider;
  96.     }

  97. }