/*
 * blanco Framework
 * Copyright (C) 2004-2007 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.rss.core;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;

import blanco.rss.core.valueobject.BlancoRss;
import blanco.xml.bind.BlancoXmlBindingUtil;
import blanco.xml.bind.BlancoXmlUnmarshaller;
import blanco.xml.bind.valueobject.BlancoXmlDocument;
import blanco.xml.bind.valueobject.BlancoXmlElement;

/**
 * RSSをパースして バリューオブジェクト化します。
 * 
 * @author IGA Tosiki
 */
public class BlancoRssParser {
    private final Logger fLog = Logger.getLogger("blanco.rss.core");

    /**
     * RSSをパースして バリューオブジェクト化します。
     * 
     * @param argInput
     *            RSSの入力ストリーム。
     * @return バリューオブジェクト化されたRSS。パースに失敗した場合には null。
     * @throws IOException
     *             入出力例外が発生した場合。
     * @throws IllegalArgumentException
     *             入力例外が発生した場合。
     */
    public BlancoRss parse(final InputStream argInput) throws IOException,
            IllegalArgumentException {
        final BlancoXmlDocument document = new BlancoXmlUnmarshaller()
                .unmarshal(argInput);
        if (document == null) {
            return null;
        }

        final BlancoXmlElement elementRoot = BlancoXmlBindingUtil
                .getDocumentElement(document);

        // ルートのエレメントにより分岐。
        if ("rss".equals(elementRoot.getQName())) {
            fLog.finest("RSS ["
                    + BlancoXmlBindingUtil.getAttribute(elementRoot, "version")
                    + "]");
            return new BlancoRssRss09Parser().parse(elementRoot);
        } else if ("rdf:RDF".equals(elementRoot.getQName())) {
            fLog.finest("RDF");
            return new BlancoRssRdfParser().parse(elementRoot);
        } else {
            fLog.fine("未対応:ルート[" + elementRoot.getQName() + "]");
            return null;
        }
    }
}
