/* * Copyright 2012 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.models.guided.template.backend.upgrade; import org.drools.workbench.models.commons.backend.IUpgradeHelper; import org.drools.workbench.models.datamodel.rule.CompositeFactPattern; import org.drools.workbench.models.datamodel.rule.CompositeFieldConstraint; import org.drools.workbench.models.datamodel.rule.ConnectiveConstraint; import org.drools.workbench.models.datamodel.rule.FactPattern; import org.drools.workbench.models.datamodel.rule.FieldConstraint; import org.drools.workbench.models.datamodel.rule.IPattern; import org.drools.workbench.models.datamodel.rule.RuleModel; import org.drools.workbench.models.datamodel.rule.SingleFieldConstraint; /** * Utility class to support upgrades of the RuleModel model. This implementation * ensures additional ConnectiveConstraints fields created for Guvnor v5.2 have * reasonable default values. */ public class RuleModelUpgradeHelper2 implements IUpgradeHelper<RuleModel, RuleModel> { public RuleModel upgrade( RuleModel model ) { updateConnectiveConstraints( model ); return model; } //Connective Constraints in 5.2.0 were changed to include the Fact and Field to which they relate. //While this should not be necessary (as a ConnectiveConstraint is a further constraint on an already //known Fact and Field) it became essential as a hack to have ConnectiveConstraints on sub-fields //in a Pattern when an Expression is not used. This codes ensures ConnectiveConstraints on legacy //repositories have the fields correctly set. private void updateConnectiveConstraints( RuleModel model ) { for ( IPattern p : model.lhs ) { fixConnectiveConstraints( p ); } } //Descent into the model private void fixConnectiveConstraints( IPattern p ) { if ( p instanceof FactPattern) { fixConnectiveConstraints((FactPattern) p); } else if ( p instanceof CompositeFactPattern) { fixConnectiveConstraints( (CompositeFactPattern) p ); } } private void fixConnectiveConstraints( FactPattern p ) { for ( FieldConstraint fc : p.getFieldConstraints() ) { fixConnectiveConstraints( fc ); } } private void fixConnectiveConstraints( CompositeFactPattern p ) { for ( IPattern sp : p.getPatterns() ) { fixConnectiveConstraints( sp ); } } private void fixConnectiveConstraints( FieldConstraint fc ) { if ( fc instanceof SingleFieldConstraint) { fixConnectiveConstraints( (SingleFieldConstraint) fc ); } else if ( fc instanceof CompositeFieldConstraint) { fixConnectiveConstraints( (CompositeFieldConstraint) fc ); } } private void fixConnectiveConstraints( SingleFieldConstraint sfc ) { if ( sfc.getConnectives() == null ) { return; } for ( ConnectiveConstraint cc : sfc.getConnectives() ) { if ( cc.getFieldName() == null ) { cc.setFieldName( sfc.getFieldName() ); cc.setFieldType( sfc.getFieldType() ); } } } private void fixConnectiveConstraints( CompositeFieldConstraint cfc ) { if ( cfc.getConstraints() == null ) { return; } for ( FieldConstraint fc : cfc.getConstraints() ) { fixConnectiveConstraints( fc ); } } }