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

com.github.fge.jsonschema.jsonpointer.TreePointer Maven / Gradle / Ivy

package com.github.fge.jsonschema.jsonpointer;

import com.fasterxml.jackson.core.TreeNode;
import com.github.fge.jsonschema.messages.JsonPointerMessages;
import com.github.fge.jsonschema.report.ProcessingMessage;
import com.google.common.collect.Lists;

import java.util.Iterator;
import java.util.List;

public abstract class TreePointer
    implements Iterable>
{
    protected static final char SLASH = '/';

    protected final T missing;

    protected final List> tokenResolvers;

    protected TreePointer(final T missing,
        final List> tokenResolvers)
    {
        this.missing = missing;
        // WARNING: it is up to the actual constructor to ensure that the list
        // is a copy of the original
        this.tokenResolvers = tokenResolvers;
    }

    protected TreePointer(final List> tokenResolvers)
    {
        this(null, tokenResolvers);
    }

    protected static List tokensFromInput(final String input)
        throws JsonPointerException
    {
        final List ret = Lists.newArrayList();
        String s = input;
        String cooked;
        int index;
        char c;

        while (!s.isEmpty()) {
            c = s.charAt(0);
            if (c != SLASH)
                throw new JsonPointerException(new ProcessingMessage()
                    .message(JsonPointerMessages.NOT_SLASH)
                    .put("expected", Character.valueOf(SLASH))
                    .put("found", Character.valueOf(c)));
            s = s.substring(1);
            index = s.indexOf(SLASH);
            cooked = index == -1 ? s : s.substring(0, index);
            ret.add(ReferenceToken.fromCooked(cooked));
            if (index == -1)
                break;
            s = s.substring(index);
        }

        return ret;
    }

    public final T get(final T node)
    {
        T ret = node;
        for (final TokenResolver tokenResolver: tokenResolvers) {
            if (ret == null)
                break;
            ret = tokenResolver.get(ret);
        }

        return ret;
    }

    public final T path(final T node)
    {
        final T ret = get(node);
        return ret == null ? missing : ret;
    }

    @Override
    public final Iterator> iterator()
    {
        return tokenResolvers.iterator();
    }

    @Override
    public final int hashCode()
    {
        return tokenResolvers.hashCode();
    }

    @Override
    public final boolean equals(final Object obj)
    {
        if (obj == null)
            return false;
        if (this == obj)
            return true;
        if (getClass() != obj.getClass())
            return false;
        @SuppressWarnings("unchecked")
        final TreePointer other = (TreePointer) obj;
        return tokenResolvers.equals(other.tokenResolvers);
    }

    @Override
    public final String toString()
    {
        final StringBuilder sb = new StringBuilder();
        for (final TokenResolver tokenResolver: tokenResolvers)
            sb.append('/').append(tokenResolver);

        return sb.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy