/* * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xwiki.contrib.mailarchive.timeline.internal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map.Entry; import java.util.TreeMap; import javax.inject.Named; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.xwiki.component.annotation.Component; import org.xwiki.rendering.renderer.printer.DefaultWikiPrinter; import org.xwiki.rendering.renderer.printer.WikiPrinter; import org.xwiki.rendering.renderer.printer.XMLWikiPrinter; import edu.emory.mathcs.util.security.action.GetLongAction; /** * Specialized Writer for TimeLine events. * * @version $Id$ */ @Component @Named("simile") public class TimeLineDataWriterSimile extends XMLWikiPrinter implements ITimeLineDataWriter { private static final DateFormat eventsDateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US); private static final DateFormat displayDateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM); public TimeLineDataWriterSimile() { super(new DefaultWikiPrinter()); } /** * @param printer */ public TimeLineDataWriterSimile(WikiPrinter printer) { this(); this.setWikiPrinter(printer); } public void setWikiPrinter(final WikiPrinter printer) { super.setWikiPrinter(printer); } /** * {@inheritDoc} * * @see org.xwiki.contrib.mailarchive.timeline.internal.ITimeLineDataWriter#print(java.util.TreeMap) */ @Override public void print(TreeMap<Long, TimeLineEvent> sortedEvents) { printXMLStartElement("data"); for (Entry<Long, TimeLineEvent> event : sortedEvents.entrySet()) { print(event.getValue()); } printXMLEndElement("data"); } /** * {@inheritDoc} * * @see org.xwiki.contrib.mailarchive.timeline.internal.ITimeLineDataWriter#print(org.xwiki.contrib.mailarchive.timeline.internal.TimeLineEvent) */ @Override public void print(TimeLineEvent event) { if (event.beginDate == null) { // skipping invalid event return; } if (event.endDate != null) { // This is a topic printTopic(event); } else { // This is a special mail printMail(event); } } /** * {@inheritDoc} * * @see org.xwiki.contrib.mailarchive.timeline.internal.ITimeLineDataWriter#printTopic(org.xwiki.contrib.mailarchive.timeline.internal.TimeLineEvent) */ protected void printTopic(TimeLineEvent event) { // We use color of first mailing-list found for timeline band String classname = ""; if (CollectionUtils.isNotEmpty(event.lists)) { classname = event.lists.get(0).replaceAll("\\s", "-"); } String[][] attributes = new String[][] { {"start", eventsDateFormatter.format(event.beginDate)}, {"end", eventsDateFormatter.format(event.endDate)}, {"title", event.title}, {"icon", (event.icons != null && event.icons.size() > 0 ? event.icons.get(0) : "")}, {"image", (event.icons != null && event.icons.size() > 0 ? event.icons.get(0) : "")}, {"classname", classname}, {"durationEvent", "true"}, {"link", event.url}}; printXMLStartElement("event", attributes); // FIXME HTML generation here if (CollectionUtils.isNotEmpty(event.lists)) { for (String tag : event.lists) { printXML("<span class=\"block-" + tag.replaceAll("\\s", "-") + "\">OO</span> " + tag + ' '); } } printXML("<br/><br/> " + event.action + " by " + event.author + "<br/> "); // Print extract printXML("<br/>"); printXML("\"" + event.extract + "\""); printXML("<br/>"); printXML("<br/>"); if (MapUtils.isNotEmpty(event.messages)) { for (Entry<Long, TopicEventBubble> bubbleInfo : event.messages.entrySet()) { print(bubbleInfo.getValue()); } } printXMLEndElement("event"); } /** * {@inheritDoc} * * @see org.xwiki.contrib.mailarchive.timeline.internal.ITimeLineDataWriter#printMail(org.xwiki.contrib.mailarchive.timeline.internal.TimeLineEvent) */ protected void printMail(TimeLineEvent event) { String[][] attributes = new String[][] { {"start", eventsDateFormatter.format(event.beginDate)}, {"title", event.title}, {"icon", (event.icons != null && event.icons.size() > 0 ? event.icons.get(0) : "")}, {"image", (event.icons != null && event.icons.size() > 0 ? event.icons.get(0) : "")}, {"link", event.url}}; printXMLStartElement("event", attributes); // FIXME HTML generation here if (CollectionUtils.isNotEmpty(event.lists)) { for (String tag : event.lists) { printXML("<span class=\"block-" + tag.replaceAll("\\s", "-") + "\">OO</span> " + tag + ' '); } } printXML("<br/><br/>" + event.action + " by " + event.author + "<br/>"); printXML("<br/>"); printXML("\"" + event.extract + "\""); printXML("<br/>"); printXML("<br/>"); printXMLEndElement("event"); } /** * {@inheritDoc} * * @see org.xwiki.contrib.mailarchive.timeline.internal.ITimeLineDataWriter#print(org.xwiki.contrib.mailarchive.timeline.internal.TopicEventBubble) */ @Override public void print(final TopicEventBubble bubbleInfo) { // FIXME HTML Generation ? printXML("<a href=\"javascript:centerTimeline('" + bubbleInfo.date + "');\">" + displayDateFormatter.format(bubbleInfo.date) + "</a>"); printXML(" - "); printXML("<a href=\"" + bubbleInfo.url + "\">" + bubbleInfo.subject + "</a>"); printXML(" - "); if (bubbleInfo.link != null) { printXML("<a href=\"" + bubbleInfo.link + "\">"); } printXML(bubbleInfo.user); if (bubbleInfo.link != null) { printXML("</a>"); } printXML("<br/>"); /* * <a href="javascript:centerTimeline();"> formatter.format(maildate)</a> - <a href=\"" + +"\">" + subject + * "</a> - " + (link != null ? "<a href=\"" + link + "\">" : "") + user + (link != null ? "</a> " : "") + * "'<br/>"; */ } }