📄 mannersnativetest.java
字号:
package org.drools.examples;
/*
* $Id: MannersNativeTest.java,v 1.13 2005/02/04 02:13:37 mproctor Exp $
*
* Copyright 2002 (C) The Werken Company. All Rights Reserved.
*
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain copyright statements and
* notices. Redistributions must also contain a copy of this document.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name "drools" must not be used to endorse or promote products derived
* from this Software without prior written permission of The Werken Company.
* For written permission, please contact bob@werken.com.
*
* 4. Products derived from this Software may not be called "drools" nor may
* "drools" appear in their names without prior written permission of The Werken
* Company. "drools" is a registered trademark of The Werken Company.
*
* 5. Due credit should be given to The Werken Company.
* (http://drools.werken.com/).
*
* THIS SOFTWARE IS PROVIDED BY THE WERKEN COMPANY AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE WERKEN COMPANY OR ITS CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.StringTokenizer;
import junit.framework.TestCase;
import org.drools.FactException;
import org.drools.RuleBase;
import org.drools.RuleBaseBuilder;
import org.drools.TestWorkingMemoryEventListener;
import org.drools.WorkingMemory;
import org.drools.examples.model.Context;
import org.drools.examples.model.Guest;
import org.drools.examples.model.LastSeat;
import org.drools.examples.model.Seat;
import org.drools.examples.model.Seating;
import org.drools.rule.Declaration;
import org.drools.rule.Rule;
import org.drools.rule.RuleSet;
import org.drools.spi.Condition;
import org.drools.spi.Consequence;
import org.drools.spi.ConsequenceException;
import org.drools.spi.Tuple;
/**
* @author Andy Barnett
*/
public class MannersNativeTest extends TestCase
implements
Serializable
{
/** Drools working memory. */
private WorkingMemory workingMemory;
/** Number of guests at the dinner (default: 16). */
private int numGuests = 16;
/** Number of seats at the table (default: 16). */
private int numSeats = 16;
/** Minimum number of hobbies each guest should have (default: 2). */
private int minHobbies = 2;
/** Maximun number of hobbies each guest should have (default: 3). */
private int maxHobbies = 3;
protected void setUp() throws Exception
{
// Reuse the Java semantics ObjectType
// so Drools can identify the model classes
ClassObjectType contextType = new ClassObjectType( Context.class );
ClassObjectType guestType = new ClassObjectType( Guest.class );
ClassObjectType seatingType = new ClassObjectType( Seating.class );
ClassObjectType lastSeatType = new ClassObjectType( LastSeat.class );
// <rule-set name="Miss Manners" ...>
RuleSet ruleSet = new RuleSet( "Miss Manners" );
// ===========================================
// <rule name="find first seat" salience="40">
// ===========================================
final Rule findFirstSeatRule = new Rule( "find first seat" );
findFirstSeatRule.setSalience( 40 );
// Build the declaration and specify it as a parameter of the Rule
// <parameter identifier="context">
// <class>org.drools.examples.manners.model.Context</class>
// </parameter>
final Declaration contextDeclA = findFirstSeatRule.addParameterDeclaration( "context",
contextType );
// <parameter identifier="guest">
// <class>org.drools.examples.manners.model.Guest</class>
// </parameter>
final Declaration guestDeclA = findFirstSeatRule.addParameterDeclaration( "guest",
guestType );
// Build and Add the Condition to the Rule
// <java:condition>context.isState("start")</java:condition>
final Condition conditionA1 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Context context = (Context) tuple.get( contextDeclA );
return context.isState( "start" );
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{contextDeclA};
}
public String toString()
{
return "context.isState(\"start\")";
}
};
findFirstSeatRule.addCondition( conditionA1 );
// Build and Add the Consequence to the Rule
// <java:consequence>
// System.out.println("FIRE: find first seat: " + guest);
// import org.drools.examples.manners.model.Seating;
// drools.assertObject(new Seating(1, guest, null));
// context.setState("find_seating");
// drools.modifyObject(context);
// </java:consequence>
final Consequence consequenceA = new Consequence( )
{
public void invoke(Tuple tuple) throws ConsequenceException
{
WorkingMemory workingMemory = tuple.getWorkingMemory( );
Context context = (Context) tuple.get( contextDeclA );
Guest guest = (Guest) tuple.get( guestDeclA );
try
{
workingMemory.assertObject( new Seating( 1,
guest,
null ) );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
context.setState( "find_seating" );
try
{
workingMemory.modifyObject( tuple.getFactHandleForObject( context ),
context );
}
catch ( FactException e )
{
throw new ConsequenceException( e );
}
}
};
findFirstSeatRule.setConsequence( consequenceA );
ruleSet.addRule( findFirstSeatRule );
// ========================================
// <rule name="find seating" salience="30">
// ========================================
final Rule findSeatingRule = new Rule( "find seating" );
findSeatingRule.setSalience( 30 );
// Build the declaration and specify it as a parameter of the Rule
// <parameter identifier="context">
// <class>org.drools.examples.manners.model.Context</class>
// </parameter>
final Declaration contextDeclB = findSeatingRule.addParameterDeclaration( "context",
contextType );
// <parameter identifier="guest">
// <class>org.drools.examples.manners.model.Guest</class>
// </parameter>
final Declaration guestDeclB = findSeatingRule.addParameterDeclaration( "guest",
guestType );
// <parameter identifier="seating">
// <class>org.drools.examples.manners.model.Seating</class>
// </parameter>
final Declaration seatingDeclB = findSeatingRule.addParameterDeclaration( "seating",
seatingType );
// Build and Add the Condition to the Rule
// <java:condition>context.isState("find_seating")</java:condition>
final Condition conditionB1 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Context context = (Context) tuple.get( contextDeclB );
return context.isState( "find_seating" );
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{contextDeclB};
}
public String toString()
{
return "context.isState(\"find_seating\")";
}
};
findSeatingRule.addCondition( conditionB1 );
// <java:condition>seating.getGuest2() == null</java:condition>
final Condition conditionB2 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Seating seating = (Seating) tuple.get( seatingDeclB );
return seating.getGuest2( ) == null;
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{seatingDeclB};
}
public String toString()
{
return "seating.getGuest2() == null";
}
};
findSeatingRule.addCondition( conditionB2 );
// <java:condition>!seating.getTabooList().contains(guest)</java:condition>
final Condition conditionB3 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Seating seating = (Seating) tuple.get( seatingDeclB );
Guest guest = (Guest) tuple.get( guestDeclB );
return !seating.getTabooList( ).contains( guest );
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{seatingDeclB, guestDeclB};
}
public String toString()
{
return "!seating.getTabooList().contains(guest)";
}
};
findSeatingRule.addCondition( conditionB3 );
// <java:condition>seating.getGuest1().hasOppositeSex(guest)</java:condition>
final Condition conditionB4 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Seating seating = (Seating) tuple.get( seatingDeclB );
Guest guest = (Guest) tuple.get( guestDeclB );
return seating.getGuest1( ).hasOppositeSex( guest );
}
public Declaration[] getRequiredTupleMembers()
{
return new Declaration[]{seatingDeclB, guestDeclB};
}
public String toString()
{
return "seating.getGuest1().hasOppositeSex(guest)";
}
};
findSeatingRule.addCondition( conditionB4 );
// <java:condition>seating.getGuest1().hasSameHobby(guest)</java:condition>
final Condition conditionB5 = new Condition( )
{
public boolean isAllowed(Tuple tuple)
{
Seating seating = (Seating) tuple.get( seatingDeclB );
Guest guest = (Guest) tuple.get( guestDeclB );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -