rome-1.0.orig/ 0000755 0000000 0000000 00000000000 11400010355 010126 5 ustar rome-1.0.orig/com/ 0000755 0000000 0000000 00000000000 10713621736 010725 5 ustar rome-1.0.orig/com/sun/ 0000755 0000000 0000000 00000000000 10713621736 011532 5 ustar rome-1.0.orig/com/sun/syndication/ 0000755 0000000 0000000 00000000000 11117224666 014056 5 ustar rome-1.0.orig/com/sun/syndication/rome.properties 0000644 0000000 0000000 00000013033 10424136506 017131 0 ustar # # Copyright 2004 Sun Microsystems, Inc. # # Licensed 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. # # Feed Parser implementation classes # WireFeedParser.classes=com.sun.syndication.io.impl.RSS090Parser \ com.sun.syndication.io.impl.RSS091NetscapeParser \ com.sun.syndication.io.impl.RSS091UserlandParser \ com.sun.syndication.io.impl.RSS092Parser \ com.sun.syndication.io.impl.RSS093Parser \ com.sun.syndication.io.impl.RSS094Parser \ com.sun.syndication.io.impl.RSS10Parser \ com.sun.syndication.io.impl.RSS20wNSParser \ com.sun.syndication.io.impl.RSS20Parser \ com.sun.syndication.io.impl.Atom10Parser \ com.sun.syndication.io.impl.Atom03Parser # Parsers for Atom 1.0 feed modules # atom_1.0.feed.ModuleParser.classes=com.sun.syndication.io.impl.SyModuleParser \ com.sun.syndication.io.impl.DCModuleParser # Parsers for Atom 1.0 entry modules # atom_1.0.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for Atom 0.3 feed modules # atom_0.3.feed.ModuleParser.classes=com.sun.syndication.io.impl.SyModuleParser \ com.sun.syndication.io.impl.DCModuleParser # Parsers for Atom 0.3 entry modules # atom_0.3.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 1.0 feed modules # rss_1.0.feed.ModuleParser.classes=com.sun.syndication.io.impl.SyModuleParser \ com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 1.0 item modules # rss_1.0.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 2.0 (w/NS) feed modules # rss_2.0wNS.feed.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 2.0 (w/NS) item modules # rss_2.0wNS.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 2.0 feed modules # rss_2.0.feed.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Parsers for RSS 2.0 item modules # rss_2.0.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser # Feed Generator implementation classes # WireFeedGenerator.classes=com.sun.syndication.io.impl.RSS090Generator \ com.sun.syndication.io.impl.RSS091NetscapeGenerator \ com.sun.syndication.io.impl.RSS091UserlandGenerator \ com.sun.syndication.io.impl.RSS092Generator \ com.sun.syndication.io.impl.RSS093Generator \ com.sun.syndication.io.impl.RSS094Generator \ com.sun.syndication.io.impl.RSS10Generator \ com.sun.syndication.io.impl.RSS20Generator \ com.sun.syndication.io.impl.Atom10Generator \ com.sun.syndication.io.impl.Atom03Generator # Generators for Atom 1.0 feed modules # atom_1.0.feed.ModuleGenerator.classes=com.sun.syndication.io.impl.SyModuleGenerator \ com.sun.syndication.io.impl.DCModuleGenerator # Generators for Atom 1.0 entry modules # atom_1.0.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator # Generators for Atom 0.3 feed modules # atom_0.3.feed.ModuleGenerator.classes=com.sun.syndication.io.impl.SyModuleGenerator \ com.sun.syndication.io.impl.DCModuleGenerator # Generators for Atom 0.3 entry modules # atom_0.3.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator # Generators for RSS 1.0 feed modules # rss_1.0.feed.ModuleGenerator.classes=com.sun.syndication.io.impl.SyModuleGenerator \ com.sun.syndication.io.impl.DCModuleGenerator # Generators for RSS_1.0 entry modules # rss_1.0.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator # Generators for RSS 2.0 feed modules # rss_2.0.feed.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator # Generators for RSS_2.0 entry modules # rss_2.0.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator # Feed Conversor implementation classes # Converter.classes=com.sun.syndication.feed.synd.impl.ConverterForAtom10 \ com.sun.syndication.feed.synd.impl.ConverterForAtom03 \ com.sun.syndication.feed.synd.impl.ConverterForRSS090 \ com.sun.syndication.feed.synd.impl.ConverterForRSS091Netscape \ com.sun.syndication.feed.synd.impl.ConverterForRSS091Userland \ com.sun.syndication.feed.synd.impl.ConverterForRSS092 \ com.sun.syndication.feed.synd.impl.ConverterForRSS093 \ com.sun.syndication.feed.synd.impl.ConverterForRSS094 \ com.sun.syndication.feed.synd.impl.ConverterForRSS10 \ com.sun.syndication.feed.synd.impl.ConverterForRSS20 rome-1.0.orig/com/sun/syndication/io/ 0000755 0000000 0000000 00000000000 10713621736 014465 5 ustar rome-1.0.orig/com/sun/syndication/io/WireFeedParser.java 0000644 0000000 0000000 00000004467 10063767102 020206 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import com.sun.syndication.feed.WireFeed; import com.sun.syndication.io.FeedException; import org.jdom.Document; /** * Parses an XML document (JDOM) into a feed bean. *
* WireFeedParser instances must thread safe. *
* TODO: explain how developers can plugin their own implementations. *
* @author Alejandro Abdelnur * */ public interface WireFeedParser { /** * Returns the type of feed the parser handles. *
* @see WireFeed for details on the format of this string. *
* @return the type of feed the parser handles. * */ public String getType(); /** * Inspects an XML Document (JDOM) to check if it can parse it. *
* It checks if the given document if the type of feeds the parser understands. *
* @param document XML Document (JDOM) to check if it can be parsed by this parser. * @return true if the parser know how to parser this feed, false otherwise. * */ public boolean isMyType(Document document); /** * Parses an XML document (JDOM Document) into a feed bean. *
* @param document XML document (JDOM) to parse. * @param validate indicates if the feed should be strictly validated (NOT YET IMPLEMENTED). * @return the resulting feed bean. * @throws IllegalArgumentException thrown if the parser cannot handle the given feed type. * @throws FeedException thrown if a feed bean cannot be created out of the XML document (JDOM). * */ public WireFeed parse(Document document, boolean validate) throws IllegalArgumentException,FeedException; } rome-1.0.orig/com/sun/syndication/io/XmlReader.java 0000644 0000000 0000000 00000070105 11131327504 017205 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.net.HttpURLConnection; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.text.MessageFormat; /** * Character stream that handles (or at least attemtps to) all the necessary Voodo to figure out * the charset encoding of the XML document within the stream. *
* IMPORTANT: This class is not related in any way to the org.xml.sax.XMLReader. This one IS a * character stream. *
* All this has to be done without consuming characters from the stream, if not the XML parser * will not recognized the document as a valid XML. This is not 100% true, but it's close enough * (UTF-8 BOM is not handled by all parsers right now, XmlReader handles it and things work in all * parsers). *
* The XmlReader class handles the charset encoding of XML documents in Files, raw streams and * HTTP streams by offering a wide set of constructors. *
* By default the charset encoding detection is lenient, the constructor with the lenient flag * can be used for an script (following HTTP MIME and XML specifications). * All this is nicely explained by Mark Pilgrim in his blog, * * Determining the character encoding of a feed. *
* @author Alejandro Abdelnur * */ public class XmlReader extends Reader { private static final int BUFFER_SIZE = 4096; private static final String UTF_8 = "UTF-8"; private static final String US_ASCII = "US-ASCII"; private static final String UTF_16BE = "UTF-16BE"; private static final String UTF_16LE = "UTF-16LE"; private static final String UTF_16 = "UTF-16"; private static String _staticDefaultEncoding = null; private Reader _reader; private String _encoding; private String _defaultEncoding; /** * Sets the default encoding to use if none is set in HTTP content-type, * XML prolog and the rules based on content-type are not adequate. *
* If it is set to NULL the content-type based rules are used. * * By default it is NULL. * * * @param encoding charset encoding to default to. */ public static void setDefaultEncoding(String encoding) { _staticDefaultEncoding = encoding; } /** * Returns the default encoding to use if none is set in HTTP content-type, * XML prolog and the rules based on content-type are not adequate. * * If it is NULL the content-type based rules are used. * * * @return the default encoding to use. */ public static String getDefaultEncoding() { return _staticDefaultEncoding; } /** * Creates a Reader for a File. ** It looks for the UTF-8 BOM first, if none sniffs the XML prolog charset, if this is also * missing defaults to UTF-8. *
* It does a lenient charset encoding detection, check the constructor with the lenient parameter * for details. *
* @param file File to create a Reader from. * @throws IOException thrown if there is a problem reading the file. * */ public XmlReader(File file) throws IOException { this(new FileInputStream(file)); } /** * Creates a Reader for a raw InputStream. *
* It follows the same logic used for files. *
* It does a lenient charset encoding detection, check the constructor with the lenient parameter * for details. *
* @param is InputStream to create a Reader from. * @throws IOException thrown if there is a problem reading the stream. * */ public XmlReader(InputStream is) throws IOException { this(is,true); } /** * Creates a Reader for a raw InputStream and uses the provided default encoding if none is determined. *
* It follows the same logic used for files. *
* If lenient detection is indicated and the detection above fails as per specifications it then attempts * the following: *
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again. *
* Else if the XML prolog had a charset encoding that encoding is used. *
* Else if the content type had a charset encoding that encoding is used. *
* Else 'UTF-8' is used. *
* If lenient detection is indicated an XmlReaderException is never thrown. *
* @param is InputStream to create a Reader from. * @param lenient indicates if the charset encoding detection should be relaxed. * @param defaultEncoding default encoding to use if one cannot be detected. * @throws IOException thrown if there is a problem reading the stream. * @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs. * */ public XmlReader(InputStream is, boolean lenient, String defaultEncoding) throws IOException, XmlReaderException { _defaultEncoding = (defaultEncoding == null) ? _staticDefaultEncoding : defaultEncoding; try { doRawStream(is,lenient); } catch (XmlReaderException ex) { if (!lenient) { throw ex; } else { doLenientDetection(null,ex); } } } /** * Creates a Reader for a raw InputStream. *
* It follows the same logic used for files. *
* If lenient detection is indicated and the detection above fails as per specifications it then attempts * the following: *
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again. *
* Else if the XML prolog had a charset encoding that encoding is used. *
* Else if the content type had a charset encoding that encoding is used. *
* Else 'UTF-8' is used. *
* If lenient detection is indicated an XmlReaderException is never thrown. *
* @param is InputStream to create a Reader from. * @param lenient indicates if the charset encoding detection should be relaxed. * @throws IOException thrown if there is a problem reading the stream. * @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs. * */ public XmlReader(InputStream is,boolean lenient) throws IOException, XmlReaderException { this(is, lenient, null); } /** * Creates a Reader using the InputStream of a URL. *
* If the URL is not of type HTTP and there is not 'content-type' header in the fetched * data it uses the same logic used for Files. *
* If the URL is a HTTP Url or there is a 'content-type' header in the fetched * data it uses the same logic used for an InputStream with content-type. *
* It does a lenient charset encoding detection, check the constructor with the lenient parameter * for details. *
* @param url URL to create a Reader from. * @throws IOException thrown if there is a problem reading the stream of the URL. * */ public XmlReader(URL url) throws IOException { this(url.openConnection()); } /** * Creates a Reader using the InputStream of a URLConnection. *
* If the URLConnection is not of type HttpURLConnection and there is not * 'content-type' header in the fetched data it uses the same logic used for files. *
* If the URLConnection is a HTTP Url or there is a 'content-type' header in the fetched * data it uses the same logic used for an InputStream with content-type. *
* It does a lenient charset encoding detection, check the constructor with the lenient parameter * for details. *
* @param conn URLConnection to create a Reader from. * @throws IOException thrown if there is a problem reading the stream of the URLConnection. * */ public XmlReader(URLConnection conn) throws IOException { _defaultEncoding = _staticDefaultEncoding; boolean lenient = true; if (conn instanceof HttpURLConnection) { try { doHttpStream(conn.getInputStream(),conn.getContentType(),lenient); } catch (XmlReaderException ex) { doLenientDetection(conn.getContentType(),ex); } } else if (conn.getContentType()!=null) { try { doHttpStream(conn.getInputStream(),conn.getContentType(),lenient); } catch (XmlReaderException ex) { doLenientDetection(conn.getContentType(),ex); } } else { try { doRawStream(conn.getInputStream(),lenient); } catch (XmlReaderException ex) { doLenientDetection(null,ex); } } } /** * Creates a Reader using an InputStream and the associated content-type header. *
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding. * If there is not content-type encoding checks the XML prolog encoding. If there is not XML * prolog encoding uses the default encoding mandated by the content-type MIME type. *
* It does a lenient charset encoding detection, check the constructor with the lenient parameter * for details. *
* @param is InputStream to create the reader from. * @param httpContentType content-type header to use for the resolution of the charset encoding. * @throws IOException thrown if there is a problem reading the file. * */ public XmlReader(InputStream is,String httpContentType) throws IOException { this(is,httpContentType,true); } /** * Creates a Reader using an InputStream and the associated content-type header. *
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding. * If there is not content-type encoding checks the XML prolog encoding. If there is not XML * prolog encoding uses the default encoding mandated by the content-type MIME type. *
* If lenient detection is indicated and the detection above fails as per specifications it then attempts * the following: *
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again. *
* Else if the XML prolog had a charset encoding that encoding is used. *
* Else if the content type had a charset encoding that encoding is used. *
* Else 'UTF-8' is used. *
* If lenient detection is indicated and XmlReaderException is never thrown. *
* @param is InputStream to create the reader from. * @param httpContentType content-type header to use for the resolution of the charset encoding. * @param lenient indicates if the charset encoding detection should be relaxed. * @param defaultEncoding default encoding to use if one cannot be detected. * @throws IOException thrown if there is a problem reading the file. * @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs. * */ public XmlReader(InputStream is,String httpContentType,boolean lenient, String defaultEncoding) throws IOException, XmlReaderException { _defaultEncoding = (defaultEncoding == null) ? _staticDefaultEncoding : defaultEncoding; try { doHttpStream(is,httpContentType,lenient); } catch (XmlReaderException ex) { if (!lenient) { throw ex; } else { doLenientDetection(httpContentType,ex); } } } /** * Creates a Reader using an InputStream and the associated content-type header. *
* First it checks if the stream has BOM. If there is not BOM checks the content-type encoding. * If there is not content-type encoding checks the XML prolog encoding. If there is not XML * prolog encoding uses the default encoding mandated by the content-type MIME type. *
* If lenient detection is indicated and the detection above fails as per specifications it then attempts * the following: *
* If the content type was 'text/html' it replaces it with 'text/xml' and tries the detection again. *
* Else if the XML prolog had a charset encoding that encoding is used. *
* Else if the content type had a charset encoding that encoding is used. *
* Else 'UTF-8' is used. *
* If lenient detection is indicated and XmlReaderException is never thrown. *
* @param is InputStream to create the reader from. * @param httpContentType content-type header to use for the resolution of the charset encoding. * @param lenient indicates if the charset encoding detection should be relaxed. * @throws IOException thrown if there is a problem reading the file. * @throws XmlReaderException thrown if the charset encoding could not be determined according to the specs. * */ public XmlReader(InputStream is, String httpContentType, boolean lenient) throws IOException, XmlReaderException { this(is, httpContentType, lenient, null); } private void doLenientDetection(String httpContentType,XmlReaderException ex) throws IOException { if (httpContentType!=null) { if (httpContentType.startsWith("text/html")) { httpContentType = httpContentType.substring("text/html".length()); httpContentType = "text/xml" + httpContentType; try { doHttpStream(ex.getInputStream(),httpContentType,true); ex = null; } catch (XmlReaderException ex2) { ex = ex2; } } } if (ex!=null) { String encoding = ex.getXmlEncoding(); if (encoding==null) { encoding = ex.getContentTypeEncoding(); } if (encoding==null) { encoding = (_defaultEncoding == null) ? UTF_8 : _defaultEncoding; } prepareReader(ex.getInputStream(),encoding); } } /** * Returns the charset encoding of the XmlReader. *
* @return charset encoding. * */ public String getEncoding() { return _encoding; } public int read(char[] buf,int offset,int len) throws IOException { return _reader.read(buf,offset,len); } /** * Closes the XmlReader stream. *
* @throws IOException thrown if there was a problem closing the stream. * */ public void close() throws IOException { _reader.close(); } private void doRawStream(InputStream is,boolean lenient) throws IOException { BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE); String bomEnc = getBOMEncoding(pis); String xmlGuessEnc = getXMLGuessEncoding(pis); String xmlEnc = getXmlProlog(pis,xmlGuessEnc); String encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, pis); prepareReader(pis,encoding); } private void doHttpStream(InputStream is,String httpContentType,boolean lenient) throws IOException { BufferedInputStream pis = new BufferedInputStream(is, BUFFER_SIZE); String cTMime = getContentTypeMime(httpContentType); String cTEnc = getContentTypeEncoding(httpContentType); String bomEnc = getBOMEncoding(pis); String xmlGuessEnc = getXMLGuessEncoding(pis); String xmlEnc = getXmlProlog(pis,xmlGuessEnc); String encoding = calculateHttpEncoding(cTMime, cTEnc, bomEnc, xmlGuessEnc, xmlEnc, pis,lenient); prepareReader(pis,encoding); } private void prepareReader(InputStream is,String encoding) throws IOException { _reader = new InputStreamReader(is,encoding); _encoding = encoding; } // InputStream is passed for XmlReaderException creation only private String calculateRawEncoding(String bomEnc, String xmlGuessEnc, String xmlEnc, InputStream is) throws IOException { String encoding; if (bomEnc==null) { if (xmlGuessEnc==null || xmlEnc==null) { encoding = (_defaultEncoding == null) ? UTF_8 : _defaultEncoding; } else if (xmlEnc.equals(UTF_16) && (xmlGuessEnc.equals(UTF_16BE) || xmlGuessEnc.equals(UTF_16LE))) { encoding = xmlGuessEnc; } else { encoding = xmlEnc; } } else if (bomEnc.equals(UTF_8)) { if (xmlGuessEnc!=null && !xmlGuessEnc.equals(UTF_8)) { throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}), bomEnc,xmlGuessEnc,xmlEnc,is); } if (xmlEnc!=null && !xmlEnc.equals(UTF_8)) { throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}), bomEnc,xmlGuessEnc,xmlEnc,is); } encoding = UTF_8; } else if (bomEnc.equals(UTF_16BE) || bomEnc.equals(UTF_16LE)) { if (xmlGuessEnc!=null && !xmlGuessEnc.equals(bomEnc)) { throw new IOException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc})); } if (xmlEnc!=null && !xmlEnc.equals(UTF_16) && !xmlEnc.equals(bomEnc)) { throw new XmlReaderException(RAW_EX_1.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}), bomEnc,xmlGuessEnc,xmlEnc,is); } encoding =bomEnc; } else { throw new XmlReaderException(RAW_EX_2.format(new Object[]{bomEnc,xmlGuessEnc,xmlEnc}), bomEnc,xmlGuessEnc,xmlEnc,is); } return encoding; } // InputStream is passed for XmlReaderException creation only private String calculateHttpEncoding(String cTMime, String cTEnc, String bomEnc, String xmlGuessEnc, String xmlEnc, InputStream is,boolean lenient) throws IOException { String encoding; if (lenient & xmlEnc!=null) { encoding = xmlEnc; } else { boolean appXml = isAppXml(cTMime); boolean textXml = isTextXml(cTMime); if (appXml || textXml) { if (cTEnc==null) { if (appXml) { encoding = calculateRawEncoding(bomEnc, xmlGuessEnc, xmlEnc, is); } else { encoding = (_defaultEncoding == null) ? US_ASCII : _defaultEncoding; } } else if (bomEnc!=null && (cTEnc.equals(UTF_16BE) || cTEnc.equals(UTF_16LE))) { throw new XmlReaderException(HTTP_EX_1.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}), cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is); } else if (cTEnc.equals(UTF_16)) { if (bomEnc!=null && bomEnc.startsWith(UTF_16)) { encoding = bomEnc; } else { throw new XmlReaderException(HTTP_EX_2.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}), cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is); } } else { encoding = cTEnc; } } else { throw new XmlReaderException(HTTP_EX_3.format(new Object[]{cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc}), cTMime,cTEnc,bomEnc,xmlGuessEnc,xmlEnc,is); } } return encoding; } // returns MIME type or NULL if httpContentType is NULL private static String getContentTypeMime(String httpContentType) { String mime = null; if (httpContentType!=null) { int i = httpContentType.indexOf(";"); mime = ((i==-1) ? httpContentType : httpContentType.substring(0,i)).trim(); } return mime; } private static final Pattern CHARSET_PATTERN = Pattern.compile("charset=([.[^; ]]*)"); // returns charset parameter value, NULL if not present, NULL if httpContentType is NULL private static String getContentTypeEncoding(String httpContentType) { String encoding = null; if (httpContentType!=null) { int i = httpContentType.indexOf(";"); if (i>-1) { String postMime = httpContentType.substring(i+1); Matcher m = CHARSET_PATTERN.matcher(postMime); encoding = (m.find()) ? m.group(1) : null; encoding = (encoding!=null) ? encoding.toUpperCase() : null; } if (encoding != null && ((encoding.startsWith("\"") && encoding.endsWith("\"")) || (encoding.startsWith("'") && encoding.endsWith("'")) )) { encoding = encoding.substring(1, encoding.length() - 1); } } return encoding; } // returns the BOM in the stream, NULL if not present, // if there was BOM the in the stream it is consumed private static String getBOMEncoding(BufferedInputStream is) throws IOException { String encoding = null; int[] bytes = new int[3]; is.mark(3); bytes[0] = is.read(); bytes[1] = is.read(); bytes[2] = is.read(); if (bytes[0] == 0xFE && bytes[1] == 0xFF) { encoding = UTF_16BE; is.reset(); is.read(); is.read(); } else if (bytes[0] == 0xFF && bytes[1] == 0xFE) { encoding = UTF_16LE; is.reset(); is.read(); is.read(); } else if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) { encoding = UTF_8; } else { is.reset(); } return encoding; } // returns the best guess for the encoding by looking the first bytes of the stream, '' private static String getXMLGuessEncoding(BufferedInputStream is) throws IOException { String encoding = null; int[] bytes = new int[4]; is.mark(4); bytes[0] = is.read(); bytes[1] = is.read(); bytes[2] = is.read(); bytes[3] = is.read(); is.reset(); if (bytes[0] == 0x00 && bytes[1] == 0x3C && bytes[2] == 0x00 && bytes[3] == 0x3F) { encoding = UTF_16BE; } else if (bytes[0] == 0x3C && bytes[1] == 0x00 && bytes[2] == 0x3F && bytes[3] == 0x00) { encoding = UTF_16LE; } else if (bytes[0] == 0x3C && bytes[1] == 0x3F && bytes[2] == 0x78 && bytes[3] == 0x6D) { encoding = UTF_8; } return encoding; } private static final Pattern ENCODING_PATTERN = Pattern.compile("<\\?xml.*encoding[\\s]*=[\\s]*((?:\".[^\"]*\")|(?:'.[^']*'))", Pattern.MULTILINE); // returns the encoding declared in the , NULL if none private static String getXmlProlog(BufferedInputStream is,String guessedEnc) throws IOException { String encoding = null; if (guessedEnc!=null) { byte[] bytes = new byte[BUFFER_SIZE]; is.mark(BUFFER_SIZE); int offset = 0; int max = BUFFER_SIZE; int c = is.read(bytes,offset,max); int firstGT = -1; while (c!=-1 && firstGT==-1 && offset< BUFFER_SIZE) { offset += c; max -= c; c = is.read(bytes,offset,max); firstGT = new String(bytes, 0, offset).indexOf(">"); } if (firstGT == -1) { if (c == -1) { throw new IOException("Unexpected end of XML stream"); } else { throw new IOException("XML prolog or ROOT element not found on first " + offset + " bytes"); } } int bytesRead = offset; if (bytesRead>0) { is.reset(); Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes,0,firstGT + 1), guessedEnc); BufferedReader bReader = new BufferedReader(reader); StringBuffer prolog = new StringBuffer(); String line = bReader.readLine(); while (line != null) { prolog.append(line); line = bReader.readLine(); } Matcher m = ENCODING_PATTERN.matcher(prolog); if (m.find()) { encoding = m.group(1).toUpperCase(); encoding = encoding.substring(1,encoding.length()-1); } } } return encoding; } // indicates if the MIME type belongs to the APPLICATION XML family private static boolean isAppXml(String mime) { return mime!=null && (mime.equals("application/xml") || mime.equals("application/xml-dtd") || mime.equals("application/xml-external-parsed-entity") || (mime.startsWith("application/") && mime.endsWith("+xml"))); } // indicates if the MIME type belongs to the TEXT XML family private static boolean isTextXml(String mime) { return mime!=null && (mime.equals("text/xml") || mime.equals("text/xml-external-parsed-entity") || (mime.startsWith("text/") && mime.endsWith("+xml"))); } private static final MessageFormat RAW_EX_1 = new MessageFormat( "Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] encoding mismatch"); private static final MessageFormat RAW_EX_2 = new MessageFormat( "Invalid encoding, BOM [{0}] XML guess [{1}] XML prolog [{2}] unknown BOM"); private static final MessageFormat HTTP_EX_1 = new MessageFormat( "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], BOM must be NULL"); private static final MessageFormat HTTP_EX_2 = new MessageFormat( "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], encoding mismatch"); private static final MessageFormat HTTP_EX_3 = new MessageFormat( "Invalid encoding, CT-MIME [{0}] CT-Enc [{1}] BOM [{2}] XML guess [{3}] XML prolog [{4}], Invalid MIME"); } rome-1.0.orig/com/sun/syndication/io/WireFeedInput.java 0000644 0000000 0000000 00000030163 11117222772 020041 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.List; import java.util.Map; import java.util.WeakHashMap; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.DOMBuilder; import org.jdom.input.JDOMParseException; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import com.sun.syndication.feed.WireFeed; import com.sun.syndication.io.impl.FeedParsers; import com.sun.syndication.io.impl.XmlFixerReader; /** * Parses an XML document (File, InputStream, Reader, W3C SAX InputSource, W3C DOM Document or JDom DOcument) * into an WireFeed (RSS/Atom). *
* It accepts all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0) and * Atom 0.3 feeds. Parsers are plugable (they must implement the WireFeedParser interface). *
* The WireFeedInput useds liberal parsers. *
* @author Alejandro Abdelnur * */ public class WireFeedInput { private static Map clMap = new WeakHashMap(); private static FeedParsers getFeedParsers() { synchronized(WireFeedInput.class) { FeedParsers parsers = (FeedParsers) clMap.get(Thread.currentThread().getContextClassLoader()); if (parsers == null) { parsers = new FeedParsers(); clMap.put(Thread.currentThread().getContextClassLoader(), parsers); } return parsers; } } private static final InputSource EMPTY_INPUTSOURCE = new InputSource(new ByteArrayInputStream(new byte[0])); private static final EntityResolver RESOLVER = new EmptyEntityResolver(); private static class EmptyEntityResolver implements EntityResolver { public InputSource resolveEntity(String publicId, String systemId) { if(systemId != null && systemId.endsWith(".dtd")) return EMPTY_INPUTSOURCE; return null; } } private boolean _validate; private boolean _xmlHealerOn; /** * Returns the list of supported input feed types. *
* @see WireFeed for details on the format of these strings. *
* @return a list of String elements with the supported input feed types. * */ public static List getSupportedFeedTypes() { return getFeedParsers().getSupportedFeedTypes(); } /** * Creates a WireFeedInput instance with input validation turned off. *
* */ public WireFeedInput() { this (false); } /** * Creates a WireFeedInput instance. *
* @param validate indicates if the input should be validated. NOT IMPLEMENTED YET (validation does not happen) * */ public WireFeedInput(boolean validate) { _validate = false; // TODO FIX THIS THINGY _xmlHealerOn = true; } /** * Enables XML healing in the WiredFeedInput instance. *
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog. *
* Healing resolves HTML entities (from literal to code number) in the reader. *
* The healing is done only with the build(File) and build(Reader) signatures. *
* By default is TRUE. *
* @param heals TRUE enables stream healing, FALSE disables it. * */ public void setXmlHealerOn(boolean heals) { _xmlHealerOn = heals; } /** * Indicates if the WiredFeedInput instance will XML heal (if necessary) the character stream. *
* Healing trims leading chars from the stream (empty spaces and comments) until the XML prolog. *
* Healing resolves HTML entities (from literal to code number) in the reader. *
* The healing is done only with the build(File) and build(Reader) signatures. *
* By default is TRUE. *
* @return TRUE if healing is enabled, FALSE if not. * */ public boolean getXmlHealerOn() { return _xmlHealerOn; } /** * Builds an WireFeed (RSS or Atom) from a file. *
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom.Document)'. *
* @param file file to read to create the WireFeed. * @return the WireFeed read from the file. * @throws FileNotFoundException thrown if the file could not be found. * @throws IOException thrown if there is problem reading the file. * @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers. * @throws FeedException if the feed could not be parsed * */ public WireFeed build(File file) throws FileNotFoundException,IOException,IllegalArgumentException,FeedException { WireFeed feed; Reader reader = new FileReader(file); if (_xmlHealerOn) { reader = new XmlFixerReader(reader); } feed = build(reader); reader.close(); return feed; } /** * Builds an WireFeed (RSS or Atom) from an Reader. *
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom.Document)'. *
* @param reader Reader to read to create the WireFeed. * @return the WireFeed read from the Reader. * @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers. * @throws FeedException if the feed could not be parsed * */ public WireFeed build(Reader reader) throws IllegalArgumentException,FeedException { SAXBuilder saxBuilder = createSAXBuilder(); try { if (_xmlHealerOn) { reader = new XmlFixerReader(reader); } Document document = saxBuilder.build(reader); return build(document); } catch (JDOMParseException ex) { throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex); } catch (IllegalArgumentException ex) { throw ex; } catch (Exception ex) { throw new ParsingFeedException("Invalid XML",ex); } } /** * Builds an WireFeed (RSS or Atom) from an W3C SAX InputSource. *
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom.Document)'. *
* @param is W3C SAX InputSource to read to create the WireFeed. * @return the WireFeed read from the W3C SAX InputSource. * @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers. * @throws FeedException if the feed could not be parsed * */ public WireFeed build(InputSource is) throws IllegalArgumentException,FeedException { SAXBuilder saxBuilder = createSAXBuilder(); try { Document document = saxBuilder.build(is); return build(document); } catch (JDOMParseException ex) { throw new ParsingFeedException("Invalid XML: " + ex.getMessage(), ex); } catch (IllegalArgumentException ex) { throw ex; } catch (Exception ex) { throw new ParsingFeedException("Invalid XML",ex); } } /** * Builds an WireFeed (RSS or Atom) from an W3C DOM document. *
* NOTE: This method delages to the 'AsbtractFeed WireFeedInput#build(org.jdom.Document)'. *
* @param document W3C DOM document to read to create the WireFeed. * @return the WireFeed read from the W3C DOM document. * @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers. * @throws FeedException if the feed could not be parsed * */ public WireFeed build(org.w3c.dom.Document document) throws IllegalArgumentException,FeedException { DOMBuilder domBuilder = new DOMBuilder(); try { Document jdomDoc = domBuilder.build(document); return build(jdomDoc); } catch (IllegalArgumentException ex) { throw ex; } catch (Exception ex) { throw new ParsingFeedException("Invalid XML",ex); } } /** * Builds an WireFeed (RSS or Atom) from an JDOM document. *
* NOTE: All other build methods delegate to this method. *
* @param document JDOM document to read to create the WireFeed. * @return the WireFeed read from the JDOM document. * @throws IllegalArgumentException thrown if feed type could not be understood by any of the underlying parsers. * @throws FeedException if the feed could not be parsed * */ public WireFeed build(Document document) throws IllegalArgumentException,FeedException { WireFeedParser parser = getFeedParsers().getParserFor(document); if (parser==null) { throw new IllegalArgumentException("Invalid document"); } return parser.parse(document, _validate); } /** * Creates and sets up a org.jdom.input.SAXBuilder for parsing. * * @return a new org.jdom.input.SAXBuilder object */ protected SAXBuilder createSAXBuilder() { SAXBuilder saxBuilder = new SAXBuilder(_validate); saxBuilder.setEntityResolver(RESOLVER); // // This code is needed to fix the security problem outlined in http://www.securityfocus.com/archive/1/297714 // // Unfortunately there isn't an easy way to check if an XML parser supports a particular feature, so // we need to set it and catch the exception if it fails. We also need to subclass the JDom SAXBuilder // class in order to get access to the underlying SAX parser - otherwise the features don't get set until // we are already building the document, by which time it's too late to fix the problem. // // Crimson is one parser which is known not to support these features. try { XMLReader parser = saxBuilder.createParser(); try { parser.setFeature("http://xml.org/sax/features/external-general-entities", false); saxBuilder.setFeature("http://xml.org/sax/features/external-general-entities", false); } catch (SAXNotRecognizedException e) { // ignore } catch (SAXNotSupportedException e) { // ignore } try { parser.setFeature("http://xml.org/sax/features/external-parameter-entities", false); saxBuilder.setFeature("http://xml.org/sax/features/external-parameter-entities", false); } catch (SAXNotRecognizedException e) { // ignore } catch (SAXNotSupportedException e) { // ignore } try { parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); saxBuilder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); } catch (SAXNotRecognizedException e) { // ignore } catch (SAXNotSupportedException e) { // ignore } } catch (JDOMException e) { throw new IllegalStateException("JDOM could not create a SAX parser"); } saxBuilder.setExpandEntities(false); return saxBuilder; } } rome-1.0.orig/com/sun/syndication/io/ModuleGenerator.java 0000644 0000000 0000000 00000003767 10457601322 020433 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import com.sun.syndication.feed.module.Module; import com.sun.syndication.feed.WireFeed; import org.jdom.Element; import java.util.Set; /** * Injects module metadata into a XML node (JDOM element). *
* ModuleGenerator instances must thread safe. *
* TODO: explain how developers can plugin their own implementations. *
* @author Alejandro Abdelnur * */ public interface ModuleGenerator { /** * Returns the namespace URI this generator handles. *
* @return the namespace URI. * */ public String getNamespaceUri(); /** * Returns a set with all the URIs (JDOM Namespace elements) this module generator uses. *
* It is used by the the feed generators to add their namespace definition in * the root element of the generated document (forward-missing of Java 5.0 Generics). * * * @return a set with all the URIs (JDOM Namespace elements) this module generator uses. */ public Set getNamespaces(); /** * Generates and injects module metadata into an XML node (JDOM element). ** @param module the module to inject into the XML node (JDOM element). * @param element the XML node into which module meta-data will be injected. */ public void generate(Module module,Element element); } rome-1.0.orig/com/sun/syndication/io/SyndFeedOutput.java 0000644 0000000 0000000 00000021124 11131327506 020243 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import com.sun.syndication.feed.synd.SyndFeed; import org.jdom.Document; import java.io.File; import java.io.IOException; import java.io.Writer; /** * Generates an XML document (String, File, OutputStream, Writer, W3C DOM document or JDOM document) * out of an SyndFeedImpl.. *
* It delegates to a WireFeedOutput to generate all feed types. *
* @author Alejandro Abdelnur * */ public class SyndFeedOutput { private WireFeedOutput _feedOutput; /** * Creates a SyndFeedOutput instance. *
* */ public SyndFeedOutput() { _feedOutput = new WireFeedOutput(); } /** * Creates a String with the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility * of the developer to ensure that if the String is written to a character stream the stream charset is the same as * the feed encoding property. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @return a String with the XML representation for the given SyndFeedImpl. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public String outputString(SyndFeed feed) throws FeedException { return _feedOutput.outputString(feed.createWireFeed()); } /** * Creates a String with the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility * of the developer to ensure that if the String is written to a character stream the stream charset is the same as * the feed encoding property. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @param prettyPrint pretty-print XML (true) oder collapsed * @return a String with the XML representation for the given SyndFeedImpl. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public String outputString(SyndFeed feed,boolean prettyPrint) throws FeedException { return _feedOutput.outputString(feed.createWireFeed(),prettyPrint); } /** * Creates a File containing with the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform * default charset encoding is used to write the feed to the file. It is the responsibility * of the developer to ensure the feed encoding is set to the platform charset encoding. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @param file the file where to write the XML representation for the given SyndFeedImpl. * @throws IOException thrown if there was some problem writing to the File. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public void output(SyndFeed feed,File file) throws IOException, FeedException { _feedOutput.output(feed.createWireFeed(),file); } /** * Creates a File containing with the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. The platform * default charset encoding is used to write the feed to the file. It is the responsibility * of the developer to ensure the feed encoding is set to the platform charset encoding. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @param prettyPrint pretty-print XML (true) oder collapsed * @param file the file where to write the XML representation for the given SyndFeedImpl. * @throws IOException thrown if there was some problem writing to the File. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public void output(SyndFeed feed,File file,boolean prettyPrint) throws IOException, FeedException { _feedOutput.output(feed.createWireFeed(),file,prettyPrint); } /** * Writes to an Writer the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility * of the developer to ensure that if the String is written to a character stream the stream charset is the same as * the feed encoding property. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @param writer Writer to write the XML representation for the given SyndFeedImpl. * @throws IOException thrown if there was some problem writing to the Writer. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public void output(SyndFeed feed,Writer writer) throws IOException, FeedException { _feedOutput.output(feed.createWireFeed(),writer); } /** * Writes to an Writer the XML representation for the given SyndFeedImpl. *
* If the feed encoding is not NULL, it will be used in the XML prolog encoding attribute. It is the responsibility * of the developer to ensure that if the String is written to a character stream the stream charset is the same as * the feed encoding property. *
* @param feed Abstract feed to create XML representation from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @param prettyPrint pretty-print XML (true) oder collapsed * @param writer Writer to write the XML representation for the given SyndFeedImpl. * @throws IOException thrown if there was some problem writing to the Writer. * @throws FeedException thrown if the XML representation for the feed could not be created. * */ public void output(SyndFeed feed,Writer writer,boolean prettyPrint) throws IOException, FeedException { _feedOutput.output(feed.createWireFeed(),writer,prettyPrint); } /** * Creates a W3C DOM document for the given SyndFeedImpl. *
* This method does not use the feed encoding property. *
* @param feed Abstract feed to create W3C DOM document from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @return the W3C DOM document for the given SyndFeedImpl. * @throws FeedException thrown if the W3C DOM document for the feed could not be created. * */ public org.w3c.dom.Document outputW3CDom(SyndFeed feed) throws FeedException { return _feedOutput.outputW3CDom(feed.createWireFeed()); } /** * Creates a JDOM document for the given SyndFeedImpl. *
* This method does not use the feed encoding property. *
* @param feed Abstract feed to create JDOM document from. The type of the SyndFeedImpl must match * the type given to the FeedOuptut constructor. * @return the JDOM document for the given SyndFeedImpl. * @throws FeedException thrown if the JDOM document for the feed could not be created. * */ public Document outputJDom(SyndFeed feed) throws FeedException { return _feedOutput.outputJDom(feed.createWireFeed()); } } rome-1.0.orig/com/sun/syndication/io/SAXBuilder.java 0000644 0000000 0000000 00000001622 10512451140 017256 0 ustar package com.sun.syndication.io; import org.jdom.JDOMException; import org.xml.sax.XMLReader; /* * This code is needed to fix the security problem outlined in http://www.securityfocus.com/archive/1/297714 * * Unfortunately there isn't an easy way to check if an XML parser supports a particular feature, so * we need to set it and catch the exception if it fails. We also need to subclass the JDom SAXBuilder * class in order to get access to the underlying SAX parser - otherwise the features don't get set until * we are already building the document, by which time it's too late to fix the problem. * * Crimson is one parser which is known not to support these features. * */ public class SAXBuilder extends org.jdom.input.SAXBuilder { public SAXBuilder(boolean _validate) { super(_validate); } public XMLReader createParser() throws JDOMException { return super.createParser(); } } rome-1.0.orig/com/sun/syndication/io/WireFeedGenerator.java 0000644 0000000 0000000 00000003554 10063767100 020672 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import com.sun.syndication.feed.WireFeed; import com.sun.syndication.io.FeedException; import org.jdom.Document; /** * Generates an XML document (JDOM) out of a feed for a specific real feed type. *
* WireFeedGenerator instances must thread safe. *
* TODO: explain how developers can plugin their own implementations. *
* @author Alejandro Abdelnur * */ public interface WireFeedGenerator { /** * Returns the type of feed the generator creates. *
* @see WireFeed for details on the format of this string. *
* @return the type of feed the generator creates. * */ public String getType(); /** * Creates an XML document (JDOM) for the given feed bean. *
* @param feed the feed bean to generate the XML document from. * @return the generated XML document (JDOM). * @throws IllegalArgumentException thrown if the type of the given feed bean does not * match with the type of the WireFeedGenerator. * @throws FeedException thrown if the XML Document could not be created. * */ public Document generate(WireFeed feed) throws IllegalArgumentException,FeedException; } rome-1.0.orig/com/sun/syndication/io/ParsingFeedException.java 0000644 0000000 0000000 00000004353 10104027754 021375 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io; import org.jdom.input.JDOMParseException; /** * Exception thrown by WireFeedInput instance if it can not parse a feed. *
* @author Elaine Chien * */ public class ParsingFeedException extends FeedException { /** * Creates a FeedException with a message. *
* @param msg exception message. * */ public ParsingFeedException(String msg) { super(msg); } /** * Creates a FeedException with a message and a root cause exception. *
* @param msg exception message. * @param rootCause root cause exception. * */ public ParsingFeedException(String msg, Throwable rootCause) { super(msg, rootCause); } /** * Returns the line number of the end of the text where the * parse error occurred. *
* The first line in the document is line 1.
* * @return an integer representing the line number, or -1 * if the information is not available. */ public int getLineNumber() { return (getCause() instanceof JDOMParseException)? ((JDOMParseException)getCause()).getLineNumber(): -1; } /** * Returns the column number of the end of the text where the * parse error occurred. ** The first column in a line is position 1.
* * @return an integer representing the column number, or -1 * if the information is not available. */ public int getColumnNumber() { return (getCause() instanceof JDOMParseException)? ((JDOMParseException)getCause()).getColumnNumber(): -1; } } rome-1.0.orig/com/sun/syndication/io/impl/ 0000755 0000000 0000000 00000000000 11131330066 015412 5 ustar rome-1.0.orig/com/sun/syndication/io/impl/FeedParsers.java 0000644 0000000 0000000 00000004633 10064605164 020476 0 ustar /* * Copyright 2004 Sun Microsystems, Inc. * * Licensed 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 com.sun.syndication.io.impl; import com.sun.syndication.io.WireFeedParser; import org.jdom.Document; import java.util.List; /** * Parses an XML document (JDOM Document) into a Feed. ** It accepts all flavors of RSS (0.90, 0.91, 0.92, 0.93, 0.94, 1.0 and 2.0) and * Atom 0.3 feeds. *
* The WireFeedParser is a liberal parser. *
* WireFeedParser instances are thread safe. *
* Parsers for a specific type must extend this class and register in the parser list. * (Right now registration is hardcoded in the WireFeedParser constructor). *
* @author Alejandro Abdelnur * */ public class FeedParsers extends PluginManager { /** * WireFeedParser.classes= [className] ... * */ public static final String FEED_PARSERS_KEY = "WireFeedParser.classes"; /** * Creates a parser instance. *
* */ public FeedParsers() { super(FEED_PARSERS_KEY); } public List getSupportedFeedTypes() { return getKeys(); } /** * Finds the real parser type for the given document feed. *
* @param document document feed to find the parser for.
* @return the parser for the given document or null if there is no parser for that document.
*
*/
public WireFeedParser getParserFor(Document document) {
List parsers = getPlugins();
WireFeedParser parser = null;
for (int i=0;parser==null && i