/* * Copyright (c) 2010-2016 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.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import com.evolveum.midpoint.model.api.context.AssignmentPath; import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPathType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.jetbrains.annotations.NotNull; /** * @author semancik * */ public class AssignmentPathImpl implements AssignmentPath { private final List<AssignmentPathSegmentImpl> segments = new ArrayList<>(); public AssignmentPathImpl() { } @Override public List<AssignmentPathSegmentImpl> getSegments() { return segments; } public void add(AssignmentPathSegmentImpl segment) { segments.add(segment); } public void removeLast(AssignmentPathSegmentImpl segment) { AssignmentPathSegmentImpl last = last(); if (last == null) { throw new IllegalStateException("Attempt to remove segment from empty path: " + this + "; segment=" + segment); } else if (!last.equals(segment)) { throw new IllegalStateException("Attempt to remove wrong segment from the end of path: " + this + "; segment=" + segment); } else { segments.remove(segments.size() - 1); } } @Override public AssignmentPathSegmentImpl first() { return segments.get(0); } @Override public boolean isEmpty() { return segments.isEmpty(); } @Override public int size() { return segments.size(); } // @Override // public EvaluationOrder getEvaluationOrder() { // if (isEmpty()) { // return EvaluationOrderImpl.ZERO; // } else { // return last().getEvaluationOrder(); // } // } @Override public AssignmentPathSegmentImpl last() { return beforeLast(0); } @Override public AssignmentPathSegmentImpl beforeLast(int n) { if (size() <= n) { return null; } else { return segments.get(segments.size()-1-n); } } @Override public boolean containsTarget(ObjectType target) { if (target == null) { return false; } for (AssignmentPathSegment segment: segments) { ObjectType segmentTarget = segment.getTarget(); if (segmentTarget != null) { if (segmentTarget.getOid() != null && target.getOid() != null && segmentTarget.getOid().equals(target.getOid())) { return true; } if (segmentTarget.getOid() == null && target.getOid() == null && segmentTarget.equals(target)) { return true; } } } return false; } @NotNull @Override public List<ObjectType> getFirstOrderChain() { return segments.stream() .filter(seg -> seg.isMatchingOrder() && seg.getTarget() != null) .map(seg -> seg.getTarget()) .collect(Collectors.toList()); } /** * Shallow clone. */ public AssignmentPathImpl clone() { AssignmentPathImpl clone = new AssignmentPathImpl(); clone.segments.addAll(this.segments); return clone; } @Override public String toString() { return "AssignmentPath(" + segments + ")"; } @Override public String debugDump() { return debugDump(0); } @Override public String debugDump(int indent) { StringBuilder sb = new StringBuilder(); DebugUtil.debugDumpLabel(sb, "AssignmentPath", indent); if (segments.isEmpty()) { sb.append(" (empty)"); } else { sb.append(" (").append(segments.size()).append(")"); if (DebugUtil.isDetailedDebugDump()) { sb.append("\n"); DebugUtil.debugDump(sb, segments, indent + 1, false); } else { for (AssignmentPathSegment segment: segments) { sb.append("\n"); DebugUtil.indentDebugDump(sb, indent + 1); sb.append(segment.toString()); } } } return sb.toString(); } @Override public AssignmentPathType toAssignmentPathType() { AssignmentPathType rv = new AssignmentPathType(); segments.forEach(seg -> rv.getSegment().add(seg.toAssignmentPathSegmentType())); return rv; } }