Package org.cruxframework.crux.core.client.db

Source Code of org.cruxframework.crux.core.client.db.AbstractDatabase

/*
* Copyright 2013 cruxframework.org.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.cruxframework.crux.core.client.db;

import java.util.List;
import java.util.logging.Logger;

import org.cruxframework.crux.core.client.db.Transaction.TransactionCallback;
import org.cruxframework.crux.core.client.utils.StringUtils;

import com.google.gwt.core.client.GWT;

/**
* CRUX INTERNAL CLASS. DO NOT USE IT DIRECTLY.
*
* Base class for Crux databases. Use the interface Database to define your databases
* @author Thiago da Rosa de Bustamante
*/
public abstract class AbstractDatabase implements Database
{
  protected static Logger logger = Logger.getLogger(AbstractDatabase.class.getName());
  protected DBMessages messages = GWT.create(DBMessages.class);
  protected DatabaseErrorHandler errorHandler;
  protected String name;
  protected int version;

  @Override
  public String getName()
  {
      return name;
  }
 
  @Override
  public void setName(String newName) throws DatabaseException
  {
    if (isOpen())
    {
      throw new DatabaseException(messages.databaseSetPropertyOnOpenDBError(getName()));
    }
    this.name = newName;
  }
 
  @Override
  public int getVersion()
  {
      return version;
  }
 
  @Override
  public void setVersion(int newVersion) throws DatabaseException
  {
    if (isOpen())
    {
      throw new DatabaseException(messages.databaseSetPropertyOnOpenDBError(getName()));
    }
    this.version = newVersion;
  }
 
    @Override
  public void open(final DatabaseCallback callback)
  {
    if (checkOpenPreConditions(callback))
    {
      doOpen(callback);
    }
  }

  @Override
  public Transaction getTransaction(String[] storeNames, Transaction.Mode mode)
  {
    return getTransaction(storeNames, mode, null);
  }

    @Override
  public Transaction getTransaction(String[] storeNames, Transaction.Mode mode, TransactionCallback callback)
  {
    Transaction transaction = createTransaction(storeNames, mode);
    transaction.setTransactionCallback(callback);
    return transaction;
  }

    @Override
  public <V> void add(V[] objects, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<?, V> objectStore = transaction.getObjectStore(objectStoreName);
      for (V object : objects)
        {
        objectStore.add(object);
        }
  }

    @Override
  public <V> void add(List<V> objects, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<?, V> objectStore = transaction.getObjectStore(objectStoreName);
      for (V object : objects)
        {
        objectStore.add(object);
        }
  }

    @Override
  public <V> void put(V[] objects, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<?, V> objectStore = transaction.getObjectStore(objectStoreName);
      for (V object : objects)
        {
        objectStore.put(object);
        }
  }

    @Override
  public <V> void put(List<V> objects, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<?, V> objectStore = transaction.getObjectStore(objectStoreName);
      for (V object : objects)
        {
        objectStore.put(object);
        }
  }

    @Override
    public <K, V> void get(K key, String objectStoreName, final DatabaseRetrieveCallback<V> callback)
    {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readOnly);
      ObjectStore<K, V> objectStore = transaction.getObjectStore(objectStoreName);
      objectStore.get(key, callback);
    }

    @Override
    public <K> void delete(K key, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<K, ?> objectStore = transaction.getObjectStore(objectStoreName);
      objectStore.delete(key);
  }
       
    @Override
    public <K> void delete(KeyRange<K> keys, String objectStoreName, final DatabaseCallback callback)
  {
      Transaction transaction = getTransaction(new String[]{objectStoreName}, Transaction.Mode.readWrite, getCallbackForWriteTransaction(callback));
      ObjectStore<K, ?> objectStore = transaction.getObjectStore(objectStoreName);
      objectStore.delete(keys);
  }
   
    @Override
    public void setDefaultErrorHandler(DatabaseErrorHandler errorHandler)
    {
    this.errorHandler = errorHandler;
       
    }
   
  private boolean checkOpenPreConditions(final DatabaseCallback callback)
    {
      if (StringUtils.isEmpty(getName()))
    {
      callback.onError(messages.databaseInvalidNameDBError(getName()));
    }
      else if (isOpen())
    {
      callback.onError(messages.databaseIAlreadyOpenDBError(getName()));
    }
      else if (!isSupported())
    {
      callback.onError(messages.databaseNotSupportedError());
    }
      else
      {
        return true;
      }
      return false;
    }

  private TransactionCallback getCallbackForWriteTransaction(final DatabaseCallback callback)
    {
    if (callback == null && errorHandler == null)
    {
      return null;
    }
      return new TransactionCallback()
    {
      @Override
      public void onError(String message)
      {
        if (callback != null)
        {
          callback.onError(message);
        }
        else if (errorHandler != null)
        {
          errorHandler.onError(message);
        }
      }
     
      @Override
      public void onAbort()
      {
        if (callback != null)
        {
          callback.onError(messages.databaseTransactionAborted(getName()));
        }
        else if (errorHandler != null)
        {
          errorHandler.onError(messages.databaseTransactionAborted(getName()));
        }
      }
     
      @Override
      public void onComplete()
      {
        if (callback != null)
        {
          callback.onSuccess();
        }
      }
    };
    }
 
  @Override
  public void useIndexedDB()
  {
  }

  @Override
  public void useWebSQL()
  {
  }
 
    protected abstract void doOpen(DatabaseCallback callback);
    protected abstract Transaction createTransaction(String[] storeNames, Transaction.Mode mode);
}
TOP

Related Classes of org.cruxframework.crux.core.client.db.AbstractDatabase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.