X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2FContact.java;h=87c1286a77093d436148a1563015f789e1b9beb6;hb=cf77cb3542f2aefbebdb9aa00b358dbeb4489a73;hp=553ca7680f486f34b1a38e9753dff0b4f06edb99;hpb=296a0b75515b3a7424b98292c87cbbf2272b73f9;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/Contact.java b/src/be/nikiroo/jvcard/Contact.java index 553ca76..87c1286 100644 --- a/src/be/nikiroo/jvcard/Contact.java +++ b/src/be/nikiroo/jvcard/Contact.java @@ -1,9 +1,13 @@ package be.nikiroo.jvcard; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.UUID; import be.nikiroo.jvcard.parsers.Format; import be.nikiroo.jvcard.parsers.Parser; @@ -15,12 +19,9 @@ import be.nikiroo.jvcard.tui.StringUtils; * @author niki * */ -public class Contact { - private List datas; +public class Contact extends BaseClass { private int nextBKey = 1; private Map binaries; - private boolean dirty; - private Card parent; /** * Create a new Contact from the given information. Note that the BKeys data @@ -30,42 +31,10 @@ public class Contact { * the information about the contact */ public Contact(List content) { - this.datas = new LinkedList(); - - boolean fn = false; - boolean n = false; - for (Data data : content) { - if (data.getName().equals("N")) { - n = true; - } else if (data.getName().equals("FN")) { - fn = true; - } - - if (!data.getName().equals("VERSION")) { - datas.add(data); - } - } - - // required fields: - if (!n) { - datas.add(new Data(null, "N", "", null)); - } - if (!fn) { - datas.add(new Data(null, "FN", "", null)); - } - + super(load(content)); updateBKeys(true); } - /** - * Return the informations (note: this is the actual list, be careful). - * - * @return the list of data anout this contact - */ - public List getContent() { - return datas; - } - /** * Return the preferred Data field with the given name, or NULL if none. * @@ -78,7 +47,8 @@ public class Contact { for (Data data : getData(name)) { if (first == null) first = data; - for (TypeInfo type : data.getTypes()) { + for (int index = 0; index < data.size(); index++) { + TypeInfo type = data.get(index); if (type.getName().equals("TYPE") && type.getValue().equals("pref")) { return data; @@ -114,7 +84,7 @@ public class Contact { public List getData(String name) { List found = new LinkedList(); - for (Data data : datas) { + for (Data data : this) { if (data.getName().equals(name)) found.add(data); } @@ -133,7 +103,14 @@ public class Contact { */ public String toString(Format format, int startingBKey) { updateBKeys(false); - return Parser.toString(this, format, startingBKey); + + StringBuilder builder = new StringBuilder(); + for (String line : Parser.toStrings(this, format, startingBKey)) { + builder.append(line); + builder.append("\r\n"); + } + + return builder.toString(); } /** @@ -166,7 +143,7 @@ public class Contact { * The format is basically a list of field names separated by a pipe and * optionally parametrised. The parameters allows you to: *
    - *
  • @x: show only a present/not present info
  • + *
  • @x: (the 'x' is the letter 'x') show only a present/not present info
  • *
  • @n: limit the size to a fixed value 'n'
  • *
  • @+: expand the size of this field as much as possible
  • *
@@ -407,48 +384,6 @@ public class Contact { return str.toArray(new String[] {}); } - /** - * Add a {@link String} to the given {@link List}, but make sure it does not - * exceed the maximum size, and truncate it if needed to fit. - * - * @param list - * @param add - * @param currentSize - * @param maxSize - * @return - */ - static private int addToList(List list, String add, - int currentSize, int maxSize) { - if (add == null || add.length() == 0) { - if (add != null) - list.add(add); - return 0; - } - - if (maxSize > -1) { - if (currentSize < maxSize) { - if (currentSize + add.length() >= maxSize) { - add = add.substring(0, maxSize - currentSize); - } - } else { - add = ""; - } - } - - list.add(add); - return add.length(); - } - - /** - * Return a {@link String} representation of this contact, in vCard 2.1, - * without BKeys. - * - * @return the {@link String} representation - */ - public String toString() { - return toString(Format.VCard21, -1); - } - /** * Update the information from this contact with the information in the * given contact. Non present fields will be removed, new fields will be @@ -461,7 +396,7 @@ public class Contact { public void updateFrom(Contact vc) { updateBKeys(false); - List newDatas = new LinkedList(vc.datas); + List newDatas = new LinkedList(vc); for (int i = 0; i < newDatas.size(); i++) { Data data = newDatas.get(i); int bkey = Parser.getBKey(data); @@ -472,11 +407,29 @@ public class Contact { } } - this.datas = newDatas; + replaceListContent(newDatas); this.nextBKey = vc.nextBKey; + } + + @Override + public String getId() { + return "" + getPreferredDataValue("UID"); + } + + @Override + public String getState() { + return "" + getPreferredDataValue("UID"); + } - setParent(parent); - setDirty(); + /** + * Return a {@link String} representation of this contact, in vCard 2.1, + * without BKeys. + * + * @return the {@link String} representation + */ + @Override + public String toString() { + return toString(Format.VCard21, -1); } /** @@ -495,7 +448,7 @@ public class Contact { binaries = new HashMap(); } - for (Data data : datas) { + for (Data data : this) { if (data.isBinary() && (data.getB64Key() <= 0 || force)) { binaries.put(nextBKey, data); data.resetB64Key(nextBKey++); @@ -503,55 +456,80 @@ public class Contact { } } - public boolean isDirty() { - return dirty; - } - /** - * Notify that this element has unsaved changes, and notify its parent of - * the same if any. + * Load the data from the given {@link File} under the given {@link Format}. + * + * @param file + * the {@link File} to load from + * @param format + * the {@link Format} to load as + * + * @return the list of elements + * @throws IOException + * in case of IO error */ - protected void setDirty() { - this.dirty = true; - if (this.parent != null) - this.parent.setDirty(); - } + static private List load(List content) { + List datas = new ArrayList(); - void setParent(Card parent) { - this.parent = parent; - for (Data data : datas) { - data.setParent(this); - } - } + boolean fn = false; + boolean n = false; + boolean uid = false; + if (content != null) { + for (Data data : content) { + if (data.getName().equals("N")) { + n = true; + } else if (data.getName().equals("FN")) { + fn = true; + } else if (data.getName().equals("UID")) { + uid = true; + } - /** - * Delete this {@link Contact} from its parent {@link Card} if any. - * - * @return TRUE in case of success - */ - public boolean delete() { - if (parent != null) { - List list = parent.getContactsList(); - for (int i = 0; i < list.size(); i++) { - if (list.get(i) == this) { - list.remove(i); - parent.setDirty(); - return true; + if (!data.getName().equals("VERSION")) { + datas.add(data); } } } - return false; + // required fields: + if (!n) // required since vCard 3.0, supported in 2.1 + datas.add(new Data(null, "N", "", null)); + if (!fn) // not required anymore but still supported in 4.0 + datas.add(new Data(null, "FN", "", null)); + if (!uid) // supported by vCard, required by this program + datas.add(new Data(null, "UID", UUID.randomUUID().toString(), null)); + + return datas; } /** - * Notify this element and all its descendants that it is in pristine - * state (as opposed to dirty). + * Add a {@link String} to the given {@link List}, but make sure it does not + * exceed the maximum size, and truncate it if needed to fit. + * + * @param list + * @param add + * @param currentSize + * @param maxSize + * @return */ - void setPristine() { - dirty = false; - for (Data data : datas) { - data.setPristine(); + static private int addToList(List list, String add, + int currentSize, int maxSize) { + if (add == null || add.length() == 0) { + if (add != null) + list.add(add); + return 0; } + + if (maxSize > -1) { + if (currentSize < maxSize) { + if (currentSize + add.length() >= maxSize) { + add = add.substring(0, maxSize - currentSize); + } + } else { + add = ""; + } + } + + list.add(add); + return add.length(); } }