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()); } }