All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jparams.store.reference.DefaultReferenceManager Maven / Gradle / Ivy

There is a newer version: 3.1.4
Show newest version
package com.jparams.store.reference;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;

import com.jparams.store.identity.IdentityProvider;

/**
 * An implementation of reference manager that maintains unique references
 *
 * @param  value type
 */
public class DefaultReferenceManager implements ReferenceManager
{
    private final IdentityProvider identityProvider;
    private final ReferenceFactory referenceFactory;
    private final Map> referenceMap;

    public DefaultReferenceManager(final IdentityProvider identityProvider, final ReferenceFactory referenceFactory)
    {
        this.identityProvider = identityProvider;
        this.referenceFactory = referenceFactory;
        this.referenceMap = new LinkedHashMap<>();
    }

    private DefaultReferenceManager(final IdentityProvider identityProvider, final ReferenceFactory referenceFactory, final Map> referenceMap)
    {
        this.identityProvider = identityProvider;
        this.referenceFactory = referenceFactory;
        this.referenceMap = new LinkedHashMap<>(referenceMap);
    }

    @Override
    public Collection> getReferences()
    {
        return referenceMap.values();
    }

    @Override
    public Optional> findReference(final Object item)
    {
        final Object identity = identityProvider.getIdentity(item);

        if (identity == null)
        {
            return Optional.empty();
        }

        return Optional.ofNullable(referenceMap.get(identity));
    }

    @Override
    public int size()
    {
        return referenceMap.size();
    }

    @Override
    public void clear()
    {
        referenceMap.clear();
    }

    @Override
    public Reference add(final V item)
    {
        final Object identity = identityProvider.getIdentity(item);

        if (identity == null)
        {
            return null;
        }

        if (referenceMap.containsKey(identity))
        {
            return referenceMap.get(identity);
        }

        final Reference reference = referenceFactory.createReference(item);
        referenceMap.put(identity, reference);
        return reference;
    }

    @Override
    public ReferenceManager copy()
    {
        return new DefaultReferenceManager<>(identityProvider, referenceFactory, referenceMap);
    }

    @Override
    public Reference remove(final Object item)
    {
        final Object identity = identityProvider.getIdentity(item);

        if (identity == null)
        {
            return null;
        }

        return referenceMap.remove(identity);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy