Author: echatellier Date: 2014-05-30 18:32:40 +0200 (Fri, 30 May 2014) New Revision: 115 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/115 Log: refs #4662: Begin ldap job to update database Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapUser.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/AbstractFaxToMailJob.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/LdapJob.java Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-05-30 16:32:40 UTC (rev 115) @@ -24,27 +24,27 @@ * #L% */ -import java.util.ArrayList; -import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import com.franciaflex.faxtomail.persistence.entities.Configuration; import com.franciaflex.faxtomail.persistence.entities.ConfigurationImpl; import com.franciaflex.faxtomail.persistence.entities.ConfigurationTopiaDao; import com.franciaflex.faxtomail.persistence.entities.EmailAccount; +import com.franciaflex.faxtomail.persistence.entities.EmailAccountImpl; import com.franciaflex.faxtomail.persistence.entities.EmailAccountTopiaDao; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFilterTopiaDao; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; -import com.unboundid.ldap.sdk.LDAPConnection; -import com.unboundid.ldap.sdk.LDAPException; -import com.unboundid.ldap.sdk.SearchResult; -import com.unboundid.ldap.sdk.SearchResultEntry; -import com.unboundid.ldap.sdk.SearchScope; +import com.google.common.collect.Maps; /** * @author kmorin <kmorin@codelutin.com> @@ -138,45 +138,35 @@ /** * - * @param emailAccounts + * @param newEmailAccounts new email account list to save */ - public void saveEmailAccounts(List<EmailAccount> emailAccounts) { - - } + public void saveEmailAccounts(List<EmailAccount> newEmailAccounts) { + List<EmailAccount> emailAccounts = getEmailAccounts(); + Map<String, EmailAccount> emailAccountMap = new HashMap<>(Maps.uniqueIndex(emailAccounts, TopiaEntities.getTopiaIdFunction())); + Binder<EmailAccount, EmailAccount> binder = BinderFactory.newBinder(EmailAccount.class); + EmailAccountTopiaDao emailAccountTopiaDao = getPersistenceContext().getEmailAccountDao(); - /** - * Get ldap connection. - * - * @return - * @throws LDAPException - */ - protected LDAPConnection getLDAPConnection() throws LDAPException { - // host, port, username and password - return new LDAPConnection(getApplicationConfig().getLdapHost(), - getApplicationConfig().getLdapPort(), - getApplicationConfig().getLdapUser(), - getApplicationConfig().getLdapPassword()); - } - - public List<String> getAllGroups() throws LDAPException { - List<String> results = new ArrayList<>(); - - if (StringUtils.isNotBlank(getApplicationConfig().getLdapHost())) { - // ldapsearch -h ldap.codelutin.home -b "ou=Group,DC=codelutin,DC=home" "objectClass=posixGroup" - String baseDN = "ou=Group,DC=codelutin,DC=home"; - String filter = "(objectClass=posixGroup)"; - - LDAPConnection connection = getLDAPConnection(); - if (connection.isConnected()) { - SearchResult searchResult = connection.search(baseDN, SearchScope.ONE, filter); - - List<SearchResultEntry> searchEntries = searchResult.getSearchEntries(); - for (SearchResultEntry searchEntry : searchEntries) { - results.add(searchEntry.getAttributeValue("cn")); - } + for (EmailAccount newEmailAccount : newEmailAccounts) { + EmailAccount emailAccount; + if (StringUtils.isNotBlank(newEmailAccount.getTopiaId())) { + emailAccount = emailAccountMap.remove(newEmailAccount.getTopiaId()); + } else { + emailAccount = new EmailAccountImpl(); } + + binder.copyExcluding(newEmailAccount, emailAccount, + EmailAccount.PROPERTY_TOPIA_ID, + EmailAccount.PROPERTY_TOPIA_CREATE_DATE, + EmailAccount.PROPERTY_TOPIA_VERSION); + + if (emailAccount.isPersisted()) { + emailAccountTopiaDao.update(emailAccount); + } else { + emailAccountTopiaDao.create(emailAccount); + } } - - return results; + + emailAccountTopiaDao.deleteAll(emailAccountMap.values()); + getPersistenceContext().commit(); } } Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java 2014-05-30 16:32:40 UTC (rev 115) @@ -0,0 +1,89 @@ +package com.franciaflex.faxtomail.services.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; +import com.franciaflex.faxtomail.services.service.ldap.LdapUser; +import com.unboundid.ldap.sdk.LDAPConnection; +import com.unboundid.ldap.sdk.LDAPException; +import com.unboundid.ldap.sdk.SearchResult; +import com.unboundid.ldap.sdk.SearchResultEntry; +import com.unboundid.ldap.sdk.SearchScope; + +public class LdapService extends FaxToMailServiceSupport { + + private static final Log log = LogFactory.getLog(LdapService.class); + + /** + * Get ldap connection. + * + * @return + * @throws LDAPException + */ + protected LDAPConnection getLDAPConnection() throws LDAPException { + // host, port, username and password + return new LDAPConnection(getApplicationConfig().getLdapHost(), + getApplicationConfig().getLdapPort(), + getApplicationConfig().getLdapUser(), + getApplicationConfig().getLdapPassword()); + } + + /** + * Get all user from ldap. + * + * @return ldap users with group infos + * @throws LDAPException + */ + protected Collection<LdapUser> getAllLdapUsers() throws LDAPException { + Collection<LdapUser> results = new ArrayList<>(); + + // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=posixGroup" + // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=account" + String baseDN = "ou=People,DC=codelutin,DC=home"; + String filter = "(objectClass=account)"; + + LDAPConnection connection = null; + try { + connection = getLDAPConnection(); + if (connection.isConnected()) { + SearchResult searchResult = connection.search(baseDN, SearchScope.ONE, filter); + + List<SearchResultEntry> searchEntries = searchResult.getSearchEntries(); + for (SearchResultEntry searchEntry : searchEntries) { + LdapUser user = new LdapUser(); + user.setLogin(searchEntry.getAttributeValue("uid")); + user.setLogin(searchEntry.getAttributeValue("uid")); + user.setLogin(searchEntry.getAttributeValue("uid")); + + results.add(user); + } + } + } finally { + if (connection != null) { + connection.close(); + } + } + + + return results; + } + + /** + * Recupere les utilisateurs/groupes du ldap et met à jour la base locale. + */ + public void updateLdapData() { + if (StringUtils.isBlank(getApplicationConfig().getLdapHost())) { + if (log.isDebugEnabled()) { + log.debug("Ldap service not configured !"); + } + } + + + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapUser.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapUser.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapUser.java 2014-05-30 16:32:40 UTC (rev 115) @@ -0,0 +1,23 @@ +package com.franciaflex.faxtomail.services.service.ldap; + +import java.util.ArrayList; +import java.util.Collection; + +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserImpl; + +public class LdapUser extends FaxToMailUserImpl { + + protected Collection<String> groups = new ArrayList<>(); + + public Collection<String> getGroups() { + return groups; + } + + public void setGroups(Collection<String> groups) { + this.groups = groups; + } + + public void addGroup(String group) { + this.groups.add(group); + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapUser.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java 2014-05-30 16:32:40 UTC (rev 115) @@ -88,11 +88,17 @@ .withIdentity("faxToMailJobs", "ediManagementJob") .build(); + JobDetail ldapJob = JobBuilder.newJob(EDIManagementJob.class) + .usingJobData(data) + .withIdentity("faxToMailJobs", "ldapJob") + .build(); + try { + + // schedule mail job (toutes les 20 minutes) Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("mailFiltering", "mailFilteringTrigger") -// .withSchedule(CronScheduleBuilder.cronSchedule("* 0/1 * * * ?")) .withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ?")) .build(); @@ -100,6 +106,7 @@ scheduler.start(); scheduler.scheduleJob(mailFilteringJob, trigger); + // schedule EDI job (toutes les 5 heures)s trigger = TriggerBuilder .newTrigger() .withIdentity("ediManagement", "ediManagementTrigger") @@ -110,6 +117,17 @@ scheduler.start(); scheduler.scheduleJob(ediManagementJob, trigger); + // schedule ldap job (toutes les heures à 0 minute) + trigger = TriggerBuilder + .newTrigger() + .withIdentity("ldapManagement", "ldapManagementTrigger") + .withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")) + .build(); + + scheduler = new StdSchedulerFactory().getScheduler(); + scheduler.start(); + scheduler.scheduleJob(ldapJob, trigger); + log.debug("schedulers launched"); } catch (SchedulerException e) { Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-05-30 16:32:40 UTC (rev 115) @@ -25,6 +25,7 @@ */ import java.lang.reflect.Type; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -83,7 +84,7 @@ public String input() throws Exception { etatAttentes = referentielService.getAllEtatAttente(); mailFolders = mailFolderService.getRootMailFolders(); - groupNames = configurationService.getAllGroups(); + groupNames = Collections.emptyList(); //FIXME: configurationService.getAllGroups(); emailAccounts = configurationService.getEmailAccounts(); mailFilters = configurationService.getMailFilters(); return INPUT; @@ -99,6 +100,7 @@ referentielService.saveEtatAttente(etatAttentes); mailFolderService.saveMailFolders(mailFolders); configurationService.saveMailFilters(mailFilters); + configurationService.saveEmailAccounts(emailAccounts); return result; } Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java 2014-05-30 16:32:40 UTC (rev 115) @@ -27,6 +27,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.util.Collections; import java.util.List; import org.apache.commons.logging.Log; @@ -63,7 +64,7 @@ @org.apache.struts2.convention.annotation.Action("user-folder-input") public String input() throws Exception { mailFolders = mailFolderService.getAllMailFolders(); - groupNames = configurationService.getAllGroups(); + groupNames = Collections.emptyList(); //FIXME: configurationService.getAllGroups(); return INPUT; } Added: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/AbstractFaxToMailJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/AbstractFaxToMailJob.java (rev 0) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/AbstractFaxToMailJob.java 2014-05-30 16:32:40 UTC (rev 115) @@ -0,0 +1,16 @@ +package com.franciaflex.faxtomail.web.job; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; + +import com.franciaflex.faxtomail.services.FaxToMailServiceContext; + +public abstract class AbstractFaxToMailJob implements Job { + + public static final String SERVICE_CONTEXT = "serviceContext"; + + protected FaxToMailServiceContext getServiceContext(JobExecutionContext jobExecutionContext) { + FaxToMailServiceContext serviceContext = (FaxToMailServiceContext) jobExecutionContext.getMergedJobDataMap().get(SERVICE_CONTEXT); + return serviceContext; + } +} Property changes on: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/AbstractFaxToMailJob.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java 2014-05-30 16:32:40 UTC (rev 115) @@ -36,17 +36,15 @@ * @author Kevin Morin (Code Lutin) * @since x.x */ -public class EDIManagementJob implements Job { +public class EDIManagementJob extends AbstractFaxToMailJob { private static final Log log = LogFactory.getLog(EDIManagementJob.class); - public static final String SERVICE_CONTEXT = "serviceContext"; - protected FaxToMailServiceContext serviceContext; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - serviceContext = (FaxToMailServiceContext) jobExecutionContext.getMergedJobDataMap().get(SERVICE_CONTEXT); + serviceContext = getServiceContext(jobExecutionContext); EmailService emailService = serviceContext.newService(EmailService.class); emailService.transmitPendingDemandsToEdi(); Added: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/LdapJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/LdapJob.java (rev 0) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/LdapJob.java 2014-05-30 16:32:40 UTC (rev 115) @@ -0,0 +1,28 @@ +package com.franciaflex.faxtomail.web.job; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import com.franciaflex.faxtomail.services.FaxToMailServiceContext; +import com.franciaflex.faxtomail.services.service.LdapService; + +/** + * Ce job interroge périodiquement l'annuaire ldap pour mettre à jour la liste + * des comptes et des utilisateurs directement dans la base de données faxtomail. + * + * @author Eric Chatellier + */ +public class LdapJob extends AbstractFaxToMailJob { + + protected FaxToMailServiceContext serviceContext; + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + serviceContext = getServiceContext(jobExecutionContext); + + LdapService ldapService = serviceContext.newService(LdapService.class); + ldapService.updateLdapData(); + + } + +} Property changes on: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/LdapJob.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-05-30 16:32:40 UTC (rev 115) @@ -61,7 +61,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -83,18 +82,16 @@ * @author Kevin Morin (Code Lutin) * @since x.x */ -public class MailFilterJob implements Job { +public class MailFilterJob extends AbstractFaxToMailJob { private static final Log log = LogFactory.getLog(MailFilterJob.class); - public static final String SERVICE_CONTEXT = "serviceContext"; - protected FaxToMailServiceContext serviceContext; //TODO kmorin 20140414 handle imap protocol @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { - serviceContext = (FaxToMailServiceContext) jobExecutionContext.getMergedJobDataMap().get(SERVICE_CONTEXT); + serviceContext = getServiceContext(jobExecutionContext); ConfigurationService configurationService = serviceContext.newService(ConfigurationService.class); Collection<EmailAccount> emailAccounts = configurationService.getEmailAccounts(); Modified: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-05-30 15:20:22 UTC (rev 114) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/configuration-input.jsp 2014-05-30 16:32:40 UTC (rev 115) @@ -464,6 +464,8 @@ </div> <div id="tabs-mailaccounts" class="tab-pane" ng-controller="ConfigurationEmailAccountsController"> + <input type="hidden" name="emailAccountsJson" value="{{emailAccounts}}" /> + <table id='table-snapshot' class="table table-bordered"> <thead> <tr>