Skip to content

Commit

Permalink
Merge branch 'post-3.7-fixes' into support-3.7
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Jan 28, 2018
2 parents 2f6afa5 + bacb5a5 commit 9a719e0
Show file tree
Hide file tree
Showing 23 changed files with 1,310 additions and 94 deletions.
Expand Up @@ -1158,14 +1158,12 @@ public Object runScriptOnConnector(ScriptContext request, OperationOptions optio
public Object runScriptOnResource(ScriptContext request, OperationOptions options) {

try {
resource.runScript(request.getScriptLanguage(), request.getScriptText(), request.getScriptArguments());
return resource.runScript(request.getScriptLanguage(), request.getScriptText(), request.getScriptArguments());
} catch (IllegalArgumentException e) {
throw new ConnectorException(e.getMessage(), e);
} catch (FileNotFoundException e) {
throw new ConnectorIOException(e.getMessage(), e);
}

return null;
}

/**
Expand Down
Expand Up @@ -118,6 +118,8 @@ public class DummyResource implements DebugDumpable {
public static final String VALUE_COOKIE = "cookie";

public static final String SCRIPT_LANGUAGE_POWERFAIL = "powerfail";
public static final String SCRIPT_LANGUAGE_PARROT = "parrot";

public static final String POWERFAIL_ARG_ERROR = "error";
public static final String POWERFAIL_ARG_ERROR_GENERIC = "generic";
public static final String POWERFAIL_ARG_ERROR_RUNTIME = "runtime";
Expand Down Expand Up @@ -819,7 +821,7 @@ public void purgeScriptHistory() {
*
* @param scriptCode code of the script
*/
public void runScript(String language, String scriptCode, Map<String, Object> params) throws FileNotFoundException {
public String runScript(String language, String scriptCode, Map<String, Object> params) throws FileNotFoundException {
scriptHistory.add(new ScriptHistoryEntry(language, scriptCode, params));
if (SCRIPT_LANGUAGE_POWERFAIL.equals(language)) {
Object errorArg = params.get(POWERFAIL_ARG_ERROR);
Expand All @@ -832,7 +834,10 @@ public void runScript(String language, String scriptCode, Map<String, Object> pa
} else if (POWERFAIL_ARG_ERROR_IO.equals(errorArg)) {
throw new FileNotFoundException("Booom! PowerFail script failed (IO)");
}
} else if (SCRIPT_LANGUAGE_PARROT.equals(language)) {
return scriptCode.toUpperCase();
}
return null;
}

/**
Expand Down
Expand Up @@ -16076,6 +16076,7 @@
<xsd:element name="assignmentsOrg" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="assignmentsMembershipAndDelegate" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="assignmentsConflicts" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="focusLifecycle" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="objectTemplateAfterAssignments" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="focusCredentials" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
<xsd:element name="focusPolicyRules" type="tns:PartialProcessingTypeType" minOccurs="0" default="automatic"/>
Expand Down
Expand Up @@ -1931,11 +1931,11 @@
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="uri" type="xsd:anyURI" minOccurs="1" maxOccurs="1">
<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
<p>
Identifier (URI) of the state. This is the value that is used in the
Identifier of the state. This is the value that is used in the
lifecycleState property.
</p>
</xsd:documentation>
Expand Down Expand Up @@ -2023,11 +2023,11 @@
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="targetState" type="xsd:anyURI" minOccurs="1" maxOccurs="1">
<xsd:element name="targetState" type="xsd:string" minOccurs="1" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
<p>
Identifier (URI) of the state that is the target of the transition.
Identifier of the state that is the target of the transition.
</p>
</xsd:documentation>
</xsd:annotation>
Expand Down
@@ -0,0 +1,27 @@
/**
* Copyright (c) 2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.util.annotation;

/**
* Marks experimental code.
* The code marked with this annotation is not officially supported.
* Use at your own risk.
*
* @author Radovan Semancik
*/
public @interface Experimental {

}
Expand Up @@ -1105,5 +1105,15 @@ TaskType submitTaskFromTemplate(String templateTaskOid, Map<QName, Object> exten
<F extends ObjectType> ModelElementContext<F> getFocusContext();

ModelProjectionContext getProjectionContext();

Object executeAdHocProvisioningScript(ResourceType resource, String language, String code)
throws SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException,
SecurityViolationException, ObjectAlreadyExistsException;

Object executeAdHocProvisioningScript(String resourceOid, String language, String code)
throws SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException,
SecurityViolationException, ObjectAlreadyExistsException;

}
Expand Up @@ -33,6 +33,7 @@
import com.evolveum.midpoint.model.common.ConstantsManager;
import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluationContext;
import com.evolveum.midpoint.model.impl.ModelObjectResolver;
import com.evolveum.midpoint.model.impl.lens.EvaluatedAssignmentImpl;
import com.evolveum.midpoint.model.impl.lens.LensContext;
import com.evolveum.midpoint.model.impl.lens.LensFocusContext;
import com.evolveum.midpoint.model.impl.lens.LensProjectionContext;
Expand All @@ -41,6 +42,7 @@
import com.evolveum.midpoint.prism.crypto.EncryptionException;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.marshaller.ItemPathHolder;
Expand All @@ -62,6 +64,7 @@
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.Holder;
import com.evolveum.midpoint.util.LocalizableMessage;
import com.evolveum.midpoint.util.annotation.Experimental;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
Expand Down Expand Up @@ -415,6 +418,34 @@ public boolean isDirectlyAssigned(ObjectType target) {
return isDirectlyAssigned(target.getOid());
}

// EXPERIMENTAL!!
@Experimental
public boolean hasActiveAssignmentTargetSubtype(String roleSubtype) {
LensContext<ObjectType> lensContext = ModelExpressionThreadLocalHolder.getLensContext();
if (lensContext == null) {
throw new UnsupportedOperationException("hasActiveAssignmentRoleSubtype works only with model context");
}
DeltaSetTriple<EvaluatedAssignmentImpl<?>> evaluatedAssignmentTriple = lensContext.getEvaluatedAssignmentTriple();
if (evaluatedAssignmentTriple == null) {
throw new UnsupportedOperationException("hasActiveAssignmentRoleSubtype works only with evaluatedAssignmentTriple");
}
Collection<EvaluatedAssignmentImpl<?>> nonNegativeEvaluatedAssignments = evaluatedAssignmentTriple.getNonNegativeValues();
if (nonNegativeEvaluatedAssignments == null) {
return false;
}
for (EvaluatedAssignmentImpl<?> nonNegativeEvaluatedAssignment : nonNegativeEvaluatedAssignments) {
PrismObject<?> target = nonNegativeEvaluatedAssignment.getTarget();
if (target == null) {
continue;
}
Collection<String> targetSubtypes = ObjectTypeUtil.getSubtypeValues((PrismObject) target);
if (targetSubtypes.contains(roleSubtype)) {
return true;
}
}
return false;
}

@Override
public ShadowType getLinkedShadow(FocusType focus, ResourceType resource) throws SchemaException,
SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException {
Expand Down Expand Up @@ -1586,4 +1617,25 @@ public String translate(LocalizableMessage message) {
public String translate(LocalizableMessageType message) {
return localizationService.translate(LocalizationUtil.toLocalizableMessage(message), Locale.getDefault());
}

@Override
public Object executeAdHocProvisioningScript(ResourceType resource, String language, String code)
throws SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException,
SecurityViolationException, ObjectAlreadyExistsException {
return executeAdHocProvisioningScript(resource.getOid(), language, code);
}

@Override
public Object executeAdHocProvisioningScript(String resourceOid, String language, String code)
throws SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException,
SecurityViolationException, ObjectAlreadyExistsException {
OperationProvisioningScriptType script = new OperationProvisioningScriptType();
script.setCode(code);
script.setLanguage(language);
script.setHost(ProvisioningScriptHostType.RESOURCE);

return provisioningService.executeScript(resourceOid, script, getCurrentTask(), getCurrentResult());
}
}
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2017 Evolveum
* Copyright (c) 2013-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -113,36 +113,36 @@ public static PrismValueDeltaSetTriple<?> evaluateAnyExpressionInContext(Express
}

public static <T> PrismValueDeltaSetTriple<PrismPropertyValue<T>> evaluateExpressionInContext(Expression<PrismPropertyValue<T>,
PrismPropertyDefinition<T>> expression, ExpressionEvaluationContext context, Task task, OperationResult result)
PrismPropertyDefinition<T>> expression, ExpressionEvaluationContext eeContext, Task task, OperationResult result)
throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException {
ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(task, result));
try {
return expression.evaluate(context);
return expression.evaluate(eeContext);
} finally {
ModelExpressionThreadLocalHolder.popExpressionEnvironment();
}
}

public static PrismValueDeltaSetTriple<PrismReferenceValue> evaluateRefExpressionInContext(Expression<PrismReferenceValue,
PrismReferenceDefinition> expression, ExpressionEvaluationContext context, Task task, OperationResult result)
PrismReferenceDefinition> expression, ExpressionEvaluationContext eeContext, Task task, OperationResult result)
throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException {
ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(task, result));
try {
return expression.evaluate(context);
return expression.evaluate(eeContext);
} finally {
ModelExpressionThreadLocalHolder.popExpressionEnvironment();
}
}

public static <T> PrismValueDeltaSetTriple<PrismPropertyValue<T>> evaluateExpressionInContext(Expression<PrismPropertyValue<T>,
PrismPropertyDefinition<T>> expression, ExpressionEvaluationContext context,
LensContext<?> lensContext, LensProjectionContext projectionContext, Task task, OperationResult result)
public static <T> PrismValueDeltaSetTriple<PrismPropertyValue<T>> evaluateExpressionInContext(
Expression<PrismPropertyValue<T>,PrismPropertyDefinition<T>> expression,
ExpressionEvaluationContext eeContext,
ExpressionEnvironment<?> env)
throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException {
ExpressionEnvironment<?> env = new ExpressionEnvironment<>(lensContext, projectionContext, task, result);
ModelExpressionThreadLocalHolder.pushExpressionEnvironment(env);
PrismValueDeltaSetTriple<PrismPropertyValue<T>> exprResultTriple;
try {
exprResultTriple = expression.evaluate(context);
exprResultTriple = expression.evaluate(eeContext);
} finally {
ModelExpressionThreadLocalHolder.popExpressionEnvironment();
}
Expand Down
Expand Up @@ -1575,11 +1575,15 @@ private OperationProvisioningScriptsType evaluateScript(OperationProvisioningScr
continue;
}
}
if (!script.getOperation().contains(operation)) {
continue;
if (operation != null) {
if (!script.getOperation().contains(operation)) {
continue;
}
}
if (order != null && order != script.getOrder()) {
continue;
if (order != null) {
if (order != null && order != script.getOrder()) {
continue;
}
}
// Let's do the most expensive evaluation last
if (!evaluateScriptCondition(script, variables, task, result)){
Expand Down Expand Up @@ -1630,9 +1634,10 @@ private void evaluateScriptArgument(ProvisioningScriptArgumentType argument,

ExpressionEvaluationContext params = new ExpressionEvaluationContext(null, variables, shortDesc, task,
result);
ExpressionEnvironment<?> env = new ExpressionEnvironment<>(context,
objectContext instanceof LensProjectionContext ? (LensProjectionContext) objectContext : null, task, result);
PrismValueDeltaSetTriple<PrismPropertyValue<String>> outputTriple = ModelExpressionThreadLocalHolder
.evaluateExpressionInContext(expression, params, context,
objectContext instanceof LensProjectionContext ? (LensProjectionContext) objectContext : null, task, result);
.evaluateExpressionInContext(expression, params, env);

Collection<PrismPropertyValue<String>> nonNegativeValues = null;
if (outputTriple != null) {
Expand Down Expand Up @@ -1684,6 +1689,21 @@ private <T extends ObjectType, F extends ObjectType> void executeReconciliationS
if (resourceScripts == null) {
return;
}

executeProvisioningScripts(context, projContext, resourceScripts, ProvisioningOperationTypeType.RECONCILE, order, task, parentResult);
}

private <T extends ObjectType, F extends ObjectType> Object executeProvisioningScripts(LensContext<F> context, LensProjectionContext projContext,
OperationProvisioningScriptsType scripts, ProvisioningOperationTypeType operation, BeforeAfterType order, Task task, OperationResult parentResult)
throws SchemaException, ObjectNotFoundException,
ExpressionEvaluationException, CommunicationException, ConfigurationException,
SecurityViolationException, ObjectAlreadyExistsException {

ResourceType resource = projContext.getResource();
if (resource == null) {
LOGGER.warn("Resource does not exist. Skipping processing reconciliation scripts.");
return null;
}

PrismObject<F> user = null;
PrismObject<ShadowType> shadow = null;
Expand All @@ -1708,26 +1728,29 @@ private <T extends ObjectType, F extends ObjectType> void executeReconciliationS
} else if (order == BeforeAfterType.AFTER) {
shadow = (PrismObject<ShadowType>) projContext.getObjectNew();
} else {
throw new IllegalArgumentException("Unknown order " + order);
shadow = (PrismObject<ShadowType>) projContext.getObjectCurrent();
}

ExpressionVariables variables = Utils.getDefaultExpressionVariables(user, shadow,
projContext.getResourceShadowDiscriminator(), resource.asPrismObject(),
context.getSystemConfiguration(), projContext);
Object scriptResult = null;
ModelExpressionThreadLocalHolder.pushExpressionEnvironment(new ExpressionEnvironment<>(context, projContext, task, parentResult));
try {
OperationProvisioningScriptsType evaluatedScript = evaluateScript(resourceScripts,
projContext.getResourceShadowDiscriminator(), ProvisioningOperationTypeType.RECONCILE, order,
variables, context, projContext, task, parentResult);
for (OperationProvisioningScriptType script : evaluatedScript.getScript()) {
Utils.setRequestee(task, context);
provisioning.executeScript(resource.getOid(), script, task, parentResult);
Utils.clearRequestee(task);
}
OperationProvisioningScriptsType evaluatedScript = evaluateScript(scripts,
projContext.getResourceShadowDiscriminator(), operation, order,
variables, context, projContext, task, parentResult);
for (OperationProvisioningScriptType script : evaluatedScript.getScript()) {
Utils.setRequestee(task, context);
scriptResult = provisioning.executeScript(resource.getOid(), script, task, parentResult);
Utils.clearRequestee(task);
}
} finally {
ModelExpressionThreadLocalHolder.popExpressionEnvironment();
}

return scriptResult;
}


}

0 comments on commit 9a719e0

Please sign in to comment.