Author: kmorin Date: 2014-08-07 17:54:09 +0200 (Thu, 07 Aug 2014) New Revision: 493 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/493 Log: integration des fetchs Added: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailFolderImpl.java trunk/faxtomail-service/src/main/resources/db/migration/V1_0_0_492__add_emailGroup_emails_idx.sql Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ShowDemandeAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/transmit/MailFolderChooserUIHandler.java Added: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailFolderImpl.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailFolderImpl.java (rev 0) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/MailFolderImpl.java 2014-08-07 15:54:09 UTC (rev 493) @@ -0,0 +1,32 @@ +package com.franciaflex.faxtomail.persistence.entities; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class MailFolderImpl extends MailFolderAbstract { + + protected Boolean folderReadable; + protected Boolean folderWritable; + + @Override + public Boolean isFolderReadable() { + return folderReadable; + } + + @Override + public void setFolderReadable(Boolean folderReadable) { + this.folderReadable = folderReadable; + } + + @Override + public Boolean isFolderWritable() { + return folderWritable; + } + + @Override + public void setFolderWritable(Boolean folderWritable) { + this.folderWritable = folderWritable; + } + +} Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties =================================================================== --- trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-08-07 15:41:29 UTC (rev 492) +++ trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-08-07 15:54:09 UTC (rev 493) @@ -37,6 +37,7 @@ # DemandType com.franciaflex.faxtomail.persistence.entities.DemandType.attribute.label.tagvalue.naturalId=true +com.franciaflex.faxtomail.persistence.entities.DemandType.attribute.fields.tagvalue.unique=true # Client com.franciaflex.faxtomail.persistence.entities.Client.attribute.brand.tagvalue.naturalId=true @@ -47,7 +48,7 @@ com.franciaflex.faxtomail.persistence.entities.NewClient.attribute.brand.tagvalue.notNull=true com.franciaflex.faxtomail.persistence.entities.NewClient.attribute.type.tagvalue.notNull=true -#\u00a0EdiReturn +# EdiReturn com.franciaflex.faxtomail.persistence.entities.EdiReturn.attribute.rangeRowTopiaId.tagvalue.notNull=true # EmailAccount @@ -87,8 +88,8 @@ # History com.franciaflex.faxtomail.persistence.entities.History.attribute.type.tagvalue.notNull=true +com.franciaflex.faxtomail.persistence.entities.History.attribute.fields.tagvalue.unique=true - # FaxToMailUser com.franciaflex.faxtomail.persistence.entities.FaxToMailUser.attribute.login.tagvalue.naturalId=true Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-07 15:41:29 UTC (rev 492) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-07 15:54:09 UTC (rev 493) @@ -492,13 +492,13 @@ result = dao.forMailFolderEquals(folder) .addNull(Email.PROPERTY_ARCHIVE_DATE) .addNotEquals(Email.PROPERTY_DEMAND_STATUS, DemandStatus.ARCHIVED) - .addAllFetches(Email.PROPERTY_DEMAND_TYPE, - Email.PROPERTY_DEMAND_STATUS, + .addAllFetches( + Email.PROPERTY_DEMAND_TYPE, +// Email.PROPERTY_DEMAND_TYPE + "." + DemandType.PROPERTY_FIELDS, Email.PROPERTY_RANGE_ROW, Email.PROPERTY_RANGE_ROW + "." + RangeRow.PROPERTY_RANGE, Email.PROPERTY_HISTORY, Email.PROPERTY_HISTORY + "." + History.PROPERTY_FAX_TO_MAIL_USER, - Email.PROPERTY_HISTORY + "." + History.PROPERTY_TYPE, Email.PROPERTY_HISTORY + "." + History.PROPERTY_FIELDS, Email.PROPERTY_REPLIES, Email.PROPERTY_ATTACHMENT, @@ -507,13 +507,16 @@ Email.PROPERTY_EMAIL_GROUP, Email.PROPERTY_EMAIL_GROUP + "." + EmailGroup.PROPERTY_EMAIL, Email.PROPERTY_ETAT_ATTENTE, - Email.PROPERTY_PRIORITY) + Email.PROPERTY_PRIORITY + ) .findPage(page); -// //FIXME kmorin 20140805 fetch -// for (Email email : result.getElements()) { -// fetchEmailData(email); -// } + // fetch fields manually to avoid a multiple bags exception in the previous query + for (Email email : result.getElements()) { + if (email.getDemandType() != null) { + Hibernate.initialize(email.getDemandType().getFields()); + } + } } else { List<Email> elements = Collections.emptyList(); result = PaginationResult.of(elements, 0, page); Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java 2014-08-07 15:41:29 UTC (rev 492) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderServiceImpl.java 2014-08-07 15:54:09 UTC (rev 493) @@ -30,14 +30,17 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import com.franciaflex.faxtomail.persistence.entities.DemandType; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.MailField; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.Hibernate; import org.nuiton.util.pagination.PaginationParameter; import com.franciaflex.faxtomail.persistence.entities.EmailTopiaDao; @@ -107,44 +110,57 @@ MailFolderTopiaDao dao = getPersistenceContext().getMailFolderDao(); List<MailFolder> result = new ArrayList<>(dao.getReadableFolders(user)); for (MailFolder f : result) { - findReadableFolders(f); + findReadableFolders(f, user, false); + + while (f.getParent() != null) { + f = f.getParent(); + + Hibernate.initialize(f); + f.setFolderReadable(false); + f.setFolderWritable(false); + + fetchFolderAttributes(f); + } } return result; } - protected void findReadableFolders(MailFolder folder) { - folder.sizeFolderTableColumns(); - //TODO kmorin 20140806 put rights for user in impl - folder.sizeWriteRightGroups(); - folder.sizeWriteRightUsers(); - folder.sizeRanges(); - folder.sizeReplyAddresses(); - folder.sizeReplyDomains(); + protected void findReadableFolders(MailFolder folder, FaxToMailUser user, boolean writable) { + folder.setFolderReadable(true); - if (folder.sizeEtatAttentes() > 0) { - for (EtatAttente etatAttente : folder.getEtatAttentes()) { - etatAttente.sizeInvalidFormDisabledActions(); - etatAttente.sizeValidFormDisabledActions(); - } + if (!writable && folder.sizeWriteRightGroups() > 0) { + writable = CollectionUtils.containsAny(folder.getWriteRightGroups(), user.getUserGroups()); } - - if (folder.sizeDemandTypes() > 0) { - for (DemandType demandType : folder.getDemandTypes()) { - if (demandType.sizeFields() > 0) { - for (MailField mailField : demandType.getFields()) { - mailField.toString(); - } - } - } + if (!writable && folder.sizeWriteRightUsers() > 0) { + writable = folder.containsWriteRightUsers(user); } + folder.setFolderWritable(writable); + fetchFolderAttributes(folder); + if (folder.isChildrenNotEmpty()) { for (MailFolder child : folder.getChildren()) { - findReadableFolders(child); + findReadableFolders(child, user, writable); } } } + protected void fetchFolderAttributes(MailFolder folder) { + Hibernate.initialize(folder.getFolderTableColumns()); + Hibernate.initialize(folder.getRanges()); + Hibernate.initialize(folder.getReplyAddresses()); + Hibernate.initialize(folder.getReplyDomains()); + + if (folder.sizeEtatAttentes() > 0) { + for (EtatAttente etatAttente : folder.getEtatAttentes()) { + Hibernate.initialize(etatAttente.getInvalidFormDisabledActions()); + Hibernate.initialize(etatAttente.getValidFormDisabledActions()); + } + } + + Hibernate.initialize(folder.getDemandTypes()); + } + @Override public List<MailFolder> getRootMailFoldersWithMoveRights(FaxToMailUser user) { List<MailFolder> rootFolders = getRootMailFolders(); Added: trunk/faxtomail-service/src/main/resources/db/migration/V1_0_0_492__add_emailGroup_emails_idx.sql =================================================================== --- trunk/faxtomail-service/src/main/resources/db/migration/V1_0_0_492__add_emailGroup_emails_idx.sql (rev 0) +++ trunk/faxtomail-service/src/main/resources/db/migration/V1_0_0_492__add_emailGroup_emails_idx.sql 2014-08-07 15:54:09 UTC (rev 493) @@ -0,0 +1,6 @@ +ALTER TABLE email ADD COLUMN emailgroup_idx ${indexType}; + +UPDATE email SET emailgroup_idx = ( + SELECT COUNT(topiaid) FROM email sub + WHERE sub.email = emailgroup.email AND (sub.topiacreatedate || sub.topiaid) < (emailgroup.topiacreatedate || emailgroup.topiaid) +); \ No newline at end of file Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ShowDemandeAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ShowDemandeAction.java 2014-08-07 15:41:29 UTC (rev 492) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ShowDemandeAction.java 2014-08-07 15:54:09 UTC (rev 493) @@ -100,16 +100,9 @@ FaxToMailUser currentUser = getContext().getCurrentUser(); MailFolder folder = currentEmail.getMailFolder(); - boolean canWrite = false; - while (!canWrite && folder != null) { - canWrite = folder.containsWriteRightUsers(currentUser) - || !CollectionUtils.intersection(folder.getWriteRightGroups(), - currentUser.getUserGroups()).isEmpty(); - folder = folder.getParent(); - } - - if (currentEmail.getArchiveDate() != null || !canWrite) { + if (currentEmail.getArchiveDate() != null || !Boolean.TRUE.equals(folder.isFolderWritable())) { currentEmail.setEditable(false); + } else if (takenBy != null && !currentUser.equals(takenBy)) { String htmlMessage = String.format( AbstractApplicationUIHandler.CONFIRMATION_FORMAT, Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/transmit/MailFolderChooserUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/transmit/MailFolderChooserUIHandler.java 2014-08-07 15:41:29 UTC (rev 492) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/transmit/MailFolderChooserUIHandler.java 2014-08-07 15:54:09 UTC (rev 493) @@ -70,7 +70,7 @@ // init tree Collection<MailFolder> folders = serviceContext.getMailFolderService(). - getRootMailFoldersWithMoveRights(getContext().getCurrentUser()); + getRootMailFoldersWithMoveRights(getContext().getCurrentUser()); JTree navigationTree = ui.getNavigationTree(); Map<MailFolder, FolderTreeNode> nodesByFolder =