/*
* Copyright 2014 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.datamodel.rule.visitors;
import java.util.List;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.datamodel.rule.ExpressionCollection;
import org.drools.workbench.models.datamodel.rule.ExpressionCollectionIndex;
import org.drools.workbench.models.datamodel.rule.ExpressionField;
import org.drools.workbench.models.datamodel.rule.ExpressionFieldVariable;
import org.drools.workbench.models.datamodel.rule.ExpressionFormLine;
import org.drools.workbench.models.datamodel.rule.ExpressionGlobalVariable;
import org.drools.workbench.models.datamodel.rule.ExpressionMethod;
import org.drools.workbench.models.datamodel.rule.ExpressionMethodParameter;
import org.drools.workbench.models.datamodel.rule.ExpressionPart;
import org.drools.workbench.models.datamodel.rule.ExpressionText;
import org.drools.workbench.models.datamodel.rule.ExpressionUnboundFact;
import org.drools.workbench.models.datamodel.rule.ExpressionVariable;
import org.drools.workbench.models.datamodel.rule.ExpressionVisitor;
import org.drools.workbench.models.datamodel.rule.builder.DRLConstraintValueBuilder;
/**
* A visitor that can emit a String representing the Expression
*/
public class ToStringExpressionVisitor implements
ExpressionVisitor {
private StringBuilder sb;
private DRLConstraintValueBuilder constraintValueBuilder;
private boolean first;
public ToStringExpressionVisitor() {
this( DRLConstraintValueBuilder.getBuilder( DRLConstraintValueBuilder.DEFAULT_DIALECT ) );
}
public ToStringExpressionVisitor( final DRLConstraintValueBuilder constraintValueBuilder ) {
this.constraintValueBuilder = constraintValueBuilder;
}
public void visit( ExpressionPart part ) {
if ( part == null ) {
return;
}
sb = new StringBuilder();
first = true;
part.accept( this );
}
public void visit( ExpressionField part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionMethod part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() )
.append( '(' )
.append( paramsToString( part.getOrderedParams() ) )
.append( ')' );
moveNext( part );
}
public void visit( ExpressionVariable part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionUnboundFact part ) {
moveNext( part,
false );
}
public void visit( ExpressionGlobalVariable part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionCollection part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionCollectionIndex part ) {
sb.append( '[' ).append( paramsToString( part.getOrderedParams() ) ).append( ']' );
moveNext( part );
}
public void visit( ExpressionFieldVariable part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionText part ) {
if ( !first ) {
sb.append( '.' );
}
sb.append( part.getName() );
moveNext( part );
}
public void visit( ExpressionMethodParameter part ) {
if ( !first ) {
sb.append( '.' );
}
constraintValueBuilder.buildLHSFieldValue( sb,
BaseSingleFieldConstraint.TYPE_LITERAL,
part.getClassType(),
part.getName() );
moveNext( part );
}
public String getText() {
return sb.toString();
}
private String paramsToString( List<ExpressionFormLine> params ) {
if ( params.isEmpty() ) {
return "";
}
StringBuilder strParams = new StringBuilder();
for ( ExpressionFormLine param : params ) {
ToStringExpressionVisitor visitor = new ToStringExpressionVisitor( constraintValueBuilder );
visitor.visit( param.getRootExpression() );
strParams.append( ", " ).append( visitor.getText() );
}
return strParams.substring( 2 );
}
private void moveNext( ExpressionPart exp ) {
moveNext( exp,
true );
}
private void moveNext( ExpressionPart exp,
boolean resetFirst ) {
if ( exp.getNext() != null ) {
if ( resetFirst ) {
first = false;
}
exp.getNext().accept( this );
}
}
}