package com.fdar.apress.s2.util; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.Result; import com.sun.syndication.feed.synd.*; import com.sun.syndication.feed.module.georss.GeoRSSModule; import com.sun.syndication.feed.module.georss.W3CGeoModuleImpl; import com.sun.syndication.feed.module.georss.geometries.Position; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedOutput; import com.fdar.apress.s2.domain.Event; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.List; import java.util.ArrayList; import java.text.SimpleDateFormat; import java.text.DateFormat; import java.net.URL; import org.apache.struts2.StrutsStatics; import sun.net.www.protocol.http.HttpURLConnection; public class RssEventResult implements Result { private static final String MIME_TYPE = "application/xml"; private String inputName = "inputList"; private String feedType = "rss_2.0"; private String title; private String link; private String description; public void setInputName(String inputName) { this.inputName = inputName; } public void setFeedType(String feedType) { this.feedType = feedType; } public void setTitle(String title) { this.title = title; } public void setLink(String link) { this.link = link; } public void setDescription(String description) { this.description = description; } public void execute(ActionInvocation invocation) throws Exception { HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE); response.setContentType(MIME_TYPE); List<Event> events = (List<Event>) invocation.getStack().findValue(inputName); try { SyndFeedOutput feedOutput = new SyndFeedOutput(); feedOutput.output(createFeed(events,feedType, (TextProvider)invocation.getAction()),response.getWriter()); response.getWriter().flush(); } finally { if( response.getWriter() != null ) { response.getWriter().close(); } } } protected SyndFeed createFeed(List<Event> events,String feedType, TextProvider textProvider) throws IOException,FeedException { SyndFeed feed = new SyndFeedImpl(); feed.setFeedType(feedType); feed.setTitle(title); feed.setLink(link); feed.setDescription(description); List entries = new ArrayList(); for( Event next: events ) { entries.add( createEntry(next,textProvider) ); } feed.setEntries(entries); return feed; } private SyndEntry createEntry(Event event, TextProvider textProvider) { SyndEntry entry = new SyndEntryImpl(); entry.setTitle(event.getName()); entry.setLink(link.substring(0,link.lastIndexOf("/")+1)+"api/event/"+event.getId()); entry.setPublishedDate(event.getStartTime()); SyndContent description = new SyndContentImpl(); description.setType("text/html"); description.setValue(createDescription(event,textProvider)); entry.setDescription(description); entry.getModules().add(geoCodeLocation(event)); return entry; } private String createDescription(Event event, TextProvider textProvider) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); StringBuilder sb = new StringBuilder(); sb.append("<ul>"); sb.append("<li>") .append(textProvider.getText("event.startDate")) .append(": ") .append(df.format(event.getStartTime())) .append("</li>"); sb.append("<li>") .append(textProvider.getText("event.timeZoneOffset")) .append(": ") .append(event.getTimeZoneOffset()) .append("</li>"); sb.append("<li>") .append(textProvider.getText("event.duration")) .append(": ") .append(event.getDuration()) .append("</li>"); sb.append("<li>") .append(textProvider.getText("event.location")) .append(": ") .append(event.getLocation().getCity()) .append(", ") .append(event.getLocation().getState()) .append("</li>"); sb.append("</ul>"); return sb.toString(); } private GeoRSSModule geoCodeLocation(Event event) { // GeoCode the address StringBuilder sb = new StringBuilder() .append("http://maps.google.com/maps/geo?q=") .append(event.getLocation().getCity().replaceAll(" ","+")) .append(",") .append(event.getLocation().getState().replaceAll(" ","+")) .append("&output=csv") .append("&key={googleKey}"); String[] data = null; try { HttpURLConnection url = new HttpURLConnection(new URL(sb.toString()),"maps.google.com",80); url.connect(); BufferedReader br = new BufferedReader(new InputStreamReader(url.getInputStream())); String buffer = br.readLine(); data = buffer.split(","); } catch (Exception e) { e.printStackTrace(); } double latitude = Double.parseDouble(data[2]); double longitude = Double.parseDouble(data[3]); // Add RSS GeoCoding GeoRSSModule geoRSSModule = new W3CGeoModuleImpl(); Position pos = new Position(latitude,longitude); geoRSSModule.setPosition(pos); return geoRSSModule; } }