use of com.evolveum.midpoint.xml.ns._public.common.api_types_3.PolicyItemDefinitionType in project midpoint by Evolveum.
the class ModelInteractionServiceImpl method generateValue.
@Override
public <O extends ObjectType> void generateValue(PrismObject<O> object, PolicyItemsDefinitionType policyItemsDefinition, Task task, OperationResult parentResult) throws ObjectAlreadyExistsException, ExpressionEvaluationException, SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, PolicyViolationException {
String oid = object.getOid();
OperationResult result = parentResult.createSubresult(OPERATION_GENERATE_VALUE);
Class<O> clazz = (Class<O>) object.asObjectable().getClass();
ValuePolicyType valuePolicy = null;
try {
valuePolicy = getValuePolicy(object, task, result);
} catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException e) {
LOGGER.error("Failed to get value policy for generating value. ", e);
result.recordFatalError("Error while getting value policy. Reason: " + e.getMessage(), e);
throw e;
}
Collection<PropertyDelta<?>> deltasToExecute = new ArrayList<>();
for (PolicyItemDefinitionType policyItemDefinition : policyItemsDefinition.getPolicyItemDefinition()) {
OperationResult generateValueResult = parentResult.createSubresult(OPERATION_GENERATE_VALUE);
ItemPath path = getPath(policyItemDefinition);
if (path == null) {
LOGGER.error("No item path defined in the target for policy item definition. Cannot generate value");
generateValueResult.recordFatalError("No item path defined in the target for policy item definition. Cannot generate value");
continue;
}
result.addParam("policyItemPath", path);
PrismPropertyDefinition<?> propertyDef = getItemDefinition(object, path);
if (propertyDef == null) {
LOGGER.error("No definition for property {} in object. Is the path referencing prism property?" + path, object);
generateValueResult.recordFatalError("No definition for property " + path + " in object " + object + ". Is the path referencing prism property?");
continue;
}
LOGGER.trace("Default value policy: {}", valuePolicy);
try {
generateValue(object, valuePolicy, policyItemDefinition, task, generateValueResult);
} catch (ExpressionEvaluationException | SchemaException | ObjectNotFoundException | CommunicationException | ConfigurationException | SecurityViolationException e) {
LOGGER.error("Failed to generate value for {} " + policyItemDefinition, e);
generateValueResult.recordFatalError("Failed to generate value for " + policyItemDefinition + ". Reason: " + e.getMessage(), e);
policyItemDefinition.setResult(generateValueResult.createOperationResultType());
continue;
}
collectDeltasForGeneratedValuesIfNeeded(object, policyItemDefinition, deltasToExecute, path, propertyDef);
generateValueResult.computeStatusIfUnknown();
}
result.computeStatus();
if (!result.isAcceptable()) {
return;
}
try {
if (!deltasToExecute.isEmpty()) {
modelCrudService.modifyObject(clazz, oid, deltasToExecute, null, task, result);
}
} catch (ObjectNotFoundException | SchemaException | ExpressionEvaluationException | CommunicationException | ConfigurationException | ObjectAlreadyExistsException | PolicyViolationException | SecurityViolationException e) {
LOGGER.error("Could not execute deltas for generated values. Reason: " + e.getMessage(), e);
result.recordFatalError("Could not execute deltas for gegenerated values. Reason: " + e.getMessage(), e);
throw e;
}
}
use of com.evolveum.midpoint.xml.ns._public.common.api_types_3.PolicyItemDefinitionType in project midpoint by Evolveum.
the class ModelInteractionServiceImpl method generateValue.
private <O extends ObjectType> void generateValue(PrismObject<O> object, ValuePolicyType defaultPolicy, PolicyItemDefinitionType policyItemDefinition, Task task, OperationResult result) throws ExpressionEvaluationException, SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException {
PolicyItemTargetType target = policyItemDefinition.getTarget();
if (target == null || ItemPath.isNullOrEmpty(target.getPath())) {
LOGGER.error("Target item path must be defined");
throw new SchemaException("Target item path must be defined");
}
ItemPath targetPath = target.getPath().getItemPath();
ValuePolicyType valuePolicy = resolveValuePolicy(policyItemDefinition, defaultPolicy, task, result);
LOGGER.trace("Value policy used for generating new value : {}", valuePolicy);
StringPolicyType stringPolicy = valuePolicy != null ? valuePolicy.getStringPolicy() : null;
if (stringPolicy == null) {
LOGGER.trace("No sting policy defined. Cannot generate value.");
result.recordFatalError("No string policy defined. Cannot generate value");
return;
// throw new SchemaException("No value policy for " + targetPath);
}
String newValue = policyProcessor.generate(targetPath, stringPolicy, 10, object, "generating value for" + targetPath, task, result);
policyItemDefinition.setValue(newValue);
}
use of com.evolveum.midpoint.xml.ns._public.common.api_types_3.PolicyItemDefinitionType in project midpoint by Evolveum.
the class ModelInteractionServiceImpl method validateValue.
private <T, O extends ObjectType> boolean validateValue(PrismObject<O> object, ValuePolicyType policy, PolicyItemDefinitionType policyItemDefinition, Task task, OperationResult parentResult) throws ExpressionEvaluationException, SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, PolicyViolationException {
ValuePolicyType stringPolicy = resolveValuePolicy(policyItemDefinition, policy, task, parentResult);
RawType rawValue = (RawType) policyItemDefinition.getValue();
String valueToValidate = null;
List<String> valuesToValidate = new ArrayList<>();
PolicyItemTargetType target = policyItemDefinition.getTarget();
ItemPath path = null;
if (target != null) {
path = target.getPath().getItemPath();
}
if (rawValue != null) {
valueToValidate = rawValue.getParsedRealValue(String.class);
valuesToValidate.add(valueToValidate);
} else {
if (target == null || target.getPath() == null) {
LOGGER.error("Target item path must be defined");
parentResult.recordFatalError("Target item path must be defined");
throw new SchemaException("Target item path must be defined");
}
path = target.getPath().getItemPath();
PrismProperty<T> property = object.findProperty(path);
if (property == null || property.isEmpty()) {
LOGGER.error("Attribute {} has no value. Nothing to validate.", property);
parentResult.recordFatalError("Attribute " + property + " has no value. Nothing to validate");
throw new SchemaException("Attribute " + property + " has no value. Nothing to validate");
}
PrismPropertyDefinition<T> itemToValidateDefinition = property.getDefinition();
QName definitionName = itemToValidateDefinition.getTypeName();
if (!isSupportedType(definitionName)) {
LOGGER.error("Trying to validate string policy on the property of type {} failed. Unsupported type.", itemToValidateDefinition);
parentResult.recordFatalError("Trying to validate string policy on the property of type " + itemToValidateDefinition + " failed. Unsupported type.");
throw new SchemaException("Trying to validate string policy on the property of type " + itemToValidateDefinition + " failed. Unsupported type.");
}
if (itemToValidateDefinition.isSingleValue()) {
if (definitionName.equals(PolyStringType.COMPLEX_TYPE)) {
valueToValidate = ((PolyString) property.getRealValue()).getOrig();
} else if (definitionName.equals(ProtectedStringType.COMPLEX_TYPE)) {
ProtectedStringType protectedString = ((ProtectedStringType) property.getRealValue());
valueToValidate = getClearValue(protectedString);
} else {
valueToValidate = (String) property.getRealValue();
}
valuesToValidate.add(valueToValidate);
} else {
if (definitionName.equals(DOMUtil.XSD_STRING)) {
valuesToValidate.addAll(property.getRealValues(String.class));
} else if (definitionName.equals(ProtectedStringType.COMPLEX_TYPE)) {
for (ProtectedStringType protectedString : property.getRealValues(ProtectedStringType.class)) {
valuesToValidate.add(getClearValue(protectedString));
}
} else {
for (PolyString val : property.getRealValues(PolyString.class)) {
valuesToValidate.add(val.getOrig());
}
}
}
}
for (String newValue : valuesToValidate) {
OperationResult result = parentResult.createSubresult(OPERATION_VALIDATE_VALUE + ".value");
if (path != null)
result.addParam("path", path);
result.addParam("valueToValidate", newValue);
if (!policyProcessor.validateValue(newValue, stringPolicy, object, "validate value " + (path != null ? "for " + path : "") + " for " + object + " value " + valueToValidate, task, result)) {
result.recordFatalError("Validation for value " + newValue + " against policy " + stringPolicy + " failed");
LOGGER.error("Validation for value {} against policy {} failed", newValue, stringPolicy);
}
result.computeStatusIfUnknown();
}
parentResult.computeStatus();
policyItemDefinition.setResult(parentResult.createOperationResultType());
return parentResult.isAcceptable();
}
use of com.evolveum.midpoint.xml.ns._public.common.api_types_3.PolicyItemDefinitionType in project midpoint by Evolveum.
the class ModelInteractionServiceImpl method getPath.
private ItemPath getPath(PolicyItemDefinitionType policyItemDefinition) {
PolicyItemTargetType target = policyItemDefinition.getTarget();
if (target == null) {
return null;
}
ItemPathType itemPathType = target.getPath();
if (itemPathType == null) {
return null;
}
return itemPathType.getItemPath();
}
use of com.evolveum.midpoint.xml.ns._public.common.api_types_3.PolicyItemDefinitionType in project midpoint by Evolveum.
the class GenerateValueExecutor method execute.
@Override
public PipelineData execute(ActionExpressionType expression, PipelineData input, ExecutionContext context, OperationResult globalResult) throws ScriptExecutionException {
PolicyItemsDefinitionType itemsDefinition = expressionHelper.getSingleArgumentValue(expression.getParameter(), PARAMETER_ITEMS, false, false, PARAMETER_ITEMS, input, context, PolicyItemsDefinitionType.class, globalResult);
if (itemsDefinition == null) {
itemsDefinition = new PolicyItemsDefinitionType().policyItemDefinition(new PolicyItemDefinitionType().target(new PolicyItemTargetType().path(new ItemPathType(new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD, PasswordType.F_VALUE)))).execute(false));
}
for (PipelineItem item : input.getData()) {
PrismValue value = item.getValue();
OperationResult result = operationsHelper.createActionResult(item, this, context, globalResult);
context.checkTaskStop();
if (value instanceof PrismObjectValue) {
PrismObject<? extends ObjectType> object = ((PrismObjectValue) value).asPrismObject();
ObjectType objectBean = object.asObjectable();
long started = operationsHelper.recordStart(context, objectBean);
Throwable exception = null;
try {
LOGGER.trace("Generating value(s) for {}", objectBean);
modelInteraction.generateValue(object, itemsDefinition, context.getTask(), result);
operationsHelper.recordEnd(context, objectBean, started, null);
} catch (Throwable e) {
operationsHelper.recordEnd(context, objectBean, started, e);
exception = processActionException(e, NAME, value, context);
}
context.println((exception != null ? "Attempted to generate value(s) for " : "Generated value(s) for ") + objectBean.toString() + exceptionSuffix(exception));
} else {
//noinspection ThrowableNotThrown
processActionException(new ScriptExecutionException("Item is not a PrismObject"), NAME, value, context);
}
operationsHelper.trimAndCloneResult(result, globalResult, context);
}
return input;
}
Aggregations