001: /*
002: * Copyright 2006 JBoss Inc
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.drools.rule;
018:
019: import java.util.ArrayList;
020: import java.util.Collections;
021: import java.util.HashMap;
022: import java.util.Iterator;
023: import java.util.List;
024: import java.util.Map;
025:
026: /**
027: * The forall conditional element.
028: *
029: * @author etirelli
030: */
031: public class Forall extends ConditionalElement {
032:
033: private static final long serialVersionUID = 400L;
034:
035: // forall base pattern
036: private Pattern basePattern;
037: // foral remaining patterns
038: private List remainingPatterns;
039:
040: public Forall() {
041: this (null, new ArrayList(1));
042: }
043:
044: public Forall(final Pattern basePattern) {
045: this (basePattern, new ArrayList(1));
046: }
047:
048: public Forall(final Pattern basePattern,
049: final List remainingPatterns) {
050: this .basePattern = basePattern;
051: this .remainingPatterns = remainingPatterns;
052: }
053:
054: /* (non-Javadoc)
055: * @see org.drools.rule.ConditionalElement#clone()
056: */
057: public Object clone() {
058: return new Forall(this .basePattern, new ArrayList(
059: this .remainingPatterns));
060: }
061:
062: /**
063: * Forall inner declarations are only provided by the base patterns
064: * since it negates the remaining patterns
065: */
066: public Map getInnerDeclarations() {
067: final Map inner = new HashMap(this .basePattern
068: .getOuterDeclarations());
069: for (final Iterator it = this .remainingPatterns.iterator(); it
070: .hasNext();) {
071: inner.putAll(((Pattern) it.next()).getOuterDeclarations());
072: }
073: return inner;
074: }
075:
076: /**
077: * Forall does not export any declarations
078: */
079: public Map getOuterDeclarations() {
080: return Collections.EMPTY_MAP;
081: }
082:
083: /**
084: * Forall can only resolve declarations from its base pattern
085: */
086: public Declaration resolveDeclaration(final String identifier) {
087: return (Declaration) this .getInnerDeclarations()
088: .get(identifier);
089: }
090:
091: /**
092: * @return the basePattern
093: */
094: public Pattern getBasePattern() {
095: return this .basePattern;
096: }
097:
098: /**
099: * @param basePattern the basePattern to set
100: */
101: public void setBasePattern(final Pattern basePattern) {
102: this .basePattern = basePattern;
103: }
104:
105: /**
106: * @return the remainingPatterns
107: */
108: public List getRemainingPatterns() {
109: return this .remainingPatterns;
110: }
111:
112: /**
113: * @param remainingPatterns the remainingPatterns to set
114: */
115: public void setRemainingPatterns(final List remainingPatterns) {
116: this .remainingPatterns = remainingPatterns;
117: }
118:
119: /**
120: * Adds one more pattern to the list of remaining patterns
121: * @param pattern
122: */
123: public void addRemainingPattern(final Pattern pattern) {
124: this.remainingPatterns.add(pattern);
125: }
126:
127: }
|