package edu.ualr.oyster.gui; import java.util.ArrayList; import javax.swing.JTable; public class TableConstraintChecker { public static class InUse{ private ArrayList<Integer> problemRows; private ArrayList<Integer> problemNumbers; private boolean matchFound = false; private boolean hasNullsOrEmpties = false; private boolean hasInvertedRange = false; private boolean hasOverlapRange = false; private boolean hasDuplicates = false; private boolean hasREFID = false; public ArrayList<Integer> getRows(){ return problemRows; } public ArrayList<Integer> getNumbers(){ return problemNumbers; } public boolean isMatchFound(){ return matchFound; } public boolean hasNullsOrEmpties(){ return hasNullsOrEmpties; } public boolean hasInvertedRange(){ return hasInvertedRange; } public boolean hasOverlapRange(){ return hasOverlapRange; } public boolean hasDuplicates(){ return hasDuplicates; } public boolean hasREFID(){ return hasREFID; } private void setProblemRows(ArrayList<Integer> problems){ problemRows = problems; } private void setProblemNumbers(ArrayList<Integer> problems){ problemNumbers = problems; } private void setMatchFound(boolean b){ matchFound = b; } private void setNullsOrEmpties(boolean b){ hasNullsOrEmpties = b; } private void setInvertedRange(boolean b){ hasInvertedRange = b; } private void setOverlapRange(boolean b){ hasOverlapRange = b; } private void setDuplicateFound(boolean b){ hasDuplicates = b; } private void setREFID(boolean b){ hasREFID = b; } public void setFalse(){ matchFound = false; } } public InUse CheckRanges(JTable t){ InUse used = new InUse(); boolean problemFound = false; boolean duplicateFound = false; boolean overlapFound = false; boolean invertedRange = false; int rows = t.getRowCount(); int[][] ranges = new int[rows][2]; ArrayList<Integer> problemNumbersList = null; ArrayList<Integer> problemRowsList = null; //Add table to array[][] for (int i = 0; i < rows; i++){ ranges[i][0] = (Integer) t.getModel().getValueAt(i, 2); ranges[i][1] = (Integer) t.getModel().getValueAt(i, 3); } for (int i=0; i < ranges.length; i++){ for (int j=0; j < ranges[i].length; j++){ int n = ranges[i][j]; for (int k=0; k < ranges.length; k++){ for(int h=0; h < ranges[k].length; h++){ if( (i!=k && h!=j) || (i==k && h!=j)){ if (ranges[k][h] == n){ duplicateFound = true; problemFound = true; } if( n > ranges[k][0] && n < ranges[k][1]){ overlapFound = true; problemFound = true; } } } } } } for (int i=0; i < ranges.length; i++){ if(ranges[i][0] > ranges[i][1]){ invertedRange = true; problemFound = true; } } //TODO: Add error Rows and Number to problems if (problemFound){ used.setOverlapRange(overlapFound); used.setMatchFound(problemFound); used.setInvertedRange(invertedRange); used.setDuplicateFound(duplicateFound); used.setProblemNumbers(problemNumbersList); used.setProblemRows(problemRowsList); } return used; } public InUse CheckMatches(JTable t){ InUse used = new InUse(); boolean problemFound = false; int rows = t.getRowCount(); int[] rowValues = new int[rows]; ArrayList<Integer> problemRows = new ArrayList<Integer>(); //Load row values into rowValues for (int i=0; i < rows; i++){ rowValues[i] = (Integer) t.getModel().getValueAt(i, 2); } for (int i=0; i < rowValues.length; i++){ for ( int n=0; n < rowValues.length; n++){ if (i != n){ if (rowValues[i] == rowValues[n]){ problemFound = true; problemRows.add(n); } } } } if (problemFound){ used.setMatchFound(true); used.setProblemRows(problemRows); } return used; } public InUse CheckStringMatches(JTable t){ InUse used = new InUse(); boolean problemFound = false; int rows = t.getRowCount(); String[] rowValues = new String[rows]; ArrayList<Integer> problemRows = new ArrayList<Integer>(); //Load row values into rowValues for (int i=0; i < rows; i++){ rowValues[i] = (String) t.getModel().getValueAt(i, 1); } for (int i=0; i < rowValues.length; i++){ for ( int n=0; n < rowValues.length; n++){ if (i != n){ if (rowValues[i].equals(rowValues[n])){ problemFound = true; problemRows.add(n); } } } } if (problemFound){ used.setMatchFound(true); used.setDuplicateFound(true); used.setProblemRows(problemRows); } return used; } public InUse CheckNames(JTable t){ InUse used = new InUse(); int rows = t.getRowCount(); String[] rowValues = new String[rows]; boolean problemFound = false; boolean hasNullOrEmpties = false; ArrayList<Integer> problemRows = new ArrayList<Integer>(); for (int i=0; i < rows; i++){ rowValues[i] = (String) t.getModel().getValueAt(i, 0); if (rowValues[i] != null){ rowValues[i].trim(); if ( rowValues[i].equals("") ){ rowValues[i] = null; } } } for (int i=0; i < rowValues.length; i++){ for ( int n=0; n < rowValues.length; n++){ if (rowValues.length > 1){ if (i != n){ if ( (rowValues[i] == null) || (rowValues[n] == null) ){ hasNullOrEmpties = true; problemFound = true; break; } else if (rowValues[i].equals(rowValues[n])){ problemFound = true; problemRows.add(n); } } } else{ if ( (rowValues[i] == null) || (rowValues[n] == null) ){ hasNullOrEmpties = true; problemFound = true; break; } } } } if (problemFound){ used.setMatchFound(true); used.setNullsOrEmpties(hasNullOrEmpties); used.setProblemRows(problemRows); } return used; } public InUse CheckAttributes(JTable t){ InUse used = new InUse(); int rows = t.getRowCount(); String[] rowValues = new String[rows]; boolean problemFound = false; boolean hasNullOrEmpties = false; ArrayList<Integer> problemRows = new ArrayList<Integer>(); for (int i=0; i < rows; i++){ rowValues[i] = t.getCellEditor(i, 1).getCellEditorValue().toString(); if (rowValues[i] != null){ rowValues[i].trim(); if ( rowValues[i].equals("") ){ rowValues[i] = null; } } } for (int i=0; i < rowValues.length; i++){ for ( int n=0; n < rowValues.length; n++){ if (rowValues.length > 1){ if (i != n){ if ( (rowValues[i] == null) || (rowValues[n] == null) ){ hasNullOrEmpties = true; problemFound = true; break; } } } else{ if ( (rowValues[i] == null) || (rowValues[n] == null) ){ hasNullOrEmpties = true; problemFound = true; break; } } } } if (problemFound){ used.setMatchFound(true); used.setNullsOrEmpties(hasNullOrEmpties); used.setProblemRows(problemRows); } return used; } public InUse CheckREFID(JTable t){ InUse used = new InUse(); boolean foundREFID = false; for (int i = 0; i < t.getRowCount(); i ++){ String check = (String) t.getValueAt(i, 1); if ( check.equals("@RefID") ){ foundREFID = true; break; } } used.setREFID(foundREFID); return used; } }