/*
* 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 org.cruxframework.crux.core.client.db.Cursor.CursorDirection;
import org.cruxframework.crux.core.client.db.indexeddb.IDBKeyRange;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectCountRequest;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore.IDBObjectCursorRequest;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore.IDBObjectDeleteRequest;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore.IDBObjectRetrieveRequest;
import org.cruxframework.crux.core.client.db.indexeddb.IDBObjectStore.IDBObjectStoreRequest;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBCountEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBCursorEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBErrorEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBObjectDeleteEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBObjectRetrieveEvent;
import org.cruxframework.crux.core.client.db.indexeddb.events.IDBObjectStoreEvent;
import org.cruxframework.crux.core.client.file.Blob;
/**
* CRUX INTERNAL CLASS. DO NOT USE IT DIRECTLY.
*
* Indexed DB implementation for FileStore Interface. Use the interface {@link FileStore} instead.
* @author Thiago da Rosa de Bustamante
*/
public class IDXFileStore extends DBObject implements FileStore
{
protected final IDBObjectStore idbObjectStore;
protected final IDXAbstractDatabase db;
protected IDXFileStore(IDXAbstractDatabase db, IDBObjectStore idbObjectStore)
{
super(db);
this.db = db;
this.idbObjectStore = idbObjectStore;
}
@Override
public void add(Blob file, String fileName)
{
add(file, fileName, null);
}
@Override
public void put(Blob file, String fileName)
{
put(file, fileName, null);
}
@Override
public void delete(KeyRange<String> keyRange)
{
delete(keyRange, null);
}
public void add(final Blob file, final String fileName, final DatabaseWriteCallback<String> callback)
{
IDBObjectStoreRequest storeRequest = idbObjectStore.add(file, fileName);
handleWriteCallback(callback, storeRequest);
}
public void put(final Blob file, final String fileName, final DatabaseWriteCallback<String> callback)
{
IDBObjectStoreRequest storeRequest = idbObjectStore.put(file, fileName);
handleWriteCallback(callback, storeRequest);
}
public void get(String key, DatabaseRetrieveCallback<Blob> callback)
{
IDBObjectRetrieveRequest retrieveRequest = idbObjectStore.get(key);
handleRetrieveCallback(callback, retrieveRequest);
}
public void delete(String key, DatabaseDeleteCallback callback)
{
IDBObjectDeleteRequest deleteRequest = idbObjectStore.delete(key);
handleDeleteCallback(callback, deleteRequest);
}
public void delete(KeyRange<String> keyRange, DatabaseDeleteCallback callback)
{
IDBObjectDeleteRequest deleteRequest = idbObjectStore.delete(IDXKeyRange.getNativeKeyRange(keyRange));
handleDeleteCallback(callback, deleteRequest);
}
public void clear()
{
idbObjectStore.clear();
}
public void openCursor(FileStoreCursorCallback callback)
{
IDBObjectCursorRequest cursorRequest = idbObjectStore.openCursor();
handleCursorCallback(callback, cursorRequest);
}
public void openCursor(KeyRange<String> keyRange, FileStoreCursorCallback callback)
{
IDBObjectCursorRequest cursorRequest = idbObjectStore.openCursor(IDXKeyRange.getNativeKeyRange(keyRange));
handleCursorCallback(callback, cursorRequest);
}
public void openCursor(KeyRange<String> keyRange, CursorDirection direction, FileStoreCursorCallback callback)
{
IDBObjectCursorRequest cursorRequest = idbObjectStore.openCursor(IDXKeyRange.getNativeKeyRange(keyRange), IDXCursor.getNativeCursorDirection(direction));
handleCursorCallback(callback, cursorRequest);
}
public void count(DatabaseCountCallback callback)
{
IDBObjectCountRequest countRequest = idbObjectStore.count();
handleCountCallback(callback, countRequest);
}
public void count(KeyRange<String> range, DatabaseCountCallback callback)
{
IDBObjectCountRequest countRequest = idbObjectStore.count(IDXKeyRange.getNativeKeyRange(range));
handleCountCallback(callback, countRequest);
}
public KeyRangeFactory<String> getKeyRangeFactory()
{
return new IDXFileKeyRangeFactory();
}
private void handleWriteCallback(final DatabaseWriteCallback<String> callback, IDBObjectStoreRequest writeRequest)
{
if (callback != null || db.errorHandler != null)
{
if (callback != null)
{
callback.setDb(db);
}
writeRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
reportError(callback, db.messages.objectStoreWriteError(event.getName()), null);
}
});
if (callback != null)
{
writeRequest.onSuccess(new IDBObjectStoreEvent.Handler()
{
@Override
public void onSuccess(IDBObjectStoreEvent event)
{
try
{
callback.onSuccess(event.getStringKey());
callback.setDb(null);
}
catch (Exception e)
{
reportError(callback, db.messages.objectStoreWriteError(e.getMessage()), e);
}
}
});
}
}
}
private void handleCountCallback(final DatabaseCountCallback callback, IDBObjectCountRequest countRequest)
{
if (callback != null || db.errorHandler != null)
{
if (callback != null)
{
callback.setDb(db);
}
countRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
reportError(callback, db.messages.objectStoreCountError(event.getName()), null);
}
});
if (callback != null)
{
countRequest.onSuccess(new IDBCountEvent.Handler()
{
@Override
public void onSuccess(IDBCountEvent event)
{
try
{
callback.onSuccess(event.getCount());
callback.setDb(null);
}
catch (Exception e)
{
reportError(callback, db.messages.objectStoreCountError(e.getMessage()), e);
}
}
});
}
}
}
private void handleDeleteCallback(final DatabaseDeleteCallback callback, IDBObjectDeleteRequest deleteRequest)
{
if (callback != null || db.errorHandler != null)
{
if (callback != null)
{
callback.setDb(db);
}
deleteRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
reportError(callback, db.messages.objectStoreDeleteError(event.getName()), null);
}
});
if (callback != null)
{
deleteRequest.onSuccess(new IDBObjectDeleteEvent.Handler()
{
@Override
public void onSuccess(IDBObjectDeleteEvent event)
{
try
{
callback.onSuccess();
callback.setDb(null);
}
catch (Exception e)
{
reportError(callback, db.messages.objectStoreDeleteError(e.getMessage()), e);
}
}
});
}
}
}
private void handleCursorCallback(final FileStoreCursorCallback callback, IDBObjectCursorRequest cursorRequest)
{
if (callback != null || db.errorHandler != null)
{
if (callback != null)
{
callback.setDb(db);
}
cursorRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
reportError(callback, db.messages.objectStoreCursorError(event.getName()), null);
}
});
if (callback != null)
{
cursorRequest.onSuccess(new IDBCursorEvent.Handler()
{
@Override
public void onSuccess(IDBCursorEvent event)
{
try
{
callback.onSuccess(new IDXFileCursor(event.getCursor()));
callback.setDb(null);
}
catch (Exception e)
{
reportError(callback, db.messages.objectStoreCursorError(e.getMessage()), e);
}
}
});
}
}
}
private void handleRetrieveCallback(final DatabaseRetrieveCallback<Blob> callback, IDBObjectRetrieveRequest retrieveRequest)
{
if (callback != null || db.errorHandler != null)
{
if (callback != null)
{
callback.setDb(db);
}
retrieveRequest.onError(new IDBErrorEvent.Handler()
{
@Override
public void onError(IDBErrorEvent event)
{
reportError(callback, db.messages.objectStoreGetError(event.getName()), null);
}
});
if (callback != null)
{
retrieveRequest.onSuccess(new IDBObjectRetrieveEvent.Handler()
{
@Override
public void onSuccess(IDBObjectRetrieveEvent event)
{
try
{
Blob file = event.getObject().cast();
callback.onSuccess(file);
callback.setDb(null);
}
catch (Exception e)
{
reportError(callback, db.messages.objectStoreGetError(e.getMessage()), e);
}
}
});
}
}
}
static class IDXFileKeyRangeFactory implements KeyRangeFactory<String>
{
@Override
public KeyRange<String> only(String key)
{
return new IDXKeyRange<String>(IDBKeyRange.only(key));
}
@Override
public KeyRange<String> lowerBound(String key, boolean open)
{
return new IDXKeyRange<String>(IDBKeyRange.lowerBound(key, open));
}
@Override
public KeyRange<String> lowerBound(String key)
{
return new IDXKeyRange<String>(IDBKeyRange.lowerBound(key));
}
@Override
public KeyRange<String> upperBound(String key, boolean open)
{
return new IDXKeyRange<String>(IDBKeyRange.upperBound(key, open));
}
@Override
public KeyRange<String> upperBound(String key)
{
return new IDXKeyRange<String>(IDBKeyRange.upperBound(key));
}
@Override
public KeyRange<String> bound(String startKey, String endKey, boolean startOpen, boolean endOpen)
{
return new IDXKeyRange<String>(IDBKeyRange.bound(startKey, endKey, startOpen, endOpen));
}
@Override
public KeyRange<String> bound(String startKey, String endKey)
{
return new IDXKeyRange<String>(IDBKeyRange.bound(startKey, endKey));
}
}
}