@Override public void unmute(UnmuteEventsMode mode) { listenersSuspended = false; if (mode == UnmuteEventsMode.FIRE_REFRESH_EVENT) { fireCollectionChanged(Operation.REFRESH, Collections.emptyList()); } }
@Override public void removeCollectionChangeListener(CollectionChangeListener<? super T, K> listener) { getEventRouter().removeListener(CollectionChangeListener.class, listener); } }
protected DataLoadContextQuery createDataQuery(DataLoadContext context, Map<String, Object> params) { DataLoadContextQuery q = null; if (query != null && queryParameters != null) { Map<String, Object> parameters = getQueryParameters(params); for (ParameterInfo info : queryParameters) { if (ParameterInfo.Type.DATASOURCE.equals(info.getType())) { String queryString = getJPQLQuery(getTemplateParams(params)); q = context.setQueryString(queryString); ((LoadContext.Query) q).setCacheable(isCacheable());
/** * Return number of rows for the current query set in the datasource. * * @return number of rows. In case of error returns 0 and sets {@link #dataLoadError} field to the exception object */ public int getCount() { LoadContext<Entity> context = new LoadContext<>(metaClass); LoadContext.Query q = (LoadContext.Query) createDataQuery(context, savedParameters == null ? Collections.<String, Object>emptyMap() : savedParameters); context.setSoftDeletion(isSoftDeletion()); if (q == null) return 0; prepareLoadContext(context); dataLoadError = null; try { long res = dataSupplier.getCount(context); if (res > Integer.MAX_VALUE) throw new RuntimeException("Number of records is too big: " + res); return (int) res; } catch (Throwable e) { dataLoadError = e; } return 0; }
@Override public void commit() { backgroundWorker.checkUIAccess(); if (!allowCommit) { return; } if (getCommitMode() == CommitMode.DATASTORE) { DataSupplier supplier = getDataSupplier(); CommitContext context = new CommitContext(); for (Entity entity : itemsToCreate) { context.addInstanceToCommit(entity, view); } for (Entity entity : itemsToUpdate) { context.addInstanceToCommit(entity, view); } for (Entity entity : itemsToDelete) { context.addInstanceToRemove(entity); } Set<Entity> committed = supplier.commit(context); committed(committed); } else { throw new UnsupportedOperationException(); } }
@Override public T getItemNN(K id) { T it = getItem(id); if (it != null) return it; else throw new NullPointerException("Item with id=" + id + " is not found in datasource " + this.id); }
@Override public void setItem(T item) { backgroundWorker.checkUIAccess(); if (State.VALID.equals(state)) { T prevItem = this.item; if (prevItem != item) { if (item != null) { final MetaClass aClass = item.getMetaClass(); if (!aClass.equals(this.metaClass) && !this.metaClass.getDescendants().contains(aClass)) { throw new DevelopmentException(String.format("Invalid item metaClass '%s'", aClass)); } } this.item = item; fireItemChanged(prevItem); } } }
@Override public void addCollectionChangeListener(CollectionChangeListener<? super T, K> listener) { getEventRouter().addListener(CollectionChangeListener.class, listener); }
@Override public void resumeListeners() { listenersSuspended = false; while(!suspendedEvents.isEmpty()) { CollectionChangeEvent<T,K> suspendedEvent = suspendedEvents.removeLast(); fireCollectionChanged(suspendedEvent.getOperation(), Collections.unmodifiableList(suspendedEvent.getItems())); } }
protected void fireCollectionChanged(Operation operation, List<T> items) { if (listenersSuspended) { if (!suspendedEvents.isEmpty() && suspendedEvents.getFirst().getOperation().equals(operation)) { suspendedEvents.getFirst().getItems().addAll(items); } else { suspendedEvents.addFirst(new CollectionChangeEvent<>(this, operation, new ArrayList<>(items))); } return; } CollectionChangeEvent<T, K> collectionChangeEvent = new CollectionChangeEvent<>(this, operation, items); //noinspection unchecked getEventRouter().fireEvent(CollectionChangeListener.class, CollectionChangeListener::collectionChanged, collectionChangeEvent); }