Author: bleny Date: 2011-02-11 17:50:49 +0000 (Fri, 11 Feb 2011) New Revision: 1005 Log: add filtering on ContactStateMotif Added: trunk/wao-business/src/main/java/fr/ifremer/wao/service/EntitiesTranslator.java Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceReferentialImpl.java trunk/wao-business/src/main/xmi/wao.zargo trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ContactForm.java trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java trunk/wao-ui/src/main/webapp/Contacts.tml Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/WaoQueryBuilder.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -637,6 +637,10 @@ query.addEquals(contactProperty.completeSampling(), completeSampling.toArray()); } + if (filter.getContactStateMotif() != null) { + query.addEquals(contactProperty.contactStateMotif(), filter.getContactStateMotif()); + } + if (logger.isDebugEnabled()) { logger.debug("query with filters on Contacts is " + query); } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/service/EntitiesTranslator.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/EntitiesTranslator.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/EntitiesTranslator.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -0,0 +1,97 @@ +package fr.ifremer.wao.service; + +import fr.ifremer.wao.WaoDAOHelper; +import fr.ifremer.wao.entity.TranslatableEntity; +import fr.ifremer.wao.entity.Translation; +import fr.ifremer.wao.entity.TranslationDAO; +import org.apache.commons.lang.LocaleUtils; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Manage the translations of all entities. This class aim to be + * used by service that output some translatable entities and + * provides methods to fulfill an entity with its translations + * to make it ready to printed in a localized UI. + */ +public class EntitiesTranslator { + + private static final Logger log = + LoggerFactory.getLogger(EntitiesTranslator.class); + + protected TopiaContext transaction; + + public EntitiesTranslator(TopiaContext transaction) { + this.transaction = transaction; + } + + /** For a given list of entities, make all known translations available + * in the entity. + * + * This method will look in database to find all translations for a given + * entity and push them in the object. + */ + public <E extends TranslatableEntity> List<E> translateEntities(List<E> entities) throws TopiaException { + List<E> result = new ArrayList<E>(entities); + TranslationDAO translationDAO = WaoDAOHelper.getTranslationDAO(transaction); + for (TranslatableEntity entity : result) { + // find translations for this entity + List<Translation> translations = translationDAO.findAllById(entity.getTopiaId()); + for (Translation translation : translations) { + Locale locale = LocaleUtils.toLocale(translation.getLocale()); + entity.setTranslation(locale, translation.getText()); + } + } + return result; + } + + public void updateTranslations(List<? extends TranslatableEntity> entities) throws TopiaException { + + TranslationDAO translationDAO = WaoDAOHelper.getTranslationDAO(transaction); + + int translationAdded = 0; + int translationUpdated = 0; + + for (TranslatableEntity entity : entities) { + Map<Locale, String> translations = entity.getTranslations(); + String id = entity.getTopiaId(); + + for (Map.Entry<Locale, String> translation : translations.entrySet()) { + Locale locale = translation.getKey(); + String value = translation.getValue(); + + Translation translationEntity = translationDAO.findByProperties( + Translation.PROPERTY_ID, id, + Translation.PROPERTY_LOCALE, locale.toString()); + // create or update + if (translationEntity == null) { + translationDAO.create(Translation.PROPERTY_ID, id, + Translation.PROPERTY_LOCALE, locale.toString(), + Translation.PROPERTY_TEXT, value); + translationAdded += 1; + } else { + if (log.isDebugEnabled()) { + log.debug("will change translation from '" + translationEntity.getText() + + "' to '" + value + "'"); + } + translationEntity.setText(value); + translationDAO.update(translationEntity); + translationUpdated += 1; + } + } + } + + if (log.isDebugEnabled()) { + log.debug(translationAdded + " translation added, " + + translationUpdated + " translations updated"); + } + } + +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceContactImpl.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -51,6 +51,7 @@ import fr.ifremer.wao.entity.Contact; import fr.ifremer.wao.entity.ContactDAO; import fr.ifremer.wao.entity.ContactImpl; +import fr.ifremer.wao.entity.ContactStateMotif; import fr.ifremer.wao.entity.ElligibleBoat; import fr.ifremer.wao.entity.ElligibleBoatDAO; import fr.ifremer.wao.entity.FishingZone; @@ -96,6 +97,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -191,13 +193,21 @@ Map<String, Contact> results = dao.findAllMappedByQuery(query); + List<ContactStateMotif> motives = new LinkedList<ContactStateMotif>(); + // force load for (Contact contact : results.values()) { contact.getMainObserver(); contact.sizeSecondaryObservers(); contact.getTerrestrialLocation(); + if (contact.getContactStateMotif() != null) { + motives.add(contact.getContactStateMotif()); + } } + EntitiesTranslator translator = new EntitiesTranslator(transaction); + translator.translateEntities(motives); + return results; } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceReferentialImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceReferentialImpl.java 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceReferentialImpl.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -400,7 +400,8 @@ ContactState substituteState = ContactState.getSubstituteForMotif(contactState); notTranslatedResult = contactStateMotifDAO.findAllByContactStateOrdinal(substituteState.ordinal()); } - List<ContactStateMotif> result = translateEntities(transaction, notTranslatedResult); + EntitiesTranslator translator = new EntitiesTranslator(transaction); + List<ContactStateMotif> result = translator.translateEntities(notTranslatedResult); if (log.isDebugEnabled()) { log.debug(result.size() + " motifs found for state " + contactState); @@ -419,7 +420,8 @@ contactStateMotifDAO.update(motif); } } - updateTranslations(transaction, motifs); + EntitiesTranslator translator = new EntitiesTranslator(transaction); + translator.updateTranslations(motifs); transaction.commitTransaction(); } @@ -455,7 +457,8 @@ motif.setTranslation(Locale.ENGLISH, "Other"); motifs.add(motif); - updateTranslations(transaction, motifs); + EntitiesTranslator translator = new EntitiesTranslator(transaction); + translator.updateTranslations(motifs); count = contactStateMotifDAO.count(); if (log.isDebugEnabled()) { @@ -467,67 +470,4 @@ } } } - - - /** For a given list of entities, make all known translations available - * in the entity. - * - * This method will look in database to find all translations for a given - * entity and push them in the object. - */ - protected <E extends TranslatableEntity> List<E> translateEntities(TopiaContext transaction, List<E> entities) throws TopiaException { - List<E> result = new ArrayList<E>(entities); - TranslationDAO translationDAO = WaoDAOHelper.getTranslationDAO(transaction); - for (TranslatableEntity entity : result) { - // find translations for this entity - List<Translation> translations = translationDAO.findAllById(entity.getTopiaId()); - for (Translation translation : translations) { - Locale locale = LocaleUtils.toLocale(translation.getLocale()); - entity.setTranslation(locale, translation.getText()); - } - } - return result; - } - - protected void updateTranslations(TopiaContext transaction, List<? extends TranslatableEntity> entities) throws TopiaException { - - TranslationDAO translationDAO = WaoDAOHelper.getTranslationDAO(transaction); - - int translationAdded = 0; - int translationUpdated = 0; - - for (TranslatableEntity entity : entities) { - Map<Locale, String> translations = entity.getTranslations(); - String id = entity.getTopiaId(); - - for (Map.Entry<Locale, String> translation : translations.entrySet()) { - Locale locale = translation.getKey(); - String value = translation.getValue(); - - Translation translationEntity = translationDAO.findByProperties( - Translation.PROPERTY_ID, id, - Translation.PROPERTY_LOCALE, locale.toString()); - // create or update - if (translationEntity == null) { - translationDAO.create(Translation.PROPERTY_ID, id, - Translation.PROPERTY_LOCALE, locale.toString(), - Translation.PROPERTY_TEXT, value); - translationAdded += 1; - } else { - if (log.isDebugEnabled()) { - log.debug("will change translation from '" + translationEntity.getText() + - "' to '" + value + "'"); - } - translationEntity.setText(value); - translationDAO.update(translationEntity); - translationUpdated += 1; - } - } - } - - if (log.isDebugEnabled()) { - log.debug(translationAdded + " translation added, " + - translationUpdated + " translations updated"); - } - } } Modified: trunk/wao-business/src/main/xmi/wao.zargo =================================================================== (Binary files differ) Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ContactForm.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ContactForm.java 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/ContactForm.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -348,7 +348,7 @@ private GenericSelectModel<ContactStateMotif> contactStateMotifSelectModel; - public SelectModel getContactStateMotifSelectModel() { + public GenericSelectModel<ContactStateMotif> getContactStateMotifSelectModel() { if (contactStateMotifSelectModel == null) { List<ContactStateMotif> motifs = serviceReferential.getAllContactStateMotifs(contact.getContactState()); if (motifs.size() != 0) { @@ -413,6 +413,12 @@ contact.setTerrestrialLocation(terrestrialLocation); } + if (StringUtils.isEmpty(contactStateMotifId)) { + contact.setContactStateMotif(null); + } else { + contact.setContactStateMotif(getContactStateMotifSelectModel().findObject(contactStateMotifId)); + } + ValidationResult validationResult = serviceContact.validateContact(contact); if ( ! validationResult.isSuccess()) { contactForm.recordError(validationResult.getMessage()); Modified: trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java =================================================================== --- trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-ui/src/main/java/fr/ifremer/wao/ui/pages/Contacts.java 2011-02-11 17:50:49 UTC (rev 1005) @@ -34,6 +34,7 @@ import fr.ifremer.wao.bean.UserRole; import fr.ifremer.wao.bean.ValidationResult; import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.entity.ContactStateMotif; import fr.ifremer.wao.entity.TerrestrialLocation; import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.io.ImportResults; @@ -51,6 +52,7 @@ import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.ComponentResources; +import org.apache.tapestry5.SelectModel; import org.apache.tapestry5.StreamResponse; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Import; @@ -60,6 +62,7 @@ import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.beaneditor.BeanModel; +import org.apache.tapestry5.corelib.components.Form; import org.apache.tapestry5.corelib.components.Zone; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; @@ -209,6 +212,9 @@ @Log Object onSuccessFromFiltersForm() throws WaoException { + if (StringUtils.isNotEmpty(contactStateMotifId)) { + getContactFilter().setContactStateMotif(getContactStateMotifSelectModel().findObject(contactStateMotifId)); + } if (isEdited()) { return filtersZone.getBody(); } @@ -254,6 +260,33 @@ return terrestrialLocationSelectModel; } + @Property + @Persist + private String contactStateMotifId; + + private GenericSelectModel<ContactStateMotif> contactStateMotifSelectModel; + + public GenericSelectModel<ContactStateMotif> getContactStateMotifSelectModel() { + if (contactStateMotifSelectModel == null) { + if (contactFilter.getState() != null) { + List<ContactStateMotif> motifs = serviceReferential.getAllContactStateMotifs(contactFilter.getState()); + if (motifs.size() != 0) { + contactStateMotifSelectModel = new GenericSelectModel<ContactStateMotif>( + motifs, ContactStateMotif.class, "translation", ContactStateMotif.TOPIA_ID, propertyAccess); + } + } + } + return contactStateMotifSelectModel; + } + + public Zone onValueChangedFromState(ContactState contactState) { + contactFilter.setState(contactState); + // refresh + contactStateMotifSelectModel = null; + contactStateMotifId = null; + return filtersZone; + } + /**************************** CONTACT IMPORT/EXPORT ***********************/ @Property Modified: trunk/wao-ui/src/main/webapp/Contacts.tml =================================================================== --- trunk/wao-ui/src/main/webapp/Contacts.tml 2011-02-11 15:13:05 UTC (rev 1004) +++ trunk/wao-ui/src/main/webapp/Contacts.tml 2011-02-11 17:50:49 UTC (rev 1005) @@ -74,7 +74,13 @@ <label for="fromDate">${message:wao.ui.misc.since} :</label> <input t:type="datefield" class="width70" t:id="fromDate" value="contactFilter.fromDate" /> <label for="state">${message:wao.ui.field.Contact.contactState} :</label> - <select t:type="select" t:id="state" value="contactFilter.state"/> + <select t:type="select" t:id="state" value="contactFilter.state" t:zone="so-contacts-filters" /> + <t:if test="contactStateMotifSelectModel"> + <input t:type="select" + t:id="stateMotif" + t:value="contactStateMotifId" + t:model="contactStateMotifSelectModel" /> + </t:if> <t:if t:test="user.admin"> <label for="company">${message:wao.ui.entity.Company} :</label> <input t:type="select" t:id="company" t:model="companySelectModel" value="companyId"/> @@ -263,7 +269,14 @@ </span> </p:boatCell> <p:stateCell> - ${getLabelForEnum(contact.contactState)} + <t:if test="contact.contactStateMotif"> + <span t:type="ck/Tooltip" title="${message:wao.ui.field.Contact.contactStateMotif}" t:value="${contact.contactStateMotif}" t:effect="appear"> + ${getLabelForEnum(contact.contactState)} + </span> + <p:else> + ${getLabelForEnum(contact.contactState)} + </p:else> + </t:if> </p:stateCell> <p:observationBeginDateCell> <t:output value="contact.observationBeginDate" format="dateTimeFormat" />