You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2016/01/15 11:25:07 UTC

svn commit: r1724769 - in /ofbiz/branches/release14.12: ./ applications/marketing/config/MarketingUiLabels.xml applications/marketing/servicedef/services.xml applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java

Author: jleroux
Date: Fri Jan 15 10:25:07 2016
New Revision: 1724769

URL: http://svn.apache.org/viewvc?rev=1724769&view=rev
Log:
"Applied fix from trunk for revision: 1724763  " 
------------------------------------------------------------------------
r1724763 | jleroux | 2016-01-15 11:18:00 +0100 (ven. 15 janv. 2016) | 6 lignes

A slightly modified patch from Chula Lathong for <<Bug on SFA vcard import.>> https://issues.apache.org/jira/browse/OFBIZ-6795

Error occur when create Lead/Contact from Vcard.
This patch will improve importVcard service to able to create Lead/Contact from Vcard and display error messages when Vcard has invalid values.

jleroux: I simply changed the importVCard service transaction-timeout from 72000 (20 hours!) to 7200. Also added corresponding French labels
------------------------------------------------------------------------


Modified:
    ofbiz/branches/release14.12/   (props changed)
    ofbiz/branches/release14.12/applications/marketing/config/MarketingUiLabels.xml
    ofbiz/branches/release14.12/applications/marketing/servicedef/services.xml
    ofbiz/branches/release14.12/applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java

Propchange: ofbiz/branches/release14.12/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jan 15 10:25:07 2016
@@ -8,4 +8,4 @@
 /ofbiz/branches/json-integration-refactoring:1634077-1635900
 /ofbiz/branches/multitenant20100310:921280-927264
 /ofbiz/branches/release13.07:1547657
-/ofbiz/trunk:1649072,1649083-1649084,1649086,1649090,1649096,1649230,1649238-1649239,1649248,1649272,1649275,1649280-1649281,1649283,1649285-1649286,1649291,1649329,1649331,1649384,1649393,1649666,1649742,1650240,1650348,1650357,1650583,1650642,1650678,1650821,1650882,1650887,1650938,1651593,1652312,1652361,1652638,1652641,1652672,1652688,1652706,1652725,1652731,1652739,1652852,1653248,1653296,1653456,1653597,1653614,1654175,1654273,1654509,1654670,1654672-1654673,1654683-1654684,1654824,1655046,1655668,1655979,1656014,1656185,1656198,1656445,1656983,1657323,1657506-1657507,1657514,1657714,1657790,1657848,1658364,1658662,1658882,1659224,1659965,1660031,1660053,1660389,1660444,1660579,1661303,1661328,1661760,1661778,1661853,1661862,1661873,1661940,1661951,1661977,1662119-1662120,1662361,1662500,1662812,1662919,1663202,1663912,1663979,1664602,1664604,1664696,1665154,1665162,1665535,1666404,1666511,1666633,1666836,1666939,1666949,1666958,1667055,1667253,1667483,1667492,1667774,1668207,
 1668214,1668236,1668246,1668258,1668263,1668265,1668270,1668277,1668314,1668657,1669317,1669588,1672427,1672430,1672846,1672853,1672856,1672862,1672873,1673764,1674447,1674464,1674491,1674496,1674908,1676674,1677123,1677597,1677769-1677770,1678294,1678882,1678911,1679689,1679697,1679709,1679720,1679728,1679732,1679957,1680155,1680288,1680304,1680671,1680675,1680733,1680840,1680881,1682272,1682295,1682415,1682633,1683998,1684094,1686360,1686536,1686545,1686566,1686569,1686574,1686583,1686635,1686651,1686970,1687427,1688772,1690086,1690581,1692357,1692458,1692600,1692604,1693393,1693579,1695017,1696018,1696234,1697590,1697647,1697993,1698259,1698261,1698263,1701164,1701441,1701819,1701825,1701936,1702002,1702548,1702704,1703121,1703586,1703945,1703954,1703965,1703971,1703976-1703977,1703981,1704000,1704014,1704018,1704036,1704043,1704052,1704082,1704140,1704230,1705004,1705329,1705405,1705412,1705417,1705427,1705532,1706159,1706162,1706316,1706531,1706549,1706553,1706561,1706569,17065
 77,1706589,1706591,1706593,1706694,1707837,1707857,1708274,1708341,1708742,1708930,1709117,1710178,1710348,1711513,1712971,1714244,1714410,1714415,1714571,1714657,1715477-1715478,1715485,1715501,1716319,1717058,1717180,1717682,1717710,1717760,1718023,1718109,1719094,1719872,1720883,1721067,1721093,1721625,1722712,1724402,1724566
+/ofbiz/trunk:1649072,1649083-1649084,1649086,1649090,1649096,1649230,1649238-1649239,1649248,1649272,1649275,1649280-1649281,1649283,1649285-1649286,1649291,1649329,1649331,1649384,1649393,1649666,1649742,1650240,1650348,1650357,1650583,1650642,1650678,1650821,1650882,1650887,1650938,1651593,1652312,1652361,1652638,1652641,1652672,1652688,1652706,1652725,1652731,1652739,1652852,1653248,1653296,1653456,1653597,1653614,1654175,1654273,1654509,1654670,1654672-1654673,1654683-1654684,1654824,1655046,1655668,1655979,1656014,1656185,1656198,1656445,1656983,1657323,1657506-1657507,1657514,1657714,1657790,1657848,1658364,1658662,1658882,1659224,1659965,1660031,1660053,1660389,1660444,1660579,1661303,1661328,1661760,1661778,1661853,1661862,1661873,1661940,1661951,1661977,1662119-1662120,1662361,1662500,1662812,1662919,1663202,1663912,1663979,1664602,1664604,1664696,1665154,1665162,1665535,1666404,1666511,1666633,1666836,1666939,1666949,1666958,1667055,1667253,1667483,1667492,1667774,1668207,
 1668214,1668236,1668246,1668258,1668263,1668265,1668270,1668277,1668314,1668657,1669317,1669588,1672427,1672430,1672846,1672853,1672856,1672862,1672873,1673764,1674447,1674464,1674491,1674496,1674908,1676674,1677123,1677597,1677769-1677770,1678294,1678882,1678911,1679689,1679697,1679709,1679720,1679728,1679732,1679957,1680155,1680288,1680304,1680671,1680675,1680733,1680840,1680881,1682272,1682295,1682415,1682633,1683998,1684094,1686360,1686536,1686545,1686566,1686569,1686574,1686583,1686635,1686651,1686970,1687427,1688772,1690086,1690581,1692357,1692458,1692600,1692604,1693393,1693579,1695017,1696018,1696234,1697590,1697647,1697993,1698259,1698261,1698263,1701164,1701441,1701819,1701825,1701936,1702002,1702548,1702704,1703121,1703586,1703945,1703954,1703965,1703971,1703976-1703977,1703981,1704000,1704014,1704018,1704036,1704043,1704052,1704082,1704140,1704230,1705004,1705329,1705405,1705412,1705417,1705427,1705532,1706159,1706162,1706316,1706531,1706549,1706553,1706561,1706569,17065
 77,1706589,1706591,1706593,1706694,1707837,1707857,1708274,1708341,1708742,1708930,1709117,1710178,1710348,1711513,1712971,1714244,1714410,1714415,1714571,1714657,1715477-1715478,1715485,1715501,1716319,1717058,1717180,1717682,1717710,1717760,1718023,1718109,1719094,1719872,1720883,1721067,1721093,1721625,1722712,1724402,1724566,1724763

Modified: ofbiz/branches/release14.12/applications/marketing/config/MarketingUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/applications/marketing/config/MarketingUiLabels.xml?rev=1724769&r1=1724768&r2=1724769&view=diff
==============================================================================
--- ofbiz/branches/release14.12/applications/marketing/config/MarketingUiLabels.xml (original)
+++ ofbiz/branches/release14.12/applications/marketing/config/MarketingUiLabels.xml Fri Jan 15 10:25:07 2016
@@ -3185,6 +3185,18 @@
         <value xml:lang="zh">导入线索</value>
         <value xml:lang="zh_TW">匯入線索</value>
     </property>
+   <property key="SfaImportVcardDuplicatedVcardError">
+        <value xml:lang="en">All parties in this vcard are duplicated.</value>
+        <value xml:lang="fr">Tous les acteurs de cette vcard sont dupliqués.</value>
+    </property>
+    <property key="SfaImportVCardEmailFormatError">
+        <value xml:lang="en">incorrect email format.</value>
+        <value xml:lang="fr">Format de l'addresse courriel incorrect.</value>
+    </property>
+    <property key="SfaImportVcardNameMissingError">
+        <value xml:lang="en">first name or last name missing.</value>
+        <value xml:lang="fr">Prénom ou nom manquant.</value>
+    </property>
     <property key="SfaImportVCardError">
         <value xml:lang="de">Fehler beim importieren von VCard: ${errorString}</value>
         <value xml:lang="en">Error during import data from VCard: ${errorString}</value>

Modified: ofbiz/branches/release14.12/applications/marketing/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/applications/marketing/servicedef/services.xml?rev=1724769&r1=1724768&r2=1724769&view=diff
==============================================================================
--- ofbiz/branches/release14.12/applications/marketing/servicedef/services.xml (original)
+++ ofbiz/branches/release14.12/applications/marketing/servicedef/services.xml Fri Jan 15 10:25:07 2016
@@ -515,7 +515,7 @@ under the License.
     </service>
 
     <!-- VCard services -->
-    <service name="importVCard" engine="java" location="org.ofbiz.sfa.vcard.VCard" invoke="importVCard">
+    <service name="importVCard" engine="java" location="org.ofbiz.sfa.vcard.VCard" invoke="importVCard" transaction-timeout="7200">
         <attribute name="infile" type="java.nio.ByteBuffer" mode="IN" optional="false"/>
         <attribute name="partyId" type="String" mode="OUT" optional="false"/>
         <attribute name="partyType" type="String" mode="IN" optional="true"/>

Modified: ofbiz/branches/release14.12/applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java?rev=1724769&r1=1724768&r2=1724769&view=diff
==============================================================================
--- ofbiz/branches/release14.12/applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java (original)
+++ ofbiz/branches/release14.12/applications/marketing/src/org/ofbiz/sfa/vcard/VCard.java Fri Jan 15 10:25:07 2016
@@ -27,26 +27,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import javolution.util.FastMap;
-import net.wimpi.pim.Pim;
-import net.wimpi.pim.contact.basicimpl.AddressImpl;
-import net.wimpi.pim.contact.basicimpl.EmailAddressImpl;
-import net.wimpi.pim.contact.basicimpl.PhoneNumberImpl;
-import net.wimpi.pim.contact.io.ContactMarshaller;
-import net.wimpi.pim.contact.io.ContactUnmarshaller;
-import net.wimpi.pim.contact.model.Address;
-import net.wimpi.pim.contact.model.Communications;
-import net.wimpi.pim.contact.model.Contact;
-import net.wimpi.pim.contact.model.EmailAddress;
-import net.wimpi.pim.contact.model.Organization;
-import net.wimpi.pim.contact.model.OrganizationalIdentity;
-import net.wimpi.pim.contact.model.PersonalIdentity;
-import net.wimpi.pim.contact.model.PhoneNumber;
-import net.wimpi.pim.factory.ContactIOFactory;
-import net.wimpi.pim.factory.ContactModelFactory;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.FileUtil;
@@ -68,6 +54,40 @@ import org.ofbiz.service.GenericServiceE
 import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.service.ServiceUtil;
 
+import javolution.util.FastMap;
+import net.wimpi.pim.Pim;
+import net.wimpi.pim.Pim;
+import net.wimpi.pim.contact.basicimpl.AddressImpl;
+import net.wimpi.pim.contact.basicimpl.AddressImpl;
+import net.wimpi.pim.contact.basicimpl.EmailAddressImpl;
+import net.wimpi.pim.contact.basicimpl.EmailAddressImpl;
+import net.wimpi.pim.contact.basicimpl.PhoneNumberImpl;
+import net.wimpi.pim.contact.basicimpl.PhoneNumberImpl;
+import net.wimpi.pim.contact.io.ContactMarshaller;
+import net.wimpi.pim.contact.io.ContactMarshaller;
+import net.wimpi.pim.contact.io.ContactUnmarshaller;
+import net.wimpi.pim.contact.io.ContactUnmarshaller;
+import net.wimpi.pim.contact.model.Address;
+import net.wimpi.pim.contact.model.Address;
+import net.wimpi.pim.contact.model.Communications;
+import net.wimpi.pim.contact.model.Communications;
+import net.wimpi.pim.contact.model.Contact;
+import net.wimpi.pim.contact.model.Contact;
+import net.wimpi.pim.contact.model.EmailAddress;
+import net.wimpi.pim.contact.model.EmailAddress;
+import net.wimpi.pim.contact.model.Organization;
+import net.wimpi.pim.contact.model.Organization;
+import net.wimpi.pim.contact.model.OrganizationalIdentity;
+import net.wimpi.pim.contact.model.OrganizationalIdentity;
+import net.wimpi.pim.contact.model.PersonalIdentity;
+import net.wimpi.pim.contact.model.PersonalIdentity;
+import net.wimpi.pim.contact.model.PhoneNumber;
+import net.wimpi.pim.contact.model.PhoneNumber;
+import net.wimpi.pim.factory.ContactIOFactory;
+import net.wimpi.pim.factory.ContactIOFactory;
+import net.wimpi.pim.factory.ContactModelFactory;
+import net.wimpi.pim.factory.ContactModelFactory;
+
 public class VCard {
     public static final String module = VCard.class.getName();
     public static final String resourceError = "MarketingUiLabels";
@@ -90,8 +110,10 @@ public class VCard {
         try {
             ContactIOFactory ciof = Pim.getContactIOFactory();
             ContactUnmarshaller unmarshaller = ciof.createContactUnmarshaller();
+            unmarshaller.setStrict(false);
             Contact[] contacts = unmarshaller.unmarshallContacts(in);
 
+            int contactsCount = 1;
             for (Contact contact: contacts) {
                 PersonalIdentity pid = contact.getPersonalIdentity();
                 if (!isGroup) {
@@ -146,6 +168,14 @@ public class VCard {
                             }
                         }
                         if (UtilValidate.isNotEmpty(email)) {
+                                  InternetAddress emailAddr;
+                                try {
+                                    emailAddr = new InternetAddress(email);
+                                    emailAddr.validate();
+                                } catch (AddressException e) {
+                                    String emailFOrmatErrMsg = UtilProperties.getMessage(resourceError, "SfaImportVCardEmailFormatError", locale);
+                                    return ServiceUtil.returnError(pid.getFirstname() + " " + pid.getLastname() + " has " + emailFOrmatErrMsg);
+                                }
                             serviceCtx.put("emailAddress", email);
                         }
                         for (Iterator<?> iter = communications.getPhoneNumbers(); iter.hasNext();) {
@@ -175,8 +205,12 @@ public class VCard {
                 }
                 OrganizationalIdentity  oid = contact.getOrganizationalIdentity();
                 // Useful when creating a contact with more than OOTB
-                if (!isGroup) {
-                    serviceCtx.put("personalTitle", oid.getTitle());
+                if (!isGroup && oid != null && oid.getTitle() != null) {
+                    String personalTitle = oid.getTitle().replace("\\","").replaceAll("\uFFFD", " ");
+                    if (personalTitle.length() > 100) {
+                        personalTitle = oid.getTitle().replace("\\", "").replaceAll("\uFFFD", " ").substring(0, 100);
+                    }
+                    serviceCtx.put("personalTitle", personalTitle);
                 }
 
                 // Needed when creating an account (a PartyGroup)
@@ -184,7 +218,7 @@ public class VCard {
                     //serviceCtx.put("partyRole", oid.getRole()); // not used yet,maybe useful later
                     if (oid.hasOrganization()) {
                         Organization org = oid.getOrganization();
-                        serviceCtx.put("groupName", org.getName());
+                        serviceCtx.put("groupName", org.getName().replace("\\", ""));
                     }
                 }
 
@@ -197,8 +231,34 @@ public class VCard {
                         serviceCtx.put(entry.getKey(), entry.getValue());
                     }
                 }
-                Map<String, Object> resp = dispatcher.runSync(serviceName, serviceCtx);
-                result.put("partyId", resp.get("partyId"));
+                List<GenericValue> persons = EntityQuery.use(delegator).from("Person").where(
+                        "firstName", serviceCtx.get("firstName"),
+                        "lastName", serviceCtx.get("lastName")
+                        ).queryList();
+                boolean blockPerson = false;
+                for (GenericValue person: persons) {
+                    GenericValue partyStatus = EntityQuery.use(delegator).from("PartyStatus").where(
+                            "partyId", person.get("partyId")).orderBy("-statusDate").queryFirst();
+                    if (!partyStatus.get("statusId").equals("PARTY_DISABLED")) {
+                        blockPerson = true;
+                    }
+                }
+                if (!blockPerson) {
+                    String nameMissingErrMsg = UtilProperties.getMessage(resourceError, "SfaImportVcardNameMissingError", locale);
+                    if (!isGroup && serviceCtx.get("lastName") == null) {
+                        return ServiceUtil.returnError(serviceCtx.get("firstName") + " " + nameMissingErrMsg);
+                    }
+                    if (!isGroup && serviceCtx.get("firstName") == null) {
+                        return ServiceUtil.returnError(serviceCtx.get("lastName") + " " + nameMissingErrMsg);
+                    }
+                    Map<String, Object> resp = dispatcher.runSync(serviceName, serviceCtx);
+                    result.put("partyId", resp.get("partyId"));
+                }
+                if (result.get("partyId") == null && contactsCount == contacts.length) {
+                    String duplicatedErrMsg = UtilProperties.getMessage(resourceError, "SfaImportVcardDuplicatedVcardError", locale);
+                    return ServiceUtil.returnError(duplicatedErrMsg);
+                }
+                contactsCount++;
             }
         } catch (GenericEntityException e) {
             Debug.logError(e, module);