Android Open Source - NexusData Object Context Notifier






From Project

Back to project page NexusData.

License

The source code is released under:

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCT...

If you think the Android project NexusData listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.github.dkharrat.nexusdata.core;
/*w w  w  .  ja v  a  2s .  c o m*/
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

/**
 * This is a singleton class used to register for notifications from {@link ObjectContext} events, such as
 * inserted objects, changed objects, etc.
 */
public class ObjectContextNotifier {

    /**
     * Defines the interface which {@link ObjectContext} listeners must implement to receive notifications of relevant
     * events.
     */
    public static interface ObjectContextListener {
        /**
         * Called when any set of objects have changed since the last event loop. Changes includes objects that have
         * have been inserted, removed, updated, or refreshed.
         *
         * @param context           the context in which the changed objects belong to
         * @param changedObjects    a notification object containing the objects that have been inserted, removed,
         *                          updated, or refreshed
         */
        public void onObjectsChanged(ObjectContext context, ObjectsChangedNotification changedObjects);

        /**
         * Called when the context is about to be saved.
         *
         * @param context the context instance that will be saved
         */
        public void onPreSave(ObjectContext context);

        /**
         * Called when the context has just been saved.
         *
         * @param context           the context instance that has been saved
         * @param changedObjects    a reference to a collection of the objects that have been changed
         */
        public void onPostSave(ObjectContext context, ChangedObjectsSet changedObjects);
    }

    /**
     * Provides a default empty implementation of the {@link ObjectContextListener}. This is useful when you want
     * to only override specific methods and leave the rest empty.
     */
    public static abstract class DefaultObjectContextListener implements ObjectContextListener {
        @Override
        public void onPreSave(ObjectContext context) {
            // do nothing by default
        }

        @Override
        public void onObjectsChanged(ObjectContext context, ObjectsChangedNotification objectsChanged) {
            // do nothing by default
        }

        @Override
        public void onPostSave(ObjectContext context, ChangedObjectsSet changedObjects) {
            // do nothing by default
        }
    }

    private static Set<ObjectContextListener> allContextsListeners = new LinkedHashSet<ObjectContextListener>();
    private static Map<ObjectContext, Set<ObjectContextListener>> contextListeners = new HashMap<ObjectContext, Set<ObjectContextListener>>();

    static void notifyListenersOfPreSave(ObjectContext context) {
        for (ObjectContextListener listener : getListeners(context)) {
            listener.onPreSave(context);
        }
    }

    static void notifyListenersOfPostSave(ObjectContext context, ChangedObjectsSet changedObjects) {
        for (ObjectContextListener listener : getListeners(context)) {
            listener.onPostSave(context, changedObjects);
        }
    }

    static void notifyListenersOfObjectsChanged(ObjectContext context, ObjectsChangedNotification changedObjects) {
        for (ObjectContextListener listener : getListeners(context)) {
            listener.onObjectsChanged(context, changedObjects);
        }
    }

    static boolean hasListeners(ObjectContext context) {
        Set<ObjectContextListener> listeners = contextListeners.get(context);
        return !allContextsListeners.isEmpty() || (listeners != null && !listeners.isEmpty());
    }

    private static Set<ObjectContextListener> getListeners(ObjectContext context) {
        Set<ObjectContextListener> allListeners = getListenersForContext(context);

        if (!allContextsListeners.isEmpty()) {
            // make a copy so we don't modify original
            allListeners = new LinkedHashSet<ObjectContextListener>(allListeners);
            allListeners.addAll(allContextsListeners);
        }

        return allListeners;
    }

    private static Set<ObjectContextListener> getListenersForContext(ObjectContext context) {
        Set<ObjectContextListener> listeners = contextListeners.get(context);

        if (listeners == null) {
            listeners = new LinkedHashSet<ObjectContextListener>();
            contextListeners.put(context, listeners);
        }

        return listeners;
    }

    /**
     * Registers a listener to be notified of events from the specified ObjectContext. If the listener was previously
     * registered for events from all ObjectContexts, registration is ignored.
     * <p>
     * <b>Note:</b> An application must unregister the listener when it is no longer interested in the events to prevent
     *              memory leaks.
     *
     * @param forContext    the ObjectContext to listen for
     * @param listener      the listener to register
     * @see #registerListener(ObjectContextListener)
     */
    public static void registerListener(ObjectContext forContext, ObjectContextListener listener) {
        if (!allContextsListeners.contains(listener)) {
            Set<ObjectContextListener> listeners = getListenersForContext(forContext);
            listeners.add(listener);
        }
    }

    /**
     * Registers a listener to be notified of events from all ObjectContexts used by the application.
     * <p>
     * <b>Note:</b> An application must unregister the listener when you are no longer interested in the events to prevent
     *              memory leaks.
     *
     * @param listener      the listener to register
     * @see   #registerListener(ObjectContext, ObjectContextListener)
     */
    public static void registerListener(ObjectContextListener listener) {
        allContextsListeners.add(listener);
    }

    /**
     * Unregisters a listener from receiving events for the specified object context.
     *
     * @param forContext    the ObjectContext to unregister for
     * @param listener      the listener to unregister
     * @see #unregisterListener(ObjectContextListener)
     */
    public static void unregisterListener(ObjectContext forContext, ObjectContextListener listener) {
        Set<ObjectContextListener> listeners = getListenersForContext(forContext);
        listeners.remove(listener);
        if (listeners.isEmpty()) {
            // remove context from collection to prevent memory leaks
            contextListeners.remove(forContext);
        }
    }

    /**
     * Unregisters a listener from receiving events for all ObjectContexts used by the application.
     *
     * @param listener      the listener to unregister
     * @see #unregisterListener(ObjectContext, ObjectContextListener)
     */
    public static void unregisterListener(ObjectContextListener listener) {
        allContextsListeners.remove(listener);
    }
}




Java Source Code List

com.github.dkharrat.nexusdata.core.AtomicStore.java
com.github.dkharrat.nexusdata.core.ChangedObjectsSet.java
com.github.dkharrat.nexusdata.core.FaultingSet.java
com.github.dkharrat.nexusdata.core.FetchRequest.java
com.github.dkharrat.nexusdata.core.IncrementalStore.java
com.github.dkharrat.nexusdata.core.ManagedObject.java
com.github.dkharrat.nexusdata.core.NoSuchPropertyException.java
com.github.dkharrat.nexusdata.core.ObjectContextNotifier.java
com.github.dkharrat.nexusdata.core.ObjectContext.java
com.github.dkharrat.nexusdata.core.ObjectID.java
com.github.dkharrat.nexusdata.core.ObjectsChangedNotification.java
com.github.dkharrat.nexusdata.core.PersistentStoreCoordinator.java
com.github.dkharrat.nexusdata.core.PersistentStoreRequest.java
com.github.dkharrat.nexusdata.core.PersistentStore.java
com.github.dkharrat.nexusdata.core.SaveChangesRequest.java
com.github.dkharrat.nexusdata.core.SortDescriptor.java
com.github.dkharrat.nexusdata.core.StoreCacheNode.java
com.github.dkharrat.nexusdata.metamodel.Attribute.java
com.github.dkharrat.nexusdata.metamodel.Entity.java
com.github.dkharrat.nexusdata.metamodel.ObjectModelJsonParser.java
com.github.dkharrat.nexusdata.metamodel.ObjectModel.java
com.github.dkharrat.nexusdata.metamodel.Property.java
com.github.dkharrat.nexusdata.metamodel.Relationship.java
com.github.dkharrat.nexusdata.modelgen.ModelGenerator.java
com.github.dkharrat.nexusdata.modelgen.Startup.java
com.github.dkharrat.nexusdata.modelgen.metamodel.Attribute.java
com.github.dkharrat.nexusdata.modelgen.metamodel.Entity.java
com.github.dkharrat.nexusdata.modelgen.metamodel.EnumProperty.java
com.github.dkharrat.nexusdata.modelgen.metamodel.ModelWrapper.java
com.github.dkharrat.nexusdata.modelgen.metamodel.Model.java
com.github.dkharrat.nexusdata.modelgen.metamodel.Property.java
com.github.dkharrat.nexusdata.modelgen.metamodel.Relationship.java
com.github.dkharrat.nexusdata.predicate.ComparisonPredicate.java
com.github.dkharrat.nexusdata.predicate.CompoundPredicate.java
com.github.dkharrat.nexusdata.predicate.ConstantExpression.java
com.github.dkharrat.nexusdata.predicate.ExpressionBuilder.java
com.github.dkharrat.nexusdata.predicate.ExpressionVisitor.java
com.github.dkharrat.nexusdata.predicate.Expression.java
com.github.dkharrat.nexusdata.predicate.FieldPathExpression.java
com.github.dkharrat.nexusdata.predicate.NotPredicate.java
com.github.dkharrat.nexusdata.predicate.PredicateBuilder.java
com.github.dkharrat.nexusdata.predicate.Predicate.java
com.github.dkharrat.nexusdata.predicate.ThisExpression.java
com.github.dkharrat.nexusdata.predicate.parser.ComparisonParselet.java
com.github.dkharrat.nexusdata.predicate.parser.ConstantParselet.java
com.github.dkharrat.nexusdata.predicate.parser.ExpressionNode.java
com.github.dkharrat.nexusdata.predicate.parser.GroupParselet.java
com.github.dkharrat.nexusdata.predicate.parser.InfixParselet.java
com.github.dkharrat.nexusdata.predicate.parser.LexerGrammar.java
com.github.dkharrat.nexusdata.predicate.parser.Lexer.java
com.github.dkharrat.nexusdata.predicate.parser.LogicalParselet.java
com.github.dkharrat.nexusdata.predicate.parser.NameParselet.java
com.github.dkharrat.nexusdata.predicate.parser.ParseException.java
com.github.dkharrat.nexusdata.predicate.parser.Parser.java
com.github.dkharrat.nexusdata.predicate.parser.PredicateParser.java
com.github.dkharrat.nexusdata.predicate.parser.PrefixParselet.java
com.github.dkharrat.nexusdata.predicate.parser.Token.java
com.github.dkharrat.nexusdata.store.AndroidSqlPersistentStore.java
com.github.dkharrat.nexusdata.store.DatabaseHelper.java
com.github.dkharrat.nexusdata.store.InMemoryPersistentStore.java
com.github.dkharrat.nexusdata.store.PredicateToSQL.java
com.github.dkharrat.nexusdata.utils.DateUtil.java
com.github.dkharrat.nexusdata.utils.ObjectUtil.java
com.github.dkharrat.nexusdata.utils.SqlTableBuilder.java
com.github.dkharrat.nexusdata.utils.StreamUtil.java
com.github.dkharrat.nexusdata.utils.StringUtil.java
com.github.dkharrat.nexusdata.utils.android.CursorUtil.java
com.github.dkharrat.nexusdata.utils.android.SQLiteDatabaseHelper.java
org.example.todo.MainActivity.java
org.example.todo.NewTaskActivity.java
org.example.todo.Task.java
org.example.todo.TodoApp.java
org.example.todo.User.java
org.example.todo._Task.java
org.example.todo._User.java