Android Open Source - NexusData Faulting Set






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;
//from  w  w w.  j  av  a 2  s.co m
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import com.github.dkharrat.nexusdata.metamodel.Relationship;

class FaultingSet<E extends ManagedObject> implements Set<E> {

    private final ManagedObject parent;
    private Set<E> backingSet = new LinkedHashSet<E>();
    private boolean isFault = false;
    private final Relationship relationship;

    FaultingSet(ManagedObject parent, Relationship relationship, Collection<E> objects) {
        this.parent = parent;
        this.relationship = relationship;
        isFault = !this.parent.isInserted() && objects == null;
        if (objects != null) {
            setObjects(objects);
        }
    }

    private ObjectContext getContext() {
        return parent.getObjectContext();
    }

    void fulfillFaultIfNecessary() {
        if (isFault()) {
            getContext().faultInObjectRelationship(parent, relationship);
            isFault = false;
        }
    }

    public boolean isFault() {
        return isFault;
    }

    public void refresh() {
        isFault = !parent.isInserted();
        backingSet = new LinkedHashSet<E>();
    }

    void setObjects(Collection<E> objects) {
        backingSet = new LinkedHashSet<E>(objects);
    }

    /**
     * Clones this set such that it's compatible with a different context
     * @param otherContext
     */
    FaultingSet<E> getObjectsInContext(ObjectContext otherContext) {
        if (!getContext().isCompatibleWithContext(otherContext)) {
            throw new RuntimeException("Contexts not compatible. Ensure that they share the same persistence store.");
        }

        List<E> relatedObjects = null;
        if (!isFault()) {
            relatedObjects = new ArrayList<E>();
            for (E relatedObject : this) {
                relatedObjects.add((E) otherContext.objectWithID(relatedObject.getID()));
            }
        }

        FaultingSet<E> relatedObjectsSet = new FaultingSet<E>(otherContext.objectWithID(parent.getID()), relationship, relatedObjects);
        return relatedObjectsSet;
    }

    private void setInverseRelationshipValue(ManagedObject relatedObject) {
        relatedObject.setValueDirectly(relationship.getInverse(), parent);
        parent.notifyManagedObjectContextOfChange();
    }

    private void clearInverseRelationshipValue(ManagedObject relatedObject) {
        relatedObject.setValueDirectly(relationship.getInverse(), null);
        parent.notifyManagedObjectContextOfChange();
    }

    @Override
    public boolean add(E object) {
        if (object.getObjectContext() != null && object.getObjectContext() != getContext()) {
            throw new UnsupportedOperationException("Cannot add an object that belongs to another context");
        }

        if (!object.isInserted() && object.getObjectContext() == null) {
            throw new UnsupportedOperationException("Cannot add an object that is not registered with a context");
        }

        fulfillFaultIfNecessary();

        setInverseRelationshipValue(object);

        if (object.isInserted()) {
            getContext().insert(object);
        }
        object.notifyManagedObjectContextOfChange();

        return backingSet.add(object);
    }

    @Override
    public boolean addAll(Collection<? extends E> objects) {
        boolean changed = false;
        for (E object : objects) {
            changed = add(object) || changed;
        }
        return changed;
    }

    @Override
    public void clear() {
        fulfillFaultIfNecessary();

        for (E object : backingSet) {
            clearInverseRelationshipValue(object);
        }

        backingSet.clear();
    }

    @Override
    public boolean contains(Object object) {
        fulfillFaultIfNecessary();
        return backingSet.contains(object);
    }

    @Override
    public boolean containsAll(Collection<?> objects) {
        fulfillFaultIfNecessary();
        return backingSet.containsAll(objects);
    }

    @Override
    public boolean isEmpty() {
        fulfillFaultIfNecessary();
        return backingSet.isEmpty();
    }

    @Override
    public Iterator<E> iterator() {
        fulfillFaultIfNecessary();
        return backingSet.iterator();
    }

    @Override
    public boolean remove(Object o) {
        fulfillFaultIfNecessary();

        if (o instanceof ManagedObject) {
            ManagedObject object = (ManagedObject)o;
            clearInverseRelationshipValue(object);
            if (object.isInserted()) {
                getContext().delete(object);
            } else {
                object.notifyManagedObjectContextOfChange();
            }
        }

        return backingSet.remove(o);
    }

    @Override
    public boolean removeAll(Collection<?> objects) {
        boolean changed = false;
        for (Object object : objects) {
            changed = remove(object) || changed;
        }
        return changed;
    }

    @Override
    public boolean retainAll(Collection<?> objects) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int size() {
        fulfillFaultIfNecessary();
        return backingSet.size();

    }

    @Override
    public Object[] toArray() {
        fulfillFaultIfNecessary();
        return backingSet.toArray();
    }

    @Override
    public <T> T[] toArray(T[] array) {
        fulfillFaultIfNecessary();
        return backingSet.toArray(array);
    }

    @Override
    public String toString() {
        if (isFault()) {
            return "Relationship '"+ relationship.getName()+"' fault on object "+ parent.toObjectReferenceString();
        } else {
            return "Relationship '"+ relationship.getName()+"' on object "+ parent.toObjectReferenceString()+";\n"+
                    "   values: "+ backingSet.toString();
        }
    }

    public Set<ObjectID> getObjectIDs() {
        fulfillFaultIfNecessary();

        Set<ObjectID> objectIDs = new LinkedHashSet<ObjectID>();
        for (ManagedObject object : backingSet) {
            objectIDs.add(object.getID());
        }
        return objectIDs;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((backingSet == null)   ? 0 : backingSet.hashCode());
        result = prime * result + ((parent == null)       ? 0 : parent.hashCode());
        result = prime * result + ((relationship == null) ? 0 : relationship.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        FaultingSet<?> other = (FaultingSet<?>) obj;
        if (backingSet == null) {
            if (other.backingSet != null)
                return false;
        } else if (!backingSet.equals(other.backingSet))
            return false;
        if (parent == null) {
            if (other.parent != null)
                return false;
        } else if (!parent.equals(other.parent))
            return false;
        if (relationship == null) {
            if (other.relationship != null)
                return false;
        } else if (!relationship.equals(other.relationship))
            return false;
        return true;
    }
}




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