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

com.servicerocket.confluence.randombits.metadata.impl.handler.UserHandler Maven / Gradle / Ivy

There is a newer version: 2.5.12
Show newest version
package com.servicerocket.confluence.randombits.metadata.impl.handler;

import com.atlassian.confluence.user.ConfluenceUser;
import com.atlassian.confluence.user.UserAccessor;
import com.atlassian.sal.api.user.UserKey;
import com.atlassian.user.User;
import com.servicerocket.confluence.randombits.metadata.AbstractTypeHandler;
import com.servicerocket.confluence.randombits.metadata.reference.UserReference;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import static java.lang.String.format;

/**
 * Converts a {@link User} to a {@link com.servicerocket.confluence.randombits.metadata.reference.UserReference} and vice versa.
 */
public class UserHandler extends AbstractTypeHandler {

    private static final Logger log = Logger.getLogger(UserHandler.class);

    public static final String LEGACY_ALIAS = "UserOption";

    public static final String ALIAS = "UserReference";

    private final UserAccessor userAccessor;

    public UserHandler(UserAccessor userAccessor) {
        super(User.class, UserReference.class);
        this.userAccessor = userAccessor;
    }

    @Override
    protected User doGetOriginal(UserReference stored) {

        if (null == stored.getUserKey()) {

            // Reading username from UserReference should be avoided. This happens only if the data was unsuccessfully migrated,
            // likely because the user was/is missing.
            @SuppressWarnings("deprecation") String username = stored.getUsername();

            if (null != stored.getUsername()) {
                User user = userAccessor.getUserByName(username);
                if (null != user) {
                    return user;
                } else {
                    if (log.isEnabledFor(Level.WARN)) {
                        log.warn(format("Could not construct User '%s' as it is missing from the persistence. Recreate user in Confluence (then disable if necessary) to avoid reading this message again.", stored.getUsername()));
                    }
                    // DeferredLookupUser is used as a compromise between UnknownUser in Confluence 6 and DeletedUser in Confluence 7. It looks up the "real" ConfluenceUser lazily as necessary to fulfil the method contract.
                    return new UnknownUser(stored.getUsername());
                }
            }
            return null;
        } else {
            // User can actually be a deleted user here (ALA data stored in XML uses key not username). The `user_mapping` table helps to prevent a null.
            return userAccessor.getUserByKey(new UserKey(stored.getUserKey()));
        }
    }

    @Override
    protected UserReference doGetStored(User original) {

        if (original instanceof UnknownUser) {
            // Constructing UserReference by name should only happen if the user was deleted and not migrated.
            @SuppressWarnings("deprecation") UserReference r = new UserReference(original.getName());
            return r;
        } else if (original instanceof ConfluenceUser) {
            return new UserReference(userAccessor.getUserByKey(((ConfluenceUser) original).getKey()));
        } else {
            return new UserReference(userAccessor.getUserByName(original.getName()));
        }
    }

    @Override
    protected String getAlias() {
        return ALIAS;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy