Performance improvement:
[jvcard.git] / src / be / nikiroo / jvcard / parsers / Parser.java
index 5ecad4a42abcb9fe1c8c34307b53270aa70e1f0c..040cd3e113ab9862b15ace9c3967bfca4610878b 100644 (file)
@@ -1,6 +1,12 @@
 package be.nikiroo.jvcard.parsers;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.security.InvalidParameterException;
+import java.util.LinkedList;
 import java.util.List;
 
 import be.nikiroo.jvcard.Card;
@@ -9,12 +15,56 @@ import be.nikiroo.jvcard.Data;
 
 public class Parser {
 
-       public static List<Contact> parse(List<String> lines, Format format) {
+       /**
+        * Load the data from the given {@link File} under the given {@link Format}.
+        * 
+        * @param file
+        *            the input to load from
+        * @param format
+        *            the {@link Format} to load as
+        * 
+        * @return the list of elements
+        * 
+        * @throws IOException
+        *             in case of IO error
+        */
+       public static List<Contact> parseContact(File file, Format format)
+                       throws IOException {
+               List<String> lines = null;
+
+               if (file != null && file.exists()) {
+                       BufferedReader buffer = new BufferedReader(new InputStreamReader(
+                                       new FileInputStream(file), "UTF-8"));
+                       lines = new LinkedList<String>();
+                       for (String line = buffer.readLine(); line != null; line = buffer
+                                       .readLine()) {
+                               lines.add(line);
+                       }
+                       buffer.close();
+               }
+
+               if (lines == null)
+                       return new LinkedList<Contact>();
+
+               return parseContact(lines, format);
+       }
+
+       /**
+        * Load the given data from under the given {@link Format}.
+        * 
+        * @param lines
+        *            the input to load from
+        * @param format
+        *            the {@link Format} to load as
+        * 
+        * @return the list of elements
+        */
+       public static List<Contact> parseContact(List<String> lines, Format format) {
                switch (format) {
                case VCard21:
-                       return Vcard21Parser.parse(lines);
+                       return Vcard21Parser.parseContact(lines);
                case Abook:
-                       return AbookParser.parse(lines);
+                       return AbookParser.parseContact(lines);
 
                default:
                        throw new InvalidParameterException("Unknown format: "
@@ -22,29 +72,59 @@ public class Parser {
                }
        }
 
-       // -1 = no bkeys
-       public static String toString(Card card, Format format) {
+       /**
+        * Write the given {@link Card} in the {@link Appendable}.
+        * 
+        * @param writer
+        *            the {@link Appendable}
+        * @param card
+        *            the {@link Card} to write
+        * @param format
+        *            the {@link Format} to export to
+        * 
+        * @throws IOException
+        *             in case of IO error
+        */
+       public static void write(Appendable writer, Format format, Card card)
+                       throws IOException {
                switch (format) {
                case VCard21:
-                       return Vcard21Parser.toString(card);
+                       Vcard21Parser.write(writer, card);
+                       break;
                case Abook:
-                       return AbookParser.toString(card);
-
+                       AbookParser.write(writer, card);
+                       break;
                default:
                        throw new InvalidParameterException("Unknown format: "
                                        + format.toString());
                }
        }
 
-       // -1 = no bkeys
-       public static String toString(Contact contact, Format format,
-                       int startingBKey) {
+       /**
+        * Write the given {@link Contact} in the {@link Appendable}.
+        * 
+        * @param writer
+        *            the {@link Appendable}
+        * @param contact
+        *            the {@link Contact} to write
+        * @param startingBKey
+        *            the starting BKey number (all the other will follow) or -1 for
+        *            no BKey
+        * @param format
+        *            the {@link Format} to export to
+        * 
+        * @throws IOException
+        *             in case of IO error
+        */
+       public static void write(Appendable writer, Contact contact, Format format,
+                       int startingBKey) throws IOException {
                switch (format) {
                case VCard21:
-                       return Vcard21Parser.toString(contact, startingBKey);
+                       Vcard21Parser.write(writer, contact, startingBKey);
+                       break;
                case Abook:
-                       return AbookParser.toString(contact, startingBKey);
-
+                       AbookParser.write(writer, contact, startingBKey);
+                       break;
                default:
                        throw new InvalidParameterException("Unknown format: "
                                        + format.toString());