Java tutorial
/* * 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); } } }