/*
* Copyright 2010 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.compiler.lang.descr;
import org.drools.core.util.StringUtils;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This is used to connect restrictions together for a single field
* eg:
* age < 40 & > 30
*/
public class ConnectiveDescr extends RestrictionDescr {
private static final long serialVersionUID = 510l;
public final static RestrictionConnectiveType AND = RestrictionConnectiveType.AND;
public final static RestrictionConnectiveType OR = RestrictionConnectiveType.OR;
private RestrictionConnectiveType connective;
private List<Object> children;
private String prefix;
private boolean paren;
public ConnectiveDescr() { }
public ConnectiveDescr(final RestrictionConnectiveType connective) {
super();
this.connective = connective;
this.children = Collections.emptyList();
this.paren = true;
}
@Override
public void readExternal( ObjectInput in ) throws IOException,
ClassNotFoundException {
super.readExternal( in );
this.connective = (RestrictionConnectiveType) in.readObject();
this.children = (List<Object>) in.readObject();
this.prefix = (String) in.readObject();
this.paren = in.readBoolean();
}
@Override
public void writeExternal( ObjectOutput out ) throws IOException {
super.writeExternal( out );
out.writeObject(connective);
out.writeObject( children );
out.writeObject( prefix );
out.writeBoolean( paren );
}
public RestrictionConnectiveType getConnective() {
return this.connective;
}
public boolean isParen() {
return paren;
}
public void setParen(boolean paren) {
this.paren = paren;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void add(ConnectiveDescr restriction) {
if ( this.children == Collections.EMPTY_LIST ) {
this.children = new ArrayList<Object>(2);
}
this.children.add( restriction );
}
public void add(String restriction) {
if ( this.children == Collections.EMPTY_LIST ) {
this.children = new ArrayList<Object>(2);
}
this.children.add( restriction );
}
public List<Object> getRestrictions() {
return this.children;
}
public void buildExpression(StringBuilder sb ) {
if ( !StringUtils.isEmpty( prefix )) {
sb.append( prefix );
sb.append( " " );
}
for ( int i = 0; i < this.children.size(); i++ ) {
if ( isParen() && children.get( i ) instanceof ConnectiveDescr ) {
sb.append( "(" );
((ConnectiveDescr)children.get( i ) ).buildExpression( sb );
sb.append( ")" );
} else {
sb.append( children.get( i ) );
}
if ( i < this.children.size() -1 ) {
sb.append( " " );
sb.append( connective );
sb.append( " " );
}
}
}
public String toString() {
final StringBuilder buf = new StringBuilder();
buildExpression( buf );
return buf.toString();
}
/**
* The connective types that can be used for a restriction
*/
public static enum RestrictionConnectiveType {
AND {
public String toString() {
return "&&";
}
},
OR {
public String toString() {
return "||";
}
};
}
}