au.id.hazelwood.xmltvguidebuilder.mapper.XmltvMapper.java Source code

Java tutorial

Introduction

Here is the source code for au.id.hazelwood.xmltvguidebuilder.mapper.XmltvMapper.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 au.id.hazelwood.xmltvguidebuilder.mapper;

import au.id.hazelwood.xmltvguidebuilder.model.ChannelDetail;
import au.id.hazelwood.xmltvguidebuilder.model.ChannelListings;
import au.id.hazelwood.xmltvguidebuilder.model.EpisodeDetail;
import au.id.hazelwood.xmltvguidebuilder.model.ProgrammeDetail;

import org.apache.commons.lang.time.StopWatch;
import org.joda.time.LocalDate;
import org.joda.time.Minutes;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmltv.schema.Category;
import org.xmltv.schema.Channel;
import org.xmltv.schema.Desc;
import org.xmltv.schema.DisplayName;
import org.xmltv.schema.EpisodeNum;
import org.xmltv.schema.Length;
import org.xmltv.schema.ObjectFactory;
import org.xmltv.schema.Programme;
import org.xmltv.schema.Rating;
import org.xmltv.schema.SubTitle;
import org.xmltv.schema.Title;
import org.xmltv.schema.Tv;

import java.util.List;

import static au.id.hazelwood.xmltvguidebuilder.utils.DateTimeUtils.formatDurationWords;
import static java.text.MessageFormat.format;
import static org.apache.commons.lang.StringUtils.isNotBlank;

/**
 * @author Ricky Hazelwood
 * @version 1.0
 */
public class XmltvMapper {
    private static final Logger LOGGER = LoggerFactory.getLogger(XmltvMapper.class);
    private static final ObjectFactory OBJECT_FACTORY = new ObjectFactory();
    private static final DateTimeFormatter DATE_FORMAT = ISODateTimeFormat.date();
    private static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormat.forPattern("yyyyMMddHHmmss Z");
    private static final String EPISODE_NUM_SYSTEM = "xmltv_ns";
    private static final String RATING_SYSTEM = "ABA";
    private static final String LENGTH_UNITS = "minutes";
    private static final String LANG = "en";
    private final String applicationName;
    private final String applicationVersion;

    public XmltvMapper(String applicationName, String applicationVersion) {
        this.applicationName = applicationName;
        this.applicationVersion = applicationVersion;
        LOGGER.debug("Created TVBuilder");
    }

    public Tv toXmltv(ChannelListings channelListings) {
        LOGGER.debug("Creating TV");
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Tv tv = OBJECT_FACTORY.createTv();
        tv.setDate(DATE_FORMAT.print(new LocalDate()));
        tv.setSourceInfoName(format("{0} {1}", applicationName, applicationVersion));
        tv.setGeneratorInfoName(format("{0} {1}", applicationName, applicationVersion));
        for (ChannelDetail channelDetail : channelListings.getChannels()) {
            tv.getChannel().add(createChannel(channelDetail));
            for (ProgrammeDetail programmeDetail : channelListings.getPrograms(channelDetail.getId())) {
                tv.getProgramme().add(createProgramme(channelDetail, programmeDetail));
            }
        }
        stopWatch.stop();
        LOGGER.debug("Created tv in {}", formatDurationWords(stopWatch.getTime()));
        return tv;
    }

    private Channel createChannel(ChannelDetail channelDetail) {
        Channel channel = OBJECT_FACTORY.createChannel();
        channel.setId(String.valueOf(channelDetail.getId()));
        channel.getDisplayName().add(createDisplayName(channelDetail.getName()));
        return channel;
    }

    private DisplayName createDisplayName(String name) {
        DisplayName displayName = OBJECT_FACTORY.createDisplayName();
        displayName.setLang(LANG);
        displayName.setvalue(name);
        return displayName;
    }

    private Programme createProgramme(ChannelDetail channelDetail, ProgrammeDetail programmeDetail) {
        Programme programme = OBJECT_FACTORY.createProgramme();
        programme.setChannel(String.valueOf(channelDetail.getId()));
        programme.setStart(DATETIME_FORMAT.print(programmeDetail.getStartDate()));
        programme.setStop(DATETIME_FORMAT.print(programmeDetail.getEndDate()));
        programme.setLength(createLength(programmeDetail.getDuration()));
        addIfNotNull(programme.getTitle(), createTitle(programmeDetail.getTitle()));

        EpisodeDetail episodeDetail = programmeDetail.getEpisodeDetails();
        addIfNotNull(programme.getSubTitle(), createSubTitle(episodeDetail.getTitle()));
        addIfNotNull(programme.getDesc(), createDesc(episodeDetail.getDescription()));
        addIfNotNull(programme.getEpisodeNum(),
                createEpisodeNum(episodeDetail.getSeasonNumber(), episodeDetail.getEpisodeNumber()));
        for (String category : programmeDetail.getCategories()) {
            programme.getCategory().add(createCategory(category));
        }

        programme.getRating().add(createRating(programmeDetail.getRating()));
        return programme;
    }

    private Length createLength(Minutes duration) {
        Length length = OBJECT_FACTORY.createLength();
        length.setUnits(LENGTH_UNITS);
        length.setvalue(String.valueOf(duration.getMinutes()));
        return length;
    }

    private Title createTitle(String programmeTitle) {
        Title title = null;
        if (isNotBlank(programmeTitle)) {
            title = OBJECT_FACTORY.createTitle();
            title.setLang(LANG);
            title.setvalue(programmeTitle);
        }
        return title;
    }

    private SubTitle createSubTitle(String programmeSubTitle) {
        SubTitle subTitle = null;
        if (isNotBlank(programmeSubTitle)) {
            subTitle = OBJECT_FACTORY.createSubTitle();
            subTitle.setLang(LANG);
            subTitle.setvalue(programmeSubTitle);
        }
        return subTitle;
    }

    private Desc createDesc(String programmeDesc) {
        Desc desc = null;
        if (isNotBlank(programmeDesc)) {
            desc = OBJECT_FACTORY.createDesc();
            desc.setLang(LANG);
            desc.setvalue(programmeDesc);
        }
        return desc;
    }

    private EpisodeNum createEpisodeNum(String seriesNumber, String episodeNumber) {
        EpisodeNum episodeNum = null;
        if (isNotBlank(seriesNumber) && isNotBlank(episodeNumber)) {
            episodeNum = OBJECT_FACTORY.createEpisodeNum();
            episodeNum.setSystem(EPISODE_NUM_SYSTEM);
            episodeNum.setvalue(format("{0}.{1}.0/1", seriesNumber, episodeNumber));
        }
        return episodeNum;
    }

    private Category createCategory(String programmeCategory) {
        Category category = OBJECT_FACTORY.createCategory();
        category.setLang(LANG);
        category.setvalue(programmeCategory);
        return category;
    }

    private Rating createRating(String programmeRating) {
        Rating rating = null;
        if (isNotBlank(programmeRating)) {
            rating = OBJECT_FACTORY.createRating();
            rating.setSystem(RATING_SYSTEM);
            rating.setValue(programmeRating);
        }
        return rating;
    }

    private <T> void addIfNotNull(List<T> list, T item) {
        if (item != null) {
            list.add(item);
        }
    }
}