Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Apr 1, 2020
2 parents 9d17a01 + b6bc0e5 commit 38200f6
Show file tree
Hide file tree
Showing 26 changed files with 393 additions and 83 deletions.
Expand Up @@ -20,7 +20,9 @@ <h3><div wicket:id="repositoryQueryLabel"/></h3>
<div id="objectType" wicket:id="objectType"></div>
</div>
<div class="form-group" wicket:id="distinct" style="margin-bottom: 15px; width:100%"/>
<br/> <!-- couldn't put this into form-group, so leaving it standalone -->
<div class="form-group" style="margin-bottom: 10px">
<div class="col-lg-12" wicket:id="viewButtonPanel" ></div>
</div>
<textarea wicket:id="editorMidPoint" style="margin-bottom: 10px"></textarea>
<div class="form-group" style="margin-top: 10px">
<label for="querySample" class="small"><wicket:message key="PageRepositoryQuery.chooseSample"/></label>
Expand Down
Expand Up @@ -37,6 +37,7 @@
import com.evolveum.midpoint.web.component.AceEditor;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.form.CheckFormGroup;
import com.evolveum.midpoint.web.component.input.DataLanguagePanel;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.input.QNameChoiceRenderer;
import com.evolveum.midpoint.web.component.search.Search;
Expand Down Expand Up @@ -109,6 +110,7 @@ public class PageRepositoryQuery extends PageAdminConfiguration {
private static final String ID_DISTINCT = "distinct";
private static final String ID_HIBERNATE_PARAMETERS_NOTE = "hibernateParametersNote";
private static final String ID_INCOMPLETE_RESULTS_NOTE = "incompleteResultsNote";
private static final String ID_VIEW_BUTTON_PANEL = "viewButtonPanel";

private static final String SAMPLES_DIR = "query-samples";
private static final List<String> SAMPLES = Arrays.asList(
Expand Down Expand Up @@ -138,8 +140,19 @@ public class PageRepositoryQuery extends PageAdminConfiguration {
private final NonEmptyModel<RepoQueryDto> model = new NonEmptyWrapperModel<>(new Model<>(new RepoQueryDto()));
private final boolean isAdmin;

private String dataLanguage;

enum Action {TRANSLATE_ONLY, EXECUTE_MIDPOINT, EXECUTE_HIBERNATE }

@Override
protected void onInitialize() {
super.onInitialize();
if (dataLanguage == null) {
dataLanguage = determineDataLanguage();
}
initLayout();
}

public PageRepositoryQuery() {
this(null, null);
}
Expand All @@ -156,8 +169,6 @@ public PageRepositoryQuery(QName objectType, String queryText) {
admin = false;
}
isAdmin = admin;

initLayout();
}

private void initLayout() {
Expand Down Expand Up @@ -219,6 +230,25 @@ protected void onUpdate(AjaxRequestTarget target) {
midPointQueryButtonBar.setOutputMarkupId(true);
mainForm.add(midPointQueryButtonBar);

DataLanguagePanel<QueryType> dataLanguagePanel =
new DataLanguagePanel<QueryType>(ID_VIEW_BUTTON_PANEL, dataLanguage, QueryType.class, PageRepositoryQuery.this) {
private static final long serialVersionUID = 1L;

@Override
protected void onLanguageSwitched(AjaxRequestTarget target, int updatedIndex, String updatedLanguage,
String objectString) {
model.getObject().setMidPointQuery(objectString);
dataLanguage = updatedLanguage;
target.add(mainForm);
}
@Override
protected String getObjectStringRepresentation() {
return model.getObject().getMidPointQuery();
}
};
dataLanguagePanel.setOutputMarkupId(true);
mainForm.add(dataLanguagePanel);

AjaxSubmitButton executeMidPoint = new AjaxSubmitButton(ID_EXECUTE_MIDPOINT, createStringResource("PageRepositoryQuery.button.translateAndExecute")) {
@Override
protected void onError(AjaxRequestTarget target) {
Expand Down Expand Up @@ -280,7 +310,20 @@ protected void onUpdate(AjaxRequestTarget target) {
try {
String localTypeName = StringUtils.substringBefore(sampleName, "_");
model.getObject().setObjectType(new QName(SchemaConstants.NS_C, localTypeName));
model.getObject().setMidPointQuery(IOUtils.toString(is, StandardCharsets.UTF_8));
String xml = IOUtils.toString(is, StandardCharsets.UTF_8);
String serialization;
if (PrismContext.LANG_XML.equals(dataLanguage)) {
serialization = xml;
} else {
PrismContext prismContext = getPrismContext();
try {
QueryType parsed = prismContext.parserFor(xml).xml().parseRealValue(QueryType.class);
serialization = prismContext.serializerFor(dataLanguage).serializeRealValue(parsed);
} catch (Throwable t) {
serialization = "Couldn't serialize sample: " + t.getMessage();
}
}
model.getObject().setMidPointQuery(serialization);
model.getObject().setHibernateQuery("");
model.getObject().setHibernateParameters("");
model.getObject().setQueryResultObject(null);
Expand Down Expand Up @@ -506,7 +549,7 @@ private void updateRequestWithMidpointQuery(RepositoryQueryDiagRequest request,
if (clazz == null) {
throw new SchemaException("Couldn't find compile-time class for object type of " + objectType);
}
QueryType queryType = prismContext.parserFor(queryText).xml().parseRealValue(QueryType.class);
QueryType queryType = prismContext.parserFor(queryText).language(dataLanguage).parseRealValue(QueryType.class);
request.setType(clazz);
ObjectQuery objectQuery = prismContext.getQueryConverter().createObjectQuery(clazz, queryType);
ObjectQuery queryWithExprEvaluated = ExpressionUtil.evaluateQueryExpressions(objectQuery, new ExpressionVariables(),
Expand Down
Expand Up @@ -92,15 +92,6 @@ protected void onUpdatePerformed(AjaxRequestTarget target) {
}
}

PrismObjectWrapperFactory<TaskType> wrapperFactory = TaskBasicTabPanel.this.getPageBase().findObjectWrapperFactory(getTask().asPrismObject().getDefinition());
Task task = getPageBase().createSimpleTask(OPERATION_UPDATE_WRAPPER);
OperationResult result = task.getResult();
WrapperContext ctx = new WrapperContext(task, result);
try {
wrapperFactory.updateWrapper(TaskBasicTabPanel.this.getModelObject(), ctx);
} catch (SchemaException e) {
LOGGER.error("Unexpected problem occurs during updating wrapper. Reason: {}", e.getMessage(), e);
}
updateHandlerPerformed(target);

}
Expand Down
Expand Up @@ -22,10 +22,10 @@
<div class="prism-properties">
<div>
<div class="stripe">
<div class="row prism-property">
<div class="row prism-property" style="margin-right: 0px; margin-left: 0px;">
<div class="col-lg-2 col-md-4 col-xs-12 prism-property-label " wicket:id="header"/>
<div class="col-lg-10 col-md-8 col-xs-12 prism-property-value" wicket:id="values">
<div class="row">
<div class="row" style="margin-right: 0px; margin-left: 0px;">
<div class="col-xs-10" wicket:id="valueContainer">
<form wicket:id="form">
<div wicket:id="input"/>
Expand Down
Expand Up @@ -56,25 +56,12 @@ public class CustomFunctions {
private FunctionLibraryType library;
private ExpressionProfile expressionProfile;
private PrismContext prismContext;
/**
* Operation result existing at the initialization time. It is used only if we cannot obtain current operation
* result in any other way.
*/
private OperationResult initializationTimeResult;
/**
* Operation result existing at the initialization time. It is used only if we cannot obtain current operation
* result in any other way.
*/
private Task initializationTimeTask;

public CustomFunctions(FunctionLibraryType library, ExpressionFactory expressionFactory, ExpressionProfile expressionProfile,
OperationResult result, Task task) {
public CustomFunctions(FunctionLibraryType library, ExpressionFactory expressionFactory, ExpressionProfile expressionProfile) {
this.library = library;
this.expressionFactory = expressionFactory;
this.expressionProfile = expressionProfile;
this.prismContext = expressionFactory.getPrismContext();
this.initializationTimeResult = result;
this.initializationTimeTask = task;
}

/**
Expand All @@ -91,22 +78,20 @@ public <V extends PrismValue, D extends ItemDefinition> Object execute(String fu
if (ctx.getTask() != null) {
task = ctx.getTask();
} else {
LOGGER.warn("No task in ScriptExpressionEvaluationContext for the current thread found. Using "
+ "initialization-time task: {}", initializationTimeTask);
task = initializationTimeTask;
// We shouldn't use task of unknown provenience.
throw new IllegalStateException("No task in ScriptExpressionEvaluationContext for the current thread found");
}
if (ctx.getResult() != null) {
result = ctx.getResult();
} else {
LOGGER.warn("No operation result in ScriptExpressionEvaluationContext for the current thread found. Using "
+ "initialization-time op. result");
result = initializationTimeResult;
// Better throwing an exception than introducing memory leak if initialization-time result is used.
// This situation should never occur anyway.
throw new IllegalStateException("No operation result in ScriptExpressionEvaluationContext for the current thread found");
}
} else {
LOGGER.warn("No ScriptExpressionEvaluationContext for current thread found. Using initialization-time task "
+ "and operation result: {}", initializationTimeTask);
task = initializationTimeTask;
result = initializationTimeResult;
// Better throwing an exception than introducing memory leak if initialization-time result is used.
// This situation should never occur anyway.
throw new IllegalStateException("No ScriptExpressionEvaluationContext for current thread found");
}

List<ExpressionType> functions = library.getFunction().stream().filter(expression -> functionName.equals(expression.getName())).collect(Collectors.toList());
Expand Down
Expand Up @@ -181,8 +181,8 @@ public <V extends PrismValue> List<V> evaluate(ScriptExpressionEvaluationContext
context.setTrace(null);
}
context.setResult(result); // a bit of hack: this is to provide some tracing of script evaluation
ScriptExpressionEvaluationContext oldContext = context.setupThreadLocal();
try {
context.setupThreadLocal();

List<V> expressionResult = evaluator.evaluate(context);
if (context.getTrace() != null) {
Expand All @@ -197,7 +197,7 @@ public <V extends PrismValue> List<V> evaluate(ScriptExpressionEvaluationContext
result.recordFatalError(ex.getMessage(), ex);
throw ex;
} finally {
context.cleanupThreadLocal();
context.cleanupThreadLocal(oldContext);
result.computeStatusIfUnknown();
context.setResult(parentResult); // a bit of hack
}
Expand Down
Expand Up @@ -160,16 +160,14 @@ public void setResult(OperationResult result) {
this.result = result;
}

public static ThreadLocal<ScriptExpressionEvaluationContext> getThreadlocalcontext() {
return THREAD_LOCAL_CONTEXT;
}

public void setupThreadLocal() {
ScriptExpressionEvaluationContext setupThreadLocal() {
ScriptExpressionEvaluationContext oldContext = THREAD_LOCAL_CONTEXT.get();
THREAD_LOCAL_CONTEXT.set(this);
return oldContext;
}

public void cleanupThreadLocal() {
THREAD_LOCAL_CONTEXT.set(null);
void cleanupThreadLocal(ScriptExpressionEvaluationContext oldContext) {
THREAD_LOCAL_CONTEXT.set(oldContext);
}

public static ScriptExpressionEvaluationContext getThreadLocal() {
Expand Down
Expand Up @@ -119,7 +119,7 @@ public ScriptExpression createScriptExpression(
String shortDesc, Task task, OperationResult result)
throws ExpressionSyntaxException, SecurityViolationException {

initializeCustomFunctionsLibraryCache(expressionFactory, task, result);
initializeCustomFunctionsLibraryCache(expressionFactory, result);
//cache cleanup method

String language = getLanguage(expressionType);
Expand Down Expand Up @@ -168,7 +168,7 @@ private ScriptExpressionProfile processScriptExpressionProfile(ExpressionProfile
}

// if performance becomes an issue, replace 'synchronized' with something more elaborate
private synchronized void initializeCustomFunctionsLibraryCache(ExpressionFactory expressionFactory, Task task,
private synchronized void initializeCustomFunctionsLibraryCache(ExpressionFactory expressionFactory,
OperationResult result) throws ExpressionSyntaxException {
if (customFunctionLibraryCache != null) {
return;
Expand All @@ -187,7 +187,7 @@ private synchronized void initializeCustomFunctionsLibraryCache(ExpressionFactor
FunctionLibrary customLibrary = new FunctionLibrary();
customLibrary.setVariableName(object.getName().getOrig());
customLibrary.setGenericFunctions(
new CustomFunctions(object.asObjectable(), expressionFactory, expressionProfile, result, task));
new CustomFunctions(object.asObjectable(), expressionFactory, expressionProfile));
customLibrary.setNamespace(MidPointConstants.NS_FUNC_CUSTOM);
customFunctionLibraryCache.put(object.getName().getOrig(), customLibrary);
return true;
Expand Down
Expand Up @@ -15,6 +15,7 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.asserter.UserAsserter;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
Expand All @@ -25,6 +26,7 @@

import java.io.File;
import java.util.Arrays;
import java.util.Collections;

import javax.xml.namespace.QName;

Expand Down Expand Up @@ -196,15 +198,25 @@ public void test200ImportFromResourceAssociations() throws Exception {
SearchResultList<PrismObject<UserType>> users = modelService.searchObjects(UserType.class, null, null, task, result);
display("Users after import", users);

PrismObject<UserType> userHermanAfter = findUserByUsername(USER_HERMAN_USERNAME);
display("User after", userHermanAfter);
userHermanOid = userHermanAfter.getOid();
assertUser(userHermanAfter, userHermanAfter.getOid(), USER_HERMAN_USERNAME, USER_HERMAN_FULL_NAME, null, null);
assertAssignedRole(userHermanAfter, ROLE_AUTODIDACTIC_OID);
assertAssignedRole(userHermanAfter, ROLE_AUTOGRAPHIC_OID);
assertAssignedRole(userHermanAfter, ROLE_AUTOTESTERS_OID);
assertAssignedRole(userHermanAfter, ROLE_AUTOCRATIC_OID);
assertAssignments(userHermanAfter, 4);
UserAsserter<Void> userAsserter = assertUserAfterByUsername(USER_HERMAN_USERNAME);
userHermanOid = userAsserter.getOid();
PrismObject<UserType> userAfter = userAsserter.getObject();
assertUser(userAfter, userHermanOid, USER_HERMAN_USERNAME, USER_HERMAN_FULL_NAME, null, null);
userAsserter
.assignments()
.forRole(ROLE_AUTODIDACTIC_OID)
.assertOriginMappingName("Assignment from title") // MID-5846
.end()
.forRole(ROLE_AUTOGRAPHIC_OID)
.assertOriginMappingName("Assignment from title") // MID-5846
.end()
.forRole(ROLE_AUTOTESTERS_OID)
.assertOriginMappingName("Assignment from group") // MID-5846
.end()
.forRole(ROLE_AUTOCRATIC_OID)
.assertOriginMappingName("Assignment from group") // MID-5846
.end()
.assertAssignments(4);

assertEquals("Unexpected number of users", getNumberOfUsers() + 1, users.size());
}
Expand Down Expand Up @@ -246,7 +258,7 @@ public void test301removeUserFromAutoGroup() throws Exception {
craticGroup.removeMember(USER_HERMAN_USERNAME);

DummyAccount hermanAccount = getDummyAccount(RESOURCE_DUMMY_AUTOGREEN_NAME, USER_HERMAN_USERNAME);
hermanAccount.removeAttributeValues(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, Arrays.asList("didactic"));
hermanAccount.removeAttributeValues(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, Collections.singletonList("didactic"));

assertNoDummyGroupMember(RESOURCE_DUMMY_AUTOGREEN_NAME, GROUP_DUMMY_CRATIC_NAME, USER_HERMAN_USERNAME);

Expand Down

0 comments on commit 38200f6

Please sign in to comment.