Author: tchemit Date: 2012-02-22 23:23:54 +0100 (Wed, 22 Feb 2012) New Revision: 3140 Url: http://chorem.org/repositories/revision/pollen/3140 Log: add PollFeedService add application url in service context Added: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/exceptions/PollCommentNotFound.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollFeedService.java Modified: branches/pollen-1.2.6-struts2/pollen-services/pom.xml branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollCommentService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties branches/pollen-1.2.6-struts2/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java Modified: branches/pollen-1.2.6-struts2/pollen-services/pom.xml =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/pom.xml 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/pom.xml 2012-02-22 22:23:54 UTC (rev 3140) @@ -62,6 +62,10 @@ <artifactId>mail</artifactId> </dependency> <dependency> + <groupId>rome</groupId> + <artifactId>rome</artifactId> + </dependency> + <dependency> <groupId>org.nuiton.web</groupId> <artifactId>nuiton-struts2</artifactId> </dependency> Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/DefaultPollenServiceContext.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -27,6 +27,7 @@ import org.chorem.pollen.PollenConfiguration; import org.nuiton.topia.TopiaContext; +import java.net.URL; import java.util.Date; import java.util.Locale; import java.util.UUID; @@ -47,13 +48,17 @@ protected Locale locale; + private final URL applicationURL; + public static PollenServiceContext newContext( PollenServiceContext serviceContext, TopiaContext transaction) { return newContext(serviceContext.getLocale(), transaction, serviceContext.getConfiguration(), - serviceContext.getServiceFactory() + serviceContext.getServiceFactory(), + serviceContext.getApplicationURL() + ); } @@ -61,21 +66,25 @@ Locale locale, TopiaContext transaction, PollenConfiguration configuration, - PollenServiceFactory serviceFactory) { + PollenServiceFactory serviceFactory, + URL applicationURL) { return new DefaultPollenServiceContext(locale, transaction, configuration, - serviceFactory); + serviceFactory, + applicationURL); } protected DefaultPollenServiceContext(Locale locale, TopiaContext transaction, PollenConfiguration configuration, - PollenServiceFactory serviceFactory) { + PollenServiceFactory serviceFactory, + URL applicationURL) { this.locale = locale; this.transaction = transaction; this.configuration = configuration; this.serviceFactory = serviceFactory; + this.applicationURL = applicationURL; } @Override @@ -95,6 +104,11 @@ } @Override + public URL getApplicationURL() { + return applicationURL; + } + + @Override public <E extends PollenService> E newService(Class<E> clazz) { return serviceFactory.newService(clazz, this); } Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/PollenServiceContext.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -27,6 +27,7 @@ import org.chorem.pollen.PollenConfiguration; import org.nuiton.topia.TopiaContext; +import java.net.URL; import java.util.Date; import java.util.Locale; @@ -46,6 +47,8 @@ Locale getLocale(); + URL getApplicationURL(); + PollenConfiguration getConfiguration(); PollenServiceFactory getServiceFactory(); Added: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/exceptions/PollCommentNotFound.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/exceptions/PollCommentNotFound.java (rev 0) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/exceptions/PollCommentNotFound.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -0,0 +1,35 @@ +/* + * #%L + * Pollen :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package org.chorem.pollen.services.exceptions; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 1.2.6 + */ +public class PollCommentNotFound extends Exception { + + private static final long serialVersionUID = 1L; +} Property changes on: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/exceptions/PollCommentNotFound.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollCommentService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollCommentService.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollCommentService.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -33,6 +33,7 @@ import org.chorem.pollen.business.persistence.PollDAO; import org.chorem.pollen.business.persistence.UserAccount; import org.chorem.pollen.services.PollenServiceSupport; +import org.chorem.pollen.services.exceptions.PollCommentNotFound; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaQuery; import org.nuiton.web.struts2.FilterPagerUtil; @@ -75,13 +76,17 @@ // add it to poll pollToUpdate.addComment(commentCreated); + // add a feed entry + PollFeedService pollFeedService = newService(PollFeedService.class); + pollFeedService.addFeedEntryWhenCreateComment(commentCreated); + return commentCreated; } catch (TopiaException e) { throw new PollenTechnicalException(e); } } - public void deleteComment(String commentId) { + public void deleteComment(String commentId) throws PollCommentNotFound { Preconditions.checkNotNull(commentId); @@ -92,8 +97,7 @@ Comment comment = dao.findByTopiaId(commentId); if (comment == null) { - throw new PollenTechnicalException( - "Poll comment with id [" + commentId + "] not found "); + throw new PollCommentNotFound(); } //FIXME Should we also delete the associated pollAccount ? @@ -168,7 +172,7 @@ try { TopiaQuery countQuery = dao.createQuery("e"). - addWhere("e." + Comment.PROPERTY_POLL + ".id", + addWhere("e." + Comment.PROPERTY_POLL + ".pollId", TopiaQuery.Op.EQ, pollId); long records = dao.countByQuery(countQuery); pager.setRecords((int) records); @@ -181,4 +185,5 @@ throw new PollenTechnicalException(e); } } + } Added: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollFeedService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollFeedService.java (rev 0) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollFeedService.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -0,0 +1,242 @@ +/* + * #%L + * Pollen :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2009 - 2012 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package org.chorem.pollen.services.impl; + +import com.sun.syndication.feed.synd.SyndContent; +import com.sun.syndication.feed.synd.SyndContentImpl; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndEntryImpl; +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.feed.synd.SyndFeedImpl; +import com.sun.syndication.io.SyndFeedInput; +import com.sun.syndication.io.SyndFeedOutput; +import com.sun.syndication.io.XmlReader; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.PollenTechnicalException; +import org.chorem.pollen.business.persistence.Choice; +import org.chorem.pollen.business.persistence.Comment; +import org.chorem.pollen.business.persistence.Poll; +import org.chorem.pollen.business.persistence.Vote; +import org.chorem.pollen.services.PollenServiceSupport; + +import java.io.File; +import java.io.FileWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.l_; + +/** + * Service to manage feed of a poll. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.2.6 + */ +public class PollFeedService extends PollenServiceSupport { + + /** Logger. */ + private static final Log log = LogFactory.getLog(PollFeedService.class); + + public boolean isFeedExists(Poll poll) { + File file = getFeedLocation(poll); + return file.exists(); + } + + /** + * Obtain the feed file of the given poll. + * + * @param poll poll + * @return the location of the feed of the given poll + */ + public File getFeedLocation(Poll poll) { + + File feedDirectory = getConfiguration().getFeedDirectory(); + String filename = poll.getPollId() + ".xml"; + File result = new File(feedDirectory, filename); + return result; + } + + /** + * Création d'un flux. + * + * @param poll poll + * @param type type de flux (rss_2.0, atom_1.0) + */ + public void createFeed(Poll poll, String type) { + + File file = getFeedLocation(poll); + + String title = l_(getLocale(), "pollen.feed.pollTitle", poll.getTitle()); + String description = l_(getLocale(), "pollen.feed.pollDescription", poll.getDescription()); + String link = getPollFeedLink(poll); + try { + + SyndFeed feed = new SyndFeedImpl(); + feed.setFeedType(type); + feed.setTitle(title); + feed.setLink(link); + feed.setDescription(description); + + Writer writer = new FileWriter(file); + SyndFeedOutput output = new SyndFeedOutput(); + output.output(feed, writer); + writer.close(); + + if (log.isDebugEnabled()) { + log.debug("Feed created: " + file.getAbsolutePath()); + } + } catch (Exception e) { + throw new PollenTechnicalException("Could not create feed", e); + } + } + + /** + * Ajout d'une entrée dans un flux. + * + * @param poll poll + * @param title titre de l'entrée + * @param content contenu de l'entrée + */ + public void feedFeed(Poll poll, String title, + String content) { + + if (!isFeedExists(poll)) { + createFeed(poll, "atom_1.0"); + } + + File file = getFeedLocation(poll); + String link = getPollFeedLink(poll); + + try { + List entries = new ArrayList(); + SyndFeedInput input = new SyndFeedInput(); + SyndFeed feed = input.build(new XmlReader(file)); + entries.addAll(feed.getEntries()); + + SyndEntry entry; + SyndContent description; + entry = new SyndEntryImpl(); + entry.setTitle(title); + entry.setLink(link); + entry.setPublishedDate(new Date()); + description = new SyndContentImpl(); + description.setType("text/plain"); + description.setValue(content); + entry.setDescription(description); + entries.add(entry); + + feed.setEntries(entries); + + Writer writer = new FileWriter(file); + try { + SyndFeedOutput output = new SyndFeedOutput(); + output.output(feed, writer); + } finally { + writer.close(); + } + + if (log.isDebugEnabled()) { + log.debug("Feed updated: " + file.getAbsolutePath()); + } + } catch (Exception e) { + throw new PollenTechnicalException("Could not feed feed", e); + } + } + + /** + * Delete the poll feed file. + * + * @param poll poll + */ + public void deleteFeed(Poll poll) { + + File feedLocation = getFeedLocation(poll); + if (feedLocation.exists()) { + boolean wasDeleted = feedLocation.delete(); + if (!wasDeleted) { + throw new PollenTechnicalException("Could not delete feed"); + } + if (log.isDebugEnabled()) { + log.debug("Feed deleted: " + feedLocation.getAbsolutePath()); + } + } + } + + public void addFeedEntryWhenCreatePoll(Poll poll) { + + + String title = _("pollen.feed.createPollContent", + poll.getCreator().getVotingId()); + + String content = _("pollen.feed.createPollContent", poll.getDescription()); + + feedFeed(poll, title, content); + } + + + public void addFeedEntryWhenCreateComment(Comment comment) { + + //TODO Validate this is ok + String title = _("pollen.feed.addCommentTitle", + comment.getPollAccount().getVotingId()); + + String content = _("pollen.feed.addCommentContent", + comment.getText()); + + feedFeed(comment.getPoll(), title, content); + } + + public void addFeedEntryWhenAddVote(Vote vote) { + + + String title = _("pollen.feed.addVoteTitle", + vote.getPollAccount().getVotingId()); + + // TODO Add result of poll ? And if poll is not public ? + String content = _("pollen.feed.addVoteContent", "TODO"); + + feedFeed(vote.getPoll(), title, content); + } + + public void addFeedEntryWhenAddChoice(Choice choice) { + + String title = _("pollen.feed.addChoiceTitle", choice.getName()); + + String content = _("pollen.feed.addChoiceContent", + choice.getDescription()); + + feedFeed(choice.getPoll(), title, content); + } + + protected String getPollFeedLink(Poll poll) { + String link = + serviceContext.getApplicationURL() + + "/poll/vote?pollId=" + poll.getPollId(); + return link; + } +} Property changes on: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollFeedService.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -45,6 +45,8 @@ import java.util.List; +import static org.nuiton.i18n.I18n._; + public class PollService extends PollenServiceSupport { /** Logger. */ @@ -85,6 +87,21 @@ return result; } + /* + private void addFeedEntry() { + PollAccountDTO creator = servicePollAccount.findPollAccountById(poll.getCreatorId()); + String voteURL = siteURL + "poll/votefor/" + poll.getPollId(); + File feedFile = feedContext.getFile(poll.getPollId()); + + FeedUtil.createFeed(feedFile, "atom_1.0", messages.format( + "pollFeed_title", poll.getTitle()), siteURL, messages.format( + "pollFeed_desc", poll.getDescription())); + FeedUtil.feedFeed(feedFile, messages.format("pollFeed_createTitle", + creator.getVotingId()), voteURL, messages + .get("pollFeed_createContent")); + } + */ + public List<Poll> getPolls(FilterPagerUtil.FilterPagerBean pager) { Preconditions.checkNotNull(pager); @@ -894,4 +911,16 @@ // // return results; // } + + public Poll getPollByPollId(String pollId) { + + Preconditions.checkNotNull(pollId); + PollDAO dao = getDAO(Poll.class); + try { + Poll result = dao.findByPollId(pollId); + return result; + } catch (TopiaException e) { + throw new PollenTechnicalException("Could not find poll with pollId " + pollId); + } + } } Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -83,8 +83,7 @@ } public UserAccount createUser(UserAccount user, - boolean byAdmin, - URL url) throws UserLoginAlreadyUsedException, UserEmailAlreadyUsedException { + boolean byAdmin) throws UserLoginAlreadyUsedException, UserEmailAlreadyUsedException { Preconditions.checkNotNull(user); @@ -121,6 +120,8 @@ throw new PollenTechnicalException(e); } + URL url = serviceContext.getApplicationURL(); + if (url != null && StringUtil.isEmail(user.getEmail())) { Locale locale = getLocale(); @@ -259,7 +260,7 @@ user.setEmail(getConfiguration().getAdminEmail()); user.setPassword(getConfiguration().getAdminPassword()); try { - createUser(user, false, null); + createUser(user, false); if (log.isInfoEnabled()) { log.info(_("pollen.info.admin.created", login)); } @@ -283,7 +284,8 @@ * @param destination which receive the copy * @see Binder#copy(Object, Object, String...) */ - protected void copyUserAccount(UserAccount source, UserAccount destination) { + protected void copyUserAccount(UserAccount source, + UserAccount destination) { TopiaEntityBinder<UserAccount> binder = PollenBinderHelper.getSimpleTopiaBinder(UserAccount.class); Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -32,6 +32,40 @@ /** Logger. */ private static final Log log = LogFactory.getLog(VoteService.class); + /* + private void addFeedEntry(PollAction pollAction, String titleStr, + String contentStr) { + String voteURL = siteURL + "poll/VoteFor/" + poll.getPollId(); + File feedFile = getFeedContext().getFile(poll.getPollId()); + String title = null; + String content = null; + + switch (pollAction) { + case ADDVOTE: + if (isVoteAnonymous()) { + titleStr = messages.get("anonymous"); + } + title = messages.format("pollFeed_voteTitle", titleStr); + content = messages.format("pollFeed_voteContent", contentStr); + break; + case ADDCHOICE: + title = messages.format("pollFeed_choiceTitle", titleStr); + content = messages.format("pollFeed_choiceContent", contentStr); + break; + case ADDCOMMENT: + title = messages.format("pollFeed_commentTitle", titleStr); + content = messages.format("pollFeed_commentContent", contentStr); + break; + } + + if (!feedFile.exists()) { + FeedUtil.createFeed(feedFile, "atom_1.0", messages.format( + "pollFeed_title", poll.getTitle()), siteURL, messages + .format("pollFeed_desc", poll.getDescription())); + } + FeedUtil.feedFeed(feedFile, title, voteURL, content); + } + */ // public boolean canVote(Poll poll, PollAccount participant) { // try { // if (log.isDebugEnabled()) { Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties 2012-02-22 22:23:54 UTC (rev 3140) @@ -148,6 +148,15 @@ pollen.exception.user_wrong_password= pollen.exception.vote_doubloon= pollen.exception.vote_not_allowed= +pollen.feed.addChoiceContent= +pollen.feed.addChoiceTitle= +pollen.feed.addCommentContent=%s +pollen.feed.addCommentTitle=New comment of %s +pollen.feed.addVoteContent= +pollen.feed.addVoteTitle= +pollen.feed.createPollContent= +pollen.feed.pollDescription=%s +pollen.feed.pollTitle=Pollen \: %s pollen.info.admin.created=Super admin was created with login %1$s pollen.info.admin.exists=Super admin already exists pollen.info.start=Start Pollen Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties 2012-02-22 22:23:54 UTC (rev 3140) @@ -152,6 +152,15 @@ pollen.exception.user_wrong_password=Le mot de passe renseigné est incorrect pour l'utilisateur '%1$s'. pollen.exception.vote_doubloon= pollen.exception.vote_not_allowed= +pollen.feed.addChoiceContent= +pollen.feed.addChoiceTitle= +pollen.feed.addCommentContent=%s +pollen.feed.addCommentTitle=Nouveau commentaire de %s +pollen.feed.addVoteContent= +pollen.feed.addVoteTitle= +pollen.feed.createPollContent= +pollen.feed.pollDescription=%s +pollen.feed.pollTitle=Pollen \: %s pollen.info.admin.created=Le super admin a été créé avec l'identifiant %1$s. pollen.info.admin.exists=Le super admin existe déjà pollen.info.start=Démarrage de Pollen... Modified: branches/pollen-1.2.6-struts2/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-02-22 22:21:35 UTC (rev 3139) +++ branches/pollen-1.2.6-struts2/pollen-services/src/test/java/org/chorem/pollen/services/FakeServiceContext.java 2012-02-22 22:23:54 UTC (rev 3140) @@ -37,6 +37,7 @@ import org.nuiton.util.DateUtil; import java.io.File; +import java.net.URL; import java.util.Date; import java.util.Locale; import java.util.UUID; @@ -163,6 +164,11 @@ return Locale.getDefault(); } + @Override + public URL getApplicationURL() { + return null; + } + /** * Create an id to easily managed polls using urls. *