+ public Object getPythonVariantVariable(String variableName, Binding binding) {\r
+ checkValidName(variableName);\r
+ Object result = execute(() -> getPythonVariantVariableImpl(contextID, variableName));\r
+ try {\r
+ return Bindings.OBJECT.getContent(result, binding);\r
+ } catch (BindingException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ \r
+ public Variant getPythonVariantVariable(String variableName) {\r
+ checkValidName(variableName);\r
+ return Variant.ofInstance(execute(() -> getPythonVariantVariableImpl(contextID, variableName)));\r
+ }\r
+\r
+ public void setPythonVariantVariable(String variableName, Variant value) {\r
+ setPythonVariantVariable(variableName, value.getValue(), value.getBinding());\r
+ }\r
+ \r
+ public void setPythonVariantVariable(String variableName, Object value, Binding binding) {\r
+ checkValidName(variableName);\r
+ if (!binding.isInstance(value)) throw new IllegalArgumentException("Invalid object binding");\r
+ \r
+ execute(() -> setPythonVariantVariableImpl(contextID, variableName, value, binding));\r
+ \r
+ for (Listener l : listeners) { l.updated(variableName); }\r
+ }\r
+ \r
+ public VariableType getPythonVariableType(String variableName) {\r
+ checkValidName(variableName);\r
+ int code = execute(() -> getPythonVariableTypeImpl(contextID, variableName));\r
+ \r
+ VariableType[] values = VariableType.values();\r
+ if (code < 0 || code >= values.length)\r
+ return VariableType.UNKNOWN;\r
+ \r
+ return values[code];\r
+ }\r
+ \r
+ public String[] getPythonVariableNames() {\r
+ return execute(() -> getPythonVariableNamesImpl(contextID));\r
+ }\r
+ \r
+ private static void checkValidName(String variableName) {\r
+ if (!namePattern.matcher(variableName).matches())\r
+ throw new IllegalArgumentException("Invalid Python variable name " + variableName);\r
+ }\r
+ \r
+ static void execute(Runnable job) {\r
+ try {\r
+ pythonExecutor.submit(job).get();\r
+ } catch (InterruptedException | ExecutionException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ \r
+ static <V> V execute(Callable<V> job) {\r
+ try {\r
+ return pythonExecutor.submit(job).get();\r
+ } catch (InterruptedException | ExecutionException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ \r