Skip to content

Commit

Permalink
Make ModelContext really serializable (MID-6890)
Browse files Browse the repository at this point in the history
While ModelContext was declared serializable, many of its constituents
were, in fact, not. So this commit makes a lot of types/classes really
serializable:

- AbstractConstruction and its subclasses
- EvaluatedAbstractConstruction and its subclasses
- EvaluatedResourceObjectConstruction and its subtypes
- EvaluatedAssignment
- EvaluatedAssignmentTarget
- AssignmentPath
- AssignmentPathSegment
- EvaluationOrder
- AssignmentOrigin
- AssignmentPathVariables
- FocalMappingEvaluationRequest and its subclasses
- ExpressionEvaluatorProfile
- ExpressionPermissionProfile
- ScriptExpressionProfile
- ExpressionProfile
- ItemDeltaItem and subclasses
- Mapping, MappingParser, ConditionState, TimeConstraintsEvaluation

In order to do this:
- ModelBeans are now reachable via static ModelBeans.get() call,
- SchemaService is now reachable via static SchemaService.get() call,
- PrismContext is now reachable via static PrismContext.get() call.

BEHAVIOR CHANGE:
- Mapping state now can contain only serializable values.
  • Loading branch information
mederly committed Mar 10, 2021
1 parent efcc376 commit aeb862a
Show file tree
Hide file tree
Showing 62 changed files with 505 additions and 257 deletions.
Expand Up @@ -407,4 +407,7 @@ default PrismQueryLanguageParser createQueryParser() {

PrismQuerySerializer querySerializer();

static PrismContext get() {
return PrismService.get().prismContext();
}
}
@@ -0,0 +1,33 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.prism;

/**
* Statically holds an instance of PrismContext (and maybe other beans later).
*/
public class PrismService {

private static final PrismService INSTANCE = new PrismService();

private static PrismContext prismContext;

private PrismService() {
}

public static PrismService get() {
return INSTANCE;
}

public PrismContext prismContext() {
return prismContext;
}

public void prismContext(PrismContext prismContext) {
PrismService.prismContext = prismContext;
}
}
Expand Up @@ -8,6 +8,7 @@

import static com.evolveum.midpoint.prism.path.ItemPath.CompareResult;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
Expand All @@ -33,7 +34,7 @@
*
* @author Radovan Semancik
*/
public class ItemDeltaItem<V extends PrismValue,D extends ItemDefinition> implements DebugDumpable {
public class ItemDeltaItem<V extends PrismValue,D extends ItemDefinition> implements DebugDumpable, Serializable {

private Item<V,D> itemOld;
private ItemDelta<V,D> delta;
Expand Down
Expand Up @@ -8,6 +8,7 @@

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down
Expand Up @@ -154,6 +154,8 @@ private PrismContextImpl(@NotNull SchemaRegistryImpl schemaRegistry) {
// Should not happen
throw new SystemException(e.getMessage(), e);
}

PrismService.get().prismContext(this);
}

public static PrismContextImpl create(@NotNull SchemaRegistryImpl schemaRegistry) {
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.schema;

import javax.annotation.PostConstruct;
import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;
Expand All @@ -28,6 +29,17 @@ public class SchemaService {
@Autowired private PrismContext prismContext;
@Autowired private RelationRegistry relationRegistry;

private static SchemaService instance;

@PostConstruct
public void init() {
instance = this;
}

public static SchemaService get() {
return instance;
}

public PrismContext prismContext() {
return prismContext;
}
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.schema.expression;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -17,7 +18,7 @@
* @author Radovan Semancik
*
*/
public class ExpressionEvaluatorProfile {
public class ExpressionEvaluatorProfile implements Serializable {

private final QName type;
private AccessDecision decision;
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.schema.expression;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -20,7 +21,7 @@
*
* @author Radovan Semancik
*/
public class ExpressionPermissionProfile {
public class ExpressionPermissionProfile implements Serializable {

private final String identifier;
private AccessDecision decision;
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.schema.expression;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -20,7 +21,7 @@
* @author Radovan Semancik
*
*/
public class ExpressionProfile { // TODO: DebugDumpable
public class ExpressionProfile implements Serializable { // TODO: DebugDumpable

private final String identifier;
private AccessDecision decision;
Expand Down
Expand Up @@ -8,11 +8,13 @@

import com.evolveum.midpoint.schema.AccessDecision;

import java.io.Serializable;

/**
* @author semancik
*
*/
public class ScriptExpressionProfile {
public class ScriptExpressionProfile implements Serializable {

private final String language;
private AccessDecision decision;
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.test.util;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

Expand Down
Expand Up @@ -9,9 +9,12 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.AssertJUnit.*;

import java.io.Serializable;
import java.util.Collection;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.util.SerializationUtil;

import org.apache.commons.lang.StringUtils;
import org.testng.AssertJUnit;

Expand Down Expand Up @@ -111,4 +114,14 @@ public static void assertUriMatches(String current, String desc, String expected
.isNotNull()
.matches(s -> QNameUtil.matchUri(s, expected), "is " + expected);
}

public static void assertSerializable(Serializable serializable) {
try {
String s = SerializationUtil.toString(serializable);
System.out.println("Checked that " + serializable.getClass() + " is really serializable: size is " + s.length());
} catch (Throwable e) {
e.printStackTrace();
fail(serializable.getClass() + " is not serializable: " + e.getMessage());
}
}
}
Expand Up @@ -20,6 +20,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrderConstraintsType;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;
import java.util.List;

/**
Expand All @@ -31,7 +32,7 @@
* @author semancik
* @author mederly
*/
public interface AssignmentPath extends DebugDumpable, ShortDumpable, Cloneable {
public interface AssignmentPath extends DebugDumpable, ShortDumpable, Cloneable, Serializable {

List<? extends AssignmentPathSegment> getSegments();

Expand All @@ -46,8 +47,6 @@ public interface AssignmentPath extends DebugDumpable, ShortDumpable, Cloneable

int size();

// EvaluationOrder getEvaluationOrder();

AssignmentPathSegment last();

// beforeLast(0) means last()
Expand Down
Expand Up @@ -17,6 +17,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrderConstraintsType;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;
import java.util.List;

/**
Expand All @@ -27,7 +28,7 @@
* @author semancik
* @author mederly
*/
public interface AssignmentPathSegment extends DebugDumpable, ShortDumpable {
public interface AssignmentPathSegment extends DebugDumpable, ShortDumpable, Serializable {

// Returns version of the assignment (old/new) that was evaluated
AssignmentType getAssignment();
Expand Down
Expand Up @@ -6,6 +6,7 @@
*/
package com.evolveum.midpoint.model.api.context;

import java.io.Serializable;
import java.util.Collection;

import javax.xml.namespace.QName;
Expand All @@ -17,14 +18,15 @@
import com.evolveum.midpoint.security.api.Authorization;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.ShortDumpable;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import org.jetbrains.annotations.NotNull;

public interface EvaluatedAssignment<AH extends AssignmentHolderType> extends DebugDumpable {
public interface EvaluatedAssignment<AH extends AssignmentHolderType> extends ShortDumpable, DebugDumpable, Serializable {

AssignmentType getAssignmentType();

Expand Down
Expand Up @@ -13,11 +13,13 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;

/**
* @author semancik
*
*/
public interface EvaluatedAssignmentTarget extends DebugDumpable {
public interface EvaluatedAssignmentTarget extends DebugDumpable, Serializable {

@NotNull
PrismObject<? extends AssignmentHolderType> getTarget();
Expand Down
Expand Up @@ -16,6 +16,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.jetbrains.annotations.NotNull;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
Expand All @@ -25,7 +26,7 @@
*
* @author semancik
*/
public abstract class EvaluatedPolicyRuleTrigger<CT extends AbstractPolicyConstraintType> implements DebugDumpable {
public abstract class EvaluatedPolicyRuleTrigger<CT extends AbstractPolicyConstraintType> implements DebugDumpable, Serializable {

@NotNull private final PolicyConstraintKindType constraintKind;
@NotNull private final CT constraint;
Expand Down
Expand Up @@ -14,6 +14,8 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.Serializable;

/**
* Facade interface that provides insight about construction that was evaluated by projector code.
* It is used for several purposes, e.g. to display all evaluated assignments, both direct and indirect.
Expand All @@ -25,7 +27,7 @@
* @author mederly
* @author Radovan Semancik
*/
public interface EvaluatedResourceObjectConstruction extends DebugDumpable {
public interface EvaluatedResourceObjectConstruction extends DebugDumpable, Serializable {

/**
* Resource on which the object is to be constructed.
Expand Down
Expand Up @@ -7,6 +7,7 @@

package com.evolveum.midpoint.model.api.context;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
Expand All @@ -23,7 +24,7 @@
* @author semancik
* @author mederly
*/
public interface EvaluationOrder extends DebugDumpable, ShortDumpable, Cloneable {
public interface EvaluationOrder extends DebugDumpable, ShortDumpable, Cloneable, Serializable {

int getSummaryOrder();

Expand Down

0 comments on commit aeb862a

Please sign in to comment.