public XScript getScript(
     /*IN*/ String scriptURI)
     throws com.sun.star.uno.RuntimeException, ScriptFrameworkErrorException {
   ScriptMetaData scriptData = null;
   try {
     scriptData = getScriptData(scriptURI);
     ScriptImpl script = new ScriptImpl(m_xContext, scriptData, m_xModel, m_xInvocContext);
     return script;
   } catch (com.sun.star.uno.RuntimeException re) {
     throw new ScriptFrameworkErrorException(
         "Failed to create script object: " + re.getMessage(),
         null,
         scriptData.getLanguageName(),
         language,
         ScriptFrameworkErrorType.UNKNOWN);
   }
 }
  /**
   * documentStorageID and document reference for use in script name resolving
   *
   * @param aParams All parameters; pure, out params are undefined in sequence, i.e., the value has
   *     to be ignored by the callee
   * @param aOutParamIndex Out indices
   * @param aOutParam Out parameters
   * @returns The value returned from the function being invoked
   * @throws IllegalArgumentException If there is no matching script name
   * @throws CannotConvertException If args do not match or cannot be converted the those of the
   *     invokee
   * @throws InvocationTargetException If the running script throws an exception this information is
   *     captured and rethrown as this exception type.
   */
  public Object invoke(
      /*IN*/ Object[] aParams, /*OUT*/ short[][] aOutParamIndex, /*OUT*/ Object[][] aOutParam)
      throws ScriptFrameworkErrorException, InvocationTargetException {
    // Initialise the out parameters - not used at the moment
    aOutParamIndex[0] = new short[0];
    aOutParam[0] = new Object[0];

    ClassLoader cl = null;
    URL sourceUrl = null;
    try {
      cl = ClassLoaderFactory.getURLClassLoader(metaData);
      sourceUrl = metaData.getSourceURL();
    } catch (java.net.MalformedURLException mfu) {
      // Framework error
      throw new ScriptFrameworkErrorException(
          mfu.getMessage(),
          null,
          metaData.getLanguageName(),
          metaData.getLanguage(),
          ScriptFrameworkErrorType.MALFORMED_URL);
    } catch (NoSuitableClassLoaderException nsc) {
      // Framework error
      throw new ScriptFrameworkErrorException(
          nsc.getMessage(),
          null,
          metaData.getLanguageName(),
          metaData.getLanguage(),
          ScriptFrameworkErrorType.UNKNOWN);
    }
    // Set class loader to be used for class files
    // and jar files
    Thread.currentThread().setContextClassLoader(cl);
    Interpreter interpreter = new Interpreter();

    interpreter.getNameSpace().clear();
    // Set class loader to be used by interpreter
    // to look for classes by source e.g. interpreter
    // will use this classloader to search classpath
    // for source file ( bla.java ) on import or reference
    interpreter.setClassLoader(cl);
    try {
      interpreter.set(
          "XSCRIPTCONTEXT",
          ScriptContext.createContext(
              m_xModel, m_xInvocContext, m_xContext, m_xMultiComponentFactory));

      interpreter.set("ARGUMENTS", aParams);
    } catch (bsh.EvalError e) {
      // Framework error setting up context
      throw new ScriptFrameworkErrorException(
          e.getMessage(),
          null,
          metaData.getLanguageName(),
          metaData.getLanguage(),
          ScriptFrameworkErrorType.UNKNOWN);
    }

    try {
      String source = null;
      Object result = null;

      ScriptEditorForBeanShell editor = ScriptEditorForBeanShell.getEditor(sourceUrl);

      if (editor != null) {
        result = editor.execute();

        if (result == null) {
          return new Any(new Type(), null);
        }
        return result;
      }

      metaData.loadSource();
      source = metaData.getSource();

      if (source == null || source.length() == 0) {
        throw new ScriptFrameworkErrorException(
            "Failed to read script",
            null,
            metaData.getLanguageName(),
            metaData.getLanguage(),
            ScriptFrameworkErrorType.NO_SUCH_SCRIPT);
      }
      result = interpreter.eval(source);

      if (result == null) {
        return new Any(new Type(), null);
      }
      return result;
    } catch (bsh.ParseException pe) {
      throw new InvocationTargetException(
          "Beanshell failed to parse " + metaData.getLanguageName(),
          null,
          processBshException(pe, metaData.getLanguageName()));
    } catch (bsh.TargetError te) {
      throw new InvocationTargetException(
          "Beanshell uncaught exception for " + metaData.getLanguageName(),
          null,
          processBshException(te, metaData.getLanguageName()));
    } catch (bsh.EvalError ex) {
      throw new InvocationTargetException(
          "Beanshell error for " + metaData.getLanguageName(),
          null,
          processBshException(ex, metaData.getLanguageName()));
    } catch (Exception e) {
      throw new ScriptFrameworkErrorException(
          "Failed to read script",
          null,
          metaData.getLanguageName(),
          metaData.getLanguage(),
          ScriptFrameworkErrorType.UNKNOWN);
    }
  }