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.reteoo.builder;
018:
019: import java.util.ArrayList;
020: import java.util.List;
021:
022: import org.drools.common.BetaConstraints;
023: import org.drools.common.TupleStartEqualsConstraint;
024: import org.drools.reteoo.CollectNode;
025: import org.drools.reteoo.ObjectSource;
026: import org.drools.reteoo.RightInputAdapterNode;
027: import org.drools.reteoo.TupleSource;
028: import org.drools.rule.Collect;
029: import org.drools.rule.Pattern;
030: import org.drools.rule.RuleConditionElement;
031: import org.drools.spi.AlphaNodeFieldConstraint;
032:
033: /**
034: * @author etirelli
035: *
036: */
037: public class CollectBuilder implements ReteooComponentBuilder {
038:
039: /**
040: * @inheritDoc
041: */
042: public void build(final BuildContext context,
043: final BuildUtils utils, final RuleConditionElement rce) {
044:
045: boolean existSubNetwort = false;
046: final Collect collect = (Collect) rce;
047:
048: final List resultBetaConstraints = context.getBetaconstraints();
049: final List resultAlphaConstraints = context
050: .getAlphaConstraints();
051:
052: final Pattern sourcePattern = collect.getSourcePattern();
053:
054: // get builder for the pattern
055: final ReteooComponentBuilder builder = utils
056: .getBuilderFor(sourcePattern);
057:
058: // save tuple source and pattern offset for later if needed
059: final TupleSource tupleSource = context.getTupleSource();
060: final int currentPatternIndex = context
061: .getCurrentPatternOffset();
062:
063: // builds the source pattern
064: builder.build(context, utils, sourcePattern);
065:
066: // if object source is null, then we need to adapt tuple source into a subnetwork
067: if (context.getObjectSource() == null) {
068:
069: // attach right input adapter node to convert tuple source into an object source
070: context.setObjectSource((ObjectSource) utils.attachNode(
071: context, new RightInputAdapterNode(context
072: .getNextId(), context.getTupleSource())));
073:
074: // restore tuple source from before the start of the sub network
075: context.setTupleSource(tupleSource);
076:
077: // create a tuple start equals constraint and set it in the context
078: final TupleStartEqualsConstraint constraint = TupleStartEqualsConstraint
079: .getInstance();
080: final List betaConstraints = new ArrayList();
081: betaConstraints.add(constraint);
082: context.setBetaconstraints(betaConstraints);
083: existSubNetwort = true;
084: }
085:
086: BetaConstraints binder = utils.createBetaNodeConstraint(
087: context, context.getBetaconstraints(), false);
088: BetaConstraints resultBinder = utils.createBetaNodeConstraint(
089: context, resultBetaConstraints, false);
090:
091: context
092: .setTupleSource((TupleSource) utils
093: .attachNode(
094: context,
095: new CollectNode(
096: context.getNextId(),
097: context.getTupleSource(),
098: context.getObjectSource(),
099: (AlphaNodeFieldConstraint[]) resultAlphaConstraints
100: .toArray(new AlphaNodeFieldConstraint[resultAlphaConstraints
101: .size()]),
102: binder, // source binder
103: resultBinder, collect,
104: existSubNetwort)));
105: // source pattern was bound, so nulling context
106: context.setObjectSource(null);
107: context.setCurrentPatternOffset(currentPatternIndex);
108: }
109:
110: /**
111: * @inheritDoc
112: */
113: public boolean requiresLeftActivation(final BuildUtils utils,
114: final RuleConditionElement rce) {
115: return true;
116: }
117:
118: }
|