public boolean executeDmlValidationBlock(Operation dml, Element self) throws ValidationException { Element result = null; // Store the old local variables and iterators. Needed because structure // templates need to keep the state across template.execute() calls. LocalVariableMap oldVariables = createLocalVariableMap(null); IteratorMap oldIterators = createIteratorMap(); // Initialize the SELF reference to the local self value. SelfHolder selfHolder = new ReadOnlySelfHolder(self); initializeSelfHolder(selfHolder); try { result = dml.execute(this); } catch (ReturnValueException rve) { result = rve.getElement(); } catch (EvaluationException ee) { File objectFile = (objectTemplate != null) ? objectTemplate.source : null; ValidationException ve = ValidationException.create(MSG_VALIDATION_FAILED_BECAUSE_OF_EXCEPTION); ve.setObjectTemplate(objectFile); ve.initCause(ee); throw ve; } finally { clearSelf(); restoreLocalVariableMap(oldVariables); restoreIteratorMap(oldIterators); } try { BooleanProperty bresult = (BooleanProperty) result; return bresult.getValue().booleanValue(); } catch (ClassCastException cce) { File objectFile = (objectTemplate != null) ? objectTemplate.source : null; ValidationException ve = ValidationException.create( MSG_INVALID_VALIDATION_FUNCTION_RETURN_TYPE, result.getTypeAsString()); throw ve.setObjectTemplate(objectFile); } }
public Element executeDmlBlock(Operation dml) { Element result = null; // Store the old local variables and iterators. Needed because structure // templates need to keep the state across template.execute() calls. LocalVariableMap oldVariables = createLocalVariableMap(null); IteratorMap oldIterators = createIteratorMap(); // If the TEMPLATE variable is already set, then don't set the value to // the current template. This can happen when executing structure // templates and we want to keep the outermost value. boolean setTemplate = (getGlobalVariable(TPL_VAR) == null); // Set the value of TEMPLATE to the current template. Be careful, // compile time execution doesn't set the current template. In this // case, don't set the global variable. if (setTemplate) { Template current = getCurrentTemplate(); if (current != null) { StringProperty tname = StringProperty.getInstance(current.name); setGlobalVariable(TPL_VAR, tname, true); } else { setTemplate = false; } } // Run the DML block. Making sure to always restore the previous // variables and iterators. try { result = dml.execute(this); } catch (ReturnValueException rve) { result = rve.getElement(); } finally { // Remove TEMPLATE variable if we set it above. if (setTemplate) { removeGlobalVariable(TPL_VAR); } // Restore the saved local variables and iterators. restoreLocalVariableMap(oldVariables); restoreIteratorMap(oldIterators); } return result; }