tvbrowserdataservice.file.ChannelList.java Source code

Java tutorial

Introduction

Here is the source code for tvbrowserdataservice.file.ChannelList.java

Source

/*
 * TV-Browser
 * Copyright (C) 04-2003 Martin Oberhauser (darras@users.sourceforge.net)
 *
 * 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: 2010-06-28 19:33:48 +0200 (Mon, 28 Jun 2010) $
 *   $Author: bananeweizen $
 * $Revision: 6662 $
 */
package tvbrowserdataservice.file;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.TimeZone;
import java.util.logging.Logger;
import java.util.zip.GZIPOutputStream;

import javax.swing.Icon;

import org.apache.commons.lang.StringEscapeUtils;

import tvbrowserdataservice.TvBrowserDataService;
import util.io.FileFormatException;
import util.io.IOUtilities;
import util.tvdataservice.IconLoader;
import au.com.bytecode.opencsv.CSVReader;
import devplugin.AbstractTvDataService;
import devplugin.Channel;
import devplugin.ChannelGroup;
import devplugin.ChannelGroupImpl;

/**
 *
 *
 * @author Til Schneider, www.murfman.de
 */
public class ChannelList {

    public static final String FILE_NAME = "channellist.gz";

    private static final Logger mLog = Logger.getLogger(ChannelList.class.getName());

    private ArrayList<ChannelItem> mChannelList;

    private ChannelGroup mGroup;

    public ChannelList(final String groupName) {
        mChannelList = new ArrayList<ChannelItem>();
        mGroup = new ChannelGroupImpl(groupName, groupName, "");
    }

    public ChannelList(ChannelGroup group) {
        mChannelList = new ArrayList<ChannelItem>();
        mGroup = group;
    }

    public void addChannel(Channel channel) {
        mChannelList.add(new ChannelItem(channel, null));
    }

    public void addChannel(Channel channel, String iconUrl) {
        mChannelList.add(new ChannelItem(channel, iconUrl));
    }

    public int getChannelCount() {
        return mChannelList.size();
    }

    public Channel getChannelAt(int index) {
        ChannelItem item = mChannelList.get(index);
        return item.getChannel();
    }

    public Channel[] createChannelArray() {
        Channel[] channelArr = new Channel[mChannelList.size()];
        for (int i = 0; i < channelArr.length; i++) {
            channelArr[i] = (mChannelList.get(i)).getChannel();
        }
        return channelArr;
    }

    public void readFromStream(InputStream stream, AbstractTvDataService dataService)
            throws IOException, FileFormatException {
        readFromStream(stream, dataService, true);
    }

    public void readFromStream(InputStream stream, AbstractTvDataService dataService, boolean compressed)
            throws IOException, FileFormatException {
        CSVReader reader;

        if (compressed) {
            InputStream gIn = IOUtilities.openSaveGZipInputStream(stream);
            reader = new CSVReader(new InputStreamReader(gIn, "ISO-8859-15"), ';');
        } else {
            reader = new CSVReader(new InputStreamReader(stream, "ISO-8859-15"), ';');
        }

        int lineCount = 1;

        /**
         * ChannelList.readFromStream is called by both MirrorUpdater and
         * TvBrowserDataService. The MirrorUpdater calls this method without
         * DataService and doesn't need the IconLoader
         */
        IconLoader iconLoader = null;
        if (dataService != null && dataService instanceof TvBrowserDataService) {
            File dataDir = ((TvBrowserDataService) dataService).getWorkingDirectory();
            iconLoader = new IconLoader(TvBrowserDataService.getInstance(), mGroup.getId(), dataDir);
        }

        String[] tokens;
        while ((tokens = reader.readNext()) != null) {
            if (tokens.length < 4) {
                throw new FileFormatException("Syntax error in mirror file line " + lineCount
                        + ": column count is '" + tokens.length + " < 4' : " + tokens[0]);
            }

            String country = null, timezone = null, id = null, name = null, copyright = null, webpage = null,
                    iconUrl = null, categoryStr = null, unescapedname = null;
            try {
                country = tokens[0];
                timezone = tokens[1];
                id = tokens[2];
                name = tokens[3];
                copyright = tokens[4];
                webpage = tokens[5];
                iconUrl = tokens[6];
                categoryStr = tokens[7];

                if (tokens.length > 8) {
                    unescapedname = name;
                    name = StringEscapeUtils.unescapeHtml(tokens[8]);
                }

            } catch (ArrayIndexOutOfBoundsException e) {
                // ignore
            }

            int categories = Channel.CATEGORY_NONE;
            if (categoryStr != null) {
                try {
                    categories = Integer.parseInt(categoryStr);
                } catch (NumberFormatException e) {
                    categories = Channel.CATEGORY_NONE;
                }
            }
            Channel channel = new Channel(dataService, name, id, TimeZone.getTimeZone(timezone), country, copyright,
                    webpage, mGroup, null, categories, unescapedname);
            if (iconLoader != null && iconUrl != null && iconUrl.length() > 0) {
                Icon icon = iconLoader.getIcon(id, iconUrl);
                if (icon != null) {
                    channel.setDefaultIcon(icon);
                }
            }
            addChannel(channel, iconUrl);
            lineCount++;
        }

        reader.close();
        if (iconLoader != null) {
            iconLoader.close();
        }
    }

    public void readFromFile(File file, AbstractTvDataService dataService) throws IOException, FileFormatException {
        BufferedInputStream stream = null;
        try {
            stream = new BufferedInputStream(new FileInputStream(file), 0x2000);

            readFromStream(stream, dataService);
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException exc) {
                }
            }
        }
    }

    public void writeToStream(OutputStream stream) throws IOException, FileFormatException {
        GZIPOutputStream gOut = new GZIPOutputStream(stream);

        OutputStreamWriter writer = new OutputStreamWriter(gOut, "ISO-8859-15");
        for (int i = 0; i < getChannelCount(); i++) {
            ChannelItem channelItem = mChannelList.get(i);
            Channel channel = channelItem.getChannel();
            StringBuilder line = new StringBuilder();
            line.append(channel.getCountry()).append(';').append(channel.getTimeZone().getID());
            line.append(';').append(channel.getId());
            line.append(';').append(channel.getUnescapedName());
            line.append(';').append(channel.getCopyrightNotice());
            line.append(';').append(channel.getWebpage() == null ? "http://tvbrowser.org" : channel.getWebpage());
            line.append(';').append(channelItem.getIconUrl() == null ? "" : channelItem.getIconUrl());
            line.append(';').append(channel.getCategories());
            line.append(";\"").append(StringEscapeUtils.escapeHtml(channel.getName())).append('"');
            writer.write(line.toString());
            writer.write('\n');
        }
        writer.close();

        gOut.close();
    }

    public void writeToFile(File file) throws IOException, FileFormatException {
        // NOTE: We need two try blocks to ensure that the file is closed in the
        // outer block.

        try {
            FileOutputStream stream = null;
            try {
                stream = new FileOutputStream(file);

                writeToStream(stream);
            } finally {
                // Close the file in every case
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (IOException exc) {
                    }
                }
            }
        } catch (IOException exc) {
            file.delete();
            throw exc;
        } catch (FileFormatException exc) {
            file.delete();
            throw new FileFormatException("Writing file failed " + file.getAbsolutePath(), exc);
        }
    }

    private static class ChannelItem {
        private Channel mChannel;

        private String mIconUrl;

        public ChannelItem(Channel ch, String iconUrl) {
            mChannel = ch;
            mIconUrl = iconUrl;
        }

        public Channel getChannel() {
            return mChannel;
        }

        public String getIconUrl() {
            return mIconUrl;
        }

    }
}