Beta2 relase
[jvcard.git] / src / be / nikiroo / jvcard / Data.java
CommitLineData
a3b510ab
NR
1package be.nikiroo.jvcard;
2
3import java.security.InvalidParameterException;
4import java.util.LinkedList;
5import java.util.List;
6
78e4af97
NR
7/**
8 * A data is a piece of information present in a {@link Contact}. It is
9 * basically a key/value pair with optional types and an optional group name.
10 *
11 * @author niki
12 *
13 */
a3b510ab 14public class Data {
78e4af97
NR
15 public enum DataPart {
16 FN_FAMILY, FN_GIVEN, FN_ADDITIONAL, // Name
17 FN_PRE, FN_POST, // Pre/Post
18 BDAY_YYYY, BDAY_MM, BDAY_DD, // BDay
19 ADR_PBOX, ADR_EXTENDED, ADR_STREET, ADR_CITY, ADR_REGION, ADR_POSTAL_CODE, ADR_COUNTRY
20 // Address
21 }
22
a3b510ab
NR
23 private String name;
24 private String value;
25 private String group;
26 private int b64; // -1 = no, 0 = still not ordered, the rest is order
27 private List<TypeInfo> types;
28 private boolean dirty;
29 private Contact parent;
30
78e4af97
NR
31 /**
32 * Create a new {@link Data} with the given values.
33 *
34 * @param types
35 * the types of this {@link Data}
36 * @param name
37 * its name
38 * @param value
39 * its value
40 * @param group
41 * its group if any
42 */
a3b510ab
NR
43 public Data(List<TypeInfo> types, String name, String value, String group) {
44 if (types == null) {
45 types = new LinkedList<TypeInfo>();
46 }
47
48 this.types = types;
49 this.name = name;
50 this.value = value;
51 this.group = group;
52
53 b64 = -1;
54 for (TypeInfo type : types) {
78e4af97 55 type.setParent(this);
a3b510ab
NR
56 if (type.getName().equals("ENCODING")
57 && type.getValue().equals("b")) {
58 b64 = 0;
59 break;
60 }
61 }
62 }
63
78e4af97
NR
64 /**
65 * Return the number of {@link TypeInfo} present in this {@link Data}.
66 *
67 * @return the number of {@link TypeInfo}s
68 */
69 public int size() {
70 return types.size();
a3b510ab
NR
71 }
72
78e4af97
NR
73 /**
74 * Return the {@link TypeInfo} at index <i>index</i>.
75 *
76 * @param index
77 * the index of the {@link TypeInfo} to find
78 *
79 * @return the {@link TypeInfo}
80 *
81 * @throws IndexOutOfBoundsException
82 * if the index is < 0 or >= {@link Data#size()}
83 */
84 public TypeInfo get(int index) {
85 return types.get(index);
86 }
87
176a8327
NR
88 /**
89 * Add a new {@link TypeInfo} in this {@link Data}.
90 *
91 * @param type
92 * the new type
93 */
94 public void add(TypeInfo type) {
95 type.setParent(this);
96 type.setDirty();
97 types.add(type);
98 }
99
100 /**
101 * Remove the given {@link TypeInfo} from its this {@link Data} if it is in.
102 *
103 * @return TRUE in case of success
104 */
105 public boolean remove(TypeInfo type) {
106 if (types.remove(type)) {
107 setDirty();
108 }
109
110 return false;
111 }
112
113 /**
114 * Change the {@link TypeInfo}s of this {@link Data}.
115 *
116 * @param types
117 * the new types
118 */
119 @Deprecated
120 public void setTypes(List<TypeInfo> types) {
121 // TODO: check if this method is required
122 this.types.clear();
123 for (TypeInfo type : types) {
124 this.types.add(type);
125 type.setParent(this);
126 }
127
128 setDirty();
129 }
130
78e4af97
NR
131 /**
132 * Return the name of this {@link Data}
133 *
134 * @return the name
135 */
a3b510ab
NR
136 public String getName() {
137 return name;
138 }
139
78e4af97
NR
140 /**
141 * Return the value of this {@link Data}
142 *
143 * @return the value
144 */
a3b510ab
NR
145 public String getValue() {
146 return value;
147 }
148
78e4af97
NR
149 /**
150 * Change the value of this {@link Data}
151 *
152 * @param value
153 * the new value
154 */
bcb54330
NR
155 public void setValue(String value) {
156 if ((value == null && this.value != null)
157 || (value != null && !value.equals(this.value))) {
158 this.value = value;
159 setDirty();
160 }
161 }
162
78e4af97
NR
163 /**
164 * Return the group of this {@link Data}
165 *
166 * @return the group
167 */
a3b510ab
NR
168 public String getGroup() {
169 return group;
170 }
171
176a8327
NR
172 /**
173 * Change the group of this {@link Data}
174 *
175 * @param group
176 * the new group
177 */
178 public void setGroup(String group) {
179 if ((group == null && this.group != null)
180 || (group != null && !group.equals(this.group))) {
181 this.group = group;
182 setDirty();
183 }
184 }
185
78e4af97
NR
186 /**
187 * Return the bkey number of this {@link Data} or -1 if it is not binary.
188 *
189 * @return the bkey or -1
190 */
a3b510ab
NR
191 public int getB64Key() {
192 return b64;
193 }
194
78e4af97
NR
195 /**
196 * Change the bkey of this {@link Data}
197 *
198 * @param i
199 * the new bkey
200 *
201 * @throw InvalidParameterException if the {@link Data} is not binary or if
202 * it is but you try to set a negative bkey
203 */
a3b510ab
NR
204 void resetB64Key(int i) {
205 if (!isBinary())
206 throw new InvalidParameterException(
207 "Cannot add a BKey on a non-binary object");
208 if (i < 0)
209 throw new InvalidParameterException(
210 "Cannot remove the BKey on a binary object");
211
212 b64 = i;
213 }
214
78e4af97
NR
215 /**
216 * Check if this {@link Data} is binary
217 *
218 * @return TRUE if it is
219 */
a3b510ab
NR
220 public boolean isBinary() {
221 return b64 >= 0;
222 }
223
176a8327
NR
224 /**
225 * Delete this {@link Contact} from its parent {@link Card} if any.
226 *
227 * @return TRUE in case of success
228 */
229 public boolean delete() {
230 if (parent != null) {
231 return parent.remove(this);
232 }
233
234 return false;
235 }
236
78e4af97
NR
237 /**
238 * Check if this {@link Data} has unsaved changes.
239 *
240 * @return TRUE if it has
241 */
a3b510ab
NR
242 public boolean isDirty() {
243 return dirty;
244 }
245
bcb54330
NR
246 /**
247 * Notify that this element has unsaved changes, and notify its parent of
248 * the same if any.
249 */
250 protected void setDirty() {
251 this.dirty = true;
252 if (this.parent != null)
253 this.parent.setDirty();
254 }
255
256 /**
257 * Notify this element <i>and all its descendants</i> that it is in pristine
258 * state (as opposed to dirty).
259 */
260 void setPristine() {
261 dirty = false;
262 for (TypeInfo type : types) {
78e4af97 263 type.setPristine();
bcb54330
NR
264 }
265 }
266
78e4af97
NR
267 /**
268 * Set the parent of this {@link Data}.
269 *
270 * @param parent
271 * the new parent
272 */
bcb54330 273 void setParent(Contact parent) {
a3b510ab
NR
274 this.parent = parent;
275 }
276}