Skip to content

Commit

Permalink
RSS for replies (conflicts resolved by maxcom)
Browse files Browse the repository at this point in the history
  • Loading branch information
rsvato authored and Максим committed Jun 3, 2009
1 parent 5182e9d commit ecdcdf6
Show file tree
Hide file tree
Showing 6 changed files with 229 additions and 2 deletions.
110 changes: 110 additions & 0 deletions src/ru/org/linux/spring/AbstractRomeView.java
@@ -0,0 +1,110 @@
/*
* Copyright 1998-2009 Linux.org.ru
* 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 ru.org.linux.spring;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.view.AbstractView;

/**
* User: rsvato
* Date: Jun 1, 2009
* Time: 3:20:02 PM
*/
public abstract class AbstractRomeView extends AbstractView {
private Map<String,String> contentTypes;
private Map<String,String> feedTypes;
private Integer defaultCount;
private String defaultType;
private Integer minimalCount;
private Integer maximalCount;

private static final Log log = LogFactory.getLog(AbstractRomeView.class);

public Map<String, String> getContentTypes() {
return contentTypes;
}

public void setContentTypes(Map<String, String> contentTypes) {
this.contentTypes = contentTypes;
}

public Map<String, String> getFeedTypes() {
return feedTypes;
}

public void setFeedTypes(Map<String, String> feedTypes) {
this.feedTypes = feedTypes;
}

public Integer getDefaultCount() {
return defaultCount;
}

public void setDefaultCount(Integer defaultCount) {
this.defaultCount = defaultCount;
}

protected void renderMergedOutputModel(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
SyndFeed feed = new SyndFeedImpl();
feed.setEncoding("utf-8");
String feedType = (String) model.get("feed-type");
if (StringUtils.isEmpty(feedType)){
feedType = "rss";
}
feed.setFeedType(feedTypes.get(feedType));
createFeed(feed, model);
response.setContentType(contentTypes.get(feedType));
response.setCharacterEncoding("UTF-8");
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed, response.getWriter());
}

protected abstract void createFeed(SyndFeed feed, Map model);

public Integer getMaximalCount() {
return maximalCount;
}

public void setMaximalCount(Integer maximalCount) {
this.maximalCount = maximalCount;
}

public Integer getMinimalCount() {
return minimalCount;
}

public void setMinimalCount(Integer minimalCount) {
this.minimalCount = minimalCount;
}

public String getDefaultType() {
return defaultType;
}

public void setDefaultType(String defaultType) {
this.defaultType = defaultType;
}
}
58 changes: 58 additions & 0 deletions src/ru/org/linux/spring/ReplyFeedView.java
@@ -0,0 +1,58 @@
/*
* Copyright 1998-2009 Linux.org.ru
* 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 ru.org.linux.spring;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;

/**
* User: rsvato
* Date: Jun 1, 2009
* Time: 3:21:53 PM
*/
public class ReplyFeedView extends AbstractRomeView {
protected void createFeed(SyndFeed feed, Map model) {
@SuppressWarnings("unchecked")
List<ShowRepliesController.MyTopicsListItem> list = (List<ShowRepliesController.MyTopicsListItem>) model.get("topicsList");
final String s = "Последние 30 ответов на комментарии пользователя " + String.valueOf(model.get("nick"));
feed.setTitle(s);
feed.setLink("http://www.linux.org.ru");
feed.setDescription(s);
Date lastModified = new Date();
if (!list.isEmpty()) {
final Timestamp timestamp = list.get(0).getLastmod();
lastModified = new Date(timestamp.getTime());
}
feed.setPublishedDate(lastModified);
List<SyndEntry> entries = new ArrayList<SyndEntry>();
feed.setEntries(entries);
for (ShowRepliesController.MyTopicsListItem item : list) {
SyndEntry feedEntry = new SyndEntryImpl();
feedEntry.setPublishedDate(new Date(item.getLastmod().getTime()));
feedEntry.setTitle(item.getSubj());
feedEntry.setLink(String.format("http://www.linux.org.ru/jump-message.jsp?msgid=%s&cid=%s",
String.valueOf(item.getMsgid()), String.valueOf(item.getCid())));
entries.add(feedEntry);
}
}
}
15 changes: 14 additions & 1 deletion src/ru/org/linux/spring/ShowRepliesController.java
Expand Up @@ -23,6 +23,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.danga.MemCached.MemCachedClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
Expand All @@ -35,6 +36,10 @@

@Controller
public class ShowRepliesController {

@Autowired
private ReplyFeedView feedView;

@RequestMapping("/show-replies.jsp")
public ModelAndView showReplies(
HttpServletRequest request,
Expand Down Expand Up @@ -118,7 +123,15 @@ public ModelAndView showReplies(

params.put("topicsList", list);

return new ModelAndView("show-replies", params);
final ModelAndView result = new ModelAndView("show-replies", params);
if (request.getParameter("output") != null){
result.addObject("feed-type", "rss");
if ("atom".equals(request.getParameter("output"))){
result.addObject("feed-type", "atom");
}
result.setView(feedView);
}
return result;
}

public static class MyTopicsListItem extends TopicsListItem {
Expand Down
19 changes: 19 additions & 0 deletions web/WEB-INF/feeds.properties
@@ -0,0 +1,19 @@
#
# Copyright 1998-2009 Linux.org.ru
# 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.
#

feeds.defaultType=rss
feeds.defaultCount=20
feeds.minimalCount=10
feeds.maximalCount=30
2 changes: 2 additions & 0 deletions web/WEB-INF/jsp/show-replies.jsp
Expand Up @@ -38,6 +38,8 @@
ответов на комментарии пользователя ${nick}
</c:set>
<title>${title}</title>
<LINK REL="alternate" TITLE="Comments RSS" HREF="show-replies.jsp?output=rss&amp;nick=${nick}" TYPE="application/rss+xml"/>
<LINK REL="alternate" TITLE="Comments Atom" HREF="show-replies.jsp?output=atom&amp;nick=${nick}" TYPE="application/rss+atom"/>
<jsp:include page="/WEB-INF/jsp/header.jsp"/>
<h1>${title}</h1>

Expand Down
27 changes: 26 additions & 1 deletion web/WEB-INF/springapp-servlet.xml
Expand Up @@ -54,4 +54,29 @@
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="600000"/>
</bean>
</beans>

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
id="feedConfigurer">
<property name="location" value="/WEB-INF/feeds.properties"/>
</bean>

<bean id="absractRomeView" class="ru.org.linux.spring.AbstractRomeView" abstract="true">
<property name="contentTypes">
<map>
<entry key="rss" value="application/rss+xml"/>
<entry key="atom" value="application/atom+xml"/>
</map>
</property>
<property name="feedTypes">
<map>
<entry key="rss" value="rss_2.0"/>
<entry key="atom" value="atom_1.0"/>
</map>
</property>
<property name="defaultType" value="${feeds.defaultType}"/>
<property name="defaultCount" value="${feeds.defaultCount}"/>
<property name="minimalCount" value="${feeds.minimalCount}"/>
<property name="maximalCount" value="${feeds.maximalCount}"/>
</bean>
<bean id="replyFeed" class="ru.org.linux.spring.ReplyFeedView" parent="absractRomeView" scope="prototype"/>
</beans>

0 comments on commit ecdcdf6

Please sign in to comment.