diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index a3b221d6caf..2da734a05f0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -46,6 +46,7 @@ import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.prism.util.PolyStringUtils; import com.evolveum.midpoint.repo.api.CacheDispatcher; +import com.evolveum.midpoint.repo.api.CounterManager; import com.evolveum.midpoint.repo.common.ObjectResolver; import com.evolveum.midpoint.repo.common.expression.Expression; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; @@ -311,6 +312,9 @@ public abstract class PageBase extends WebPage implements ModelServiceLocator { @SpringBean private MidpointFunctions midpointFunctions; + + @SpringBean + private CounterManager counterManager; private List breadcrumbs; @@ -472,6 +476,10 @@ public LocalizationService getLocalizationService() { public MidpointFunctions getMidpointFunctions() { return midpointFunctions; } + + public CounterManager getCounterManager() { + return counterManager; + } @Contract(pure = true) public PrismContext getPrismContext() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.html index 426a442cd6a..2d23861f0e0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.html @@ -18,6 +18,28 @@ + +
+ +
+

+ + + + + + +
+ + + + + + +
+
+
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.java index c3b92c5c163..3d941554eae 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsCountersPanel.java @@ -1,15 +1,22 @@ package com.evolveum.midpoint.web.page.admin.configuration; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.repo.api.CounterSepcification; import com.evolveum.midpoint.schema.internals.InternalCounters; import com.evolveum.midpoint.schema.internals.InternalMonitor; +import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel; public class InternalsCountersPanel extends BasePanel> { @@ -18,7 +25,14 @@ public class InternalsCountersPanel extends BasePanel private static final String ID_COUNTERS_TABLE = "countersTable"; private static final String ID_COUNTER_LABEL = "counterLabel"; private static final String ID_COUNTER_VALUE = "counterValue"; - + private static final String ID_THRESHOLD_COUNTER = "thresholdCounter"; + private static final String ID_THRESHOLD_COUNTERS_TABLE = "thresholdCountersTable"; + private static final String ID_COUNTER_TASK_LABEL = "counterTask"; + private static final String ID_COUNTER_POLICY_RULE_LABEL = "counterPolicyRule"; + private static final String ID_COUNTER_COUNT_LABEL = "counterCount"; + private static final String ID_RESET_THRESHOLD_COUNTER = "resetThresholdCounter"; + + public InternalsCountersPanel(String id) { super(id); } @@ -29,6 +43,49 @@ protected void onInitialize() { setOutputMarkupId(true); + Label thresholdCounter = new Label(ID_THRESHOLD_COUNTER, createStringResource("InternalsCountersPanel.thresholds")); + add(thresholdCounter); + + ListView thresholdCountersTable = new ListView(ID_THRESHOLD_COUNTERS_TABLE, createThresholdCounterModel()) { + private static final long serialVersionUID = 1L; + + @Override + protected void populateItem(ListItem item) { + CounterSepcification counter = item.getModelObject(); + Label task = new Label(ID_COUNTER_TASK_LABEL, counter.getTaskName()); + item.add(task); + + Label policyRule = new Label(ID_COUNTER_POLICY_RULE_LABEL, counter.getPolicyRuleName()); + item.add(policyRule); + + Label count = new Label(ID_COUNTER_COUNT_LABEL, counter.getCount()); + item.add(count); + + AjaxLink resetCounter = new AjaxLink(ID_RESET_THRESHOLD_COUNTER) { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + ConfirmationPanel confirmPanel = new ConfirmationPanel(getPageBase().getMainPopupBodyId(), createStringResource("InternalsCountersPanel.reset.confirm.message", counter.getTaskName(), counter.getPolicyRuleName())) { + + private static final long serialVersionUID = 1L; + + public void yesPerformed(AjaxRequestTarget target) { + getPageBase().getCounterManager().removeCounter(counter); + target.add(InternalsCountersPanel.this); + }; + }; + getPageBase().showMainPopup(confirmPanel, target); + target.add(InternalsCountersPanel.this); + } + }; + item.add(resetCounter); + } + + }; + add(thresholdCountersTable); + ListView countersTable = new ListView(ID_COUNTERS_TABLE, Arrays.asList(InternalCounters.values())) { private static final long serialVersionUID = 1L; @@ -54,4 +111,17 @@ public String getObject() { }; add(countersTable); } -} + + private IModel> createThresholdCounterModel() { + return new IModel>() { + private static final long serialVersionUID = 1L; + + @Override + public List getObject() { + Collection thresholdCounters = getPageBase().getCounterManager().listCounters(); + return new ArrayList<>(thresholdCounters); + } + }; + } + +} \ No newline at end of file diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index ecd4fba46c4..e33ffcd8896 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -4375,3 +4375,7 @@ ResourceSummaryPanel.DOWN=Down operation.com.evolveum.midpoint.web.page.admin.configuration.InternalsThreadsPanel.executeShowAllThreads=Show all threads (Gui) operation.com.evolveum.midpoint.web.page.admin.configuration.InternalsThreadsPanel.executeShowTasksThreads=Show running tasks threads (Gui) operation.com.evolveum.midpoint.web.page.admin.configuration.InternalsThreadsPanel.executeRecordTasksThreads=Record running tasks threads (Gui) +InternalsCountersPanel.thresholds=Thresholds +PageInternals.title.thresholds.counters=Thresholds counters +InternalsCountersPanel.reset.confirm.message=Do you really want to remove counters for {0} ({1}) +InternalsCountersPanel.threshold.reset.button=Reset \ No newline at end of file diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java index 919feca1d65..cd6d51450f2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/Projector.java @@ -19,38 +19,26 @@ import static com.evolveum.midpoint.model.api.ProgressInformation.StateType.ENTERING; import static com.evolveum.midpoint.schema.internals.InternalsConfig.consistencyChecks; -import java.util.HashSet; import java.util.List; -import java.util.Set; import javax.xml.datatype.XMLGregorianCalendar; -import com.evolveum.midpoint.model.api.ProgressInformation; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.evolveum.midpoint.common.Clock; -import com.evolveum.midpoint.model.api.context.EvaluatedAssignment; -import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; +import com.evolveum.midpoint.model.api.ProgressInformation; import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; import com.evolveum.midpoint.model.impl.lens.ClockworkMedic; -import com.evolveum.midpoint.model.impl.lens.EvaluatedAssignmentImpl; import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; import com.evolveum.midpoint.model.impl.lens.LensUtil; import com.evolveum.midpoint.model.impl.lens.projector.credentials.ProjectionCredentialsProcessor; -import com.evolveum.midpoint.model.impl.lens.projector.focus.AssignmentProcessor; -import com.evolveum.midpoint.model.impl.lens.projector.focus.AssignmentTripleEvaluator; import com.evolveum.midpoint.model.impl.lens.projector.focus.AssignmentHolderProcessor; +import com.evolveum.midpoint.model.impl.lens.projector.focus.AssignmentProcessor; import com.evolveum.midpoint.model.impl.util.ModelImplUtils; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.PreconditionViolationException; -import com.evolveum.midpoint.repo.common.CounterManager; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.internals.InternalCounters; import com.evolveum.midpoint.schema.internals.InternalMonitor; @@ -67,6 +55,9 @@ import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PartialProcessingOptionsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PartialProcessingTypeType; /** * Projector recomputes the context. It takes the context with a few basic data as input. It uses all the policies @@ -99,9 +90,7 @@ public class Projector { @Autowired private Clock clock; @Autowired private ClockworkMedic medic; - @Autowired private CounterManager counterManager; - - private static final Trace LOGGER = TraceManager.getTrace(Projector.class); + private static final Trace LOGGER = TraceManager.getTrace(Projector.class); /** * Runs one projection wave, starting at current execution wave. diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java index a29e8462733..d3ec4c2a4f7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java @@ -22,8 +22,9 @@ import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.context.ModelElementContext; -import com.evolveum.midpoint.repo.common.CounterManager; -import com.evolveum.midpoint.repo.common.CounterSepcification; +import com.evolveum.midpoint.repo.api.CounterManager; +import com.evolveum.midpoint.repo.api.CounterSepcification; +import com.evolveum.midpoint.repo.cache.CacheCounterManager; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugDumpable; @@ -48,7 +49,6 @@ public class PolicyRuleSuspendTaskExecutor { private static final Trace LOGGER = TraceManager.getTrace(PolicyRuleSuspendTaskExecutor.class); @Autowired private CounterManager counterManager; -// @Autowired private TaskManager taskManager; public void execute(@NotNull ModelContext context, Task task, OperationResult result) throws ThresholdPolicyViolationException, ObjectNotFoundException, SchemaException { ModelElementContext focusCtx = context.getFocusContext(); @@ -58,7 +58,7 @@ public void execute(@NotNull ModelContext context, Tas } for (EvaluatedPolicyRule policyRule : focusCtx.getPolicyRules()) { - CounterSepcification counterSpec = counterManager.getCounterSpec(task, policyRule.getPolicyRuleIdentifier(), policyRule.getPolicyRule()); + CounterSepcification counterSpec = counterManager.getCounterSpec(task.getTaskType(), policyRule.getPolicyRuleIdentifier(), policyRule.getPolicyRule()); LOGGER.trace("Found counter specification {} for {}", counterSpec, DebugUtil.debugDumpLazily(policyRule)); int counter = 1; @@ -72,20 +72,7 @@ public void execute(@NotNull ModelContext context, Tas counterSpec.setCount(counter); } } - - //TODO : not supported yet -// Collection projectionCtxs = context.getProjectionContexts(); -// for (ModelProjectionContext projectionCtx : projectionCtxs) { -// Collection evaluatedPolicyRules = projectionCtx.getPolicyRules(); -// for (EvaluatedPolicyRule policyRule : evaluatedPolicyRules) { -// LOGGER.info("projction policy rules: {}", policyRule); -// counter = checkEvaluatedPolicyRule(task, policyRule, counter, result); -// } -// -// } - - - + } private synchronized int checkEvaluatedPolicyRule(Task task, EvaluatedPolicyRule policyRule, int counter, OperationResult result) throws ThresholdPolicyViolationException, ObjectNotFoundException, SchemaException { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java index d1f58e80fd0..28a963dfe8c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java @@ -15,6 +15,12 @@ */ package com.evolveum.midpoint.model.impl.sync; +import javax.annotation.PostConstruct; + +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.impl.ModelConstants; @@ -22,8 +28,6 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.PreconditionViolationException; -import com.evolveum.midpoint.repo.common.CounterManager; -import com.evolveum.midpoint.repo.common.util.RepoCommonUtils; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; @@ -31,7 +35,13 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.ExceptionUtil; -import com.evolveum.midpoint.task.api.*; +import com.evolveum.midpoint.task.api.RunningTask; +import com.evolveum.midpoint.task.api.StatisticsCollectionStrategy; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskCategory; +import com.evolveum.midpoint.task.api.TaskHandler; +import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.task.api.TaskRunResult; import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; @@ -43,17 +53,10 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.CriticalityType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExecutionModeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; - /** * The task handler for a live synchronization. * @@ -71,8 +74,7 @@ public class LiveSyncTaskHandler implements TaskHandler { @Autowired private TaskManager taskManager; @Autowired private ProvisioningService provisioningService; @Autowired private PrismContext prismContext; - @Autowired private CounterManager counterManager; - + private static final transient Trace LOGGER = TraceManager.getTrace(LiveSyncTaskHandler.class); @PostConstruct @@ -94,8 +96,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { @Override public TaskRunResult run(RunningTask task, TaskPartitionDefinitionType partition) { LOGGER.trace("LiveSyncTaskHandler.run starting"); - -// counterManager.registerCounter(task, true); + OperationResult opResult = new OperationResult(OperationConstants.LIVE_SYNC); TaskRunResult runResult = new TaskRunResult(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index c6a5c739e7f..cd497c61fa4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -53,7 +53,6 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.cache.RepositoryCache; -import com.evolveum.midpoint.repo.common.CounterManager; import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeTaskHandler; import com.evolveum.midpoint.repo.common.task.TaskHandlerUtil; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -134,7 +133,6 @@ public class ReconciliationTaskHandler implements WorkBucketAwareTaskHandler { @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; - @Autowired private CounterManager counterManager; @Autowired private AssignmentCollector assignmentCollector; @Autowired private SystemObjectCache systemObjectCache; diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterManager.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterManager.java new file mode 100644 index 00000000000..c30e0204788 --- /dev/null +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterManager.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2010-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.repo.api; + +import java.util.Collection; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; + +/** + * @author katka + * + */ +public interface CounterManager { + + + CounterSepcification getCounterSpec(TaskType task, String policyRuleId, PolicyRuleType policyRule); + void cleanupCounters(String taskOid); + Collection listCounters(); + void removeCounter(CounterSepcification counterSpecification); +} diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterSepcification.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterSepcification.java similarity index 63% rename from repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterSepcification.java rename to repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterSepcification.java index f083703bf00..fd4cbc259d1 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterSepcification.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/CounterSepcification.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.repo.common; - -import java.time.Duration; +package com.evolveum.midpoint.repo.api; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.util.DebugDumpable; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyThresholdType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; /** * @author katka @@ -29,7 +29,16 @@ public class CounterSepcification implements DebugDumpable { private int count = 0; private long counterStart; - private PolicyThresholdType policyThreshold; + + private TaskType task; + private PolicyRuleType policyRule; + private String policyRuleId; + + public CounterSepcification(TaskType task, String policyRuleId, PolicyRuleType policyRule) { + this.task = task; + this.policyRuleId = policyRuleId; + this.policyRule = policyRule; + } public int getCount() { return count; @@ -43,21 +52,28 @@ public void setCount(int count) { public void setCounterStart(long counterStart) { this.counterStart = counterStart; } - - /** - * @return the policyThreshold - */ + public PolicyThresholdType getPolicyThreshold() { - return policyThreshold; + return policyRule.getPolicyThreshold(); } - /** - * @param policyThreshold the policyThreshold to set - */ - public void setPolicyThreshold(PolicyThresholdType policyThreshold) { - this.policyThreshold = policyThreshold; + public String getTaskName() { + return task.getName().getOrig(); } + public String getPolicyRuleName() { + return policyRule.getName(); + } + + public String getTaskOid() { + return task.getOid(); + } + + public String getPolicyRuleId() { + return policyRuleId; + } + + public void reset(long currentTimeMillis) { count = 0; counterStart = currentTimeMillis; @@ -66,9 +82,11 @@ public void reset(long currentTimeMillis) { @Override public String debugDump(int indent) { StringBuilder sb = new StringBuilder(); + sb.append("Counter for: ").append(task).append(", policy rule: ").append(policyRule).append("\n"); sb.append("Current count: ").append(count).append("\n"); sb.append("Counter start: ").append(XmlTypeConverter.createXMLGregorianCalendar(counterStart)).append("\n"); - sb.append("Thresholds: \n").append(policyThreshold.toString()); + + sb.append("Thresholds: \n").append(getPolicyThreshold().toString()); return sb.toString(); } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/CacheCounterManager.java similarity index 71% rename from repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java rename to repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/CacheCounterManager.java index 39728747aa4..d6e8cc82b3b 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/CacheCounterManager.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.evolveum.midpoint.repo.common; +package com.evolveum.midpoint.repo.cache; +import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -26,12 +27,15 @@ import org.springframework.stereotype.Component; import com.evolveum.midpoint.common.Clock; +import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.repo.api.CounterManager; +import com.evolveum.midpoint.repo.api.CounterSepcification; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyThresholdType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeIntervalType; /** @@ -39,15 +43,15 @@ * */ @Component -public class CounterManager { +public class CacheCounterManager implements CounterManager { @Autowired private Clock clock; - private static final Trace LOGGER = TraceManager.getTrace(CounterManager.class); + private static final Trace LOGGER = TraceManager.getTrace(CacheCounterManager.class); private Map countersMap = new ConcurrentHashMap<>(); - public synchronized CounterSepcification registerCounter(Task task, String policyRuleId, PolicyRuleType policyRule) { + public synchronized CounterSepcification registerCounter(TaskType task, String policyRuleId, PolicyRuleType policyRule) { if (task.getOid() == null) { LOGGER.trace("Not persistent task, skipping registering counter."); @@ -57,10 +61,10 @@ public synchronized CounterSepcification registerCounter(Task task, String polic CounterKey key = new CounterKey(task.getOid(), policyRuleId); CounterSepcification counterSpec = countersMap.get(key); if (counterSpec == null) { - return initCleanCounter(key, policyRule); + return initCleanCounter(key, task, policyRule); } - if (isResetCounter(counterSpec)) { + if (isResetCounter(counterSpec, false)) { return refreshCounter(key, counterSpec); } @@ -68,7 +72,7 @@ public synchronized CounterSepcification registerCounter(Task task, String polic } - private boolean isResetCounter(CounterSepcification counterSpec) { + private boolean isResetCounter(CounterSepcification counterSpec, boolean removeIfTimeIntervalNotSpecified) { PolicyThresholdType threshold = counterSpec.getPolicyThreshold(); if (threshold == null) { @@ -78,17 +82,18 @@ private boolean isResetCounter(CounterSepcification counterSpec) { TimeIntervalType timeInterval = threshold.getTimeInterval(); if (timeInterval == null) { - return false; + return removeIfTimeIntervalNotSpecified; } if (timeInterval.getInterval() == null) { - return false; + return removeIfTimeIntervalNotSpecified; } Duration interval = timeInterval.getInterval(); - return !XmlTypeConverter.isAfterInterval(XmlTypeConverter.createXMLGregorianCalendar(counterSpec.getCounterStart()), interval, clock.currentTimeXMLGregorianCalendar()); + return XmlTypeConverter.isAfterInterval(XmlTypeConverter.createXMLGregorianCalendar(counterSpec.getCounterStart()), interval, clock.currentTimeXMLGregorianCalendar()); } + @Override public void cleanupCounters(String taskOid) { Set keys = countersMap.keySet(); @@ -100,14 +105,16 @@ public void cleanupCounters(String taskOid) { } for (CounterKey counterToRemove : counersToRemove) { - countersMap.remove(counterToRemove); + CounterSepcification spec = countersMap.get(counterToRemove); + if (isResetCounter(spec, true)) { + countersMap.remove(counterToRemove); + } } } - private CounterSepcification initCleanCounter(CounterKey key, PolicyRuleType policyRule) { - CounterSepcification counterSpec = new CounterSepcification(); + private CounterSepcification initCleanCounter(CounterKey key, TaskType task, PolicyRuleType policyRule) { + CounterSepcification counterSpec = new CounterSepcification(task, key.policyRuleId, policyRule); counterSpec.setCounterStart(clock.currentTimeMillis()); - counterSpec.setPolicyThreshold(policyRule.getPolicyThreshold()); countersMap.put(key, counterSpec); return counterSpec; } @@ -118,7 +125,8 @@ private CounterSepcification refreshCounter(CounterKey key, CounterSepcification return counterSpec; } - public CounterSepcification getCounterSpec(Task task, String policyRuleId, PolicyRuleType policyRule) { + @Override + public CounterSepcification getCounterSpec(TaskType task, String policyRuleId, PolicyRuleType policyRule) { if (task.getOid() == null) { LOGGER.trace("Cannot get counter spec for task without oid"); return null; @@ -132,7 +140,7 @@ public CounterSepcification getCounterSpec(Task task, String policyRuleId, Polic return registerCounter(task, policyRuleId, policyRule); } - if (isResetCounter(counterSpec)) { + if (isResetCounter(counterSpec, false)) { counterSpec = refreshCounter(key, counterSpec); } @@ -140,6 +148,17 @@ public CounterSepcification getCounterSpec(Task task, String policyRuleId, Polic return counterSpec; } + @Override + public Collection listCounters() { + return countersMap.values(); + } + + @Override + public void removeCounter(CounterSepcification counterSpecification) { + CounterKey key = new CounterKey(counterSpecification.getTaskOid(), counterSpecification.getPolicyRuleId()); + countersMap.remove(key); + } + class CounterKey { private String oid; diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java index d4fac57c7d5..1c89db2a870 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java @@ -17,30 +17,27 @@ import static com.evolveum.midpoint.prism.PrismProperty.getRealValue; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.function.Function; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.FilterUtil; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.schema.util.TaskWorkStateTypeUtil; -import com.evolveum.midpoint.task.api.*; -import com.evolveum.midpoint.util.exception.*; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.FilterUtil; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.repo.common.CounterManager; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.SelectorOptions; @@ -48,10 +45,33 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.schema.util.TaskWorkStateTypeUtil; +import com.evolveum.midpoint.task.api.ExitWorkBucketHandlerException; +import com.evolveum.midpoint.task.api.RunningTask; +import com.evolveum.midpoint.task.api.StatisticsCollectionStrategy; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.task.api.TaskRunResult; import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; +import com.evolveum.midpoint.task.api.TaskWorkBucketProcessingResult; +import com.evolveum.midpoint.task.api.WorkBucketAwareTaskHandler; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterationMethodType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SelectorQualifiedGetOptionsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; import com.evolveum.prism.xml.ns._public.query_3.QueryType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -92,8 +112,6 @@ public abstract class AbstractSearchIterativeTaskHandler