SmsSelectorRuleSet.java :  » SMS » smsselector » com » rudolfheszele » smsselector » model » Android Open Source

Android Open Source » SMS » smsselector 
smsselector » com » rudolfheszele » smsselector » model » SmsSelectorRuleSet.java
package com.rudolfheszele.smsselector.model;

import java.util.Iterator;
import java.util.LinkedList;

import com.rudolfheszele.smsselector.R;
import com.rudolfheszele.smsselector.controller.ControllerFactoryFactory;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

interface CommonRuleInterface
{
  Id getId();
  void setId(Id id);
}

public class SmsSelectorRuleSet
{  
  public static LinkedList<SmsSelectorRuleSet> readRuleSetsFromDatabase(Context context) throws SmsSelectorRuleSetException
  {
    LinkedList<SmsSelectorRuleSet> ruleSets = new LinkedList<SmsSelectorRuleSet>(); 
    SmsSelectorRuleSetSQLiteHelper databaseHelper = new SmsSelectorRuleSetSQLiteHelper(context);
    SQLiteDatabase database = databaseHelper.getReadableDatabase();
    Cursor ruleSetsCursor = null; 
    
    do
    {
      try
      {
        // Query the RuleSets
        ruleSetsCursor = database.query(SmsSelectorRuleSetSQLiteHelper.Tables.RULE_SETS, null, null, null, null, null, null);
        if(ruleSetsCursor == null)
          break;
        ruleSetsCursor.moveToFirst();
        for(int i = 0; i < ruleSetsCursor.getCount(); i++)
        {
          SmsSelectorRuleSet ruleSet = new SmsSelectorRuleSet();
          int ruleSetId = ruleSetsCursor.getInt(ruleSetsCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ID));
          String ruleSetName = ruleSetsCursor.getString(ruleSetsCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.NAME));
          int actionId = ruleSetsCursor.getInt(ruleSetsCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ACTION));
          String additionalInfo = ruleSetsCursor.getString(ruleSetsCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ADDITONAL_INFO));
          
          ruleSet.mName = ruleSetName;
          ruleSet.mAction = ActionFactory.createAction(ActionFactory.getActionId(actionId), additionalInfo);
          // Query the rules belonging to this RuleSet
          SmsSelectorRuleSet.readRulesFromDatabase(database, ruleSet, ruleSetId);
          // Query the logical operations belonging to this RuleSet
          SmsSelectorRuleSet.readLogicalOperationsFromDatabase(database, ruleSet, ruleSetId);
          // Check the consistency
          if(ruleSet.mRules.size() > 0)
          {
            if(ruleSet.mRules.size() != ruleSet.mOperations.size() + 1)
              throw new SmsSelectorRuleSetException("Inconsistent rule set!!!");
          }
          ruleSets.add(ruleSet);
          ruleSetsCursor.moveToNext();
        }
      }
      finally
      {
        ruleSetsCursor.close();
      }
    }
    while(false);
    
    return ruleSets;
  }
  
  public static void insertRuleSetIntoDatabase(SmsSelectorRuleSet ruleSet)
  {
    Activity mainActivity = (Activity)ControllerFactoryFactory.getControllerFactory().getController().getView(R.layout.smsselector_main_activity_layout); 
    SmsSelectorRuleSetSQLiteHelper databaseHelper = new SmsSelectorRuleSetSQLiteHelper(mainActivity);
    SQLiteDatabase dataBase = databaseHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    long rowId = 0;
    Iterator<Rule> rulesIterator = null;
    Iterator<LogicalOperation> operationsIterator = null;
    
    // Insert data into the "RuleSets" table
    values.put(SmsSelectorRuleSetSQLiteHelper.Columns.NAME, ruleSet.getName());
    values.put(SmsSelectorRuleSetSQLiteHelper.Columns.ACTION, ruleSet.mAction.getId().getName());
    values.put(SmsSelectorRuleSetSQLiteHelper.Columns.ADDITONAL_INFO, ruleSet.mAction.getAdditionalInfo());
    rowId = dataBase.insert(SmsSelectorRuleSetSQLiteHelper.Tables.RULE_SETS, null, values);
    if(rowId == -1)
      return;
    // Insert data into the "Rules" table
    rulesIterator = ruleSet.mRules.iterator();
    while(rulesIterator.hasNext())
    {
      Rule rule = rulesIterator.next();
      
      values.clear();
      values.put(SmsSelectorRuleSetSQLiteHelper.Columns.RULE_SET, rowId);
      values.put(SmsSelectorRuleSetSQLiteHelper.Columns.ID, rule.getId().getIntValue());
      values.put(SmsSelectorRuleSetSQLiteHelper.Columns.ADDITONAL_INFO, rule.getAddtitionalInfo());
      dataBase.insert(SmsSelectorRuleSetSQLiteHelper.Tables.RULES, null, values);
    }
    // Insert data into the "Operations" table
    operationsIterator = ruleSet.mOperations.iterator();
    while(operationsIterator.hasNext())
    {
      LogicalOperation operation = operationsIterator.next();
      
      values.clear();
      values.put(SmsSelectorRuleSetSQLiteHelper.Columns.RULE_SET, rowId);
      values.put(SmsSelectorRuleSetSQLiteHelper.Columns.ID, operation.getId().getIntValue());
      dataBase.insert(SmsSelectorRuleSetSQLiteHelper.Tables.OPERATIONS, null, values);
    }
  }
  
  public static void deleteRuleSetFromDatabase(SmsSelectorRuleSet ruleSet)
  {
    Activity mainActivity = (Activity)ControllerFactoryFactory.getControllerFactory().getController().getView(R.layout.smsselector_main_activity_layout); 
    SmsSelectorRuleSetSQLiteHelper databaseHelper = new SmsSelectorRuleSetSQLiteHelper(mainActivity);
    SQLiteDatabase readableDatabase = databaseHelper.getReadableDatabase();
    SQLiteDatabase writableDatabase = databaseHelper.getWritableDatabase();
    String[] idColumn = new String[] {SmsSelectorRuleSetSQLiteHelper.Columns.ID};
    String ruleName = "\"" + ruleSet.getName() + "\"";
    String equals = "=";
    Cursor cursor = null;
    String id = null;
    
    // Query the id of the RuleSet
    cursor = readableDatabase.query(SmsSelectorRuleSetSQLiteHelper.Tables.RULE_SETS, idColumn, SmsSelectorRuleSetSQLiteHelper.Columns.NAME + equals + ruleName, null, null, null, null);
    if(cursor == null)
      return;
    try
    {
      if(cursor.getCount() != 1)
      {
        cursor.close();
        return;
      }
      cursor.moveToFirst();
      id = cursor.getString(0);
    }
    finally
    {
      cursor.close();
    }
    // If no id found there is nothing to delete
    if(id == null)
      return;
    writableDatabase.delete(SmsSelectorRuleSetSQLiteHelper.Tables.RULE_SETS, SmsSelectorRuleSetSQLiteHelper.Columns.ID + equals + id, null);
    writableDatabase.delete(SmsSelectorRuleSetSQLiteHelper.Tables.RULES, SmsSelectorRuleSetSQLiteHelper.Columns.ID + equals + id, null);
    writableDatabase.delete(SmsSelectorRuleSetSQLiteHelper.Tables.OPERATIONS, SmsSelectorRuleSetSQLiteHelper.Columns.ID + equals + id, null);
  }
  
  public static void updateRuleSetInDatabase(SmsSelectorRuleSet ruleSet)
  {
    // In fact it is a delete, and an insert...
    SmsSelectorRuleSet.deleteRuleSetFromDatabase(ruleSet);
    SmsSelectorRuleSet.insertRuleSetIntoDatabase(ruleSet);
  }
  
  /**
   * This interface is to execute rules on object.
   * @author erudhes
   * Known subclasses:
   *  - IsMessageFromAddressRule 
   *  - IsMessageFromProviderRule
   *  - IsMessageFromPersonRule
   *  - IsMessageContainsRule
   *  - IsMessageOlderRule
   */
  public interface Rule extends CommonRuleInterface
  {
    boolean isRuleMatch(Object object);
    String getAddtitionalInfo();
  }
  
  /**
   * This interface is to concatenate to boolean variable into one, with a logical operation
   * @author erudhes
   * Known subslacces:
   *   - AndLogicalOperation
   *   - OrLogicalOperation
   *   - XorLogicalOperation
   *   - NotLogicalOperation
   */
  public interface LogicalOperation extends CommonRuleInterface
  {
    boolean doOperation(boolean valueA, boolean valueB);
  }
  
  /**
   * This interface is to do an action on an object
   * @author erudhes
   * Known sublasses:
   *   - MoveToFolderAction
   *   - DeleteMessageAction
   */
  public interface Action extends CommonRuleInterface
  {
    Object doAction(Object object);
    String getAdditionalInfo();
  }
  
  public SmsSelectorRuleSet(LinkedList<Rule> rules, LinkedList<LogicalOperation> operations, Action action, String name)
  {
    mRules = rules;
    mOperations = operations;
    mAction = action;
    mName = name;
  }
  
  // Getter methods
  public LinkedList<Rule> getRules()
  {
    return mRules;
  }
  
  public void setRules(LinkedList<Rule> rules)
  {
    mRules = rules;
  }
  
  public LinkedList<LogicalOperation> getLogicalOperations()
  {
    return mOperations;
  }
  
  public void setLogicalOperations(LinkedList<LogicalOperation> operations)
  {
    mOperations = operations;
  }
  
  public Action getAction()
  {
    return mAction;
  }
  
  public void setAction(Action action)
  {
    mAction = action;
  }
  
  public String getName()
  {
    return mName;
  }
  
  private static void readRulesFromDatabase(SQLiteDatabase database, SmsSelectorRuleSet ruleSet, int ruleSetId) throws SmsSelectorRuleSetException
  {
    Cursor rulesCursor = null;
    String additionalInfo = null;
    
    try
    {
      rulesCursor = database.query(SmsSelectorRuleSetSQLiteHelper.Tables.RULES, null, SmsSelectorRuleSetSQLiteHelper.Columns.RULE_SET + "=" + ruleSetId, null, null, null, null);
      if(rulesCursor == null)
        return;
      rulesCursor.moveToFirst();
      for(int j = 0; j < rulesCursor.getCount(); j++)
      {
        Rule rule = null;
        int ruleId = rulesCursor.getInt(rulesCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ID));
        
        additionalInfo = rulesCursor.getString(rulesCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ADDITONAL_INFO));
        rule = RuleFactory.createRule(RuleFactory.getRuleId(ruleId), additionalInfo);
        ruleSet.mRules.add(rule);
        rulesCursor.moveToNext();
      }
    }
    finally
    {
      rulesCursor.close();
    }
  }
  
  private static void readLogicalOperationsFromDatabase(SQLiteDatabase database, SmsSelectorRuleSet ruleSet, int ruleSetId)
  {
    Cursor logicalOperationsCursor = null;
    
    try
    {
      logicalOperationsCursor = database.query(SmsSelectorRuleSetSQLiteHelper.Tables.OPERATIONS, null, SmsSelectorRuleSetSQLiteHelper.Columns.RULE_SET + "=" + ruleSetId, null, null, null, null);
      if(logicalOperationsCursor == null)
        return;
      logicalOperationsCursor.moveToFirst();
      for(int j = 0; j < logicalOperationsCursor.getCount(); j++)
      {
        int operationId = logicalOperationsCursor.getInt(logicalOperationsCursor.getColumnIndex(SmsSelectorRuleSetSQLiteHelper.Columns.ID));
        LogicalOperation operation = null;
        
        operation = LogicalOperationFactory.createOperation(LogicalOperationFactory.getOperationId(operationId));
        ruleSet.mOperations.add(operation);
        logicalOperationsCursor.moveToNext();
      }
    }
    finally
    {
      logicalOperationsCursor.close();
    }
  }
  
  private SmsSelectorRuleSet()
  {
    mRules = new LinkedList<Rule>();
    mOperations = new LinkedList<LogicalOperation>();
    mAction = null;
    mName = null;
  }
  
  private LinkedList<Rule> mRules;
  private LinkedList<LogicalOperation> mOperations;
  private Action mAction;
  private String mName;
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.