/*
* 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.logging.Level;
import org.cruxframework.crux.core.client.db.Transaction.Mode;
import org.cruxframework.crux.core.client.db.indexeddb.IDBDatabase;
import org.cruxframework.crux.core.client.db.indexeddb.IDBDeleteDBRequest;
import org.cruxframework.crux.core.client.db.indexeddb.IDBFactory;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore;
import org.cruxframework.crux.core.client.db.indexeddb.IDBOpenDBRequest;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBBlockedEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBDatabaseDeleteEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBErrorEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBOpenedEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBUpgradeNeededEvent;
import org.cruxframework.crux.core.client.utils.StringUtils;
import com.google.gwt.logging.client.LogConfiguration;
/**
* CRUX INTERNAL CLASS. DO NOT USE IT DIRECTLY.
*
* Indexed DB implementation for Database Interface. Use the interface {@link Database} to define your databases.
* @author Thiago da Rosa de Bustamante
*/
public abstract class IDXAbstractDatabase extends AbstractDatabase
{
protected IDBDatabase db = null;
@Override
public void close()
{
if (isOpen())
{
db.close();
db = null;
}
}
@Override
public void delete(final DatabaseCallback callback)
{
if (StringUtils.isEmpty(getName()))
{
throw new DatabaseException(messages.databaseInvalidNameDBError(getName()));
}
IDBDeleteDBRequest deleteDatabase = IDBFactory.get().deleteDatabase(getName());
deleteDatabase.onSuccess(new IDBDatabaseDeleteEvent.Handler()
{
@Override
public void onDelete(IDBDatabaseDeleteEvent event)
{
db = null;
if (callback != null)
{
callback.onSuccess();
}
}
});
deleteDatabase.onBlocked(new IDBBlockedEvent.Handler()
{
@Override
public void onBlocked(IDBBlockedEvent event)
{
String message = messages.databaseBlocked(getName());
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.SEVERE, message);
}
if (callback != null)
{
callback.onError(message);
}
else if (errorHandler != null)
{
errorHandler.onError(message);
}
}
});
deleteDatabase.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
String message = messages.databaseDeleteError(getName(), event.getName());
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.SEVERE, message);
}
if (callback != null)
{
callback.onError(message);
}
else if (errorHandler != null)
{
errorHandler.onError(message);
}
}
});
}
@Override
public boolean isOpen()
{
return db != null;
}
@Override
public boolean isSupported()
{
return IDBFactory.isSupported();
}
@Override
protected Transaction createTransaction(String[] storeNames, Mode mode)
{
return new IDXTransaction(this, storeNames, mode);
}
@Override
protected void doOpen(final DatabaseCallback callback)
{
final IDBOpenDBRequest openDBRequest = IDBFactory.get().open(getName(), getVersion());
openDBRequest.onSuccess(new IDBOpenedEvent.Handler()
{
@Override
public void onSuccess(IDBOpenedEvent event)
{
db = event.getResult();
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.INFO, messages.databaseOpened(getName()));
}
if (callback != null)
{
callback.onSuccess();
}
}
});
openDBRequest.onBlocked(new IDBBlockedEvent.Handler()
{
@Override
public void onBlocked(IDBBlockedEvent event)
{
String message = messages.databaseBlocked(getName());
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.SEVERE, message);
}
if (callback != null)
{
callback.onError(message);
}
else if (errorHandler != null)
{
errorHandler.onError(message);
}
}
});
openDBRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
String message = messages.databaseOpenError(getName(), event.getName());
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.SEVERE, message);
}
if (callback != null)
{
callback.onError(message);
}
else if (errorHandler != null)
{
errorHandler.onError(message);
}
}
});
openDBRequest.onUpgradeNeeded(new IDBUpgradeNeededEvent.Handler()
{
@Override
public void onUpgradeNeeded(IDBUpgradeNeededEvent event)
{
db = event.getResult();
try
{
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.INFO, messages.databaseUpgrading(getName()));
}
updateDatabaseStructure(openDBRequest);
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.INFO, messages.databaseUpgraded(getName()));
}
}
catch (RuntimeException e)
{
if (LogConfiguration.loggingIsEnabled())
{
logger.log(Level.SEVERE, messages.databaseUpgradeError(getName(), e.getMessage()), e);
}
throw e;
}
}
});
}
protected abstract void updateDatabaseStructure(IDBOpenDBRequest openDBRequest);
protected abstract <K, V> ObjectStore<K, V> getObjectStore(String storeName, IDBObjectStore idbObjectStore);
}