com.springsource.greenhouse.account.AccountMapper.java Source code

Java tutorial

Introduction

Here is the source code for com.springsource.greenhouse.account.AccountMapper.java

Source

/*
 * Copyright 2010 the original author or authors.
 *
 * 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 com.springsource.greenhouse.account;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.inject.Inject;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.FileStorage;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriTemplate;

/**
 * RowMapper that maps a row in a ResultSet to an Account object instance.
 * Designed to be re-used anywhere Account SQL mapping needs to be performed.
 * Encapsulates the trickiest aspects of AccountMapping: mapping the picture and profile URL fields.
 * Also capable of mapping AccountReference objects, for generating links to public user profile without exposing private user data.
 * @author Keith Donald
 */
@Component
public class AccountMapper implements RowMapper<Account> {

    /**
     * SELECT clause for Account fields.
     */
    public static final String SELECT_ACCOUNT = "select id, firstName, lastName, email, username, gender, pictureSet from Member";

    /**
     * SELECT clause for AccountReference fields.
     */
    public static final String SELECT_ACCOUNT_REFERENCE = "select id, username, firstName, lastName, gender, pictureSet from Member";

    private final PictureUrlMapper pictureUrlMapper;

    private final UriTemplate profileUrlTemplate;

    /**
     * Constructs an AccountMapper.
     * @param pictureStorage The FileStorage for profile pictures
     * @param profileUrlTemplate The profile URL template for generating public user profile links
     */
    @Inject
    public AccountMapper(FileStorage pictureStorage,
            @Value("#{environment['application.url']}/members/{profileKey}") String profileUrlTemplate) {
        this(new PictureUrlMapper(new PictureUrlFactory(pictureStorage), PictureSize.SMALL), profileUrlTemplate);
    }

    // implementing RowMapper<Account>

    public Account mapRow(ResultSet rs, int row) throws SQLException {
        return new Account(rs.getLong("id"), rs.getString("firstName"), rs.getString("lastName"),
                rs.getString("email"), rs.getString("username"), pictureUrlMapper.mapRow(rs, row),
                profileUrlTemplate);
    }

    /**
     * A RowMapper that maps a lighter-weight {@link ProfileReference} object instead of a full-blown {@link Account}.
     * Designed to be used when generating links to user profiles.
     */
    public RowMapper<ProfileReference> getReferenceMapper() {
        return referenceMapper;
    }

    /**
     * Creates a new Account from a Person model.
     * The Account's username is initially null and may be changed later.
     * The Account's profile picture is initially the default picture for the Person's gender (it may also be changed later).
     * @param accountId the assigned internal account identifier
     * @param person the person model
     */
    public Account newAccount(Long accountId, Person person) {
        String pictureUrl = pictureUrlMapper.defaultPictureUrl(person.getGender());
        return new Account(accountId, person.getFirstName(), person.getLastName(), person.getEmail(), null,
                pictureUrl, profileUrlTemplate);
    }

    // internal helpers

    private final RowMapper<ProfileReference> referenceMapper = new RowMapper<ProfileReference>() {
        public ProfileReference mapRow(ResultSet rs, int row) throws SQLException {
            String id = getId(rs);
            String label = rs.getString("firstName") + " " + rs.getString("lastName");
            return new ProfileReference(id, label, pictureUrlMapper.mapRow(rs, row));
        }

        private String getId(ResultSet rs) throws SQLException {
            String username = rs.getString("username");
            return username != null ? username : rs.getString("id");
        }
    };

    private AccountMapper(PictureUrlMapper pictureUrlMapper, String profileUrlTemplate) {
        this.pictureUrlMapper = pictureUrlMapper;
        this.profileUrlTemplate = new UriTemplate(profileUrlTemplate);
    }

}