/* * Copyright 2008 Alberto Gimeno <gimenete at gmail.com> * * 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 siena.core.async; import java.util.List; import java.util.Map; import siena.Model; import siena.PersistenceManagerFactory; import siena.Query; import siena.QueryAggregated; import siena.QueryFilter; import siena.QueryFilterSearch; import siena.QueryJoin; import siena.QueryOrder; import siena.QueryOwned; import siena.core.batch.BatchAsync; import siena.core.options.QueryOption; /** * This is a technical class to bring asynchronous functions to Models * but this class shouldn't be inherited * * @author mandubian <pascal.voitot@mandubian.org> * */ public class ModelAsync { transient private PersistenceManagerAsync persistenceManagerAsync; transient private Model model; public ModelAsync(Model model) { this.model = model; persistenceManagerAsync = model.getPersistenceManager().async(); } public SienaFuture<Void> get() { return getPersistenceManager().get(model); } public SienaFuture<Void> delete() { return getPersistenceManager().delete(model); } public SienaFuture<Void> insert() { return getPersistenceManager().insert(model); } public SienaFuture<Void> update() { return getPersistenceManager().update(model); } public final PersistenceManagerAsync getPersistenceManager() { if(persistenceManagerAsync == null) { persistenceManagerAsync = PersistenceManagerFactory.getPersistenceManager(model.getClass()).async(); } return persistenceManagerAsync; } public static <R> QueryAsync<R> all(Class<R> clazz) { return PersistenceManagerFactory.getPersistenceManager(clazz).createQuery(clazz).async(); } public static <R> BatchAsync<R> batch(Class<R> clazz) { return PersistenceManagerFactory.getPersistenceManager(clazz).createBatch(clazz).async(); } public boolean equals(Object that) { if(this == that) { return true; } if(that == null || that.getClass() != this.getClass()) { return false; } ModelAsync masync = (ModelAsync)that; return this.model.equals(masync.model); } public int hashCode() { return model.hashCode(); } class ProxyQueryAsync<T> implements QueryAsync<T> { private static final long serialVersionUID = -1820063783201503668L; private String filter; private Class<T> clazz; private ModelAsync obj; public ProxyQueryAsync(Class<T> clazz, String filter, ModelAsync obj) { this.filter = filter; this.clazz = clazz; this.obj = obj; } private QueryAsync<T> createQuery() { return getPersistenceManager().createQuery(clazz).filter(filter, obj); } public QueryAsync<T> filter(String fieldName, Object value) { return createQuery().filter(fieldName, value); } public QueryAsync<T> order(String fieldName) { return createQuery().order(fieldName); } public QueryAsync<T> join(String field, String... sortFields) { return createQuery().join(field, sortFields); } public QueryAsync<T> aggregated(Object aggregator, String field) { return createQuery().aggregated(aggregator, field); } public QueryAsync<T> owned(Object owner, String field) { return createQuery().owned(owner, field); } public QueryAsync<T> search(String match, String... fields) { return createQuery().search(match, fields); } public QueryAsync<T> search(String match, QueryOption opt, String... fields) { return createQuery().search(match, opt, fields); } public SienaFuture<T> get() { return createQuery().get(); } public SienaFuture<T> getByKey(Object key) { return createQuery().getByKey(key); } public SienaFuture<Integer> delete() { return createQuery().delete(); } public SienaFuture<Integer> update(Map<String, ?> fieldValues) { return createQuery().update(fieldValues); } public SienaFuture<Integer> count() { return createQuery().count(); } public SienaFuture<List<T>> fetch() { return createQuery().fetch(); } public SienaFuture<List<T>> fetch(int limit) { return createQuery().fetch(); } public SienaFuture<List<T>> fetch(int limit, Object offset) { return createQuery().fetch(limit, offset); } public SienaFuture<List<T>> fetchKeys() { return createQuery().fetchKeys(); } public SienaFuture<List<T>> fetchKeys(int limit) { return createQuery().fetchKeys(limit); } public SienaFuture<List<T>> fetchKeys(int limit, Object offset) { return createQuery().fetchKeys(limit, offset); } public SienaFuture<Iterable<T>> iter() { return createQuery().iter(); } public SienaFuture<Iterable<T>> iter(int limit) { return createQuery().iter(limit); } public SienaFuture<Iterable<T>> iter(int limit, Object offset) { return createQuery().iter(limit, offset); } public SienaFuture<Iterable<T>> iterPerPage(int limit) { return createQuery().iterPerPage(limit); } public Class<T> getQueriedClass() { return clazz; } public SienaFuture<Object> raw(String request) { return createQuery().raw(request); } public QueryAsync<T> paginate(int size) { return createQuery().paginate(size); } public QueryAsync<T> nextPage() { return createQuery().nextPage(); } public QueryAsync<T> previousPage() { return createQuery().previousPage(); } public QueryAsync<T> customize(QueryOption... options) { return createQuery().customize(options); } public QueryOption option(int option) { return createQuery().option(option); } public Map<Integer, QueryOption> options() { return createQuery().options(); } public QueryAsync<T> stateful() { return createQuery().stateful(); } @Override public QueryAsync<T> stateless() { return createQuery().stateless(); } public QueryAsync<T> release() { return createQuery().release(); } @Override public QueryAsync<T> resetData() { return createQuery().resetData(); } public String dump() { return createQuery().dump(); } public QueryAsync<T> restore(String dump) { return createQuery().restore(dump); } public Query<T> sync() { return createQuery().sync(); } public List<QueryFilter> getFilters() { return createQuery().getFilters(); } public List<QueryOrder> getOrders() { return createQuery().getOrders(); } public List<QueryFilterSearch> getSearches() { return createQuery().getSearches(); } public List<QueryJoin> getJoins() { return createQuery().getJoins(); } public List<QueryAggregated> getAggregatees() { return createQuery().getAggregatees(); } public List<QueryOwned> getOwnees() { return createQuery().getOwnees(); } public QueryAsync<T> clone() { return createQuery().clone(); } public PersistenceManagerAsync getPersistenceManager() { return obj.getPersistenceManager(); } public QueryAsync<T> limit(int limit) { return createQuery().limit(limit); } public QueryAsync<T> offset(Object offset) { return createQuery().offset(offset); } } }