Index: src/main/java/br/com/prognus/psync/items/dao/PIMContactDAO.java =================================================================== --- src/main/java/br/com/prognus/psync/items/dao/PIMContactDAO.java (revisão 1951) +++ src/main/java/br/com/prognus/psync/items/dao/PIMContactDAO.java (cópia de trabalho) @@ -27,7 +27,9 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import br.com.prognus.psync.exception.PIMDBAccessException; import br.com.prognus.psync.items.model.ContactWrapper; @@ -35,7 +37,6 @@ import br.com.prognus.psync.util.Def; import br.com.prognus.psync.util.TypeAddress; -import com.funambol.common.pim.common.Property; import com.funambol.common.pim.contact.Address; import com.funambol.common.pim.contact.BusinessDetail; import com.funambol.common.pim.contact.Contact; @@ -62,7 +63,7 @@ private static final String SQL_GET_CONTACT_BY_ID_USER = "SELECT id_contact, id_owner, last_update, last_status, given_names, family_names, birthdate, category, photo, notes, alias FROM phpgw_cc_contact WHERE id_contact = ? AND id_owner = ? LIMIT 1"; - private static final String SQL_GET_CONTACT_ITEM_BY_ID = "SELECT connection_name, connection_value, id_typeof_contact_connection FROM phpgw_cc_connections AS CO LEFT JOIN phpgw_cc_contact_conns AS CC ON CO.id_connection = CC.id_connection WHERE id_contact = ?"; + private static final String SQL_GET_CONTACT_ITEM_BY_ID = "SELECT connection_is_default, connection_name, connection_value, id_typeof_contact_connection FROM phpgw_cc_connections AS CO LEFT JOIN phpgw_cc_contact_conns AS CC ON CO.id_connection = CC.id_connection WHERE id_contact = ?"; private static final String SQL_GET_STATUS_BY_ID_USER_TIME = "SELECT last_status FROM phpgw_cc_contact WHERE id_contact = ? AND id_owner = ? AND last_update > ? LIMIT 1 "; @@ -88,6 +89,8 @@ private static final String SQL_ID_MAX_CONNECTIONS = "select max(id_connection) from phpgw_cc_connections"; private static final String SQL_INSERT_INTO_FNBL_CONNECTIONS = "INSERT INTO phpgw_cc_contact_conns (id_contact, id_connection, id_typeof_contact_connection) VALUES (?, ?, ?)"; + + private static final String SQL_UPDATE_INTO_FNBL_CONNECTIONS = "UPDATE phpgw_cc_connections SET connection_is_default = ? where id_connection = ?"; private static final String SQL_UPDATE_FNBL_PIM_CONTACT_BEGIN = "UPDATE phpgw_cc_contact SET "; @@ -211,6 +214,8 @@ protected static final String SQL_FIELD_STATE_ID = "id_state"; protected static final String SQL_FIELD_CITY_ID = "id_city"; + + protected static final String SQL_FIELD_CON_IS_DEFAULT = "connection_is_default"; private Sync4jPrincipal principal = null; @@ -432,74 +437,8 @@ } // phones - if (!phones.isEmpty()) { + id_connection = insetPhones(phones, con, id_connection, id_contact); - Boolean type_phone = true; - - for (int i = 0, l = phones.size(); i < l; i++) { - - phone = phones.get(i); - phoneType = phone.getPhoneType(); - - if ((FIELD_PRIMARY_TELEPHONE_NUMBER).equals(phoneType)) { - type = TYPE_PRIMARY_TELEPHONE_NUMBER; - } else if ((FIELD_HOME_TELEPHONE_NUMBER).equals(phoneType)) { - type = TYPE_HOME_TELEPHONE_NUMBER; - } else if ((FIELD_MOBILE_TELEPHONE_NUMBER) - .equals(phoneType)) { - type = TYPE_MOBILE_TELEPHONE_NUMBER; - } else if ((FIELD_BUSINESS_TELEPHONE_NUMBER) - .equals(phoneType)) { - type = TYPE_BUSINESS_TELEPHONE_NUMBER; - } else if ((FIELD_BUSINESS_FAX_NUMBER).equals(phoneType)) { - type = TYPE_BUSINESS_FAX_NUMBER; - } else if ((FIELD_PAGER_NUMBER).equals(phoneType)) { - type = TYPE_PAGER_NUMBER; - } else { - continue; // Unknown property: saves nothing - } - - String phoneValue = phone.getPropertyValueAsString(); - - if (phoneValue != null && phoneValue.length() != 0) { - - if (phoneValue.length() > SQL_PHONE_DIM) { - phoneValue = phoneValue.substring(0, SQL_PHONE_DIM); - } - - ps = con.prepareStatement(SQL_ID_MAX_CONNECTIONS); - rs = ps.executeQuery(); - - if (rs.next()) { - long id = rs.getInt(1); - id_connection = (id == 0) ? 1 : ++id; - } - - // Insere os telefones do contato na tabela - // phpgw_cc_connections - ps = con.prepareStatement(SQL_INSERT_INTO_CONTACT_ITEM); - ps.setLong(1, id_connection); - ps.setString(2, type); - ps.setString(3, phoneValue); - ps.setBoolean(4, type_phone); - ps.executeUpdate(); - - type_phone = false; // os demais telefones serao setados - // como nao padrao - - // Insere as referencias de telefones do contato na - // tabela phpgw_cc_connections - ps = con - .prepareStatement(SQL_INSERT_INTO_FNBL_CONNECTIONS); - ps.setLong(1, id_contact); - ps.setLong(2, id_connection); - ps.setLong(3, 2); - ps.executeUpdate(); - } - - } - } - con.commit(); con.setAutoCommit(true); @@ -539,7 +478,6 @@ BusinessDetail businessDetail = null; Name name = null; - Phone phone = null; Email email = null; String type = null; @@ -768,72 +706,9 @@ ps.setLong(1, id_contact); ps.executeUpdate(); - if (!phones.isEmpty()) { + + id_connection = insetPhones(phones, con, id_connection, id_contact); - boolean type_fone = true; // Seta o primeiro telefone como - // principal no expresso - - for (int i = 0, l = phones.size(); i < l; i++) { - - phone = phones.get(i); - phoneType = phone.getPhoneType(); - - if ((FIELD_PRIMARY_TELEPHONE_NUMBER).equals(phoneType)) { - type = TYPE_PRIMARY_TELEPHONE_NUMBER; - } else if ((FIELD_HOME_TELEPHONE_NUMBER).equals(phoneType)) { - type = TYPE_HOME_TELEPHONE_NUMBER; - } else if ((FIELD_MOBILE_TELEPHONE_NUMBER) - .equals(phoneType)) { - type = TYPE_MOBILE_TELEPHONE_NUMBER; - } else if ((FIELD_BUSINESS_TELEPHONE_NUMBER) - .equals(phoneType)) { - type = TYPE_BUSINESS_TELEPHONE_NUMBER; - } else if ((FIELD_BUSINESS_FAX_NUMBER).equals(phoneType)) { - type = TYPE_BUSINESS_FAX_NUMBER; - } else if ((FIELD_PAGER_NUMBER).equals(phoneType)) { - type = TYPE_PAGER_NUMBER; - } else { - continue; // Unknown property: saves nothing - } - - String phoneValue = phone.getPropertyValueAsString(); - phoneValue = truncate(phoneValue, SQL_EMAIL_DIM); - - if (phoneValue != null && phoneValue.length() != 0) { - - // Verifica o id maximo da tabela phpgw_cc_connections - ps = con.prepareStatement(SQL_ID_MAX_CONNECTIONS); - rs = ps.executeQuery(); - - if (rs.next()) { - long id = rs.getInt(1); - id_connection = (id == 0) ? 1 : ++id; - } - - // Insere os telefones do contato na tabela - // phpgw_cc_connections - ps = con.prepareStatement(SQL_INSERT_INTO_CONTACT_ITEM); - ps.setLong(1, id_connection); - ps.setString(2, type); - ps.setString(3, phoneValue); - ps.setBoolean(4, type_fone); - ps.executeUpdate(); - - type_fone = false; // os demais telefones serao setados - // como nao padrao - - // Insere as referencias de telefones do contato na - // tabela phpgw_cc_connections - ps = con - .prepareStatement(SQL_INSERT_INTO_FNBL_CONNECTIONS); - ps.setLong(1, id_contact); - ps.setLong(2, id_connection); - ps.setLong(3, 2); - ps.executeUpdate(); - } - } - } - // endereco boolean syncAddress = true; @@ -856,7 +731,7 @@ Address address = null; boolean defaultAddress = false; - // se ambos sao nulos não faz nada aqui + // se ambos sao nulos n�o faz nada aqui if (persoAddress == null && businAddress == null) { break; } @@ -934,6 +809,82 @@ } + private Long insetPhones(List phones, Connection con, Long id_connection, Long id_contact) throws Exception { + Phone phone = null; + + PreparedStatement ps = null; + ResultSet rs = null; + + if (!phones.isEmpty()) { + + Phone defaultPhone = null; + + for (int i = 0, l = phones.size(); i < l; i++) { + + phone = phones.get(i); + // from "Home2TelephoneNumber" to "Telefone Residencial" + String type = getNameofPhone(phone.getPhoneType()); + + String phoneValue = phone.getPropertyValueAsString(); + phoneValue = truncate(phoneValue, SQL_EMAIL_DIM); + + if(type.equals("PrimaryTelephoneNumber")) { + defaultPhone = new Phone(); + defaultPhone.setPropertyType(phone.getPropertyType()); + defaultPhone.setPropertyValue(phone.getPropertyValue()); + continue; // o default sera setado no final do for + } + + if (phoneValue != null && phoneValue.length() != 0) { + + // Verifica o id maximo da tabela phpgw_cc_connections + ps = con.prepareStatement(SQL_ID_MAX_CONNECTIONS); + rs = ps.executeQuery(); + + if (rs.next()) { + long id = rs.getInt(1); + id_connection = (id == 0) ? 1 : ++id; + } + + // Insere os telefones do contato na tabela + // phpgw_cc_connections + ps = con.prepareStatement(SQL_INSERT_INTO_CONTACT_ITEM); + ps.setLong(1, id_connection); + ps.setString(2, type); + ps.setString(3, phoneValue); + ps.setBoolean(4, false); + ps.executeUpdate(); + + // Insere as referencias de telefones do contato na + // tabela phpgw_cc_connections + ps = con + .prepareStatement(SQL_INSERT_INTO_FNBL_CONNECTIONS); + ps.setLong(1, id_contact); + ps.setLong(2, id_connection); + ps.setLong(3, 2); + ps.executeUpdate(); + } + } + // compara o defaultPhone com os outros Phones + if(defaultPhone!=null) { + for (Phone phone1: phones) { + // precisa procurar entre todos os telefones para saber + // qual numero eh o mesmo numero que esta em PrimaryTelephoneNumber + if(phone1.getPropertyValue().equals(defaultPhone.getPropertyValue())) { + // update no phone setando a propriedade is_default para true + ps = con.prepareStatement(SQL_UPDATE_INTO_FNBL_CONNECTIONS); + ps.setBoolean(1, true); + ps.setLong(2, id_connection); + ps.executeUpdate(); + break; + } + } + } + } + return id_connection;// sequencia da chave da tabela do banco de dados + } + + private long searchStateId(Connection con, String stateName, String idCountry) throws Exception { PreparedStatement ps = null; @@ -1275,7 +1226,7 @@ } - private static void addAddress(Address address, ResultSet rs) throws Exception { + private void addAddress(Address address, ResultSet rs) throws Exception { ResultSetMetaData rsmd = rs.getMetaData(); @@ -1477,7 +1428,7 @@ * @throws java.sql.SQLException * @throws NotFoundException */ - private static ContactWrapper createContact(String wrapperId, ResultSet rs) + private ContactWrapper createContact(String wrapperId, ResultSet rs) throws SQLException, NotFoundException { if (!rs.next()) { @@ -1571,7 +1522,7 @@ * @return the ContactWrapper object with extra information attached * @throws java.sql.SQLException */ - private static ContactWrapper addPIMContactItems(ContactWrapper cw, + private ContactWrapper addPIMContactItems(ContactWrapper cw, ResultSet rs) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); @@ -1586,11 +1537,15 @@ Phone phone; Email email; + + Map mapPhones = new HashMap(); while (rs.next()) { columnCount = rsmd.getColumnCount(); + boolean isDefault = false; + for (int i = 1; i <= columnCount; ++i) { column = rsmd.getColumnName(i); @@ -1601,6 +1556,8 @@ value = rs.getString(i); } else if (SQL_FIELD_ITEM_TYPE.equalsIgnoreCase(column)) { type = rs.getString(i); + } else if (SQL_FIELD_CON_IS_DEFAULT.equalsIgnoreCase(column)) { + isDefault = rs.getBoolean(i); } else { throw new SQLException("\n=> Unhandled column: " + column); } @@ -1622,44 +1579,74 @@ } if (type.equals("2")) { // telefone - - if (TYPE_PRIMARY_TELEPHONE_NUMBER.equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_PRIMARY_TELEPHONE_NUMBER); - phone.setPropertyValue(value); + + // name from "Celular" to "MobileTelephoneNumber" + String idType = getIdofPhone(name); + + for (int i=2; mapPhones.containsKey(idType); i++) { + // from "MobileTelephoneNumber" to "MobileiTelephoneNumber" , where i in (2,+] + idType = idType.replaceAll("[0-9]", ""); + idType = getPlusIdofPhone(idType, i); + } + + phone = new Phone(); + phone.setPhoneType(idType); + phone.setPropertyValue(value); + + // TODO: arrumar quando o telefone eh default no BD para enviar pro Celular +// if(isDefault) { +// Phone phoneDefault = new Phone(); +// phoneDefault.setPropertyType("PrimaryTelephoneNumber"); +// phoneDefault.setPropertyValue(value); +// c.getPersonalDetail().addPhone(phoneDefault); +// } + + if(type.matches(".*Business.*")) { c.getBusinessDetail().addPhone(phone); - } else if (TYPE_HOME_TELEPHONE_NUMBER.equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_HOME_TELEPHONE_NUMBER); - phone.setPropertyValue(value); - c.getPersonalDetail().addPhone(phone); - } else if (TYPE_MOBILE_TELEPHONE_NUMBER.equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_MOBILE_TELEPHONE_NUMBER); - phone.setPropertyValue(value); - c.getPersonalDetail().addPhone(phone); - } else if (TYPE_BUSINESS_TELEPHONE_NUMBER - .equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_BUSINESS_TELEPHONE_NUMBER); - phone.setPropertyValue(value); - c.getBusinessDetail().addPhone(phone); - } else if (TYPE_BUSINESS_FAX_NUMBER.equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_BUSINESS_FAX_NUMBER); - phone.setPropertyValue(value); - c.getBusinessDetail().addPhone(phone); - } else if (TYPE_PAGER_NUMBER.equalsIgnoreCase(name)) { - phone = new Phone(); - phone.setPhoneType(FIELD_PAGER_NUMBER); - phone.setPropertyValue(value); - c.getBusinessDetail().addPhone(phone); } + c.getPersonalDetail().addPhone(phone); + mapPhones.put(idType, phone);// just to control repetition of type + } } + return cw; } + + static Map phoneType = new HashMap(); + static { + phoneType.put("Celular", "MobileTelephoneNumber"); + phoneType.put("Celular Residencial", "MobileHomeTelephoneNumber"); + phoneType.put("Celular Comercial", "MobileBusinessTelephoneNumber"); + phoneType.put("Telefone", "OtherTelephoneNumber"); + phoneType.put("Telefone Residencial", "HomeTelephoneNumber"); + phoneType.put("Telefone Comercial", "BusinessTelephoneNumber"); + phoneType.put("Fax", "OtherFaxNumber"); + phoneType.put("Fax Residencial", "HomeFaxNumber"); + phoneType.put("Fax Comercial", "BusinessFaxNumber"); + phoneType.put("Telefone Carro", "CarTelephoneNumber"); + phoneType.put("Pager", "PagerNumber"); + phoneType.put("Padrao", "PrimaryTelephoneNumber"); + } + + static public String getIdofPhone(String s) { + return phoneType.get(s); + } + + static public String getNameofPhone(String s) { + s = s.replaceAll("[0-9]", ""); + for (String pt : phoneType.keySet()) { + if(phoneType.get(pt).equals(s)) { + return pt; + } + } + return s; + } + + static public String getPlusIdofPhone(String s, int i) { + return s.replaceAll("(.*)([A-Z][a-z]*)Number","$1"+i+"$2Number"); + } /** * Retrieves the UID list of the contacts belonging to the user filtered Index: src/main/java/com/funambol/server/security/LdapUserProvisioningOfficer.java =================================================================== --- src/main/java/com/funambol/server/security/LdapUserProvisioningOfficer.java (revisão 1951) +++ src/main/java/com/funambol/server/security/LdapUserProvisioningOfficer.java (cópia de trabalho) @@ -72,8 +72,8 @@ import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; -import sun.util.logging.resources.logging; + import com.funambol.email.console.dao.ConsoleDAO; import com.funambol.email.exception.DBAccessException; import com.funambol.email.exception.InboxListenerConfigException; @@ -376,25 +376,32 @@ return null; } } else { - if (log.isTraceEnabled()) { - log.trace(username+" to User '" + objLdap.getUid() + "' found"); - } - // Check the roles - // - if (isASyncUser(user)) { - // - // User authenticated - if (log.isTraceEnabled()) { - log.trace("User is a SyncUser"); - } - } else { - // User not authenticated - // - if (log.isTraceEnabled()) { - log.trace("The user is not a '" + ROLE_USER + "'"); - } + try { + updateUser(user, password); + if (log.isTraceEnabled()) { + log.trace(username + " to User '" + objLdap.getUid() + + "' found"); + } + // Check the roles + // + if (isASyncUser(user)) { + // + // User authenticated + if (log.isTraceEnabled()) { + log.trace("User is a SyncUser"); + } + } else { + // User not authenticated + // + if (log.isTraceEnabled()) { + log.trace("The user is not a '" + ROLE_USER + "'"); + } + return null; + } + } catch (Exception e) { + log.error("Error inserting a new user", e); return null; - } + } } // @@ -435,7 +442,30 @@ userManager.insertUser(user); return user; } + + /** + * Update user with the given username and password + * + * @param userName the username + * @param password the password + * + * @return the user + * + * @throws AdminException in case of admin errors + * @throws PersistentStoreException if an error occurs + */ + protected void updateUser( + Sync4jUser user, String password) + throws AdminException, PersistentStoreException { + user.setPassword(password); + user.setFirstname(objLdap.getcn()); + user.setRoles(new String[]{ROLE_USER}); + user.setEmail(objLdap.getmail()); + + userManager.setUser(user); + } + /** * Returns the principal with the given username and deviceId. * null if not found Index: src/main/config/Funambol.xml =================================================================== --- src/main/config/Funambol.xml (revisão 0) +++ src/main/config/Funambol.xml (revisão 0) @@ -0,0 +1,75 @@ + + + + + + + com/funambol/server/security/LdapUserProvisioningOfficer.xml + + + + + + com.funambol.server.session.SyncSessionHandler + + + com/funambol/server/engine/Strategy.xml + + + com/funambol/server/admin/DBUserManager.xml + + + 1800 + + + com/funambol/server/inventory/PSDeviceInventory.xml + + + com/funambol/server/engine/transformer/DataTransformerManager.xml + + + true + + + + + + + + 1.2 + + + Funambol + + DS Server + + - + + - + + 8.0.0 + + - + + funambol + + server + + true + + true + + true + + + + + X-funambol-smartslow + + + + + + + + Index: src/main/config/email/email/FunambolEmailConnector.xml =================================================================== --- src/main/config/email/email/FunambolEmailConnector.xml (revisão 0) +++ src/main/config/email/email/FunambolEmailConnector.xml (revisão 0) @@ -0,0 +1,35 @@ + + + + + + + jdbc/fnblds + + + + true + + + + + 300000 + + + + + 15000 + + + + + fnbl_email_push_registry + + + + + false + + + + Index: src/main/config/email/email/email-ss/mail.xml =================================================================== --- src/main/config/email/email/email-ss/mail.xml (revisão 0) +++ src/main/config/email/email/email-ss/mail.xml (revisão 0) @@ -0,0 +1,54 @@ + + + + + + mail + + + + mail + + + + application/vnd.omads-email+xml,application/vnd.omads-folder+xml + + + + + + + + + + + application/vnd.omads-email+xml + + + 1.2 + + + + + + + application/vnd.omads-folder+xml + + + 1.2 + + + + + + + + true + + + + + + + + Index: src/main/config/email/email/email-ss/expresso.xml =================================================================== --- src/main/config/email/email/email-ss/expresso.xml (revisão 0) +++ src/main/config/email/email/email-ss/expresso.xml (revisão 0) @@ -0,0 +1,19 @@ + + + + + Dataprev :: Mobile + + + + true + + + + expresso + + + expresso + + + Index: src/main/config/com/funambol/server/db/db.xml =================================================================== --- src/main/config/com/funambol/server/db/db.xml (revisão 0) +++ src/main/config/com/funambol/server/db/db.xml (revisão 0) @@ -0,0 +1,53 @@ + + + + + url + jdbc:postgresql://localhost/expresso + + + driverClassName + org.postgresql.Driver + + + username + funambol + + + password + funambol + + + testWhileIdle + true + + + timeBetweenEvictionRunsMillis + 600000 + + + numTestsPerEvictionRun + 5 + + + minEvictableIdleTimeMillis + 1800000 + + + validationQuery + select 1 + + + testOnBorrow + false + + + removeAbandoned + true + + + logAbandoned + true + + + Index: src/main/config/com/funambol/server/security/LdapUserProvisioningOfficer.xml =================================================================== --- src/main/config/com/funambol/server/security/LdapUserProvisioningOfficer.xml (revisão 1951) +++ src/main/config/com/funambol/server/security/LdapUserProvisioningOfficer.xml (cópia de trabalho) @@ -8,7 +8,7 @@ 389 - mmldap + 10.82.0.207 ou=Pessoas,ou=Usuarios,dc=previdencia,dc=gov,dc=br Index: pom.xml =================================================================== --- pom.xml (revisão 1951) +++ pom.xml (cópia de trabalho) @@ -40,7 +40,7 @@ server-framework funambol - 8.2.0 + 8.0.0 provided @@ -58,7 +58,7 @@ ds-server funambol - 8.2.0 + 8.0.0 provided @@ -103,6 +103,18 @@ 8.0.0 provided + + funambol + testing-tool + 1.0.10 + test + + + funambol + sync4j-clientframework + 2.3 + test +