/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.drools.workbench.services.verifier.api.client.relations; import org.drools.workbench.services.verifier.api.client.maps.InspectorList; import org.drools.workbench.services.verifier.api.client.maps.util.HasUUID; public class ConflictResolver { private final InspectorList collection; private final Conflicts conflicts; public ConflictResolver( final InspectorList list, final boolean record ) { this.collection = list; conflicts = new Conflicts( record ); } private Conflict isConflicting( final InspectorList otherCollection ) { if ( collection == null || otherCollection == null ) { return Conflict.EMPTY; } for ( Object o : collection ) { if ( o instanceof IsConflicting ) { final Conflict conflict = hasConflictingObjectInList( otherCollection, ( IsConflicting ) o ); if ( conflict.foundIssue() ) { return new Conflict( collection, otherCollection, conflict ); } } } return Conflict.EMPTY; } private static Conflict getConflictingObjects( final InspectorList collection, final IsConflicting isConflicting ) { if ( isConflicting == null || collection == null ) { return Conflict.EMPTY; } for ( final Object other : collection ) { return isConflicting( isConflicting, ( HasUUID ) other ); } return Conflict.EMPTY; } private static Conflict hasConflictingObjectInList( final InspectorList collection, final IsConflicting isConflicting ) { return getConflictingObjects( collection, isConflicting ); } static Conflict isConflicting( final HasUUID isConflicting, final HasUUID other ) { if ( isConflicting instanceof IsConflicting ) { if ( (( IsConflicting ) isConflicting).conflicts( other ) ) { return new Conflict( isConflicting, other ); } } return Conflict.EMPTY; } public Conflict resolveConflict( final InspectorList otherCollection ) { final Conflict first = conflicts.get( otherCollection.getUuidKey() ); if ( first != null ) { if ( first.doesRelationStillExist() ) { return first; } else { // Clean conflict conflicts.remove( first ); // Restart resolution return resolveConflict( otherCollection ); } } else { final Conflict conflict = isConflicting( otherCollection ); if ( conflict.foundIssue() ) { conflicts.add( conflict ); return conflict; } else { return Conflict.EMPTY; } } } }