Author: fdesbois Date: 2010-05-21 13:56:38 +0200 (Fri, 21 May 2010) New Revision: 3009 Url: http://chorem.org/repositories/revision/pollen/3009 Log: - Add javadoc - Change signature of getErrorMessage from PollenManager - Refactor exceptions managment by ErrorReport in PollFormModel validations - Extract sendEmail method for creator from onSuccess callback Modified: trunk/pollen-business/src/main/xmi/pollen.zargo trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserRegister.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUri.java trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUriImpl.java trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties Modified: trunk/pollen-business/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -282,7 +282,7 @@ feedback.addInfo(messages.get("loginOk")); } catch (PollenBusinessException eee) { feedback.addError( - manager.getErrorMessage(eee, messages, logger)); + manager.getErrorMessage(logger, messages, eee)); } } return this; Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -11,6 +11,8 @@ import org.chorem.pollen.PollenBusinessException; import org.chorem.pollen.PollenBusinessException.PollenExceptionType; import org.chorem.pollen.entity.FavoriteList; +import org.chorem.pollen.entity.FavoriteParticipant; +import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.service.ServiceFavorite; import org.chorem.pollen.ui.base.PollenPage; import org.chorem.pollen.ui.services.PollenManager; @@ -91,7 +93,7 @@ try { serviceFavorite.createFavoriteList(newFavoriteList); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); if (logger.isDebugEnabled()) { logger.debug(message); Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -210,8 +210,9 @@ try { serviceFavorite.updateFavoriteParticipant(participantEdited); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); - participantsForm.recordError(message); +// String message = manager.getErrorMessage(eee, messages, logger); +// participantsForm.recordError(message); + manager.recordFormError(logger, messages, eee, participantsForm); } } @@ -285,8 +286,9 @@ try { serviceFavorite.createFavoriteParticipant(newParticipant); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); - addParticipant.recordError(message); +// String message = manager.getErrorMessage(eee, messages, logger); +// addParticipant.recordError(message); + manager.recordFormError(logger, messages, eee, participantsForm); } } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/models/PollFormModel.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -11,7 +11,7 @@ import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.service.ServicePoll; import org.chorem.pollen.ui.data.ChoiceField; -import org.chorem.pollen.ui.data.FieldValidationException; +import org.chorem.pollen.ui.data.ErrorReport; import org.chorem.pollen.ui.pages.poll.PollForm; import org.chorem.pollen.ui.services.PollenManager; import org.chorem.pollen.ui.services.ServiceImage; @@ -90,11 +90,14 @@ /** * Initialize the poll using an {@code uid} for an existing poll or the * current {@code user} connected if he exists as the creator of a new - * poll. + * poll with {@code createMode} flag set. * - * @param uid Unique id of an existing poll (can be null for a new poll) - * @param user Connected user as creator of a new poll (can be null if no - * user is connected). + * @param servicePoll Service used to retrieve an existing poll based on + * {@code uid} or instantiate a new one. + * @param uid Unique id of an existing poll (can be null for a new + * poll) + * @param user Connected user as creator of a new poll (can be null + * if no user is connected). */ public void initPoll(ServicePoll servicePoll, String uid, UserAccount user) { if (StringUtils.isNotEmpty(uid)) { @@ -322,7 +325,8 @@ poll = servicePoll.createPoll(poll, getLists()); } - public void validate(Messages messages) throws FieldValidationException { + public ErrorReport validate(Messages messages) { + ErrorReport report = new ErrorReport(); // Initialize beginDate if needed Date beginDate = poll.getBeginDate(); @@ -334,9 +338,11 @@ // Check endDate Date endDate = poll.getEndDate(); if (endDate != null && endDate.before(beginDate)) { - throw new FieldValidationException( - PollForm.FORM_FIELD_END_DATE, + report.recordFieldError(PollForm.FORM_FIELD_END_DATE, "error endDate before beginDate"); +// throw new FieldValidationException( +// PollForm.FORM_FIELD_END_DATE, +// "error endDate before beginDate"); } // Add choices is allowed after creation @@ -351,23 +357,28 @@ // Check beginChoiceDate if (endDate != null && beginChoiceDate.after(endDate)) { - throw new FieldValidationException( - PollForm.FORM_FIELD_BEGIN_CHOICE_DATE, + report.recordFieldError(PollForm.FORM_FIELD_BEGIN_CHOICE_DATE, "error beginChoiceDate after endDate"); +// throw new FieldValidationException( +// PollForm.FORM_FIELD_BEGIN_CHOICE_DATE, +// "error beginChoiceDate after endDate"); } // Check endChoiceDate Date endChoiceDate = poll.getEndChoiceDate(); if (endChoiceDate != null && endChoiceDate.before(beginChoiceDate)) { - throw new FieldValidationException( - PollForm.FORM_FIELD_END_CHOICE_DATE, + report.recordFieldError(PollForm.FORM_FIELD_END_CHOICE_DATE, "error endChoiceDate before beginChoiceDate"); +// throw new FieldValidationException( +// PollForm.FORM_FIELD_END_CHOICE_DATE, +// "error endChoiceDate before beginChoiceDate"); } } - // TODO-fdesbois-2010-05-20 : change exceptions by ErrorReport // validation rules : // - not allowed to save poll without choice if addChoiceAllowed is false + + return report; } /** Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -100,9 +100,9 @@ } } catch (PollenBusinessException eee) { // TODO two different errors, on password or on login - //addError(messages.get("loginFailed")); - String message = manager.getErrorMessage(eee, messages, logger); - loginForm.recordError(message); +// String message = manager.getErrorMessage(eee, messages, logger); +// loginForm.recordError(message); + manager.recordFormError(logger, messages, eee, loginForm); } } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -195,8 +195,9 @@ try { serviceUser.updateUser(accountEdited, true); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); - usersForm.recordError(message); +// String message = manager.getErrorMessage(eee, messages, logger); +// usersForm.recordError(message); + manager.recordFormError(logger, messages, eee, usersForm); } } @@ -279,7 +280,7 @@ serviceUser.createUser(newUser); addInfo(passwordInfo); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); switch (eee.getType()) { case USER_EMAIL_EXIST: newUserForm.recordError(newEmail, message); @@ -320,7 +321,7 @@ newUser.getLogin(), newUser.getEmail())); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); addError(message); addInfo(messages.format( "pollen.ui.user.create.emailFailedShowPassword", Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -14,6 +14,7 @@ import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.components.Form; +import org.apache.tapestry5.corelib.components.Select; import org.apache.tapestry5.corelib.components.Zone; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; @@ -39,6 +40,7 @@ import org.chorem.pollen.ui.components.Border; import org.chorem.pollen.ui.data.AddressBar; import org.chorem.pollen.ui.data.ChoiceField; +import org.chorem.pollen.ui.data.ErrorReport; import org.chorem.pollen.ui.data.FieldValidationException; import org.chorem.pollen.ui.data.PollUri; import org.chorem.pollen.ui.models.ParticipantListModel; @@ -117,6 +119,19 @@ @InjectComponent private Form mainForm; + private enum PollStep { + MAIN, CHOICES; + } + + /** Current step of the Form */ + private PollStep step; + + /** + * Flag to detect an internal edition in the form. Use when submit + * actions are triggered from all buttons except the save one. + */ + private boolean edited; + void onActivate(String id) { pollUID = id; } @@ -379,7 +394,7 @@ /** Flag if submit comes from lists edition */ private boolean editLists; - protected static final String EVENT_UPDATE_POLL_TYPE = "updatePollType"; + protected static final String EVENT_UPDATE_POLL_TYPE = "updateFromPollType"; /** DATA ** */ @@ -422,7 +437,7 @@ } @Log - Object onUpdatePollType(String value) { + Object onUpdateFromPollType(String value) { getModel().setPollType(servicePoll, manager, PollType.valueOf(value)); return refreshListZone(); } @@ -469,7 +484,7 @@ try { getModel().setCurrentList(manager, listName); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); listsFeedback.addError(message); } } @@ -495,12 +510,13 @@ return listsZone.getBody(); } - /** ********************** CHOIX **************************************** */ + /** ********************** CHOICES ************************************** */ - @Property - private ChoiceField choice; + @Inject + private ServiceImage serviceImage; - private List<ChoiceField> choices; + @InjectComponent + private Zone choicesZone; @Inject private Block choiceText; @@ -511,30 +527,19 @@ @Inject private Block choiceImage; - private boolean refresh; + @Property + private ChoiceField choice; + @Property + private boolean refreshChoicesZone; + /** * Get choices from poll if it exists or initialized 4 choices with the - * default type : TEXT. TODO-fdesbois-2010-05-19 : put this treatment in - * PollFormModel + * default type : TEXT. * * @return a list of ChoiceDTO */ public List<ChoiceField> getChoices() throws PollenBusinessException { -// if (choices == null) { -// choices = new ArrayList<ChoiceField>(); -// if (isCreateMode()) { -// // Initialized to choice TEXT type -// for (int i = 0; i < 4; i++) { -// choices.add(ChoiceField.getChoiceText()); -// } -// } else { -// for (Choice current : getPoll().getChoice()) { -// choices.add(new ChoiceField(getPoll(), current)); -// } -// } -// } -// return choices; return getModel().getChoices(); } @@ -549,44 +554,67 @@ } } - private enum PollStep { - - MAIN, CHOICES; + @Log + Object onChangeFromChoiceType(String value) { + ChoiceType type = ChoiceType.valueOf(value); + getPoll().setChoiceType(type); + refreshChoicesZone = true; + return choicesZone.getBody(); } - private PollStep step; + /** ********************** NAVIGATION/SUBMISSION ************************ */ - private boolean edited; + /** Service used to retrieve Field components from their ids */ + @Inject + private ComponentSource componentSource; - @Property - private boolean refreshChoicesZone; + /** Form fields used for validation */ + public static final String FORM_FIELD_BEGIN_DATE = "beginDate"; - @InjectComponent - private Zone choicesZone; + public static final String FORM_FIELD_END_DATE = "endDate"; + public static final String FORM_FIELD_BEGIN_CHOICE_DATE = "beginChoiceDate"; + + public static final String FORM_FIELD_END_CHOICE_DATE = "endChoiceDate"; + + /** Resulting page after success submission */ + @InjectPage + private PollLinks pollLinks; + + /** Service to send email after success */ @Inject - private ServiceImage serviceImage; + private ServiceEmail serviceEmail; - @Log - Object onChangeFromChoiceType(String value) { - ChoiceType type = ChoiceType.valueOf(value); - getPoll().setChoiceType(type); - refreshChoicesZone = true; - return choicesZone.getBody(); - } + /** Service to manage uris used in emails sent */ + @Inject + private ServicePollUri servicePollUri; + /** + * ON_SELECTED:: Handler method for all submit actions. Will reset refreshing + * zones flags used for subForm components. + */ @Log void onSelected() { refreshListsZone = false; refreshChoicesZone = false; } + /** + * ON_SELECTED:: Handler method for action on choiceStep submit button. Will + * change the view and display the choice formFragment of the pollForm. + * Note : maybe validations will be needed in this case (use edited flag). + */ @Log void onSelectedFromChoiceStep() { step = PollStep.CHOICES; edited = true; } + /** + * ON_SELECTED:: Handler method for action on mainStep submit button. Will + * change the view and display the main formFragment of the pollForm. + * This is a previous action after being on choices. + */ @Log void onSelectedFromMainStep() { step = PollStep.MAIN; @@ -601,86 +629,40 @@ return step.equals(PollStep.MAIN); } - @Inject - private ComponentSource componentSource; - - public static final String FORM_FIELD_BEGIN_DATE = "beginDate"; - - public static final String FORM_FIELD_END_DATE = "endDate"; - - public static final String FORM_FIELD_BEGIN_CHOICE_DATE = "beginChoiceDate"; - - public static final String FORM_FIELD_END_CHOICE_DATE = "endChoiceDate"; - @Log void onValidateForm() { if (!edited) { - // Need validations on dates - try { - getModel().validate(messages); - getModel().create(servicePoll, serviceImage); - } catch (FieldValidationException eee) { - manager.recordFormError(eee, mainForm, componentSource); - } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); - mainForm.recordError(message); + // Validate data + ErrorReport report = getModel().validate(messages); + // Record errors if report is not empty + if (report.hasErrors()) { + manager.recordFormErrors(componentSource, report, mainForm); + } else { + // Execute create for business save in database + try { + getModel().create(servicePoll, serviceImage); + } catch (PollenBusinessException eee) { + manager.recordFormError(logger, messages, eee, mainForm); + } } } } - @Inject - private PageRenderLinkSource linkSource; - - private Link successLink; - - @InjectPage - private PollLinks pollLinks; - - @Inject - private ServiceEmail serviceEmail; - - @Inject - private ServicePollUri servicePollUri; - -// public void prepareSuccessLinks(Poll newPoll) { -// String creatorUid = newPoll.getCreator().getUid(); -// String pollUid = newPoll.getUid(); -// PollUri uri = servicePollUri.getNewPollUri(creatorUid, pollUid); -//// successLink = linkSource.createPageRenderLinkWithContext( -//// PollLinks.class, uri); -// pollLinks.setPollUri(uri); -// } - @Log Object onSuccess() { if (!edited) { + pollLinks.addInfo("Sauvegarde OK !"); PollAccount creator = getPoll().getCreator(); PollUri uri = servicePollUri.getNewPollUri(creator.getUid(), getPoll().getUid()); pollLinks.setPollUri(uri); - pollLinks.addInfo("Sauvegarde OK !"); + // Send an email to the creator if (creator.getEmail() != null) { - pollLinks.addInfo("Vous avez recu un mail !"); - PollenEmail email = new PollenEmailImpl(); - email.setTo(creator.getEmail()); - email.setSubject(messages.format( - "pollen.email.createPoll.subject", - getPoll().getTitle())); - email.setContent(messages.format( - "pollen.email.createPoll.content", - getPoll().getTitle(), - servicePollUri.getVoteUrl(uri), - servicePollUri.getModerateVoteUrl(uri), - servicePollUri.getPollUpdateUrl(uri))); - try { - serviceEmail.sendEmail(email); - } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); - addError(message); + if (!sendCreatorEmail(creator, uri)) { return mainZone; } - } else { - // TODO-fdesbois-2010-05-20 : display a pretty message for this case : the links page need to be keeped by user + } else { + pollLinks.addInfo("pollen.ui.poll.links.creatorEmail.notDefined"); } if (getPoll().getPollType().isRestrictedOrGroup()) { pollLinks.addInfo("Les votants ont reçu un mail !"); @@ -690,6 +672,29 @@ return mainZone; } + protected boolean sendCreatorEmail(PollAccount creator, PollUri uri) { + PollenEmail email = new PollenEmailImpl(); + email.setTo(creator.getEmail()); + email.setSubject(messages.format( + "pollen.email.createPoll.subject", + getPoll().getTitle())); + email.setContent(messages.format( + "pollen.email.createPoll.content", + getPoll().getTitle(), + servicePollUri.getVoteUrl(uri), + servicePollUri.getModerateVoteUrl(uri), + servicePollUri.getPollUpdateUrl(uri))); + try { + serviceEmail.sendEmail(email); + pollLinks.addInfo("pollen.ui.poll.links.creatorEmail.success"); + } catch (PollenBusinessException eee) { + String message = manager.getErrorMessage(logger, messages, eee); + addError(message); + return false; + } + return true; + } + @Log Object onFailure() { return mainZone; Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -25,6 +25,7 @@ import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.PropertyAccess; import org.chorem.pollen.entity.FavoriteList; +import org.chorem.pollen.entity.UserAccount; import org.chorem.pollen.service.ServiceFavorite; import org.chorem.pollen.ui.base.AbstractPollenPage; import org.chorem.pollen.ui.components.Border; Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -133,10 +133,10 @@ /** * ON_VALIDATE_FORM :: <br \> * UI validation : check if the two passwords are equals. <br \> - * BUSINESS validation : execute {@link ServiceUser#updateUser(UserAccount) } + * BUSINESS validation : execute {@link ServiceUser#updateUser(UserAccount,boolean) } * which throws errors - * {@link PollenBusinessException.PollenExceptionType.USER_WRONG_PASSWORD} - * and {@link PollenBusinessException.PollenExceptionType.USER_EMAIL_EXIST}. + * {@link PollenBusinessException.PollenExceptionType#USER_WRONG_PASSWORD} + * and {@link PollenBusinessException.PollenExceptionType#USER_EMAIL_EXIST}. */ @Log void onValidateFormFromAccountForm() { @@ -159,7 +159,7 @@ } serviceUser.updateUser(user, false); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); switch (eee.getType()) { case USER_WRONG_PASSWORD: accountForm.recordError(passwordField, message); break; Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserRegister.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserRegister.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserRegister.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -132,8 +132,8 @@ * UI validation : check if the two passwords are equals. <br \> * BUSINESS validation : execute {@link ServiceUser#createUser(UserAccount)} * which throws errors - * {@link PollenBusinessException.PollenExceptionType.USER_LOGIN_EXIST} - * and {@link PollenBusinessException.PollenExceptionType.USER_EMAIL_EXIST}. + * {@link PollenBusinessException.PollenExceptionType#USER_LOGIN_EXIST} + * and {@link PollenBusinessException.PollenExceptionType#USER_EMAIL_EXIST}. */ void onValidateFormFromRegister() { // Check newPassword that must be equals to passwordVerify @@ -153,7 +153,7 @@ // Saving new user serviceUser.createUser(newUser); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); switch (eee.getType()) { case USER_EMAIL_EXIST: register.recordError(emailField, message); break; @@ -199,7 +199,7 @@ newUser.getEmail())); } catch (PollenBusinessException eee) { - String message = manager.getErrorMessage(eee, messages, logger); + String message = manager.getErrorMessage(logger, messages, eee); index.addError(message); } } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -24,6 +24,8 @@ import org.apache.tapestry5.Field; import org.apache.tapestry5.corelib.components.Form; import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.OrderedConfiguration; +import org.apache.tapestry5.ioc.services.RegistryShutdownHub; import org.apache.tapestry5.ioc.services.RegistryShutdownListener; import org.apache.tapestry5.ioc.services.SymbolProvider; import org.apache.tapestry5.ioc.util.CaseInsensitiveMap; @@ -34,7 +36,6 @@ import org.chorem.pollen.PollenProperty; import org.chorem.pollen.service.ServiceUser; import org.chorem.pollen.ui.data.ErrorReport; -import org.chorem.pollen.ui.data.FieldValidationException; import org.nuiton.util.ApplicationConfig; import org.slf4j.Logger; @@ -44,23 +45,31 @@ import java.util.Properties; /** - * WaoManager + * This service contains the main {@link PollenContext} for business. This is + * the service that start and stop the business part of the application. For + * this, PollenManager was registered in Tapestry as a {@link + * RegistryShutdownListener} to stop the context and contribute to registry + * startup from {@link AppModule#contributeRegistryStartup(OrderedConfiguration, + * ServiceUser, PollenManager, RegistryShutdownHub)}. The application {@code + * context} was not visible for pages, this service use delegation for needed + * methods from {@code context}. * <p/> + * This service is also used to manage errors from {@link + * PollenBusinessException} that contains i18n keys for messages. Traductions are + * made via Tapestry global catalog messages ({@code app.properties}). But you + * need to write messages in {@code resources/i18n/pollen-ui.properties}. A + * maven goal is used to merge i18n messages from business (and libs) and ui + * into the main Tapestry catalog {@code app.properties} + * <p/> * Created: 24 nov. 2009 * * @author fdesbois - * @version $Revision$ - * <p/> - * Mise a jour: $Date$ - * par : $Author$ + * @version $Id$ */ public class PollenManager implements Runnable, RegistryShutdownListener, SymbolProvider { -// private static final Logger logger = -// LoggerFactory.getLogger(PollenManager.class); - private final Map<String, String> propertiesMap = new CaseInsensitiveMap<String>(); @@ -69,7 +78,8 @@ private ServiceUser serviceUser; /** - * Constructor of WaoManager. It needs the WaoContext to start and stop. + * Constructor of PollenManager. It needs the PollenContext to start and + * stop. * * @param context used to manage application lifecycle */ @@ -129,8 +139,17 @@ return context.createPollenUrlId(); } - public String getErrorMessage(PollenBusinessException error, - Messages messages, Logger logger) { + /** + * Retrieve an error message from business {@code error} exception. Will + * used {@code messages} and {@code logger} services. + * + * @param logger Service to log error message from business + * @param messages Service to retrieve messages from i18n catalog + * @param error Exception to treate + * @return the error message to display + */ + public String getErrorMessage(Logger logger, Messages messages, + PollenBusinessException error) { if (logger.isDebugEnabled()) { logger.debug("ERROR from business : " + error.getMessage() + " _ args = " + Arrays.toString(error.getArgs())); @@ -144,23 +163,44 @@ return message; } - public void recordFormError(FieldValidationException error, - Form form, ComponentSource componentSource) - throws ClassCastException { - if (error.getField() == null) { - form.recordError(error.getMessage()); - } else { - Field field = getFieldByName(error.getField(), componentSource); - form.recordError(field, error.getMessage()); - } + /** + * Record a business {@code error} exception into a {@code form}. Will used + * {@code messages} and {@code logger} services. + * + * @param logger Service to log error message from business + * @param messages Service to retrieve messages from i18n catalog + * @param error Exception to treate + * @param form Form where error need to be recorded + * @see #getErrorMessage(Logger, Messages, PollenBusinessException) + */ + public void recordFormError(Logger logger, Messages messages, + PollenBusinessException error, + Form form) { + String message = getErrorMessage(logger, messages, error); + form.recordError(message); } - public void recordFormErrors(ErrorReport report, - Form form, ComponentSource componentSource) - throws ClassCastException { + /** + * Record ui errors (from validation) defined in {@code report} into a + * {@code form}. Will used {@code componentSource} service. + * + * @param componentSource Service to retrieve Field components from their + * ids + * @param report ErrorReport that contains errors + * @param form Form where errors need to be recorded + * @throws ClassCastException when {@code componentSource} doesn't + * find the right component based on field + * ids in {@code report}. + * @throws IllegalArgumentException when no field component was found based + * on field ids in {@code report}. + */ + public void recordFormErrors(ComponentSource componentSource, + ErrorReport report, + Form form) + throws ClassCastException, IllegalArgumentException { for (Map.Entry<String, String> entry : report.getFieldErrors().entrySet()) { - Field field = getFieldByName(entry.getKey(), componentSource); + Field field = getFieldByName(componentSource, entry.getKey()); form.recordError(field, entry.getValue()); } for (String message : report.getErrors()) { @@ -168,9 +208,24 @@ } } - protected Field getFieldByName(String field, ComponentSource componentSource) - throws ClassCastException { +// public void recordFormError(FieldValidationException error, +// Form form, ComponentSource componentSource) +// throws ClassCastException { +// if (error.getField() == null) { +// form.recordError(error.getMessage()); +// } else { +// Field field = getFieldByName(error.getField(), componentSource); +// form.recordError(field, error.getMessage()); +// } +// } + + protected Field getFieldByName(ComponentSource componentSource, String field) + throws ClassCastException, IllegalArgumentException { Component component = componentSource.getComponent(field); + if (component == null) { + throw new IllegalArgumentException("no field component was found" + + " with id " + field); + } if (!(component instanceof Field)) { throw new ClassCastException("invalid cast to Field from : " + component.getClass().getName()); Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUri.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUri.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUri.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -2,34 +2,98 @@ import org.apache.tapestry5.Link; import org.apache.tapestry5.services.PageRenderLinkSource; +import org.chorem.pollen.ui.components.Border; import org.chorem.pollen.ui.data.PollUri; -import org.chorem.pollen.ui.pages.poll.PollForm; -import org.chorem.pollen.ui.pages.poll.VoteForPoll; /** + * Service used to manage PollUri in application. The contextPath is needed to + * retrieve proper urls from uri, but to retrieve Tapestry links, only {@link + * PageRenderLinkSource} service is used. The links will be used in Tapestry + * templates, and full urls will be used for emails. + * <p/> * Created: 20 mai 2010 * * @author fdesbois <fdesbois@codelutin.com> * @version $Id$ + * @see PollUri + * @see ServicePollUriImpl */ public interface ServicePollUri { + /** + * Retrieve link for poll update page. + * + * @param uri PollUri that contains pollUid and creatorUid + * @return the Link to used for poll update page + */ Link getPollUpdateLink(PollUri uri); + /** + * Retrieve link for vote page. + * + * @param uri PollUri that contains pollUid (accountUid is not necessary) + * @return the Link to used for vote page + */ Link getVoteLink(PollUri uri); + /** + * Retrieve link for moderation on vote page. + * + * @param uri PollUri that contains pollUid and creatorUid (moderator) + * @return the Link to used for moderation on vote page + */ Link getModerateVoteLink(PollUri uri); + /** + * Retrieve url for poll update page. + * + * @param uri PollUri that contains pollUid and creatorUid + * @return the full url to used for poll update page + */ String getPollUpdateUrl(PollUri uri); + /** + * Retrieve url for vote page. + * + * @param uri PollUri that contains pollUid (accountUid is not necessary) + * @return the full url to used for vote page + */ String getVoteUrl(PollUri uri); + /** + * Retrieve url for moderation on vote page. + * + * @param uri PollUri that contains pollUid and creatorUid (moderator) + * @return the full url to used for moderation on vote page + */ String getModerateVoteUrl(PollUri uri); + /** + * Retrieve a new instance of PollUri with {@code accountUid} and {@code + * pollUid} initialized. + * + * @param accountUid Unique id of the account for the uri + * @param pollUid Unique id of the poll for the uri + * @return a new PollUri + */ PollUri getNewPollUri(String accountUid, String pollUid); + /** + * Retrieve a new instance of PollUri based on string {@code uri} that + * contains both account and poll uid necessary. + * + * @param uri Full uri as a String + * @return a new PollUri + */ PollUri getNewPollUri(String uri); + /** + * Injector for contextPath used for urls. This method need to be called + * before retrieving urls. The {@link Border} layout will do this job on + * page render. + * + * @param contextPath Context path of the current server + */ void setContextPath(String contextPath); } Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUriImpl.java =================================================================== --- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUriImpl.java 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServicePollUriImpl.java 2010-05-21 11:56:38 UTC (rev 3009) @@ -14,10 +14,17 @@ */ public class ServicePollUriImpl implements ServicePollUri { + /** Service used to create links */ private PageRenderLinkSource linkSource; + /** Context path of the current server used to create urls */ private String contextPath; + /** + * Constructor of ServicePollUriImpl. + * + * @param linkSource Service used to create links. + */ public ServicePollUriImpl(PageRenderLinkSource linkSource) { this.linkSource = linkSource; } Modified: trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties =================================================================== --- trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-20 17:54:37 UTC (rev 3008) +++ trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-21 11:56:38 UTC (rev 3009) @@ -76,6 +76,8 @@ pollen.ui.poll.links.editPage=Lien d'acc\u00e8s \u00e0 la modification du sondage : pollen.ui.poll.links.register=Si vous \u00eates un utilisateur identifi\u00e9, vous pouvez retrouver ces liens dans la page pollen.ui.poll.links.myPolls=Mes sondages +pollen.ui.poll.links.creatorEmail.success=Un email vous a \u00e9t\u00e9 envoy\u00e9 avec les liens ci-dessous. +pollen.ui.poll.links.creatorEmail.notDefined=Aucun email n'a \u00e9t\u00e9 d\u00e9fini \u00e0 la cr\u00e9ation du sondage, vous devriez enregistrer cette page dans vos favoris pour ne pas perdre les liens. # OLD LOGIN_COMPONENT