Commit | Line | Data |
---|---|---|
a3b510ab NR |
1 | package be.nikiroo.jvcard; |
2 | ||
a3b510ab NR |
3 | import java.io.BufferedWriter; |
4 | import java.io.File; | |
a3b510ab NR |
5 | import java.io.FileWriter; |
6 | import java.io.IOException; | |
78e4af97 | 7 | import java.security.InvalidParameterException; |
a3b510ab NR |
8 | import java.util.List; |
9 | ||
10 | import be.nikiroo.jvcard.parsers.Format; | |
11 | import be.nikiroo.jvcard.parsers.Parser; | |
12 | ||
13 | /** | |
14 | * A card is a contact information card. It contains data about one or more | |
15 | * contacts. | |
16 | * | |
17 | * @author niki | |
18 | * | |
19 | */ | |
26d2bd05 | 20 | public class Card extends BaseClass<Contact> { |
a3b510ab | 21 | private File file; |
0b0b2b0f | 22 | private String name; |
bcb54330 | 23 | private Format format; |
b9f192ed NR |
24 | private long lastModified; |
25 | private boolean remote; | |
a3b510ab | 26 | |
78e4af97 NR |
27 | /** |
28 | * Create a new {@link Card} from the given {@link File} and {@link Format}. | |
29 | * | |
30 | * @param file | |
b9f192ed NR |
31 | * the input {@link File} containing the {@link Card} data or |
32 | * NULL for an empty card (usually a {@link File} name or a | |
33 | * network path) | |
78e4af97 NR |
34 | * @param format |
35 | * the {@link Format} to use to parse it | |
36 | * | |
37 | * @throws IOException | |
38 | * in case of IO error | |
78e4af97 NR |
39 | * @throws InvalidParameterException |
40 | * if format is NULL | |
41 | */ | |
a3b510ab | 42 | public Card(File file, Format format) throws IOException { |
0b6140e4 | 43 | this(Parser.parseContact(file, format)); |
b9f192ed | 44 | |
cf77cb35 NR |
45 | if (file != null && file.exists()) { |
46 | lastModified = file.lastModified(); | |
b9f192ed | 47 | } |
26d2bd05 | 48 | |
bcb54330 | 49 | this.format = format; |
b9f192ed NR |
50 | |
51 | if (file != null) { | |
52 | this.file = file; | |
53 | switch (format) { | |
54 | case VCard21: | |
e253bd50 | 55 | this.name = file.getName().replaceAll(".[vV][cC][fF]$", ""); |
b9f192ed NR |
56 | break; |
57 | case Abook: | |
58 | default: | |
59 | this.name = file.getName(); | |
60 | break; | |
61 | } | |
62 | } | |
63 | } | |
64 | ||
65 | /** | |
66 | * Create a new {@link Card} from the given {@link Contact}s. | |
67 | * | |
68 | * @param contacts | |
69 | * the input contacts | |
70 | * | |
71 | * @throws IOException | |
72 | * in case of IO error | |
73 | * @throws InvalidParameterException | |
74 | * if format is NULL | |
75 | */ | |
76 | public Card(List<Contact> contacts) throws IOException { | |
77 | super(contacts); | |
78 | ||
79 | lastModified = -1; | |
176a8327 | 80 | } |
bcb54330 | 81 | |
78e4af97 NR |
82 | /** |
83 | * Save the {@link Card} to the given {@link File} with the given | |
84 | * {@link Format}. | |
85 | * | |
1c03abaf | 86 | * @param file |
b9f192ed | 87 | * the output to save to |
78e4af97 NR |
88 | * @param format |
89 | * the {@link Format} to use | |
90 | * | |
91 | * @return TRUE if it was saved | |
92 | * | |
93 | * @throws IOException | |
94 | * in case of IO errors | |
95 | */ | |
1c03abaf NR |
96 | public boolean saveAs(File file, Format format) throws IOException { |
97 | if (file == null) | |
a3b510ab NR |
98 | return false; |
99 | ||
1c03abaf | 100 | BufferedWriter writer = new BufferedWriter(new FileWriter(file)); |
a3b510ab NR |
101 | writer.append(toString(format)); |
102 | writer.close(); | |
103 | ||
1c03abaf NR |
104 | if (this.file != null |
105 | && file.getCanonicalPath().equals(this.file.getCanonicalPath())) { | |
bcb54330 | 106 | setPristine(); |
a3b510ab NR |
107 | } |
108 | ||
109 | return true; | |
110 | } | |
111 | ||
78e4af97 NR |
112 | /** |
113 | * Save the {@link Card} to the original {@link File} it was open from. | |
114 | * | |
115 | * @return TRUE if it was saved | |
116 | * | |
117 | * @throws IOException | |
118 | * in case of IO errors | |
119 | */ | |
bcb54330 | 120 | public boolean save() throws IOException { |
a3b510ab NR |
121 | return saveAs(file, format); |
122 | } | |
123 | ||
b9f192ed NR |
124 | /** |
125 | * Reload the data from the input. | |
126 | * | |
127 | * @return TRUE if it was done | |
128 | * | |
129 | * @throws IOException | |
130 | * in case of IO error | |
131 | */ | |
132 | public boolean reload() throws IOException { | |
133 | if (file == null) | |
134 | return false; | |
135 | ||
0b6140e4 | 136 | this.replaceListContent(Parser.parseContact(file, format)); |
cf77cb35 | 137 | lastModified = file.lastModified(); |
b9f192ed | 138 | setPristine(); |
cf77cb35 | 139 | |
b9f192ed NR |
140 | return true; |
141 | } | |
142 | ||
78e4af97 NR |
143 | /** |
144 | * Return a {@link String} representation of this {@link Card} in the given | |
145 | * {@link Format}. | |
146 | * | |
147 | * @param format | |
148 | * the {@link Format} to use | |
149 | * | |
150 | * @return the {@link String} | |
151 | */ | |
a3b510ab | 152 | public String toString(Format format) { |
cf77cb35 NR |
153 | StringBuilder builder = new StringBuilder(); |
154 | for (String line : Parser.toStrings(this, format)) { | |
155 | builder.append(line); | |
156 | builder.append("\r\n"); | |
157 | } | |
158 | return builder.toString(); | |
a3b510ab NR |
159 | } |
160 | ||
78e4af97 NR |
161 | /** |
162 | * Return the name of this card (the name of the {@link File} which it was | |
163 | * opened from). | |
164 | * | |
165 | * @return the name | |
166 | */ | |
167 | public String getName() { | |
168 | return name; | |
169 | } | |
170 | ||
b9f192ed NR |
171 | /** |
172 | * Return the original {@link Format} of the {@link Card}. | |
173 | * | |
174 | * @return the {@link Format} | |
175 | */ | |
176 | public Format getFormat() { | |
177 | return format; | |
178 | } | |
179 | ||
180 | /** | |
e253bd50 | 181 | * Return the {@link File} which was used to open this {@link Card}. |
b9f192ed NR |
182 | * |
183 | * @return the input | |
184 | */ | |
e253bd50 | 185 | public File getFile() { |
b9f192ed NR |
186 | return file; |
187 | } | |
188 | ||
189 | /** | |
190 | * Return the date of the last modification for this {@link Card} (or -1 if | |
191 | * unknown/new). | |
192 | * | |
193 | * @return the last modified date | |
194 | */ | |
195 | public long getLastModified() { | |
196 | return lastModified; | |
197 | } | |
198 | ||
199 | /** | |
200 | * Check if this {@link Card} is remote. | |
201 | * | |
202 | * @return TRUE if this {@link Card} is remote | |
203 | */ | |
204 | public boolean isRemote() { | |
205 | return remote; | |
206 | } | |
207 | ||
208 | /** | |
209 | * Set the remote option on this {@link Card}. | |
210 | * | |
211 | * @param remote | |
212 | * TRUE if this {@link Card} is remote | |
213 | */ | |
214 | public void setRemote(boolean remote) { | |
215 | this.remote = remote; | |
216 | } | |
217 | ||
78e4af97 | 218 | @Override |
a3b510ab NR |
219 | public String toString() { |
220 | return toString(Format.VCard21); | |
221 | } | |
222 | ||
e253bd50 NR |
223 | @Override |
224 | public String getId() { | |
225 | return "" + name; | |
226 | } | |
227 | ||
228 | @Override | |
229 | public String getState() { | |
230 | return "" + name + format; | |
231 | } | |
a3b510ab | 232 | } |