/*
* Copyright (c) 2010-2017 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.model.impl.lens;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.common.refinery.*;
import com.evolveum.midpoint.model.api.context.AssignmentPath;
import com.evolveum.midpoint.model.common.expression.ExpressionUtil;
import com.evolveum.midpoint.model.common.expression.ExpressionVariables;
import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject;
import com.evolveum.midpoint.model.common.mapping.Mapping;
import com.evolveum.midpoint.model.common.mapping.MappingFactory;
import com.evolveum.midpoint.model.impl.lens.projector.MappingEvaluator;
import com.evolveum.midpoint.model.impl.util.Utils;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.OriginType;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.marshaller.QueryConvertor;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.util.ItemPathUtil;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.processor.ResourceAttributeDefinition;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
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.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionStrengthType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectAssociationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
/**
* @author Radovan Semancik
*/
public abstract class AbstractConstruction<F extends FocusType, T extends AbstractConstructionType> implements DebugDumpable, Serializable {
private static final Trace LOGGER = TraceManager.getTrace(AbstractConstruction.class);
private AssignmentPathImpl assignmentPath;
private T constructionType;
private ObjectType source;
private OriginType originType;
private String channel;
private LensContext<F> lensContext;
private ObjectDeltaObject<F> focusOdo;
private ObjectResolver objectResolver;
private PrismContext prismContext;
private boolean isValid = true;
public AbstractConstruction(T constructionType, ObjectType source) {
this.constructionType = constructionType;
this.source = source;
this.assignmentPath = null;
}
public void setSource(ObjectType source) {
this.source = source;
}
public ObjectType getSource() {
return source;
}
public OriginType getOriginType() {
return originType;
}
public void setOriginType(OriginType originType) {
this.originType = originType;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public LensContext<F> getLensContext() {
return lensContext;
}
public void setLensContext(LensContext<F> lensContext) {
this.lensContext = lensContext;
}
public T getConstructionType() {
return constructionType;
}
public ObjectDeltaObject<F> getFocusOdo() {
return focusOdo;
}
public void setFocusOdo(ObjectDeltaObject<F> focusOdo) {
this.focusOdo = focusOdo;
}
public ObjectResolver getObjectResolver() {
return objectResolver;
}
public void setObjectResolver(ObjectResolver objectResolver) {
this.objectResolver = objectResolver;
}
PrismContext getPrismContext() {
return prismContext;
}
void setPrismContext(PrismContext prismContext) {
this.prismContext = prismContext;
}
public String getDescription() {
return constructionType.getDescription();
}
public boolean isWeak() {
return constructionType.getStrength() == ConstructionStrengthType.WEAK;
}
public boolean isValid() {
return isValid;
}
public void setValid(boolean isValid) {
this.isValid = isValid;
}
public AssignmentPathImpl getAssignmentPath() {
return assignmentPath;
}
public void setAssignmentPath(AssignmentPathImpl assignmentPath) {
this.assignmentPath = assignmentPath;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((assignmentPath == null) ? 0 : assignmentPath.hashCode());
result = prime * result + ((channel == null) ? 0 : channel.hashCode());
result = prime * result + ((constructionType == null) ? 0 : constructionType.hashCode());
result = prime * result + ((focusOdo == null) ? 0 : focusOdo.hashCode());
result = prime * result + (isValid ? 1231 : 1237);
result = prime * result + ((lensContext == null) ? 0 : lensContext.hashCode());
result = prime * result + ((objectResolver == null) ? 0 : objectResolver.hashCode());
result = prime * result + ((originType == null) ? 0 : originType.hashCode());
result = prime * result + ((prismContext == null) ? 0 : prismContext.hashCode());
result = prime * result + ((source == null) ? 0 : source.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AbstractConstruction other = (AbstractConstruction) obj;
if (assignmentPath == null) {
if (other.assignmentPath != null) {
return false;
}
} else if (!assignmentPath.equals(other.assignmentPath)) {
return false;
}
if (channel == null) {
if (other.channel != null) {
return false;
}
} else if (!channel.equals(other.channel)) {
return false;
}
if (constructionType == null) {
if (other.constructionType != null) {
return false;
}
} else if (!constructionType.equals(other.constructionType)) {
return false;
}
if (focusOdo == null) {
if (other.focusOdo != null) {
return false;
}
} else if (!focusOdo.equals(other.focusOdo)) {
return false;
}
if (isValid != other.isValid) {
return false;
}
if (lensContext == null) {
if (other.lensContext != null) {
return false;
}
} else if (!lensContext.equals(other.lensContext)) {
return false;
}
if (objectResolver == null) {
if (other.objectResolver != null) {
return false;
}
} else if (!objectResolver.equals(other.objectResolver)) {
return false;
}
if (originType != other.originType) {
return false;
}
if (prismContext == null) {
if (other.prismContext != null) {
return false;
}
} else if (!prismContext.equals(other.prismContext)) {
return false;
}
if (source == null) {
if (other.source != null) {
return false;
}
} else if (!source.equals(other.source)) {
return false;
}
return true;
}
}