dreamboxdataservice.DreamboxChannelHandler.java Source code

Java tutorial

Introduction

Here is the source code for dreamboxdataservice.DreamboxChannelHandler.java

Source

/*
 * TV-Browser
 * Copyright (C) 04-2003 Martin Oberhauser (martin@tvbrowser.org)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * CVS information:
 *  $RCSfile$
 *   $Source$
 *     $Date: 2007-09-20 23:45:38 +0200 (Do, 20 Sep 2007) $
 *   $Author: bananeweizen $
 * $Revision: 3894 $
 */
package dreamboxdataservice;

import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.commons.lang.StringUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import tvdataservice.MutableChannelDayProgram;
import tvdataservice.MutableProgram;
import tvdataservice.TvDataUpdateManager;
import devplugin.AbstractTvDataService;
import devplugin.Channel;
import devplugin.Date;
import devplugin.Program;

public class DreamboxChannelHandler extends DefaultHandler {
    private StringBuilder mCharacters = new StringBuilder();

    /**
     * map of lazily created update channel day programs
     */
    private HashMap<devplugin.Date, MutableChannelDayProgram> mMutMap = new HashMap<devplugin.Date, MutableChannelDayProgram>();
    private Channel mChannel;
    private HashMap<String, String> mCurrentEvent;
    private TvDataUpdateManager mUpdateManager;

    public DreamboxChannelHandler(TvDataUpdateManager updateManager, Channel ch) {
        mChannel = ch;
        mUpdateManager = updateManager;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        mCharacters = new StringBuilder();
        if (qName.equals("e2event")) {
            mCurrentEvent = new HashMap<String, String>();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equals("e2event")) {
            try {
                Calendar cal = Calendar.getInstance();
                cal.setTime(new java.util.Date(Long.parseLong(mCurrentEvent.get("e2eventstart")) * 1000));
                Date programDate = new Date(cal);
                MutableProgram prog = new MutableProgram(mChannel, programDate, cal.get(Calendar.HOUR_OF_DAY),
                        cal.get(Calendar.MINUTE), true);
                prog.setTitle(mCurrentEvent.get("e2eventtitle"));

                prog.setDescription(mCurrentEvent.get("e2eventdescriptionextended"));

                String shortDesc = mCurrentEvent.get("e2eventdescription");

                if (shortDesc.equals(prog.getTitle())) {
                    shortDesc = "";
                }

                if (StringUtils.isEmpty(shortDesc)) {
                    shortDesc = mCurrentEvent.get("e2eventdescriptionextended");
                }

                shortDesc = MutableProgram.generateShortInfoFromDescription(shortDesc);
                prog.setShortInfo(shortDesc);
                prog.setLength(Integer.parseInt(mCurrentEvent.get("e2eventduration")) / 60);

                prog.setProgramLoadingIsComplete();

                MutableChannelDayProgram mutDayProg = getMutableDayProgram(programDate);
                mutDayProg.addProgram(prog);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        } else if (qName.equals("e2eventlist")) {
            storeDayPrograms(mUpdateManager);
        } else {
            mCurrentEvent.put(qName, mCharacters.toString());
        }
    }

    @Override
    public void characters(char ch[], int start, int length) throws SAXException {
        mCharacters.append(ch, start, length);
    }

    /**
     * @param date Date to search for
     * @return MutableChannelDayProgram that fits to the Date, a new one is created if needed
     */
    private MutableChannelDayProgram getMutableDayProgram(devplugin.Date date) {
        MutableChannelDayProgram dayProgram = mMutMap.get(date);

        if (dayProgram == null) {
            dayProgram = new MutableChannelDayProgram(date, mChannel);
            mMutMap.put(date, dayProgram);
        }

        return dayProgram;
    }

    private void storeDayPrograms(TvDataUpdateManager updateManager) {
        for (MutableChannelDayProgram newDayProg : getAllMutableDayPrograms()) {
            // compare new and existing programs to avoid unnecessary updates
            boolean update = true;

            Iterator<Program> itCurrProg = AbstractTvDataService.getPluginManager()
                    .getChannelDayProgram(newDayProg.getDate(), mChannel);
            Iterator<Program> itNewProg = newDayProg.getPrograms();
            update = false;
            while (itCurrProg.hasNext() && itNewProg.hasNext()) {
                MutableProgram currProg = (MutableProgram) itCurrProg.next();
                MutableProgram newProg = (MutableProgram) itNewProg.next();
                if (!currProg.equalsAllFields(newProg)) {
                    update = true;
                }
            }
            // not the same number of programs ?
            if (itCurrProg.hasNext() != itNewProg.hasNext()) {
                update = true;
            }
            if (update) {
                updateManager.updateDayProgram(newDayProg);
            }
        }
    }

    /**
     * @return all MutableChannelDayPrograms
     */
    private Collection<MutableChannelDayProgram> getAllMutableDayPrograms() {
        return mMutMap.values();
    }

}