com.springsource.greenhouse.events.load.NFJSLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.springsource.greenhouse.events.load.NFJSLoader.java

Source

/*
 * Copyright 2012 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.events.load;

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

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class NFJSLoader {

    private static final Logger logger = LoggerFactory.getLogger(NFJSLoader.class);

    private final RestTemplate restTemplate;
    private final EventLoaderRepository loaderRepository;
    private final Map<Long, Long> timeSlotIdMap;
    private final Map<Long, Long> leaderIdMap;
    private final Map<Long, Long> topicSlotMap;

    @Inject
    public NFJSLoader(EventLoaderRepository loaderRepository) {
        this.loaderRepository = loaderRepository;
        this.restTemplate = new RestTemplate();
        this.timeSlotIdMap = new HashMap<Long, Long>();
        this.leaderIdMap = new HashMap<Long, Long>();
        this.topicSlotMap = new HashMap<Long, Long>();
    }

    public void loadEventData(int showId) {
        @SuppressWarnings("unchecked")
        Map<String, Object> eventMap = (Map<String, Object>) restTemplate
                .getForObject("https://springone2gx.com/m/data/show_short.json?showId={showId}", Map.class, showId);
        long sourceId = (Integer) eventMap.get("id");
        String name = (String) eventMap.get("name");
        String firstDay = (String) eventMap.get("firstDay");
        String lastDay = (String) eventMap.get("lastDay");
        String abbreviation = (String) eventMap.get("abreviation"); // yes, that's correct
        @SuppressWarnings("unchecked")
        Map<String, Object> locationMap = (Map<String, Object>) eventMap.get("location");
        String timeZone = (String) locationMap.get("timeZoneName");
        int utcOffset = (Integer) locationMap.get("utcOffset");
        String locationAddress = locationMap.get("address1") + " " + locationMap.get("address2") + " "
                + locationMap.get("city") + ", " + locationMap.get("stateCode") + " " + locationMap.get("zip");
        long eventId = loaderRepository.loadEvent(
                new EventData(MEMBER_GROUP_ID, name, null, abbreviation, firstDay, lastDay, timeZone, PROVIDER_ID,
                        sourceId),
                new VenueData((String) locationMap.get("description"), (String) locationAddress,
                        (Double) locationMap.get("latitude"), (Double) locationMap.get("longitude"),
                        (String) locationMap.get("metroArea")));
        loadTimeSlotData(showId, eventId, utcOffset);
        loadLeaderData(showId);
        loadEventSessionData(showId, eventId, abbreviation);
    }

    private void loadLeaderData(int showId) {
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> leaderMapList = (List<Map<String, Object>>) restTemplate.getForObject(
                "https://springone2gx.com/m/data/show_speakers.json?showId={showId}", List.class, showId);
        for (Map<String, Object> leaderMap : leaderMapList) {
            long sourceId = (Integer) leaderMap.get("id");
            String name = (String) leaderMap.get("name");
            String bio = (String) leaderMap.get("bio");
            String personalUrl = (String) leaderMap.get("blogLink");
            String twitterId = (String) leaderMap.get("twitterId");
            LeaderData leaderData = new LeaderData(name, bio, personalUrl, twitterId, PROVIDER_ID, sourceId);
            long leaderId = loaderRepository.loadLeader(leaderData);
            leaderIdMap.put(sourceId, leaderId);
        }
    }

    @SuppressWarnings("unchecked")
    private void loadTimeSlotData(int showId, long eventId, int utcOffset) {
        List<Map<String, Object>> dayMapList = (List<Map<String, Object>>) restTemplate.getForObject(
                "https://springone2gx.com/m/data/show_schedule.json?showId={showId}", List.class, showId);
        for (Map<String, Object> dayMap : dayMapList) {
            List<Map<String, Object>> slotMapList = (List<Map<String, Object>>) dayMap.get("slots");
            for (Map<String, Object> slotMap : slotMapList) {
                long sourceId = (Integer) slotMap.get("id");
                String label = (String) slotMap.get("label");
                String startTime = (String) slotMap.get("startTime");
                String endTime = (String) slotMap.get("endTime");
                TimeSlotData timeSlotData = new TimeSlotData(eventId, label, startTime, endTime, PROVIDER_ID,
                        sourceId);
                long timeSlotId = loaderRepository.loadTimeSlot(timeSlotData);
                timeSlotIdMap.put(sourceId, timeSlotId);
                List<Map<String, Object>> presentations = (List<Map<String, Object>>) slotMap.get("presentations");
                for (Map<String, Object> presentation : presentations) {
                    if (presentation.get("topicId") != null && presentation.get("slotId") != null) {
                        long topicId = (Integer) presentation.get("topicId");
                        long slotId = (Integer) presentation.get("slotId");
                        topicSlotMap.put(topicId, slotId);
                    }
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    private void loadEventSessionData(int showId, long event, String abbreviation) {
        List<Map<String, Object>> topicMapList = (List<Map<String, Object>>) restTemplate.getForObject(
                "https://springone2gx.com/m/data/show_topics.json?showId={showId}", List.class, showId);
        for (Map<String, Object> topicMap : topicMapList) {
            long sourceId = (Integer) topicMap.get("id");
            String title = (String) topicMap.get("title");
            String description = (String) topicMap.get("summary");
            String hashtag = "#" + abbreviation + sourceId;
            Long venue = null; // TODO: Figure out how to get this from event
            Long sourceTimeslot = topicSlotMap.get(sourceId);
            Long timeslot = timeSlotIdMap.get(sourceTimeslot);
            List<Integer> speakerIds = (List<Integer>) topicMap.get("speakerIds");
            List<Long> leaderIds = new ArrayList<Long>();
            for (Integer speakerId : speakerIds) {
                Long leaderId = leaderIdMap.get(speakerId.longValue());
                if (leaderId != null) {
                    leaderIds.add(leaderId);
                } else {
                    logger.warn("Unknown speaker ID " + speakerId + ". Not in show_speakers.json feed.");
                }
            }

            EventSessionData eventSessionData = new EventSessionData(event, -1, title, description, hashtag, venue,
                    timeslot, PROVIDER_ID, sourceId, leaderIds);
            loaderRepository.loadEventSession(eventSessionData);
        }
    }

    // expose getter so that we can use Spring Test MVC to mock NFJS server
    public RestTemplate getRestTemplate() {
        return restTemplate;
    }

    private static final String PROVIDER_ID = "NFJS";
    private static final long MEMBER_GROUP_ID = 1;

}