svn.filsa.org sketches

Rev

Blame | Last modification | View Log | RSS feed

package org.filsa.devfest.patchwork;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.log4j.Logger;

/**
 * The Grid is a 2d array of GridCell objects.
 *
 *
 * @author Phil Suh (http://filsa.net/)
 */

public class Grid {

        static Logger log = Logger.getLogger(Grid.class);

        private int rowCount;
        private int colCount;

        private GridCell[][] celldata;

        /**
         * Instantiate a Grid by passing in a filepath.
         *
         * @param filepath - a file containing same-length lines representing the grid.
         *              Each character is each line is a cell.
         * @throws IOException
         */

        public Grid(String filepath) throws IOException {
                celldata = create(filepath);
        }

        /**
         *
         * @param f
         * @return
         * @throws IOException
         */

        private GridCell[][] create(String filepath) throws IOException {

                String data = "";

                File f = new File(filepath);

                if (f.exists()) {
                        log.debug("Creating grid for file: " + f.getAbsolutePath());
                        data = readFileAsString(filepath).replaceAll("\r\n", "\n");
                }
                if (data.isEmpty()) {
                        throw new IllegalStateException(
                                        "Attempted to read datafile but no data."
                                                        + f.getAbsolutePath());
                }

                String[] lines = data.split("\n");
                int rowCt = lines.length;
                this.rowCount = rowCt;
                int colCt = 0;
                if (rowCt > 0) {
                        colCt = lines[0].length();
                        this.colCount = colCt;
                }

                GridCell[][] grid = new GridCell[rowCt][colCt];

                for (int row = 0; row < lines.length; row++) {
                        String currentLine = lines[row];
                        for (int col = 0; col < currentLine.length(); col++) {
                                char color = currentLine.charAt(col);
                                if (color != '\r' && color != '\n') {
                                        grid[row][col] = new GridCell(color, col, row);                                
                                }
                        }
                }

                return grid;
        }

        private static String readFileAsString(String filePath)
                        throws java.io.IOException {
                StringBuffer fileData = new StringBuffer(1000);
                BufferedReader reader = new BufferedReader(new FileReader(filePath));
                char[] buf = new char[1024];
                int numRead = 0;
                while ((numRead = reader.read(buf)) != -1) {
                        String readData = String.valueOf(buf, 0, numRead);
                        fileData.append(readData);
                        buf = new char[1024];
                }
                reader.close();
                fileData.toString().replaceAll("\r\n", "\n");
                return fileData.toString();
        }

        public GridCell getCell(int row, int col) {

                if (row < 0 || row > this.rowCount || col < 0 || col > this.colCount) {
/*                      log.warn("row/col must point to an existing cell. row=" + row
                                        + ", col=" + col);
*/
                      return null;
                }

                GridCell oneCell;
                try {
                        oneCell = this.celldata[row][col];                     
                } catch (ArrayIndexOutOfBoundsException e) {
/*                      log.warn("row/col must point to an existing cell. row=" + row
                                        + ", col=" + col);
*/
                      return null;
                }

                return oneCell;
        }

        public String printGrid() {

                StringBuffer sb = new StringBuffer();
                for (int row = 0; row < this.rowCount; row++) {
                        for (int col = 0; col < this.colCount; col++) {
                                sb.append(this.getCell(row, col).getColor());
                        }
                        sb.append("\n");
                }

                return sb.toString();
        }

        public int getRowCount() {
                return rowCount;
        }

        public int getColCount() {
                return colCount;
        }

        @Override
        public String toString() {
                return "Grid@" + this.hashCode() + "[rows=" + rowCount + ", cols="
                                + colCount + "]";
        }
}