mangstadt / ez-vcard

A vCard parser library for Java
Other
399 stars 92 forks source link

ez-vcard lib v.0.10.0. unable to process vcf if contact contains phone number or email id fields #71

Closed btaduri closed 7 years ago

btaduri commented 7 years ago

Issue: if the plain text vcf file contains "phone number" or email Id fields then such vcf is unable to process.(Note updated set, set to List in insertEmailAddress(), insertPhoneNumber() )

On the other note if plain vcf contains contacts with name/ address/birthday/.... any field other than Emailid or TelephoneNumbers the entire vcf is being processed.

If I revert back the methods and ez-vcard lib version I don't see any issue.

getting following exception:

11-22 20:25:51.253: W/dalvikvm(20939): dvmFindClassByName rejecting 'ezvcard/messages_en' 11-22 20:25:51.253: W/dalvikvm(20939): dvmFindClassByName rejecting 'ezvcard/messages' 11-22 20:25:51.253: W/dalvikvm(20939): Exception Ljava/util/MissingResourceException; thrown while initializing Lezvcard/Messages; 11-22 20:25:51.253: I/System.out(20939): 789789 insert contact Exception111 [Ljava.lang.StackTraceElement;@42e78258

*ExceptionInInitializerError

2

11-22 19:56:33.898: W/dalvikvm(12912): VFY: unable to find class referenced in signature (Lorg/jsoup/nodes/Element;) 11-22 19:56:33.898: I/dalvikvm(12912): Could not find method org.jsoup.nodes.Element.getElementsByTag, referenced from method ezvcard.io.scribe.SoundScribe._parseHtml 11-22 19:56:33.898: W/dalvikvm(12912): VFY: unable to resolve virtual method 25378: Lorg/jsoup/nodes/Element;.getElementsByTag (Ljava/lang/String;)Lorg/jsoup/select/Elements; 11-22 19:56:33.898: D/dalvikvm(12912): VFY: replacing opcode 0x6e at 0x002f

Unable to process vcf file with following content:

BEGIN:VCARD VERSION:2.1 N:abc;Albert;;;;;; FN:Albert abc TITLE:Senior Software Engineer ORG:abc Corp. PHOTO;TYPE=PNG;ENCODING=B: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 TEL;TYPE=WORK:123456 TEL;TYPE=CELL:5555710 TEL;TYPE=HOME:66667026 ADR;TYPE=HOME:;;000 Farmers Ln;Santa Rosa;CA;95404;USA ADR;TYPE=WORK:;;0000 Stacy Ave;Streator;IL;61364;USA EMAIL;TYPE=HOME:aaa.l@home.com EMAIL;TYPE=WORK:abc.l@work.com BDAY:19970723 NOTE:Works as Senior Software Engineer at abc Corp. in Sunnyvale END:VCARD

ajaywhiz commented 7 years ago

I see the similar issue.

I used below vCard

BEGIN:VCARD
VERSION:2.1
N:Cook;Tim;;;;;;
FN:Tim Cook
TEL;TYPE=CELL:2356452356
END:VCARD

What I found that, TelephoneScribe.parse method is calling TelUri.parse(value)

Inside TelUri parse method it seems that it expects the telephone number in tel:xxxxxxx format.

We get ExceptionInInitializerError exception

mangstadt commented 7 years ago

Cannot reproduce. The above two vCards parse correctly on my computer.

@btaduri's problem seems to be that his environment is not seeing the "messages.properties" file, located in the "ezvcard" package.

@ajaywhiz If the telephone number is not in "tel:xxx" format, then it should treat the property value as plain-text. Can you please post the full stack trace?

ajaywhiz commented 7 years ago

2 contacts.txt

[Edited]

Below is the stack trace

Exception e java.lang.ExceptionInInitializerError java.lang.ExceptionInInitializerErrorjava.util.MissingResourceException: Can't find resource for bundle 'ezvcard/messages_en_US', key '' java.lang.ExceptionInInitializerError: null at ezvcard.util.TelUri.parse(TelUri.java:121) at ezvcard.io.scribe.TelephoneScribe.parse(TelephoneScribe.java:181) at ezvcard.io.scribe.TelephoneScribe._parseText(TelephoneScribe.java:101) at ezvcard.io.scribe.TelephoneScribe._parseText(TelephoneScribe.java:48) at ezvcard.io.scribe.VCardPropertyScribe.parseText(VCardPropertyScribe.java:216) at ezvcard.io.text.VCardReader$VObjectDataListenerImpl.parseProperty(VCardReader.java:311) at ezvcard.io.text.VCardReader$VObjectDataListenerImpl.onProperty(VCardReader.java:279) at com.github.mangstadt.vinnie.io.VObjectReader.parse(VObjectReader.java:473) at ezvcard.io.text.VCardReader._readNext(VCardReader.java:223) at ezvcard.io.StreamReader.readNext(StreamReader.java:76)

We are using this lib to parse multiple vCards contained in a single file. Attached is a sample file

Also, inside TelUri.parse method I see a if block in the beginning String scheme = "tel:"; if (uri.length() < scheme.length() || !uri.substring(0, scheme.length()).equalsIgnoreCase(scheme)) { //not a tel URI throw Messages.INSTANCE.getIllegalArgumentException(18, scheme); } Which results in TRUE condition and throws the exception.

ajaywhiz commented 7 years ago

@mangstadt do you see anything in the stack trace posted above?

mangstadt commented 7 years ago

When a TEL property is not in the format "tel:xxxx", it throws an IllegalArgumentException. This is normal. The problem starts when it tries to get the exception's message.

It gets the exception's message from ez-vcard's messages.properties file. For some reason, your environment cannot find this file, which is why you are getting this error.

A ResourceBundle is used to get the message. The way ResourceBundles are supposed to work is they look for a properties file that contains messages in the user's local language (e.g. "messages_en_US.properties"). If it can't find one, then it's supposed to fall back to a file named "messages.properties". I don't know why it's not doing that for you.

ajaywhiz commented 7 years ago

@mangstadt thanks for pointing this out. We checked the gradle file and it was excluding ezvcard/messages.properties. After including this file, all works fine.

mangstadt commented 7 years ago

Good to hear. :D