/*
* Copyright 2010 Zhihua (Dennis) Jiang
*
* 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 com.gwtmobile.persistence.client;
import java.util.Date;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
public class CollectionImpl<T extends Persistable> implements Collection<T> {
protected JavaScriptObject nativeObject;
protected EntityInternal<T> entity;
public CollectionImpl(JavaScriptObject nativeObject, EntityInternal<T> entity) {
this.nativeObject = nativeObject;
this.entity = entity;
}
public Collection<T> newCollection(JavaScriptObject nativeObject) {
return new CollectionImpl<T>(nativeObject, entity);
}
@Override
public Collection<T> filter(String property, String operator, boolean value) {
return newCollection(filter(nativeObject, property, operator, value));
}
private native JavaScriptObject filter(JavaScriptObject nativeObject, String property, String operator, boolean value) /*-{
return nativeObject.filter(property, operator, value);
}-*/;
@Override
public Collection<T> filter(String property, String operator, char value) {
return newCollection(filter(nativeObject, property, operator, new String(new char[] {value})));
}
@Override
public Collection<T> filter(String property, String operator, int value) {
return newCollection(filter(nativeObject, property, operator, value));
}
private native JavaScriptObject filter(JavaScriptObject nativeObject, String property, String operator, int value) /*-{
return nativeObject.filter(property, operator, value);
}-*/;
@Override
public Collection<T> filter(String property, String operator, double value) {
return newCollection(filter(nativeObject, property, operator, value));
}
private native JavaScriptObject filter(JavaScriptObject nativeObject, String property, String operator, double value) /*-{
return nativeObject.filter(property, operator, value);
}-*/;
@Override
public Collection<T> filter(String property, String operator, String value) {
return newCollection(filter(nativeObject, property, operator, value));
}
private native JavaScriptObject filter(JavaScriptObject nativeObject, String property, String operator, String value) /*-{
return nativeObject.filter(property, operator, value);
}-*/;
@Override
public Collection<T> filter(String property, String operator, Date value) {
return newCollection(filter(nativeObject, property, operator, (double)value.getTime()));
}
@Override
public Collection<T> order(String property, boolean ascending) {
return newCollection(order(nativeObject, property, ascending));
}
private native JavaScriptObject order(JavaScriptObject nativeObject, String property, boolean ascending) /*-{
return nativeObject.order(property, ascending);
}-*/;
@Override
public Collection<T> limit(int n) {
return newCollection(limit(nativeObject, n));
}
private native JavaScriptObject limit(JavaScriptObject nativeObject, int n) /*-{
return nativeObject.limit(n);
}-*/;
@Override
public Collection<T> skip(int n) {
return newCollection(skip(nativeObject, n));
}
private native JavaScriptObject skip(JavaScriptObject nativeObject, int n) /*-{
return nativeObject.skip(n);
}-*/;
@Override
public Collection<T> prefetch(String rel) {
return newCollection(prefetch(nativeObject, rel));
}
private native JavaScriptObject prefetch(JavaScriptObject nativeObject, String rel) /*-{
return nativeObject.prefetch(rel);
}-*/;
@Override
public void add(T obj) {
add(nativeObject, ((PersistableInternal)obj).getNativeObject());
}
private native void add(JavaScriptObject nativeObject, JavaScriptObject obj) /*-{
nativeObject.add(obj);
}-*/;
@Override
public void remove(T obj) {
remove(nativeObject, ((PersistableInternal)obj).getNativeObject());
}
private native void remove(JavaScriptObject nativeObject, JavaScriptObject obj) /*-{
nativeObject.remove(obj);
}-*/;
@Override
public void destroyAll(Transaction tx, Callback callback) {
destroyAll(nativeObject, tx, callback);
}
@Override
public void destroyAll(Callback callback) {
destroyAll(nativeObject, null, callback);
}
private native void destroyAll(JavaScriptObject nativeObject, Transaction tx, Callback callback) /*-{
nativeObject.destroyAll(tx, function() {
callback.@com.gwtmobile.persistence.client.Callback::onSuccess()();
})
}-*/;
@Override
public void count(Transaction tx, ScalarCallback<Integer> callback) {
count(nativeObject, this, tx, callback);
}
@Override
public void count(ScalarCallback<Integer> callback) {
count(nativeObject, this, null, callback);
}
private native void count(JavaScriptObject nativeObject, CollectionImpl<T> self, Transaction tx, ScalarCallback<Integer> callback) /*-{
nativeObject.count(tx, function(n) {
self.@com.gwtmobile.persistence.client.CollectionImpl::processCallback(ILcom/gwtmobile/persistence/client/ScalarCallback;)(n, callback);
})
}-*/;
@Override
public void list(Transaction tx, CollectionCallback<T> callback) {
list(nativeObject, this, tx, callback);
}
@Override
public void list(CollectionCallback<T> callback) {
list(nativeObject, this, null, callback);
}
private native void list(JavaScriptObject nativeObject, CollectionImpl<T> self, Transaction tx, CollectionCallback<T> callback) /*-{
nativeObject.list(tx, function(results) {
self.@com.gwtmobile.persistence.client.CollectionImpl::processCallback(Lcom/google/gwt/core/client/JsArray;Lcom/gwtmobile/persistence/client/CollectionCallback;)(results, callback);
})
}-*/;
@Override
public void each(Transaction tx, ScalarCallback<T> callback) {
each(nativeObject, this, tx, callback);
}
@Override
public void each(ScalarCallback<T> callback) {
each(nativeObject, this, null, callback);
}
@Override
public void forEach(Transaction tx, ScalarCallback<T> callback) {
each(nativeObject, this, tx, callback);
}
@Override
public void forEach(ScalarCallback<T> callback) {
each(nativeObject, this, null, callback);
}
private native void each(JavaScriptObject nativeObject, CollectionImpl<T> self, Transaction tx, ScalarCallback<T> callback) /*-{
nativeObject.each(tx, function(result) {
self.@com.gwtmobile.persistence.client.CollectionImpl::processCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback);
})
}-*/;
@Override
public void one(Transaction tx, ScalarCallback<T> callback) {
one(nativeObject, this, tx, callback);
}
@Override
public void one(ScalarCallback<T> callback) {
one(nativeObject, this, null, callback);
}
private native void one(JavaScriptObject nativeObject, CollectionImpl<T> self, Transaction tx, ScalarCallback<T> callback) /*-{
nativeObject.one(tx, function(result) {
self.@com.gwtmobile.persistence.client.CollectionImpl::processCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback);
})
}-*/;
@SuppressWarnings("unused")
private void processCallback(JsArray<JavaScriptObject> results, CollectionCallback<T> callback) {
T[] array = entity.newInstanceArray(results.length());
for (int i = 0; i < array.length; i++) {
array[i] = entity.newInstance(results.get(i));
}
callback.onSuccess(array);
}
@SuppressWarnings("unused")
private void processCallback(JavaScriptObject result, ScalarCallback<T> callback) {
callback.onSuccess(entity.newInstance(result));
}
@SuppressWarnings("unused")
private void processCallback(int result, ScalarCallback<Integer> callback) {
callback.onSuccess(result);
}
public Collection<T> or(Filter filter) {
return newCollection(or(nativeObject, filter));
}
private native JavaScriptObject or(JavaScriptObject nativeObject, JavaScriptObject filter) /*-{
return nativeObject.or(filter);
}-*/;
public Collection<T> and(Filter filter) {
return newCollection(and(nativeObject, filter));
}
private native JavaScriptObject and(JavaScriptObject nativeObject, JavaScriptObject filter) /*-{
return nativeObject.and(filter);
}-*/;
}