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

org.vertexium.MapMetadata Maven / Gradle / Ivy

There is a newer version: 4.10.0
Show newest version
package org.vertexium;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MapMetadata implements Metadata {
    private static final String KEY_SEPARATOR = "\u001f";
    private final Map entries;
    private final FetchHints fetchHints;
    private transient ReadWriteLock entriesLock = new ReentrantReadWriteLock();

    public MapMetadata() {
        this(FetchHints.ALL);
    }

    public MapMetadata(FetchHints fetchHints) {
        this.entries = new HashMap<>();
        this.fetchHints = fetchHints;
    }

    public MapMetadata(Metadata copyFromMetadata) {
        this(copyFromMetadata, FetchHints.ALL);
    }

    public MapMetadata(Metadata copyFromMetadata, FetchHints fetchHints) {
        this(fetchHints);
        if (copyFromMetadata != null) {
            for (Metadata.Entry entry : copyFromMetadata.entrySet()) {
                add(entry.getKey(), entry.getValue(), entry.getVisibility());
            }
        }
    }

    @Override
    public Metadata add(String key, Object value, Visibility visibility) {
        getEntriesLock().writeLock().lock();
        try {
            entries.put(toMapKey(key, visibility), new Metadata.Entry(key, value, visibility));
            return this;
        } finally {
            getEntriesLock().writeLock().unlock();
        }
    }

    @Override
    public void remove(String key, Visibility visibility) {
        getEntriesLock().writeLock().lock();
        try {
            entries.remove(toMapKey(key, visibility));
        } finally {
            getEntriesLock().writeLock().unlock();
        }
    }

    @Override
    public void clear() {
        getEntriesLock().writeLock().lock();
        try {
            entries.clear();
        } finally {
            getEntriesLock().writeLock().unlock();
        }
    }

    @Override
    public void remove(String key) {
        getEntriesLock().writeLock().lock();
        try {
            for (Map.Entry e : new ArrayList<>(entries.entrySet())) {
                if (e.getValue().getKey().equals(key)) {
                    entries.remove(e.getKey());
                }
            }
        } finally {
            getEntriesLock().writeLock().unlock();
        }
    }

    @Override
    public Collection entrySet() {
        getEntriesLock().readLock().lock();
        try {
            return new ArrayList<>(entries.values());
        } finally {
            getEntriesLock().readLock().unlock();
        }
    }

    @Override
    public Entry getEntry(String key, Visibility visibility) {
        getFetchHints().assertMetadataIncluded(key);
        getEntriesLock().readLock().lock();
        try {
            return entries.get(toMapKey(key, visibility));
        } finally {
            getEntriesLock().readLock().unlock();
        }
    }

    @Override
    public Entry getEntry(String key) {
        getFetchHints().assertMetadataIncluded(key);
        getEntriesLock().readLock().lock();
        try {
            Entry entry = null;
            for (Map.Entry e : entries.entrySet()) {
                if (e.getValue().getKey().equals(key)) {
                    if (entry != null) {
                        throw new VertexiumException("Multiple matching entries for key: " + key);
                    }
                    entry = e.getValue();
                }
            }
            return entry;
        } finally {
            getEntriesLock().readLock().unlock();
        }
    }

    @Override
    public Collection getEntries(String key) {
        getFetchHints().assertMetadataIncluded(key);
        getEntriesLock().readLock().lock();
        try {
            Collection results = new ArrayList<>();
            for (Map.Entry e : entries.entrySet()) {
                if (e.getValue().getKey().equals(key)) {
                    Entry entry = e.getValue();
                    results.add(entry);
                }
            }
            return results;
        } finally {
            getEntriesLock().readLock().unlock();
        }
    }

    @Override
    public boolean containsKey(String key) {
        getFetchHints().assertMetadataIncluded(key);
        getEntriesLock().readLock().lock();
        try {
            for (Map.Entry e : entries.entrySet()) {
                if (e.getValue().getKey().equals(key)) {
                    return true;
                }
            }
            return false;
        } finally {
            getEntriesLock().readLock().unlock();
        }
    }

    private String toMapKey(String key, Visibility visibility) {
        return key + KEY_SEPARATOR + visibility.getVisibilityString();
    }

    private ReadWriteLock getEntriesLock() {
        // entriesLock may be null if this class has just been deserialized
        if (entriesLock == null) {
            entriesLock = new ReentrantReadWriteLock();
        }
        return entriesLock;
    }

    @Override
    public FetchHints getFetchHints() {
        return fetchHints;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy