[jboss-svn-commits] JBL Code SVN: r14773 - in labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku: rules and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 31 05:22:45 EDT 2007


Author: pete.bennett at jboss.com
Date: 2007-08-31 05:22:44 -0400 (Fri, 31 Aug 2007)
New Revision: 14773

Added:
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Main.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/AbstractCellValue.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsSudokuGridModel.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsUtil.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/PossibleCellValue.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/ResolvedCellValue.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/AbstractSudokuGridModel.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridEvent.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridListener.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridModel.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridSamples.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridView.java
Removed:
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Field.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/FieldGenerator.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/PossibleValue.java
   labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/SudokuExample.java
Log:


Deleted: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Field.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Field.java	2007-08-31 05:28:13 UTC (rev 14772)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Field.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -1,49 +0,0 @@
-package org.drools.examples.sudoku;
-/**
- *
- * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
- */
-public class Field {
-
-	private String value;
-	private int column;
-	private int row;
-	private int zone;
-	public Field() {
-		super();
-	}
-	public Field(String value, int column, int row, int zone) {
-		super();
-		this.value = value;
-		this.column = column;
-		this.row = row;
-		this.zone = zone;
-	}
-	public int getColumn() {
-		return column;
-	}
-	public void setColumn(int column) {
-		this.column = column;
-	}
-	public int getRow() {
-		return row;
-	}
-	public void setRow(int row) {
-		this.row = row;
-	}
-	public String getValue() {
-		return value;
-	}
-	public void setValue(String value) {
-		this.value = value;
-	}
-	public int getZone() {
-		return zone;
-	}
-	public void setZone(int zone) {
-		this.zone = zone;
-	}
-	public String toString(){
-		return "Value=" + value + " Column=" + column + " Row=" + row + " Zone=" + zone;
-	}
-}

Deleted: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/FieldGenerator.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/FieldGenerator.java	2007-08-31 05:28:13 UTC (rev 14772)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/FieldGenerator.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -1,79 +0,0 @@
-package org.drools.examples.sudoku;
-/**
- * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
- */
-public class FieldGenerator {
-
-	private static FieldGenerator fieldGenerator = new FieldGenerator();
-	public static FieldGenerator getInstance(){
-		return fieldGenerator;
-	}
-	public int[][] getField(){
-		return new int[][]{{0, 5, 6, 8, 0, 1, 9, 4, 0},
-						   {9, 0, 0, 6, 0, 5, 0, 0, 3},
-						   {7, 0, 0, 4, 9, 3, 0, 0, 8},
-						   {8, 9, 7, 0, 4, 0, 6, 3, 5},
-						   {0, 0, 3, 9, 0, 6, 8, 0, 0},
-						   {4, 6, 5, 0, 8, 0, 2, 9, 1},
-						   {5, 0, 0, 2, 6, 9, 0, 0, 7},
-						   {6, 0, 0, 5, 0, 4, 0, 0, 9},
-						   {0, 4, 9, 7, 0, 8, 3, 5, 0}};
-	}
-	public int[][] getFieldMiddle(){
-		return new int[][]{{8, 4, 7, 0, 0, 0, 2, 5, 6},
-						   {5, 0, 0, 0, 8, 0, 0, 0, 4},
-						   {2, 0, 0, 0, 7, 0, 0, 0, 8},
-						   {0, 0, 0, 3, 0, 8, 0, 0, 0},
-						   {0, 5, 1, 0, 0, 0, 8, 7, 2},
-						   {0, 0, 0, 5, 0, 7, 0, 0, 0},
-						   {4, 0, 0, 0, 5, 0, 0, 0, 7},
-						   {6, 0, 0, 0, 3, 0, 0, 0, 9},
-						   {1, 3, 2, 0, 0, 0, 4, 8, 5}};
-	}
-	public int[][] getFieldHard(){
-		return new int[][]{{0, 0, 0, 0, 5, 1, 0, 8, 0},
-						   {0, 8, 0, 0, 4, 0, 0, 0, 5},
-						   {0, 0, 3, 0, 0, 0, 2, 0, 0},
-						   {0, 0, 0, 0, 6, 0, 0, 0, 9},
-						   {6, 7, 0, 4, 0, 9, 0, 1, 3},
-						   {8, 0, 0, 0, 3, 0, 0, 0, 0},
-						   {0, 0, 2, 0, 0, 0, 4, 0, 0},
-						   {5, 0, 0, 0, 9, 0, 0, 2, 0},
-						   {0, 9, 0, 7, 1, 0, 0, 0, 0}};
-	}
-	
-	public int[][] getFieldHard2(){
-		return new int[][]{{0,0,0,6,0,0,1,0,0},
-						   {0,0,0,0,0,5,0,0,6},
-						   {5,0,7,0,0,0,2,3,0},
-						   {0,8,0,9,0,7,0,0,0},
-						   {9,3,0,0,0,0,0,6,7},
-						   {0,0,0,4,0,6,0,1,0},
-						   {0,7,4,0,0,0,9,0,1},
-						   {8,0,0,7,0,0,0,0,0},
-						   {0,0,3,0,0,8,0,0,0}};
-	}
-	
-	public int[][] getFieldHard3(){
-		return new int[][]{{0,8,0,0,0,6,0,0,5},
-						   {2,0,0,0,0,0,4,8,0},
-						   {0,0,9,0,0,8,0,1,0},
-						   {0,0,0,0,8,0,1,0,2},
-						   {0,0,0,3,0,1,0,0,0},
-						   {6,0,1,0,9,0,0,0,0},
-						   {0,9,0,4,0,0,8,0,0},
-						   {0,7,6,0,0,0,0,0,3},
-						   {1,0,0,7,0,0,0,5,0}};
-	}
-	public int[][] getFieldHard4(){
-		return new int[][]{{0,0,0,0,0,4,0,9,5},
-						   {6,7,0,5,0,0,0,1,0},
-						   {0,0,0,6,0,9,0,0,0},
-						   {0,2,0,0,0,0,4,0,0},
-						   {8,1,0,0,0,0,0,7,2},
-						   {0,0,7,0,0,0,0,8,0},
-						   {0,0,0,3,0,5,0,0,0},
-						   {0,6,0,0,0,1,0,5,8},
-						   {7,3,0,9,0,0,0,0,0}};
-	}
-}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Main.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Main.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/Main.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,141 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+
+import org.drools.examples.sudoku.rules.DroolsSudokuGridModel;
+import org.drools.examples.sudoku.swing.SudokuGridSamples;
+import org.drools.examples.sudoku.swing.SudokuGridView;
+
+/**
+ * This example shows how Drools can be used to solve a 9x9 Sudoku Grid.
+ * <p
+ * This Class hooks together the GUI and the model and allows you to 
+ * load different grids.
+ * 
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public class Main
+   implements ActionListener
+{
+   private JFrame mainFrame;
+   private SudokuGridView sudokuGridView;
+   private DroolsSudokuGridModel droolsSudokuGridModel;
+   private JMenuBar menuBar = new JMenuBar();
+   private JMenu fileMenu = new JMenu("File");
+   private JMenu samplesMenu = new JMenu("Samples");
+   private JMenuItem openMenuItem = new JMenuItem("Open...");
+   private JMenuItem exitMenuItem = new JMenuItem("Exit");
+   private BorderLayout borderLayout = new BorderLayout();
+   private FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
+   private JPanel buttonPanel = new JPanel(flowLayout);
+   private JButton solveButton = new JButton("Solve Grid");
+   private JFileChooser fileChooser;
+   
+   public static void main(String[] args)
+   {
+      @SuppressWarnings("unused")
+      Main main = new Main();
+   }
+   
+   public Main()
+   {
+      mainFrame = new JFrame("Drools Sudoku Example");
+      for (String sampleName : SudokuGridSamples.getInstance().getSampleNames())
+      {
+         JMenuItem menuItem = new JMenuItem(sampleName);
+         menuItem.addActionListener(this);
+         samplesMenu.add(menuItem);
+      }
+      fileMenu.add(samplesMenu);
+      openMenuItem.addActionListener(this);
+      // fileMenu.add(openMenuItem);
+      exitMenuItem.addActionListener(this);
+      fileMenu.add(exitMenuItem);
+      menuBar.add(fileMenu);
+      mainFrame.setJMenuBar(menuBar);
+      sudokuGridView = new SudokuGridView();
+      droolsSudokuGridModel = new DroolsSudokuGridModel(SudokuGridSamples.getInstance().getSample("Simple"));
+      mainFrame.setLayout(borderLayout);
+      mainFrame.add(BorderLayout.CENTER, sudokuGridView);
+      buttonPanel.add(solveButton);
+      solveButton.addActionListener(this);
+      mainFrame.add(BorderLayout.SOUTH, buttonPanel);
+      mainFrame.setSize(400,400);
+      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+      mainFrame.setVisible(true);
+      sudokuGridView.setModel(droolsSudokuGridModel);
+   }
+
+   public void actionPerformed(ActionEvent ev)
+   {
+      if (ev.getSource().equals(solveButton))
+      {
+         long startTime = System.currentTimeMillis();
+
+         if (droolsSudokuGridModel.solve())
+         {
+            solveButton.setText("Solved ("+(System.currentTimeMillis()-startTime)+" ms)");
+            solveButton.setEnabled(false);
+         }
+         else
+         {
+            solveButton.setText("Unsolved ("+(System.currentTimeMillis()-startTime)+" ms)");
+            solveButton.setEnabled(false);            
+         }
+      }
+      else if (ev.getSource().equals(openMenuItem))
+      {
+         if (fileChooser == null)
+         {
+            fileChooser = new JFileChooser();
+         }
+         
+         try
+         {
+            if (fileChooser.showOpenDialog(mainFrame) == JFileChooser.APPROVE_OPTION)
+            {
+               System.out.println(fileChooser.getSelectedFile().getCanonicalPath());
+            }
+         }
+         catch (IOException ex)
+         {
+            ex.printStackTrace();
+         }
+      }
+      else if (ev.getSource().equals(exitMenuItem))
+      {
+         System.exit(0);
+      }
+      else if (ev.getSource() instanceof JMenuItem)
+      {
+         JMenuItem menuItem = (JMenuItem) ev.getSource();
+         droolsSudokuGridModel = new DroolsSudokuGridModel(SudokuGridSamples.getInstance().getSample(menuItem.getText()));
+         sudokuGridView.setModel(droolsSudokuGridModel);
+         solveButton.setText("Solve");
+         solveButton.setEnabled(true);
+      }
+      else
+      {
+         //
+      }
+   }
+}

Deleted: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/PossibleValue.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/PossibleValue.java	2007-08-31 05:28:13 UTC (rev 14772)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/PossibleValue.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -1,52 +0,0 @@
-package org.drools.examples.sudoku;
-/**
- * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
- */
-public class PossibleValue {
-	
-	private String value;
-	private int column;
-	private int row;
-	private int zone;
-	public PossibleValue() {
-		super();
-	}
-	public PossibleValue(String value, int column, int row, int zone) {
-		super();
-		this.value = value;
-		this.column = column;
-		this.row = row;
-		this.zone = zone;
-	}
-	public PossibleValue(String value, Field field) {
-		super();
-		this.value = value;
-		this.column = field.getColumn();
-		this.row = field.getRow();
-		this.zone = field.getZone();
-	}
-	public int getColumn() {
-		return column;
-	}
-	public void setColumn(int column) {
-		this.column = column;
-	}
-	public int getRow() {
-		return row;
-	}
-	public void setRow(int row) {
-		this.row = row;
-	}
-	public String getValue() {
-		return value;
-	}
-	public void setValue(String value) {
-		this.value = value;
-	}
-	public int getZone() {
-		return zone;
-	}
-	public void setZone(int zone) {
-		this.zone = zone;
-	}
-}

Deleted: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/SudokuExample.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/SudokuExample.java	2007-08-31 05:28:13 UTC (rev 14772)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/SudokuExample.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -1,166 +0,0 @@
-package org.drools.examples.sudoku;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuleBaseFactory;
-import org.drools.StatefulSession;
-import org.drools.compiler.PackageBuilder;
-import org.drools.rule.Package;
-
-/**
- * This example shows, how a Sudoku puzzle can be solved using JBoss Rules
- * 
- * @author <a href="mailto:michael.frandsen at syngenio.de">Michael Frandsen</a>
- */
-public class SudokuExample {
-
-    public static void testWithInput(int[][] field) {
-        StatefulSession session = null;
-        try {
-            Collection fields = new ArrayList();
-            //create Fields for every element of the matrix
-            //Print Sudoku, which is to solve
-            for ( int i = 0; i < field.length; i++ ) {
-                String row = "{";
-                for ( int j = 0; j < field[i].length; j++ ) {
-                    row += field[i][j] + ",";
-                    fields.add( new Field( "" + field[i][j],
-                                           j + 1,
-                                           i + 1,
-                                           getZone( i,
-                                                    j ) ) );
-                }
-                row += "}";
-                System.out.println( row );
-            }
-            //load up the rulebase
-            RuleBase ruleBase = readRule();
-            session = ruleBase.newStatefulSession();
-
-            //go !
-            Iterator iter = fields.iterator();
-
-            Collection handles = new ArrayList();
-            while ( iter.hasNext() ) {
-                handles.add( session.insert( iter.next() ) );
-            }
-            session.fireAllRules();
-
-            System.out.println( "Size: " + iteratorToList( session.iterateObjects() ).size() );
-
-            //Get Result
-            iter = session.iterateObjects();
-            //Copy the values of the fields into the matrix
-            while ( iter.hasNext() ) {
-                Object next = iter.next();
-                if ( next instanceof Field ) {
-                    field[((Field) next).getRow() - 1][((Field) next).getColumn() - 1] = Integer.parseInt( ((Field) next).getValue() );
-                }
-            }
-
-            //Pr
-            for ( int i = 0; i < field.length; i++ ) {
-                String row = "{";
-                for ( int j = 0; j < field[i].length; j++ ) {
-                    row += field[i][j] + ",";
-                    fields.add( new Field( "" + field[i][j],
-                                           j + 1,
-                                           i + 1,
-                                           getZone( i,
-                                                    j ) ) );
-                }
-                row += "}";
-                System.out.println( row );
-            }
-
-        } catch ( Throwable t ) {
-            t.printStackTrace();
-        } finally {
-            if ( session != null ) {
-                session.dispose();
-            }
-        }
-    }
-
-    public static final void main(String[] args) {
-        //    	testWithInput(FieldGenerator.getInstance().getField());
-        //    	testWithInput(FieldGenerator.getInstance().getFieldMiddle());
-        //    	testWithInput(FieldGenerator.getInstance().getFieldHard());
-        //    	testWithInput(FieldGenerator.getInstance().getFieldHard2());
-        //    	testWithInput(FieldGenerator.getInstance().getFieldHard3());
-        testWithInput( FieldGenerator.getInstance().getFieldHard4() );
-    }
-
-    private static int getZone(int row,
-                               int column) {
-        if ( column < 3 && row < 3 ) {
-            return 1;
-        } else if ( column < 6 && row < 3 ) {
-            return 2;
-        } else if ( column < 9 && row < 3 ) {
-            return 3;
-        } else if ( column < 3 && row < 6 ) {
-            return 4;
-        } else if ( column < 6 && row < 6 ) {
-            return 5;
-        } else if ( column < 9 && row < 6 ) {
-            return 6;
-        } else if ( column < 3 ) {
-            return 7;
-        } else if ( column < 6 ) {
-            return 8;
-        } else if ( column < 9 ) {
-            return 9;
-        }
-        return 0;
-    }
-
-    /**
-     * Please note that this is the "low level" rule assembly API.
-     */
-    private static RuleBase readRule() throws Exception {
-        //read in the source
-        Reader source = new InputStreamReader( SudokuExample.class.getResourceAsStream( "sudoku.drl" ) );
-
-        //optionally read in the DSL (if you are using it).
-        //Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
-
-        //Use package builder to build up a rule package.
-        //An alternative lower level class called "DrlParser" can also be used...
-
-        PackageBuilder builder = new PackageBuilder();
-
-        //this wil parse and compile in one step
-        //NOTE: There are 2 methods here, the one argument one is for normal DRL.
-        builder.addPackageFromDrl( source );
-
-        //Use the following instead of above if you are using a DSL:
-        //builder.addPackageFromDrl( source, dsl );
-
-        //get the compiled package (which is serializable)
-        Package pkg = builder.getPackage();
-
-        //add the package to a rulebase (deploy the rule package).
-        RuleBaseConfiguration conf = new RuleBaseConfiguration();
-        conf.setRemoveIdentities( true );
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                                         conf );
-        ruleBase.addPackage( pkg );
-        return ruleBase;
-    }
-
-    private static List iteratorToList(Iterator it) {
-        List list = new ArrayList();
-        for ( ; it.hasNext(); ) {
-            list.add( it.next() );
-        }
-        return list;
-    }
-}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/AbstractCellValue.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/AbstractCellValue.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/AbstractCellValue.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,101 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.rules;
+
+import org.drools.examples.sudoku.swing.SudokuGridModel;
+
+/**
+ * An abstract class which contains the methods common to both a PossibleCellValue
+ * in a Sudoku grid or a ResolvedCellValue. Stores the row and col for the cell
+ * as well as the 3x3 "zone" in which the cell is contained and the value 
+ * entered in the cell.
+ * 
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class AbstractCellValue
+{
+   // The value for this cell in the Grid from 1-9
+   private int value;
+   
+   // The row for this cell in the Grid
+   private int row;
+   
+   // The column for this cell in the Grid
+   private int col;
+   
+   // The zone for this cell in the Grid
+   private int zone;         
+   
+   /**
+    * Create a new AbstractCellValue with the specified value at the given
+    * row and column in the Grid. The zone is added automatically.
+    * 
+    * @param value the value for this cell in the Grid from 1-9
+    * @param row the value for this cell in the Grid from 1-9
+    * @param col the value for this cell in the Grid from 1-9
+    */
+   protected AbstractCellValue(int value, int row, int col)
+   {
+      this.value = value;
+      this.row = row;
+      this.col = col;
+      this.zone = deriveZone(row, col);
+   }
+   
+   /**
+    * Derives the 3x3 zone in which the cell is located based on its row and column
+    * 
+    * @param row the cell's row, from 0-8
+    * @param col the cell's column, from 0-8
+    * @return the cells's zone from 1-9
+    */
+   private int deriveZone(int row, int col)
+   {
+      return SudokuGridModel.ZONE_LOOKUP[row][col];
+   }
+   
+   /**
+    * Return the value stored in this cell
+    * 
+    * @return the cell's value from 1-9
+    */
+   public int getValue()
+   {
+      return value;
+   }
+
+   /**
+    * Return the row for this cell
+    * 
+    * @return the cell's row from 0-8
+    */
+   public int getRow()
+   {
+      return row;
+   }
+   
+   /**
+    * Return the column for this cell
+    * 
+    * @return the cell's column from 0-8
+    */
+   public int getCol()
+   {
+      return col;
+   }
+
+   /**
+    * Return the zone for this cell
+    * 
+    * @return the cell's zone from 1-9
+    */
+   public int getZone()
+   {
+      return zone;
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsSudokuGridModel.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsSudokuGridModel.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsSudokuGridModel.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,252 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.rules;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.drools.RuleBase;
+import org.drools.StatefulSession;
+import org.drools.event.ObjectInsertedEvent;
+import org.drools.event.ObjectRetractedEvent;
+import org.drools.event.ObjectUpdatedEvent;
+import org.drools.event.WorkingMemoryEventListener;
+import org.drools.examples.sudoku.swing.AbstractSudokuGridModel;
+import org.drools.examples.sudoku.swing.SudokuGridEvent;
+import org.drools.examples.sudoku.swing.SudokuGridModel;
+
+/**
+ * An implementation of the SudokuGridModel interface which is backed by the Drools engine.
+ * <p>
+ * Two rule bases are used in this implementation. The first, defined at SUDOKU_SOLVER_DRL 
+ * provides a set of rules that attempt to solve a partially completed Sudoku grid. The
+ * second, defined at SUDOKU_VALIDATOR_DRL provides a set of rules which can validate 
+ * whether the current state of the model represents a valid solution.
+ * <p>
+ * 
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public class DroolsSudokuGridModel
+   extends AbstractSudokuGridModel
+   implements SudokuGridModel
+{
+   /**
+    * The location of the DRL file which defines the rule base for solving a Sudoku grid
+    */
+   public final static String SUDOKU_SOLVER_DRL = "../sudokuSolver.drl";
+   
+   /**
+    * The location of the DRL file which defines the rule base for validating the content of a Sudoku grid
+    */
+   public final static String SUDOKU_VALIDATOR_DRL = "../sudokuValidator.drl";
+   
+   /** A set of AbtractCellValues capturing the current state of the grid */
+   private Set<AbstractCellValue> allCellValues = new HashSet<AbstractCellValue>();
+
+   /** The solver rule base */
+   private RuleBase solverRuleBase;
+   
+   /** The stateful session working memory for the solver rule base */
+   private StatefulSession solverStatefulSession;
+
+   /** An inner class implementation listening to working memory events */
+   private SudokuWorkingMemoryListener workingMemoryListener = new SudokuWorkingMemoryListener();
+   
+   /**
+    * Create a new DroolsSudokuGridModel with an empty grid.
+    */
+   public DroolsSudokuGridModel()
+   {
+   
+   }
+
+   /**
+    * Create a new DroolsSudokuGridModel with the specified values.
+    * 
+    * @param cellValues a two dimensional grid of Integer values for cells, a null means the value is not yet resolved
+    */
+   public DroolsSudokuGridModel(Integer[][] cellValues)
+   {  
+      this();
+      setCellValues(cellValues);
+   }
+   
+   public void setCellValues(Integer[][] cellValues)
+   {
+      if (solverRuleBase == null)
+      {
+         try
+         {
+            solverRuleBase = DroolsUtil.getInstance().readRuleBase(SUDOKU_SOLVER_DRL);
+         }
+         catch(Exception ex)
+         {
+            ex.printStackTrace();
+            throw new RuntimeException("Error Reading RuleBase for Solver");
+         }         
+      }
+      
+      if (solverStatefulSession != null)
+      {
+         solverStatefulSession.removeEventListener(workingMemoryListener);
+      }
+      
+      solverStatefulSession = solverRuleBase.newStatefulSession();
+      solverStatefulSession.addEventListener(workingMemoryListener);
+      
+      for(int row=0; row<cellValues.length; row++)
+      {
+         for (int col=0; col<cellValues[row].length; col++)
+         {
+            if(cellValues[row][col] == null)
+            {
+               for(int value=1; value<10; value++)
+               {
+                  PossibleCellValue cellValue = new PossibleCellValue(value, row, col);
+                  allCellValues.add(cellValue);
+               }
+            }
+            else
+            {
+               ResolvedCellValue cellValue = new ResolvedCellValue(cellValues[row][col], row, col);
+               allCellValues.add(cellValue);
+            }
+         }
+      }
+      
+      insertAllCellValues(solverStatefulSession);
+   }
+   
+   public boolean isCellEditable(int row, int col)
+   {
+      return false;
+   }
+   
+   public boolean isCellResolved(int row, int col)
+   {
+      return getPossibleCellValues(row, col).size() == 1;
+   }
+   
+   public boolean isGridSolved()
+   {
+      boolean solved = true;
+      
+      for(int row=0; row<NUM_ROWS; row++)
+      {
+         for (int col=0; col<NUM_COLS; col++)
+         {
+            if(!isCellResolved(row, col))
+            {
+               System.out.println("("+row+","+col+") has not been resolved");
+               solved=false;
+            }
+         }
+      }
+      
+      if (solved)
+      {
+         try
+         {
+            RuleBase validatorRuleBase = DroolsUtil.getInstance().readRuleBase(SUDOKU_VALIDATOR_DRL);
+            
+            StatefulSession validatorStatefulSession = validatorRuleBase.newStatefulSession();
+            List issues = new ArrayList();
+            validatorStatefulSession.setGlobal("issues", issues);
+            insertAllCellValues(validatorStatefulSession);
+            validatorStatefulSession.fireAllRules();
+            
+            if (issues.isEmpty())
+            {
+               System.out.println("Sucessfully Validated Solution");
+            }
+            else
+            {
+               solved = false;
+               for (Object issue : issues)
+               {
+                  System.out.println(issue);
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            ex.printStackTrace();
+            throw new RuntimeException();
+         }
+      }
+      
+      return solved;
+   }
+   
+   public List<Integer> getPossibleCellValues(int row, int col)
+   {
+      List<Integer> possibleCellValues = new ArrayList<Integer>();
+
+      for (AbstractCellValue cellValue : allCellValues)
+      {
+         if (cellValue.getRow() == row && cellValue.getCol() == col)
+         {
+            possibleCellValues.add(cellValue.getValue());
+         }
+      }
+      
+      return possibleCellValues;
+   }
+   
+   public boolean solve()
+   {
+      solverStatefulSession.fireAllRules();
+      
+      return isGridSolved();
+   }
+   
+   private void insertAllCellValues(StatefulSession statefulSession)
+   {
+      for (AbstractCellValue cellValue : allCellValues)
+      {
+         statefulSession.insert(cellValue);
+      }
+   }
+
+   class SudokuWorkingMemoryListener
+      implements WorkingMemoryEventListener
+   {
+      public void objectInserted(ObjectInsertedEvent ev)
+      {
+         if (ev.getObject() instanceof AbstractCellValue)
+         {
+            allCellValues.add(((AbstractCellValue) ev.getObject()));
+         }
+         
+         if (ev.getObject() instanceof ResolvedCellValue)
+         {
+            ResolvedCellValue cellValue = (ResolvedCellValue) ev.getObject();
+            fireCellResolvedEvent(new SudokuGridEvent(this, cellValue.getRow(), cellValue.getCol(), cellValue.getValue()));
+         }
+      }
+   
+      public void objectRetracted(ObjectRetractedEvent ev)
+      {
+         if (ev.getOldObject() instanceof AbstractCellValue)
+         {
+            allCellValues.remove(((AbstractCellValue) ev.getOldObject()));
+         }     
+      }
+   
+      public void objectUpdated(ObjectUpdatedEvent ev)
+      {
+         if (ev.getObject() instanceof ResolvedCellValue)
+         {
+            ResolvedCellValue cellValue = (ResolvedCellValue) ev.getObject();
+            fireCellUpdatedEvent(new SudokuGridEvent(this, cellValue.getRow(), cellValue.getCol(), cellValue.getValue()));
+   
+         }     
+      }
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsUtil.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/DroolsUtil.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,69 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.rules;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.rule.Package;
+
+public class DroolsUtil
+{
+   private static DroolsUtil INSTANCE;
+   
+   private DroolsUtil()
+   {
+      
+   }
+   
+   public static DroolsUtil getInstance()
+   {
+      if (INSTANCE == null)
+      {
+         INSTANCE = new DroolsUtil();
+      }
+      
+      return INSTANCE;
+   }
+   
+   public RuleBase readRuleBase(String drlFileName) 
+      throws Exception 
+   {
+      //read in the source
+      Reader source = new InputStreamReader( DroolsSudokuGridModel.class.getResourceAsStream(drlFileName) );
+   
+      //optionally read in the DSL (if you are using it).
+      //Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
+   
+      //Use package builder to build up a rule package.
+      //An alternative lower level class called "DrlParser" can also be used...
+   
+      PackageBuilder builder = new PackageBuilder();
+   
+      //this wil parse and compile in one step
+      //NOTE: There are 2 methods here, the one argument one is for normal DRL.
+      builder.addPackageFromDrl( source );
+   
+      //Use the following instead of above if you are using a DSL:
+      //builder.addPackageFromDrl( source, dsl );
+   
+      //get the compiled package (which is serializable)
+      Package pkg = builder.getPackage();
+   
+      //add the package to a rulebase (deploy the rule package).
+      RuleBaseConfiguration conf = new RuleBaseConfiguration();
+      conf.setRemoveIdentities( true );
+      RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                                       conf );
+      ruleBase.addPackage( pkg );
+      return ruleBase;
+   }   
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/PossibleCellValue.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/PossibleCellValue.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/PossibleCellValue.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.rules;
+
+/**
+ * Represents a possible value for a given cell, used when we are not 
+ * currently certain what the value for this cell is, so we need 
+ * to associated multiple PossibleCellValue objects with the 
+ * same row and column in the Grid.
+ * 
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public final class PossibleCellValue
+   extends AbstractCellValue
+{
+   /**
+    * Uses the constructor on the superclass to construct a new PossibleCellValue
+    * 
+    * @param value the potential value in the cell from 1-9
+    * @param row the row index from 0-8
+    * @param col the column index from 0-8
+    */
+   public PossibleCellValue(int value, int row, int col)
+   {
+      super(value, row, col);
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/ResolvedCellValue.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/ResolvedCellValue.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/rules/ResolvedCellValue.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.rules;
+
+/**
+ * Represents a single, resolved value for a given cell, used when we 
+ * have determined what the value for this cell is, only a 
+ * single ResolvedCellValue object should be associated with a 
+ * given row and column in a solved Grid.
+ * 
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public class ResolvedCellValue
+   extends AbstractCellValue
+{
+   /**
+    * Uses the constructor on the superclass to construct a new ResolvedCellValue
+    * 
+    * @param value the resolved value in the cell from 1-9
+    * @param row the row index from 0-8
+    * @param col the column index from 0-8
+    */   
+   public ResolvedCellValue(int value, int row, int col)
+   {
+      super(value, row, col);
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/AbstractSudokuGridModel.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/AbstractSudokuGridModel.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/AbstractSudokuGridModel.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,59 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import javax.swing.event.EventListenerList;
+
+public abstract class AbstractSudokuGridModel
+{
+   private EventListenerList listenerList = new EventListenerList();
+
+   public void addSudokuGridListener(SudokuGridListener l)
+   {
+      listenerList.add(SudokuGridListener.class, l);
+   }
+   
+   public void removeSudokuGridListener(SudokuGridListener l)
+   {
+      listenerList.remove(SudokuGridListener.class, l);
+   }
+
+   // Notify all listeners that have registered interest for
+   // notification on this event type.  The event instance 
+   // is lazily created using the parameters passed into 
+   // the fire method.
+
+   protected void fireCellResolvedEvent(SudokuGridEvent ev)
+   {
+      // Guaranteed to return a non-null array
+      Object[] listeners = listenerList.getListenerList();
+      // Process the listeners last to first, notifying
+      // those that are interested in this event
+      for (int i = listeners.length - 2; i >= 0; i -= 2)
+      {
+         if (listeners[i] == SudokuGridListener.class)
+         {
+            ((SudokuGridListener) listeners[i + 1]).cellResolved(ev);
+         }
+      }
+   }
+   
+   protected void fireCellUpdatedEvent(SudokuGridEvent ev)
+   {
+      // Guaranteed to return a non-null array
+      Object[] listeners = listenerList.getListenerList();
+      // Process the listeners last to first, notifying
+      // those that are interested in this event
+      for (int i = listeners.length - 2; i >= 0; i -= 2)
+      {
+         if (listeners[i] == SudokuGridListener.class)
+         {
+            ((SudokuGridListener) listeners[i + 1]).cellModified(ev);
+         }
+      }
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridEvent.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridEvent.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import java.util.EventObject;
+
+public class SudokuGridEvent 
+   extends EventObject
+{
+   /** The serialVersionUID */
+   private static final long serialVersionUID = 1L;
+   
+   private int row;
+   private int col;
+   private int value;
+   
+   public SudokuGridEvent(Object source)
+   {
+      super(source);
+   }
+   
+   public SudokuGridEvent(Object source, int row, int col, int value)
+   {
+      this(source);
+      this.row=row;
+      this.col=col;
+      this.value=value;
+   }
+
+   public int getCol()
+   {
+      return col;
+   }
+
+   public int getRow()
+   {
+      return row;
+   }
+
+   public int getValue()
+   {
+      return value;
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridListener.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridListener.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import java.util.EventListener;
+
+/**
+ * Defines the callbacks that can be implemented to listen to events from a SudokuGridModel.
+ * 
+ * @see SudokuGridModel
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public interface SudokuGridListener
+   extends EventListener
+{
+   /**
+    * Fired when a cell in the Sudoku grid is resolved for the first time to a specific value
+    * 
+    * @param ev an event containing the cell which is resolved along with the value it now has
+    */
+   public void cellResolved(SudokuGridEvent ev);
+
+   /**
+    * Fired when a cell in the Sudoku grid is updated to a new value
+    * 
+    * @param ev an event containing the cell which is updated along with the value it now has
+    */
+   public void cellModified(SudokuGridEvent ev);
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridModel.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridModel.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridModel.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,69 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import java.util.List;
+
+/**
+ * An interface representing a 9x9 Sudoku Grid of Cells.
+ * <p>
+ * In a solved Sodoku grid, each cell must contain an 
+ * integer from 1-9 and the same integer must not be 
+ * repeated in the same row, in the same column or in 
+ * the same 3x3 subsection of the grid.
+ * 
+ * @see SudokuGridListener
+ * @see SudokuGridEvent
+ * @see SudokuGridView
+ * @see AbstractSudokuGridModel
+ * @author <a href="pbennett at redhat.com">Pete Bennett</a>
+ * @version $Revision: 1.1 $
+ */
+public interface SudokuGridModel
+{
+   /**
+    * The number of rows in the Grid, i.e. the height
+    */
+   public static int NUM_ROWS = 9;
+
+   /**
+    * The number of columns in the Grid, i.e. the width
+    */
+   public static int NUM_COLS = 9;
+   
+   
+   /**
+    * A NUM_ROWSxNUM_COLS two dimensional array which maps from rows and columns
+    * to the 3x3 subzones in a Sudoku grid
+    */
+   public static int[][] ZONE_LOOKUP = 
+   { { 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3},
+     { 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3},
+     { 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3},
+     { 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6},
+     { 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6},
+     { 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6},
+     { 7 , 7 , 7 , 8 , 8 , 8 , 9 , 9 , 9},
+     { 7 , 7 , 7 , 8 , 8 , 8 , 9 , 9 , 9},
+     { 7 , 7 , 7 , 8 , 8 , 8 , 9 , 9 , 9} };  
+   
+   public void setCellValues(Integer[][] cellValues);
+   
+   public boolean isCellEditable(int row, int col);
+   
+   public boolean isCellResolved(int row, int col);
+   
+   public List<Integer> getPossibleCellValues(int row, int col);
+   
+   public boolean solve();
+   
+   public boolean isGridSolved();
+   
+   public void addSudokuGridListener(SudokuGridListener l);   
+   
+   public void removeSudokuGridListener(SudokuGridListener l);
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridSamples.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridSamples.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridSamples.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,144 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class SudokuGridSamples
+{
+   private Map<String, Integer[][]> samples = new HashMap<String, Integer[][]>();
+   private static SudokuGridSamples INSTANCE;
+   
+   private SudokuGridSamples()
+   {
+      samples.put
+      (
+        "Simple",
+        new Integer[][] 
+       {{null, 5, 6, 8, null, 1, 9, 4, null},
+        {9, null, null, 6, null, 5, null, null, 3},
+        {7, null, null, 4, 9, 3, null, null, 8},
+        {8, 9, 7, null, 4, null, 6, 3, 5},
+        {null, null, 3, 9, null, 6, 8, null, null},
+        {4, 6, 5, null, 8, null, 2, 9, 1},
+        {5, null, null, 2, 6, 9, null, null, 7},
+        {6, null, null, 5, null, 4, null, null, 9},
+        {null, 4, 9, 7, null, 8, 3, 5, null}}
+      );
+      
+      samples.put
+      (
+        "Medium",
+        new Integer[][] 
+       {{8, 4, 7, null, null, null, 2, 5, 6},
+               {5, null, null, null, 8, null, null, null, 4},
+               {2, null, null, null, 7, null, null, null, 8},
+               {null, null, null, 3, null, 8, null, null, null},
+               {null, 5, 1, null, null, null, 8, 7, 2},
+               {null, null, null, 5, null, 7, null, null, null},
+               {4, null, null, null, 5, null, null, null, 7},
+               {6, null, null, null, 3, null, null, null, 9},
+               {1, 3, 2, null, null, null, 4, 8, 5}}
+      );
+      
+      samples.put
+      (
+        "Hard 1",
+        new Integer[][] 
+       {{null, null, null, null, 5, 1, null, 8, null},
+               {null, 8, null, null, 4, null, null, null, 5},
+               {null, null, 3, null, null, null, 2, null, null},
+               {null, null, null, null, 6, null, null, null, 9},
+               {6, 7, null, 4, null, 9, null, 1, 3},
+               {8, null, null, null, 3, null, null, null, null},
+               {null, null, 2, null, null, null, 4, null, null},
+               {5, null, null, null, 9, null, null, 2, null},
+               {null, 9, null, 7, 1, null, null, null, null}}
+      );
+      
+      samples.put
+      (
+        "Hard 2",
+        new Integer[][] 
+       {{null,null,null,6,null,null,1,null,null},
+           {null,null,null,null,null,5,null,null,6},
+           {5,null,7,null,null,null,2,3,null},
+           {null,8,null,9,null,7,null,null,null},
+           {9,3,null,null,null,null,null,6,7},
+           {null,null,null,4,null,6,null,1,null},
+           {null,7,4,null,null,null,9,null,1},
+           {8,null,null,7,null,null,null,null,null},
+           {null,null,3,null,null,8,null,null,null}}
+      );
+
+      samples.put
+      (
+        "Hard 3",
+        new Integer[][] 
+       {{null,8,null,null,null,6,null,null,5},
+               {2,null,null,null,null,null,4,8,null},
+               {null,null,9,null,null,8,null,1,null},
+               {null,null,null,null,8,null,1,null,2},
+               {null,null,null,3,null,1,null,null,null},
+               {6,null,1,null,9,null,null,null,null},
+               {null,9,null,4,null,null,8,null,null},
+               {null,7,6,null,null,null,null,null,3},
+               {1,null,null,7,null,null,null,5,null}}
+      );
+      
+      samples.put
+      (
+        "Hard 4",
+        new Integer[][] 
+       {{null,null,null,null,null,4,null,9,5},
+               {6,7,null,5,null,null,null,1,null},
+               {null,null,null,6,null,9,null,null,null},
+               {null,2,null,null,null,null,4,null,null},
+               {8,1,null,null,null,null,null,7,2},
+               {null,null,7,null,null,null,null,8,null},
+               {null,null,null,3,null,5,null,null,null},
+               {null,6,null,null,null,1,null,5,8},
+               {7,3,null,9,null,null,null,null,null}}
+      );    
+      
+      samples.put
+      (
+        "!DELIBERATELY BROKEN!",
+        new Integer[][] 
+       {{5,null,null,null,null,4,null,9,5},
+               {6,7,null,5,null,null,null,1,null},
+               {null,null,null,6,null,9,null,null,null},
+               {null,2,null,null,null,null,4,null,null},
+               {8,1,null,null,null,null,null,7,2},
+               {null,null,7,null,null,null,null,8,null},
+               {8,null,null,3,null,5,null,null,null},
+               {null,6,null,null,null,1,null,5,8},
+               {7,3,null,9,null,null,null,null,null}}
+      );   }
+   
+   public static SudokuGridSamples getInstance()
+   {
+      if (INSTANCE == null)
+      {
+         INSTANCE = new SudokuGridSamples();
+      }
+      
+      return INSTANCE;
+   }
+   
+   public Set<String> getSampleNames()
+   {
+      return samples.keySet();
+   }
+   
+   public Integer[][] getSample(String name)
+   {
+      return samples.get(name);
+   }
+}

Added: labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridView.java
===================================================================
--- labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridView.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/sudoku/swing/SudokuGridView.java	2007-08-31 09:22:44 UTC (rev 14773)
@@ -0,0 +1,177 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ * 
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.drools.examples.sudoku.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.GridLayout;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+
+public class SudokuGridView
+   extends JComponent
+   implements SudokuGridListener, ComponentListener
+{
+   /** The serialVersionUID */
+   private static final long serialVersionUID = 1L;
+   private SudokuGridModel model;
+   private GridLayout gridLayout;
+   private JTextField textFields[][];
+   private EmptyBorder emptyBorder = new EmptyBorder(0,0,0,0);
+   
+   public SudokuGridView()
+   {
+      gridLayout = new GridLayout(SudokuGridModel.NUM_ROWS, SudokuGridModel.NUM_COLS);
+      setLayout(gridLayout);
+      textFields = new JTextField[SudokuGridModel.NUM_ROWS][SudokuGridModel.NUM_COLS];
+      for (int row=0; row<textFields.length; row++)
+      {
+         for (int col=0; col<textFields[row].length; col++)
+         {
+            JTextField textField = new JTextField("");
+            textField.setEditable(false);
+            if (row==0 && col==0)
+            {
+               textField.addComponentListener(this);
+            }
+            JPanel panel = new JPanel();
+            panel.setBorder(emptyBorder);
+            panel.setLayout(new BorderLayout());
+            
+            textField.setOpaque(true);
+            textField.setBackground(Color.WHITE);
+            textField.setHorizontalAlignment(JTextField.CENTER);
+            
+            textFields[row][col] = textField;
+            
+            panel.add(BorderLayout.CENTER, textField);
+            add(panel);
+         }
+      }
+   }
+   
+   public SudokuGridView(SudokuGridModel model)
+   {
+      this();
+      setModel(model);
+   }
+   
+   public void setModel(SudokuGridModel model)
+   {
+      if (this.model != null  && this.model instanceof AbstractSudokuGridModel)
+      {
+         ((AbstractSudokuGridModel) this.model).removeSudokuGridListener(this);
+      }
+      
+      this.model = model;
+      refreshValues();
+      
+      if (this.model != null  && this.model instanceof AbstractSudokuGridModel)
+      {
+         ((AbstractSudokuGridModel) this.model).addSudokuGridListener(this);
+      }
+   }
+   
+   public SudokuGridModel getModel()
+   {
+      return model;
+   }
+   
+   private void refreshValues()
+   {
+      for (int row=0; row<textFields.length; row++)
+      {
+         for (int col=0; col<textFields[row].length; col++)
+         {
+            refreshValue(row, col);
+         }
+      }      
+   }
+   
+   private void refreshValue(int row, int col)
+   {
+      if(getModel().isCellResolved(row, col))
+      {
+         textFields[row][col].setText(""+getModel().getPossibleCellValues(row, col).get(0));
+      }
+      else
+      {
+         textFields[row][col].setText("");
+      }      
+   }
+
+   public void cellResolved(SudokuGridEvent ev)
+   {
+      refreshValue(ev.getRow(), ev.getCol());
+   }
+
+   public void cellModified(SudokuGridEvent ev)
+   {
+      refreshValue(ev.getRow(), ev.getCol());
+   }
+   
+   public void componentHidden(ComponentEvent ev)
+   {
+      // FIXME componentHidden
+      
+   }
+
+   public void componentMoved(ComponentEvent ev)
+   {
+      // FIXME componentMoved
+      
+   }
+
+   public void componentResized(ComponentEvent ev)
+   {
+      JTextField textField = (JTextField) ev.getComponent();
+      int height = textField.getHeight();
+      Font font = textField.getFont();
+      
+      FontMetrics fontMetrics = textField.getGraphics().getFontMetrics(font);
+      if (fontMetrics.getAscent() < height)
+      {
+         while (fontMetrics.getAscent() < height)
+         {
+            font = new Font(font.getName(), font.getStyle(), font.getSize()+2);
+            fontMetrics = textField.getGraphics().getFontMetrics(font);
+         }
+      }
+      else if (fontMetrics.getAscent() > height)
+      {
+         while (fontMetrics.getAscent() > height)
+         {
+            font = new Font(font.getName(), font.getStyle(), font.getSize()-2);
+            fontMetrics = textField.getGraphics().getFontMetrics(font);
+         }         
+      }
+      else
+      {
+         //
+      }
+      
+      for (int row=0; row<textFields.length; row++)
+      {
+         for (int col=0; col<textFields[row].length; col++)
+         {
+            textFields[row][col].setFont(font);
+         }
+      }
+   }
+
+   public void componentShown(ComponentEvent ev)
+   {
+      // FIXME componentShown
+   }
+}




More information about the jboss-svn-commits mailing list