/*
* 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.core.cache.inspectors;
import java.util.Collection;
import org.drools.workbench.services.verifier.api.client.configuration.AnalyzerConfiguration;
import org.drools.workbench.services.verifier.api.client.index.Action;
import org.drools.workbench.services.verifier.api.client.index.Condition;
import org.drools.workbench.services.verifier.api.client.index.Field;
import org.drools.workbench.services.verifier.api.client.index.ObjectField;
import org.drools.workbench.services.verifier.api.client.index.keys.Key;
import org.drools.workbench.services.verifier.api.client.index.keys.UUIDKey;
import org.drools.workbench.services.verifier.api.client.index.select.AllListener;
import org.drools.workbench.services.verifier.api.client.maps.InspectorList;
import org.drools.workbench.services.verifier.api.client.maps.UpdatableInspectorList;
import org.drools.workbench.services.verifier.api.client.maps.util.HasConflicts;
import org.drools.workbench.services.verifier.api.client.maps.util.HasKeys;
import org.drools.workbench.services.verifier.api.client.relations.Conflict;
import org.drools.workbench.services.verifier.api.client.relations.HumanReadable;
import org.drools.workbench.services.verifier.api.client.relations.IsConflicting;
import org.drools.workbench.services.verifier.api.client.relations.IsRedundant;
import org.drools.workbench.services.verifier.api.client.relations.IsSubsuming;
import org.uberfire.commons.validation.PortablePreconditions;
import org.drools.workbench.services.verifier.core.cache.inspectors.action.ActionInspector;
import org.drools.workbench.services.verifier.core.cache.inspectors.action.ActionInspectorFactory;
import org.drools.workbench.services.verifier.core.cache.inspectors.condition.ConditionInspector;
import org.drools.workbench.services.verifier.core.cache.inspectors.condition.ConditionInspectorFactory;
public class FieldInspector
implements HasConflicts,
IsConflicting,
IsSubsuming,
IsRedundant,
HumanReadable,
HasKeys {
private final ObjectField objectField;
private final UpdatableInspectorList<ActionInspector, Action> actionInspectorList;
private final UpdatableInspectorList<ConditionInspector, Condition> conditionInspectorList;
private final UUIDKey uuidKey;
private final RuleInspectorUpdater ruleInspectorUpdater;
public FieldInspector( final Field field,
final RuleInspectorUpdater ruleInspectorUpdater,
final AnalyzerConfiguration configuration ) {
this( field.getObjectField(),
ruleInspectorUpdater,
configuration );
configuration.getUUID( this );
updateActionInspectors( field.getActions()
.where( Action.value()
.any() )
.select()
.all() );
updateConditionInspectors( field.getConditions()
.where( Condition.value()
.any() )
.select()
.all() );
setupActionsListener( field );
setupConditionsListener( field );
}
public FieldInspector( final ObjectField field,
final RuleInspectorUpdater ruleInspectorUpdater,
final AnalyzerConfiguration configuration ) {
this.objectField = PortablePreconditions.checkNotNull( "field",
field );
this.ruleInspectorUpdater = PortablePreconditions.checkNotNull( "ruleInspectorUpdater",
ruleInspectorUpdater );
uuidKey = configuration.getUUID( this );
actionInspectorList = new UpdatableInspectorList<>( new ActionInspectorFactory( configuration ),
configuration );
conditionInspectorList = new UpdatableInspectorList<>( new ConditionInspectorFactory( configuration ),
configuration );
}
private void setupConditionsListener( final Field field ) {
field.getConditions()
.where( Condition.value()
.any() )
.listen()
.all( new AllListener<Condition>() {
@Override
public void onAllChanged( final Collection<Condition> all ) {
updateConditionInspectors( all );
ruleInspectorUpdater.resetConditionsInspectors();
}
} );
}
private void setupActionsListener( final Field field ) {
field.getActions()
.where( Action.value()
.any() )
.listen()
.all( new AllListener<Action>() {
@Override
public void onAllChanged( final Collection<Action> all ) {
updateActionInspectors( all );
ruleInspectorUpdater.resetActionsInspectors();
}
} );
}
public ObjectField getObjectField() {
return objectField;
}
private void updateConditionInspectors( final Collection<Condition> all ) {
conditionInspectorList.update( all );
}
private void updateActionInspectors( final Collection<Action> all ) {
actionInspectorList.update( all );
}
public InspectorList<ActionInspector> getActionInspectorList() {
return actionInspectorList;
}
public InspectorList<ConditionInspector> getConditionInspectorList() {
return conditionInspectorList;
}
@Override
public Conflict hasConflicts() {
int index = 1;
for ( final ConditionInspector conditionInspector : conditionInspectorList ) {
for ( int j = index; j < conditionInspectorList.size(); j++ ) {
if ( conditionInspector.conflicts( conditionInspectorList.get( j ) ) ) {
return new Conflict( conditionInspector,
conditionInspectorList.get( j ) );
}
}
index++;
}
return Conflict.EMPTY;
}
@Override
public boolean conflicts( final Object other ) {
if ( other instanceof FieldInspector && objectField.equals( ( (FieldInspector) other ).objectField ) ) {
final boolean conflicting = actionInspectorList.conflicts( ( (FieldInspector) other ).actionInspectorList );
if ( conflicting ) {
return true;
} else {
return conditionInspectorList.conflicts( ( (FieldInspector) other ).conditionInspectorList );
}
} else {
return false;
}
}
@Override
public boolean isRedundant( final Object other ) {
if ( other instanceof FieldInspector && objectField.equals( ( (FieldInspector) other ).objectField ) ) {
return actionInspectorList.isRedundant( ( (FieldInspector) other ).actionInspectorList )
&& conditionInspectorList.isRedundant( ( (FieldInspector) other ).conditionInspectorList );
} else {
return false;
}
}
@Override
public boolean subsumes( final Object other ) {
if ( other instanceof FieldInspector && objectField.equals( ( (FieldInspector) other ).objectField ) ) {
return actionInspectorList.subsumes( ( (FieldInspector) other ).actionInspectorList )
&& conditionInspectorList.subsumes( ( (FieldInspector) other ).conditionInspectorList );
} else {
return false;
}
}
@Override
public String toHumanReadableString() {
return objectField.getName();
}
@Override
public UUIDKey getUuidKey() {
return uuidKey;
}
@Override
public Key[] keys() {
return new Key[]{
uuidKey
};
}
}