001 /*
002 Licensed to the Apache Software Foundation (ASF) under one
003 or more contributor license agreements. See the NOTICE file
004 distributed with this work for additional information
005 regarding copyright ownership. The ASF licenses this file
006 to you under the Apache License, Version 2.0 (the
007 "License"); you may not use this file except in compliance
008 with the License. You may obtain a copy of the License at
009
010 http://www.apache.org/licenses/LICENSE-2.0
011
012 Unless required by applicable law or agreed to in writing,
013 software distributed under the License is distributed on an
014 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 KIND, either express or implied. See the License for the
016 specific language governing permissions and limitations
017 under the License.
018 */
019 package org.apache.wiki.rss;
020
021 import java.io.IOException;
022 import java.io.StringWriter;
023 import java.text.SimpleDateFormat;
024 import java.util.*;
025
026 import javax.servlet.ServletContext;
027
028 import org.jdom2.Element;
029 import org.jdom2.output.Format;
030 import org.jdom2.output.XMLOutputter;
031 import org.apache.wiki.Release;
032 import org.apache.wiki.WikiContext;
033 import org.apache.wiki.WikiEngine;
034 import org.apache.wiki.WikiPage;
035 import org.apache.wiki.api.exceptions.ProviderException;
036 import org.apache.wiki.attachment.Attachment;
037
038 /**
039 * Represents an RSS 2.0 feed (with enclosures). This feed provides no
040 * fizz-bang features.
041 *
042 * @since 2.2.27
043 */
044 public class RSS20Feed extends Feed
045 {
046 /**
047 * Creates an RSS 2.0 feed for the specified Context.
048 *
049 * @param context The WikiContext.
050 */
051 public RSS20Feed( WikiContext context )
052 {
053 super( context );
054 }
055
056 private List getItems()
057 {
058 ArrayList<Element> list = new ArrayList<Element>();
059 SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'");
060
061 WikiEngine engine = m_wikiContext.getEngine();
062 ServletContext servletContext = null;
063
064 if( m_wikiContext.getHttpRequest() != null )
065 servletContext = m_wikiContext.getHttpRequest().getSession().getServletContext();
066
067 for( Iterator i = m_entries.iterator(); i.hasNext(); )
068 {
069 Entry e = (Entry)i.next();
070 WikiPage p = e.getPage();
071
072 String url = e.getURL();
073
074 Element item = new Element("item");
075
076 item.addContent( new Element("link").setText(url) );
077
078 item.addContent( new Element("title").setText( e.getTitle()) );
079
080 item.addContent( new Element("description").setText( e.getContent()) );
081
082 //
083 // Attachments for enclosures
084 //
085
086 if( engine.getAttachmentManager().hasAttachments(p) && servletContext != null )
087 {
088 try
089 {
090 Collection c = engine.getAttachmentManager().listAttachments(p);
091
092 for( Iterator a = c.iterator(); a.hasNext(); )
093 {
094 Attachment att = (Attachment) a.next();
095
096 Element attEl = new Element("enclosure");
097 attEl.setAttribute( "url", engine.getURL(WikiContext.ATTACH, att.getName(), null, true ) );
098 attEl.setAttribute( "length", Long.toString(att.getSize()) );
099 attEl.setAttribute( "type", getMimeType( servletContext, att.getFileName() ) );
100
101 item.addContent( attEl );
102 }
103 }
104 catch( ProviderException ex )
105 {
106 // FIXME: log.info("Can't get attachment data",ex);
107 }
108 }
109
110 //
111 // Modification date.
112 //
113 Calendar cal = Calendar.getInstance();
114 cal.setTime( p.getLastModified() );
115 cal.add( Calendar.MILLISECOND,
116 - (cal.get( Calendar.ZONE_OFFSET ) +
117 (cal.getTimeZone().inDaylightTime( p.getLastModified() ) ? cal.get( Calendar.DST_OFFSET ) : 0 )) );
118
119 item.addContent( new Element("pubDate").setText(fmt.format(cal.getTime())) );
120
121 list.add( item );
122 }
123
124 return list;
125 }
126
127 /**
128 * {@inheritDoc}
129 */
130 @Override
131 public String getString()
132 {
133 WikiEngine engine = m_wikiContext.getEngine();
134 Element root = new Element("rss");
135 root.setAttribute("version","2.0");
136
137 Element channel = new Element("channel");
138 root.addContent( channel );
139
140 //
141 // Mandatory parts
142 //
143 channel.addContent( new Element("title").setText( getChannelTitle() ) );
144 channel.addContent( new Element("link").setText(engine.getBaseURL()));
145 channel.addContent( new Element("description").setText( getChannelDescription() ));
146
147 //
148 // Optional
149 //
150 channel.addContent( new Element("language").setText(getChannelLanguage()));
151 channel.addContent( new Element("generator").setText("JSPWiki "+Release.VERSTR));
152
153 String mail = engine.getVariable(m_wikiContext,RSSGenerator.PROP_RSS_AUTHOREMAIL);
154 if( mail != null )
155 {
156 String editor = engine.getVariable( m_wikiContext,RSSGenerator.PROP_RSS_AUTHOR );
157
158 if( editor != null )
159 mail = mail + " ("+editor+")";
160
161 channel.addContent( new Element("managingEditor").setText(mail) );
162 }
163
164 //
165 // Items
166 //
167
168 channel.addContent( getItems() );
169
170 //
171 // aaand output
172 //
173 XMLOutputter output = new XMLOutputter();
174
175 output.setFormat( Format.getPrettyFormat() );
176
177 try
178 {
179 StringWriter res = new StringWriter();
180 output.output( root, res );
181
182 return res.toString();
183 }
184 catch( IOException e )
185 {
186 return null;
187 }
188 }
189
190 }