uk.q3c.krail.core.user.profile.SimpleUserHierarchy.java Source code

Java tutorial

Introduction

Here is the source code for uk.q3c.krail.core.user.profile.SimpleUserHierarchy.java

Source

/*
 * Copyright (c) 2015. David Sowerby
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

package uk.q3c.krail.core.user.profile;

import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import uk.q3c.krail.core.shiro.SubjectIdentifier;
import uk.q3c.krail.core.shiro.SubjectProvider;
import uk.q3c.krail.core.user.opt.Option;
import uk.q3c.krail.i18n.LabelKey;
import uk.q3c.krail.i18n.Translate;

import javax.annotation.Nonnull;
import javax.annotation.concurrent.ThreadSafe;

import static com.google.common.base.Preconditions.checkArgument;

/**
 * The most basic of {@link UserHierarchy} implementations, with just two ranks, the 'system' and the 'user'.  The
 * user is represented by {@link SubjectIdentifier#userId()}, and is a higher rank than 'system'
 * <p>
 * Created by David Sowerby on 18/02/15.
 */
@ThreadSafe
public class SimpleUserHierarchy implements UserHierarchy {

    public static final String SYSTEM = "system";
    private final SubjectProvider subjectProvider;
    private final SubjectIdentifier subjectIdentifier;
    private Translate translate;

    @Inject
    public SimpleUserHierarchy(SubjectProvider subjectProvider, SubjectIdentifier subjectIdentifier,
            Translate translate) {
        this.subjectProvider = subjectProvider;
        this.subjectIdentifier = subjectIdentifier;
        this.translate = translate;
    }

    /**
     * The descriptive name for this hierarchy, usually for use in the user interface. Should be Locale sensitive
     *
     * @return The descriptive name for this hierarchy
     */
    @Override
    @Nonnull
    public synchronized String displayName() {
        return translate.from(LabelKey.Simple_User_Hierarchy);
    }

    /**
     * Returns the identifier of the {@code hierarchyRank}, for the current user.  From the example given in the
     * {@link Option} javadoc, above that could be 'Development' if an implementation represented an Organisation,
     * and the current user is Emily
     *
     * @param hierarchyRank
     *         the rank (index) which is required.
     *
     * @return the rank name, for the current user, at the rank specified by {@code hierarchyRank}.
     *
     * @throws IllegalArgumentException
     *         if {@code hierarchyRank} is out of bounds
     */
    @Override
    public synchronized String rankName(int hierarchyRank) {
        checkArgument(hierarchyRank >= 0, "hierarchyRank must be 0 or greater");
        ImmutableList<String> ranks = ranksForCurrentUser();
        try {
            return ranks.get(hierarchyRank);
        } catch (IndexOutOfBoundsException e) {
            throw new IllegalArgumentException("Hierarchy level of " + hierarchyRank + " is too high");
        }
    }

    /**
     * Returns the values for the hierarchy ranks, for the current user, for this {@link UserHierarchy} implementation.
     *
     * @return if the user is authenticated, the userId and 'system'.  If the user is not authenticated, 'system' only
     */
    @Override
    @Nonnull
    public synchronized ImmutableList<String> ranksForCurrentUser() {

        if (subjectProvider.get().isAuthenticated()) {
            return ImmutableList.of(subjectIdentifier.userId(), SYSTEM);

        } else {
            //not authenticated, can only use system level
            return ImmutableList.of(SYSTEM);
        }
    }

    @Override
    public synchronized String highestRankName() {
        ImmutableList<String> ranks = ranksForCurrentUser();
        return ranks.get(0);
    }

    @Override
    public synchronized String lowestRankName() {
        ImmutableList<String> ranks = ranksForCurrentUser();
        return ranks.get(ranks.size() - 1);
    }
}