[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