X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2FCard.java;h=547535804b8f37fa80fb5dc3ca22f89afc22857e;hb=5ad0e17e7fea1c602cb2638a006424af9c7e33e8;hp=a9018ca066d1cc590fcb92b76ce884919150a1ea;hpb=a3b510ab4bf89a7a2a05f3851ffe0f030b8a78f4;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/Card.java b/src/be/nikiroo/jvcard/Card.java index a9018ca..5475358 100644 --- a/src/be/nikiroo/jvcard/Card.java +++ b/src/be/nikiroo/jvcard/Card.java @@ -1,13 +1,10 @@ package be.nikiroo.jvcard; -import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; +import java.security.InvalidParameterException; import java.util.List; import be.nikiroo.jvcard.parsers.Format; @@ -20,28 +17,81 @@ import be.nikiroo.jvcard.parsers.Parser; * @author niki * */ -public class Card { - private List contacts; +public class Card extends BaseClass { private File file; - private boolean dirty; + private String name; + private Format format; + private long lastModified; + /** + * Create a new {@link Card} from the given {@link File} and {@link Format}. + * + * @param file + * the input {@link File} containing the {@link Card} data or + * NULL for an empty card (usually a {@link File} name or a + * network path) + * @param format + * the {@link Format} to use to parse it + * + * @throws IOException + * in case of IO error + * @throws InvalidParameterException + * if format is NULL + */ public Card(File file, Format format) throws IOException { - this.file = file; + this(Parser.parseContact(file, format)); - BufferedReader buffer = new BufferedReader(new FileReader(file)); - List lines = new LinkedList(); - for (String line = buffer.readLine(); line != null; line = buffer - .readLine()) { - lines.add(line); + if (file != null && file.exists()) { + lastModified = file.lastModified(); } - load(lines, format); + this.format = format; + + if (file != null) { + this.file = file; + switch (format) { + case VCard21: + this.name = file.getName().replaceAll(".[vV][cC][fF]$", ""); + break; + case Abook: + default: + this.name = file.getName(); + break; + } + } } - public List getContacts() { - return contacts; + /** + * Create a new {@link Card} from the given {@link Contact}s. + * + * @param contacts + * the input contacts + * + * @throws IOException + * in case of IO error + * @throws InvalidParameterException + * if format is NULL + */ + public Card(List contacts) { + super(contacts); + + lastModified = -1; } + /** + * Save the {@link Card} to the given {@link File} with the given + * {@link Format}. + * + * @param file + * the output to save to + * @param format + * the {@link Format} to use + * + * @return TRUE if it was saved + * + * @throws IOException + * in case of IO errors + */ public boolean saveAs(File file, Format format) throws IOException { if (file == null) return false; @@ -50,48 +100,114 @@ public class Card { writer.append(toString(format)); writer.close(); - if (file.equals(this.file)) { - dirty = false; + if (this.file != null + && file.getCanonicalPath().equals(this.file.getCanonicalPath())) { + lastModified = file.lastModified(); + setPristine(); } return true; } - public boolean save(Format format, boolean bKeys) throws IOException { + /** + * Save the {@link Card} to the original {@link File} it was open from. + * + * @return TRUE if it was saved + * + * @throws IOException + * in case of IO errors + */ + public boolean save() throws IOException { return saveAs(file, format); } - public String toString(Format format) { - return Parser.toString(this, format); - } + /** + * Reload the data from the input. + * + * @return TRUE if it was done + * + * @throws IOException + * in case of IO error + */ + public boolean reload() throws IOException { + if (file == null) + return false; - public String toString() { - return toString(Format.VCard21); + this.replaceListContent(Parser.parseContact(file, format)); + lastModified = file.lastModified(); + setPristine(); + + return true; } - protected void load(String serializedContent, Format format) { - // note: fixed size array - List lines = Arrays.asList(serializedContent.split("\n")); - load(lines, format); + /** + * Return a {@link String} representation of this {@link Card} in the given + * {@link Format}. + * + * @param format + * the {@link Format} to use + * + * @return the {@link String} + */ + public String toString(Format format) { + StringBuilder builder = new StringBuilder(); + for (String line : Parser.toStrings(this, format)) { + builder.append(line); + builder.append("\r\n"); + } + return builder.toString(); } - protected void load(List lines, Format format) { - this.contacts = Parser.parse(lines, format); - setDirty(); + /** + * Return the name of this card (the name of the {@link File} which it was + * opened from). + * + * @return the name + */ + public String getName() { + return name; + } - for (Contact contact : contacts) { - contact.setParent(this); - } + /** + * Return the original {@link Format} of the {@link Card}. + * + * @return the {@link Format} + */ + public Format getFormat() { + return format; } - public boolean isDirty() { - return dirty; + /** + * Return the {@link File} which was used to open this {@link Card}. + * + * @return the input + */ + public File getFile() { + return file; } /** - * Notify that this element has unsaved changes. + * Return the date of the last modification for this {@link Card} (or -1 if + * unknown/new). + * + * @return the last modified date */ - void setDirty() { - dirty = true; + public long getLastModified() { + return lastModified; + } + + @Override + public String toString() { + return toString(Format.VCard21); + } + + @Override + public String getId() { + return "" + name; + } + + @Override + public String getState() { + return ("" + name + format).replace(' ', '_'); } }