public void initialize(CSLExtension ext) {
   try {
     extension = ext;
     String calClassName = extension.getCSLClassName();
     Class<?> clazz = Class.forName(calClassName);
     Method[] list = clazz.getMethods();
     for (Method m : list) {
       methods.put(m.getName(), m);
     }
   } catch (ClassNotFoundException ex) {
     Logger.getLogger(CSLExtensionHelper.class.getName()).log(Level.SEVERE, null, ex);
   }
 }
  public int getMethodParameterCount(String name) {
    int result = -1;
    Method m = methods.get(name);
    if (m != null) {
      result = m.getParameterTypes().length;
    }

    if (result == -1) {
      throw new ScriptExecutionException(
          101, "Extension " + extension.getId() + " has no such method: " + name);
    }

    return result;
  }
  public IValue executeMethod(String name, List<IValue> params) {
    Method m = methods.get(name);
    Object[] paramArray = new Object[params.size()];
    for (int i = 0; i < params.size(); i++) {
      IValue param = params.get(i);
      if (m.getParameterTypes()[i].equals(String.class)) {
        paramArray[i] = param.valueAsString();
      } else if (m.getParameterTypes()[i].equals(Boolean.class)
          || m.getParameterTypes()[i].equals(Boolean.TYPE)) {
        paramArray[i] = param.valueAsBoolean();
      } else if (isRuleVariable(m.getParameterTypes()[i])) {
        paramArray[i] = param.valueAsObject();
      } else {
        // defaulting to a number
        paramArray[i] = param.valueAsDouble();
      }
    }

    try {
      Object result = m.invoke(extension, paramArray);
      if (result instanceof IValue) {
        return (IValue) result;
      } else if (result instanceof List) {
        List<?> list = (List<?>) result;
        List<IValue> ivals = new ArrayList<IValue>();
        for (Object o : list) {
          StringVariable var = new StringVariable(null, o.toString());
          ivals.add(var);
        }

        Array returnArray = new Array(null);
        returnArray.initialize(ivals);
        return returnArray;
      } else {
        return new StringVariable(null, result.toString());
      }
    } catch (Exception e) {
      throw new ScriptExecutionException(
          102,
          "Extension "
              + extension.getId()
              + " invocation failure: "
              + e.getCause().getLocalizedMessage());
    }
  }