patrickfav/under-the-hood

View on GitHub
hood-core/src/release/java/at/favre/lib/hood/internal/UnmodifiablePages.java

Summary

Maintainability
A
3 hrs
Test Coverage
package at.favre.lib.hood.internal;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import at.favre.lib.hood.interfaces.Config;
import at.favre.lib.hood.interfaces.Page;
import at.favre.lib.hood.interfaces.Pages;

/**
 * Used to prevent changes to the pages object. Is a simple delegate.
 * Will throw exception when mutators are called.
 */
class UnmodifiablePages implements Pages {
    private final Pages debugPages;
    private final List<Page> unmodifiablePages;

    UnmodifiablePages(Pages pages) {
        this.debugPages = pages;
        this.unmodifiablePages = createImmutablePagesList(pages);
    }

    private List<Page> createImmutablePagesList(Pages pages) {
        List<Page> copy = new ArrayList<>(pages.size());
        for (Page page : pages.getAll()) {
            copy.add(new UnmodifiablePageDelegate(page));
        }
        return Collections.unmodifiableList(copy);
    }

    public Page addNewPage() {
        throw new UnsupportedOperationException("cannot change page in use");
    }

    public Page addNewPage(String title) {
        throw new UnsupportedOperationException("cannot change page in use");
    }

    @NonNull
    public Page getFirstPage() {
        return debugPages.getFirstPage();
    }

    @Nullable
    public Page getPage(int index) {
        return debugPages.getPage(index);
    }

    @NonNull
    public List<Page> getAll() {
        return unmodifiablePages;
    }

    public int size() {
        return debugPages.size();
    }

    public void refreshData() {
        debugPages.refreshData();
    }

    public void log(String message) {
        debugPages.log(message);
    }

    public void logPages() {
        debugPages.logPages();
    }

    @Override
    public StringBuilder getLogString() {
        return debugPages.getLogString();
    }

    @NonNull
    public Config getConfig() {
        return debugPages.getConfig();
    }

    @Override
    public Map<String, String> createDataMap() {
        return Collections.unmodifiableMap(debugPages.createDataMap());
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        UnmodifiablePages that = (UnmodifiablePages) o;

        if (debugPages != null ? !debugPages.equals(that.debugPages) : that.debugPages != null)
            return false;
        return unmodifiablePages != null ? unmodifiablePages.equals(that.unmodifiablePages) : that.unmodifiablePages == null;

    }

    @Override
    public int hashCode() {
        int result = debugPages != null ? debugPages.hashCode() : 0;
        result = 31 * result + (unmodifiablePages != null ? unmodifiablePages.hashCode() : 0);
        return result;
    }
}