    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 */
    019package org.apache.wiki.rss;
    020
    021import org.apache.wiki.api.Release;
    022import org.apache.wiki.api.core.Attachment;
    023import org.apache.wiki.api.core.Context;
    024import org.apache.wiki.api.core.ContextEnum;
    025import org.apache.wiki.api.core.Engine;
    026import org.apache.wiki.api.core.Page;
    027import org.apache.wiki.api.exceptions.ProviderException;
    028import org.apache.wiki.attachment.AttachmentManager;
    029import org.apache.wiki.variables.VariableManager;
    030import org.jdom2.Element;
    031import org.jdom2.output.Format;
    032import org.jdom2.output.XMLOutputter;
    033
    034import javax.servlet.ServletContext;
    035import java.io.IOException;
    036import java.io.StringWriter;
    037import java.text.SimpleDateFormat;
    038import java.util.ArrayList;
    039import java.util.Calendar;
    040import java.util.List;
    041
    042/**
    043 *  Represents an RSS 2.0 feed (with enclosures).  This feed provides no
    044 *  fizz-bang features.
    045 *
    046 *  @since 2.2.27
    047 */
    048public class RSS20Feed extends Feed
    049{
    050    /**
    051     *  Creates an RSS 2.0 feed for the specified Context.
    052     *
    053     *  @param context The WikiContext.
    054     */
    055    public RSS20Feed( final Context context )
    056    {
    057        super( context );
    058    }
    059
    060    private List<Element> getItems()
    061    {
    062        final ArrayList<Element> list = new ArrayList<>();
    063        final SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'");
    064
    065        final Engine engine = m_wikiContext.getEngine();
    066        ServletContext servletContext = null;
    067
    068        if( m_wikiContext.getHttpRequest() != null )
    069            servletContext = m_wikiContext.getHttpRequest().getSession().getServletContext();
    070
    071        for( final Entry e : m_entries ) {
    072            final Page p = e.getPage();
    073            final String url = e.getURL();
    074            final Element item = new Element( "item" );
    075            item.addContent( new Element( "link" ).setText( url ) );
    076            item.addContent( new Element( "title" ).setText( e.getTitle() ) );
    077            item.addContent( new Element( "description" ).setText( e.getContent() ) );
    078
    079            //
    080            //  Attachments for enclosures
    081            //
    082            if( engine.getManager( AttachmentManager.class ).hasAttachments( p ) && servletContext != null ) {
    083                try {
    084                    final List< Attachment > c = engine.getManager( AttachmentManager.class ).listAttachments( p );
    085                    for( final Attachment att : c ) {
    086                        final Element attEl = new Element( "enclosure" );
    087                        attEl.setAttribute( "url", engine.getURL( ContextEnum.PAGE_ATTACH.getRequestContext(), att.getName(), null ) );
    088                        attEl.setAttribute( "length", Long.toString( att.getSize() ) );
    089                        attEl.setAttribute( "type", getMimeType( servletContext, att.getFileName() ) );
    090
    091                        item.addContent( attEl );
    092                    }
    093                } catch( final ProviderException ex ) {
    094                    // FIXME: LOG.info("Can't get attachment data",ex);
    095                }
    096            }
    097
    098            //
    099            //  Modification date.
    100            //
    101            final Calendar cal = Calendar.getInstance();
    102            cal.setTime( p.getLastModified() );
    103            cal.add( Calendar.MILLISECOND, -( cal.get( Calendar.ZONE_OFFSET ) + ( cal.getTimeZone().inDaylightTime( p.getLastModified() ) ?
    104                    cal.get( Calendar.DST_OFFSET ) :
    105                    0 ) ) );
    106
    107            item.addContent( new Element( "pubDate" ).setText( fmt.format( cal.getTime() ) ) );
    108
    109            list.add( item );
    110        }
    111
    112        return list;
    113    }
    114
    115    /**
    116     *  {@inheritDoc}
    117     */
    118    @Override
    119    public String getString()
    120    {
    121        final Engine engine = m_wikiContext.getEngine();
    122        final Element root = new Element("rss");
    123        root.setAttribute("version","2.0");
    124
    125        final Element channel = new Element("channel");
    126        root.addContent( channel );
    127
    128        //
    129        //  Mandatory parts
    130        //
    131        channel.addContent( new Element("title").setText( getChannelTitle() ) );
    132        channel.addContent( new Element("link").setText(engine.getBaseURL()));
    133        channel.addContent( new Element("description").setText( getChannelDescription() ));
    134
    135        //
    136        //  Optional
    137        //
    138        channel.addContent( new Element("language").setText(getChannelLanguage()));
    139        channel.addContent( new Element("generator").setText("JSPWiki "+Release.VERSTR));
    140
    141        String mail = engine.getManager( VariableManager.class ).getVariable(m_wikiContext,RSSGenerator.PROP_RSS_AUTHOREMAIL);
    142        if( mail != null )
    143        {
    144            final String editor = engine.getManager( VariableManager.class ).getVariable( m_wikiContext,RSSGenerator.PROP_RSS_AUTHOR );
    145
    146            if( editor != null )
    147                mail = mail + " ("+editor+")";
    148
    149            channel.addContent( new Element("managingEditor").setText(mail) );
    150        }
    151
    152        //
    153        //  Items
    154        //
    155
    156        channel.addContent( getItems() );
    157
    158        //
    159        //  aaand output
    160        //
    161        final XMLOutputter output = new XMLOutputter();
    162
    163        output.setFormat( Format.getPrettyFormat() );
    164
    165        try {
    166            final StringWriter res = new StringWriter();
    167            output.output( root, res );
    168
    169            return res.toString();
    170        } catch( final IOException e ) {
    171            return null;
    172        }
    173    }
    174
    175}