/** * Copyright 2010 JBoss Inc * * 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.rule; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * The forall conditional element. * * @author etirelli */ public class Forall extends ConditionalElement { private static final long serialVersionUID = 510l; // forall base pattern private Pattern basePattern; // foral remaining patterns private List remainingPatterns; public Forall() { this( null, new ArrayList( 1 ) ); } public Forall(final Pattern basePattern) { this( basePattern, new ArrayList( 1 ) ); } public Forall(final Pattern basePattern, final List remainingPatterns) { this.basePattern = basePattern; this.remainingPatterns = remainingPatterns; } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { basePattern = (Pattern)in.readObject(); remainingPatterns = (List)in.readObject(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(basePattern); out.writeObject(remainingPatterns); } /* (non-Javadoc) * @see org.drools.rule.ConditionalElement#clone() */ public Object clone() { return new Forall( this.basePattern, new ArrayList( this.remainingPatterns ) ); } /** * Forall inner declarations are only provided by the base patterns * since it negates the remaining patterns */ public Map getInnerDeclarations() { final Map inner = new HashMap( this.basePattern.getOuterDeclarations() ); for ( final Iterator it = this.remainingPatterns.iterator(); it.hasNext(); ) { inner.putAll( ((Pattern) it.next()).getOuterDeclarations() ); } return inner; } /** * Forall does not export any declarations */ public Map getOuterDeclarations() { return Collections.EMPTY_MAP; } /** * Forall can only resolve declarations from its base pattern */ public Declaration resolveDeclaration(final String identifier) { return (Declaration) this.getInnerDeclarations().get( identifier ); } /** * @return the basePattern */ public Pattern getBasePattern() { return this.basePattern; } /** * @param basePattern the basePattern to set */ public void setBasePattern(final Pattern basePattern) { this.basePattern = basePattern; } /** * @return the remainingPatterns */ public List getRemainingPatterns() { return this.remainingPatterns; } /** * @param remainingPatterns the remainingPatterns to set */ public void setRemainingPatterns(final List remainingPatterns) { this.remainingPatterns = remainingPatterns; } /** * Adds one more pattern to the list of remaining patterns * @param pattern */ public void addRemainingPattern(final Pattern pattern) { this.remainingPatterns.add( pattern ); } public List getNestedElements() { List elements = new ArrayList( 1 + this.remainingPatterns.size() ); elements.add( this.basePattern ); elements.addAll( this.remainingPatterns ); return elements; } public boolean isPatternScopeDelimiter() { return true; } @Override public String toString() { return "forall( "+basePattern+" "+remainingPatterns+" )"; } }