/* * 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.JsArrayString; public abstract class EntityInternal<T extends Persistable> implements Entity<T> { public abstract T newInstance(JavaScriptObject nativeObject); public abstract T[] newInstanceArray(int size); //Cannot create a generic array in Java... public abstract JavaScriptObject getNativeObject(); public abstract Collection<T> newCollection(JavaScriptObject nativeCollection); public abstract String getInverseRelationName(String rel); public abstract String getEntityName(); public void load(Transaction transaction, String id, ScalarCallback<T> callback) { load(transaction, id, callback, getNativeObject(), this); } public void load(String id, ScalarCallback<T> callback) { load(null, id, callback, getNativeObject(), this); } private native void load(Transaction transaction, String id, ScalarCallback<T> callback, JavaScriptObject nativeObject, EntityInternal<T> self) /*-{ nativeObject.load($wnd.persistence, transaction, id, function(result) { self.@com.gwtmobile.persistence.client.EntityInternal::processwLoadCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback); }); }-*/; @SuppressWarnings("unused") private void processwLoadCallback(JavaScriptObject result, ScalarCallback<T> callback) { callback.onSuccess(result == null ? null : newInstance(result)); } public void findBy(Transaction transaction, String property, boolean value, ScalarCallback<T> callback) { findBy(transaction, property, value, callback, getNativeObject(), this); } public void findBy(String property, boolean value, ScalarCallback<T> callback) { findBy(null, property, value, callback, getNativeObject(), this); } public void findBy(Transaction transaction, String property, char value, ScalarCallback<T> callback) { findBy(transaction, property, new String(new char[] {value}), callback, getNativeObject(), this); } public void findBy(String property, char value, ScalarCallback<T> callback) { findBy(null, property, new String(new char[] {value}), callback, getNativeObject(), this); } public void findBy(Transaction transaction, String property, int value, ScalarCallback<T> callback) { findBy(transaction, property, value, callback, getNativeObject(), this); } public void findBy(String property, int value, ScalarCallback<T> callback) { findBy(null, property, value, callback, getNativeObject(), this); } public void findBy(Transaction transaction, String property, double value, ScalarCallback<T> callback) { findBy(transaction, property, value, callback, getNativeObject(), this); } public void findBy(String property, double value, ScalarCallback<T> callback) { findBy(null, property, value, callback, getNativeObject(), this); } public void findBy(Transaction transaction, String property, String value, ScalarCallback<T> callback) { findBy(transaction, property, value, callback, getNativeObject(), this); } public void findBy(String property, String value, ScalarCallback<T> callback) { findBy(null, property, value, callback, getNativeObject(), this); } public void findBy(Transaction transaction, String property, Date value, ScalarCallback<T> callback) { findBy(transaction, property, value.getTime(), callback, getNativeObject(), this); } public void findBy(String property, Date value, ScalarCallback<T> callback) { findBy(null, property, value.getTime(), callback, getNativeObject(), this); } private native void findBy(Transaction transaction, String property, boolean value, ScalarCallback<T> callback, JavaScriptObject nativeObject, EntityInternal<T> self) /*-{ nativeObject.findBy($wnd.persistence, transaction, property, value, function(result) { self.@com.gwtmobile.persistence.client.EntityInternal::processwLoadCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback); }); }-*/; private native void findBy(Transaction transaction, String property, String value, ScalarCallback<T> callback, JavaScriptObject nativeObject, EntityInternal<T> self) /*-{ nativeObject.findBy($wnd.persistence, transaction, property, value, function(result) { self.@com.gwtmobile.persistence.client.EntityInternal::processwLoadCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback); }); }-*/; // Can't pass long to JSNI... private native void findBy(Transaction transaction, String property, double value, ScalarCallback<T> callback, JavaScriptObject nativeObject, EntityInternal<T> self) /*-{ nativeObject.findBy($wnd.persistence, transaction, property, value, function(result) { self.@com.gwtmobile.persistence.client.EntityInternal::processwLoadCallback(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/gwtmobile/persistence/client/ScalarCallback;)(result, callback); }); }-*/; public void index(String column) { index(column, false, getNativeObject()); } public void index(String column, boolean unique) { index(column, unique, getNativeObject()); } private native void index(String column, boolean unique, JavaScriptObject nativeObject) /*-{ if (unique) { nativeObject.index(column, {unique:true}); }else { nativeObject.index(column); } }-*/; public void index(String[] columns) { index(columns, false); } public void index(String[] columns, boolean unique) { JsArrayString jsArray = (JsArrayString) JavaScriptObject.createArray(); for (int i = 0; i < columns.length; i++) { String col = columns[i]; jsArray.set(i, col); } index(jsArray, false, getNativeObject()); } private native void index(JavaScriptObject columns, boolean unique, JavaScriptObject nativeObject) /*-{ if (unique) { nativeObject.index(columns, {unique:true}); }else { nativeObject.index(columns); } }-*/; }