/*
* 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 SingleFieldConstraint and ConnectiveConstraint fields
* created for Guvnor v5.4 have reasonable default values.
*/
public class RuleModelUpgradeHelper3
implements
IUpgradeHelper<RuleModel, RuleModel> {
public RuleModel upgrade( RuleModel model ) {
updateConstraints( model );
return model;
}
//As from 5.4.0 FieldConstraints hold the FactType to which they relate. This is necessary as
//both "nested" field constraints and ExpressionFormLine constraints didn't have knowledge of the
//FactType to which they related and hence field completions could not be ascertained. This also
//restores fieldNames, that were temporarily fully qualified with the factType, before this more
//complete fix was made. See BZ724448 (Support for BigDecimal in Guided Editors)
private void updateConstraints( RuleModel model ) {
for ( IPattern p : model.lhs ) {
fixConstraints( p );
}
}
//Descent into the model
private void fixConstraints( IPattern p ) {
if ( p instanceof FactPattern ) {
fixConstraints( (FactPattern) p );
} else if ( p instanceof CompositeFactPattern ) {
fixConstraints( (CompositeFactPattern) p );
}
}
private void fixConstraints( FactPattern p ) {
for ( FieldConstraint fc : p.getFieldConstraints() ) {
fixConstraints( p,
fc );
}
}
private void fixConstraints( CompositeFactPattern p ) {
for ( IPattern cp : p.getPatterns() ) {
fixConstraints( cp );
}
}
private void fixConstraints( FactPattern fp,
FieldConstraint fc ) {
if ( fc instanceof SingleFieldConstraint ) {
fixConstraints( fp,
(SingleFieldConstraint) fc );
} else if ( fc instanceof CompositeFieldConstraint ) {
fixConstraints( fp,
(CompositeFieldConstraint) fc );
}
}
private void fixConstraints( FactPattern fp,
SingleFieldConstraint sfc ) {
final FieldConstraint parent = sfc.getParent();
if ( parent == null ) {
sfc.setFactType( fp.getFactType() );
} else if ( parent instanceof SingleFieldConstraint ) {
sfc.setFactType( ( (SingleFieldConstraint) parent ).getFieldType() );
}
sfc.setFieldName( fixFieldName( sfc.getFieldName() ) );
if ( sfc.getConnectives() == null ) {
return;
}
for ( ConnectiveConstraint cc : sfc.getConnectives() ) {
cc.setFactType( fp.getFactType() );
cc.setFieldName( fixFieldName( cc.getFieldName() ) );
}
}
private void fixConstraints( FactPattern fp,
CompositeFieldConstraint cfc ) {
if ( cfc.getConstraints() == null ) {
return;
}
for ( FieldConstraint fc : cfc.getConstraints() ) {
fixConstraints( fp, fc );
}
}
private String fixFieldName( String fieldName ) {
if ( fieldName == null ) {
return null;
}
int dotIndex = fieldName.indexOf( "." );
if ( dotIndex != -1 ) {
return fieldName.substring( dotIndex + 1 );
}
return fieldName;
}
}