OSDN Git Service

e85e4927f2379d8453ce05458092cc8046f6c4cf
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / xml / ImportData.java
1 /*\r
2  * This file is part of NeverNote \r
3  * Copyright 2009 Randy Baumgarte\r
4  * \r
5  * This file may be licensed under the terms of of the\r
6  * GNU General Public License Version 2 (the ``GPL'').\r
7  *\r
8  * Software distributed under the License is distributed\r
9  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
10  * express or implied. See the GPL for the specific language\r
11  * governing rights and limitations.\r
12  *\r
13  * You should have received a copy of the GPL along with this\r
14  * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
15  * or write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
17  *\r
18 */\r
19 \r
20 package cx.fbn.nevernote.xml;\r
21 \r
22 import java.util.ArrayList;\r
23 import java.util.HashMap;\r
24 import java.util.List;\r
25 import java.util.Random;\r
26 \r
27 import com.evernote.edam.type.Data;\r
28 import com.evernote.edam.type.Note;\r
29 import com.evernote.edam.type.NoteAttributes;\r
30 import com.evernote.edam.type.Notebook;\r
31 import com.evernote.edam.type.Resource;\r
32 import com.evernote.edam.type.ResourceAttributes;\r
33 import com.evernote.edam.type.SavedSearch;\r
34 import com.evernote.edam.type.Tag;\r
35 import com.trolltech.qt.core.QByteArray;\r
36 import com.trolltech.qt.core.QFile;\r
37 import com.trolltech.qt.core.QIODevice;\r
38 import com.trolltech.qt.xml.QXmlStreamAttributes;\r
39 import com.trolltech.qt.xml.QXmlStreamReader;\r
40 \r
41 import cx.fbn.nevernote.sql.DatabaseConnection;\r
42 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
43 \r
44 public class ImportData {\r
45 \r
46         public int                                                      lastError;\r
47         private String                                          errorMessage;\r
48         private String                                          fileName;\r
49         DatabaseConnection                                      conn;\r
50         QXmlStreamReader                                        reader;\r
51         private Note                                            note;\r
52         private boolean                                         noteIsDirty;\r
53         private Notebook                                        notebook;\r
54         private boolean                                         notebookIsDirty;\r
55         private boolean                                         notebookIsLocal;\r
56         private Tag                                                     tag;\r
57         private boolean                                         tagIsDirty;\r
58         private final HashMap<String,Integer>           titleColors;\r
59         private SavedSearch                                     search;\r
60         private boolean                                         searchIsDirty;\r
61         public int                                                      highUpdateSequenceNumber;\r
62         public long                                                     lastSequenceDate;\r
63         private final ApplicationLogger         logger;\r
64         private final boolean                           backup;\r
65         private String                                          notebookGuid;\r
66         \r
67         public ImportData(DatabaseConnection c, boolean full) {\r
68                 logger = new ApplicationLogger("import.log");\r
69                 backup = full;\r
70                 conn = c;\r
71                 titleColors = new HashMap<String,Integer>();\r
72         }\r
73         \r
74         public void importData(String f) {\r
75                 fileName = f;\r
76                 errorMessage = "";\r
77                                 \r
78                 lastError = 0;\r
79                 errorMessage = "";\r
80                 QFile xmlFile = new QFile(fileName);\r
81                 if (!xmlFile.open(QIODevice.OpenModeFlag.ReadOnly)) {\r
82                         lastError = 16;\r
83                         errorMessage = "Cannot open file.";\r
84                 }\r
85                         \r
86                 reader = new QXmlStreamReader(xmlFile); \r
87                 while (!reader.atEnd()) {\r
88                         reader.readNext();\r
89                         if (reader.hasError()) {\r
90                                 errorMessage = reader.errorString();\r
91                                 logger.log(logger.LOW, "************************* ERROR READING BACKUP " +reader.errorString());\r
92                                 lastError = 16;\r
93                                 return;\r
94                         }\r
95                         if (reader.name().equalsIgnoreCase("nevernote-export") && reader.isStartElement()) {\r
96                                 QXmlStreamAttributes attributes = reader.attributes();\r
97                                 String version = attributes.value("version");\r
98                                 String type = attributes.value("exportType");\r
99                                 String application = attributes.value("application");\r
100                                 if (!version.equalsIgnoreCase("0.85") && !version.equalsIgnoreCase("0.86")) {\r
101                                         lastError = 1;\r
102                                         errorMessage = "Unknown backup version = " +version;\r
103                                         return;\r
104                                 }\r
105                                 if (!application.equalsIgnoreCase("NeverNote")) {\r
106                                         lastError = 2;\r
107                                         errorMessage = "This backup is from an unknown application = " +application;\r
108                                         return;\r
109                                 }\r
110                                 if (!type.equalsIgnoreCase("backup") && backup) {\r
111                                         lastError = 4;\r
112                                         errorMessage = "This is an export file, not a backup file";\r
113                                         return;\r
114                                 } \r
115                                 if (type.equalsIgnoreCase("export") && backup) {\r
116                                         lastError = 5;\r
117                                         errorMessage = "This is a backup file, not an export file";             \r
118                                         return;\r
119                                 }\r
120                                 \r
121                         }\r
122                         if (reader.name().equalsIgnoreCase("Synchronization") && reader.isStartElement() && backup) {\r
123                                 processSynchronizationNode();\r
124                                 conn.getSyncTable().setLastSequenceDate(lastSequenceDate);\r
125                         conn.getSyncTable().setUpdateSequenceNumber(highUpdateSequenceNumber);\r
126 //                              Global.setSequenceDate(lastSequenceDate);\r
127 //                      Global.setUpdateSequenceNumber(highUpdateSequenceNumber);\r
128                         }\r
129                         if (reader.name().equalsIgnoreCase("note") && reader.isStartElement()) {\r
130                                 processNoteNode();\r
131                                 if (backup)\r
132                                         conn.getNoteTable().addNote(note, noteIsDirty);\r
133                                 else {\r
134                                         note.setUpdateSequenceNum(0);\r
135                                         if (notebookGuid != null) \r
136                                                 note.setNotebookGuid(notebookGuid);\r
137                                         for (int i=0; i<note.getResourcesSize(); i++) {\r
138                                                 note.getResources().get(i).setUpdateSequenceNum(0);\r
139                                         }\r
140                                         conn.getNoteTable().addNote(note, true);\r
141                                 }\r
142                                 if (titleColors.containsKey(note.getGuid())) \r
143                                         conn.getNoteTable().setNoteTitleColor(note.getGuid(), titleColors.get(note.getGuid()));\r
144                         }\r
145                         if (reader.name().equalsIgnoreCase("notebook") && reader.isStartElement() && backup) {\r
146                                 processNotebookNode();\r
147                         String existingGuid = conn.getNotebookTable().findNotebookByName(notebook.getName());\r
148                         if (existingGuid == null)\r
149                                 conn.getNotebookTable().addNotebook(notebook, notebookIsDirty, notebookIsLocal);\r
150                         else \r
151                         {\r
152                                 conn.getNotebookTable().updateNotebookGuid(existingGuid, notebook.getGuid());\r
153                                 conn.getNotebookTable().updateNotebook(notebook, notebookIsDirty);\r
154                         }\r
155 \r
156                         }\r
157                         if (reader.name().equalsIgnoreCase("tag") && reader.isStartElement() && backup) {\r
158                                 processTagNode();\r
159                                 String testGuid = conn.getTagTable().findTagByName(tag.getName());\r
160                         if (testGuid == null)\r
161                                 conn.getTagTable().addTag(tag, tagIsDirty);\r
162                         else {\r
163                                 conn.getTagTable().updateTagGuid(testGuid, tag.getGuid());\r
164                                 conn.getTagTable().updateTag(tag,tagIsDirty);\r
165                         }\r
166                         }\r
167                         if (reader.name().equalsIgnoreCase("savedsearch") && reader.isStartElement() && backup) {\r
168                                 processSavedSearchNode();\r
169                         conn.getSavedSearchTable().addSavedSearch(search, searchIsDirty);\r
170                         }\r
171                 }\r
172                 xmlFile.close();\r
173         }\r
174         \r
175         \r
176         private void processNoteNode() {\r
177                 note = new Note();\r
178                 note.setResources(new ArrayList<Resource>());\r
179 \r
180                 boolean atEnd = false;\r
181                 while(!atEnd) {\r
182                         if (reader.isStartElement()) {\r
183                                 if (reader.name().equalsIgnoreCase("Guid")) \r
184                                         note.setGuid(textValue());\r
185                                 if (!backup) {\r
186                                         Random random1 = new Random();\r
187                                         String newGuid = "IMP" +new Integer(random1.nextInt(1000)).toString();\r
188                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
189                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
190                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
191                                         note.setGuid(newGuid);\r
192                                 }\r
193                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber")) \r
194                                         note.setUpdateSequenceNum(intValue());\r
195                                 if (reader.name().equalsIgnoreCase("Title")) \r
196                                         note.setTitle(textValue());\r
197                                 if (reader.name().equalsIgnoreCase("Created")) \r
198                                         note.setCreated(longValue());\r
199                                 if (reader.name().equalsIgnoreCase("Updated")) \r
200                                         note.setUpdated(longValue());\r
201                                 if (reader.name().equalsIgnoreCase("Deleted")) \r
202                                         note.setDeleted(longValue());\r
203                                 if (reader.name().equalsIgnoreCase("Active")) \r
204                                         note.setActive(booleanValue());\r
205                                 if (reader.name().equalsIgnoreCase("NotebookGuid") && backup) \r
206                                         note.setNotebookGuid(textValue());\r
207                                 if (reader.name().equalsIgnoreCase("Content")) \r
208                                         note.setContent(textValue());\r
209                                 if (reader.name().equalsIgnoreCase("NoteTags") && backup) \r
210                                         note.setTagGuids(processNoteTagList());\r
211                                 if (reader.name().equalsIgnoreCase("NoteAttributes")) \r
212                                         note.setAttributes(processNoteAttributes());\r
213                                 if (reader.name().equalsIgnoreCase("NoteResource")) \r
214                                         note.getResources().add(processResource());\r
215                                 if (reader.name().equalsIgnoreCase("Dirty")) {\r
216                                         if (booleanValue())\r
217                                                 noteIsDirty=true;\r
218                                 }\r
219                                 if (reader.name().equalsIgnoreCase("TitleColor")) \r
220                                         titleColors.put(note.getGuid(), intValue());\r
221                         }\r
222                         reader.readNext();\r
223                         if (reader.name().equalsIgnoreCase("note") && reader.isEndElement())\r
224                                 atEnd = true;\r
225                 }\r
226                 \r
227                 return;\r
228                 \r
229         }       \r
230         private Resource processResource() {\r
231                 Resource resource = new Resource();\r
232                 boolean atEnd = false;\r
233                 boolean isDirty = false;\r
234                 while(!atEnd) {\r
235                         if (reader.isStartElement()) {\r
236                                 if (reader.name().equalsIgnoreCase("Guid")) \r
237                                         resource.setGuid(textValue());\r
238                                 if (!backup) {\r
239                                         Random random1 = new Random();\r
240                                         String newGuid = "IMP" +new Integer(random1.nextInt(1000)).toString();\r
241                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
242                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
243                                         newGuid = newGuid+"-"+new Integer(random1.nextInt(1000)).toString();\r
244                                         resource.setGuid(newGuid);\r
245                                 }\r
246                                 if (reader.name().equalsIgnoreCase("NoteGuid")) \r
247                                         resource.setNoteGuid(textValue());\r
248                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber")) \r
249                                         resource.setUpdateSequenceNum(intValue());\r
250                                 if (reader.name().equalsIgnoreCase("Active")) \r
251                                         resource.setActive(booleanValue());\r
252                                 if (reader.name().equalsIgnoreCase("Mime")) \r
253                                         resource.setMime(textValue());\r
254                                 if (reader.name().equalsIgnoreCase("Duration")) \r
255                                         resource.setDuration(shortValue());\r
256                                 if (reader.name().equalsIgnoreCase("Height")) \r
257                                         resource.setHeight(shortValue());\r
258                                 if (reader.name().equalsIgnoreCase("Width")) \r
259                                         resource.setWidth(shortValue());\r
260                                 if (reader.name().equalsIgnoreCase("dirty")) \r
261                                         isDirty = booleanValue();\r
262                                 if (reader.name().equalsIgnoreCase("Data")) \r
263                                         resource.setData(processData("Data"));\r
264                                 if (reader.name().equalsIgnoreCase("AlternateData")) \r
265                                         resource.setAlternateData(processData("AlternateData"));\r
266                                 if (reader.name().equalsIgnoreCase("RecognitionData")) \r
267                                         resource.setRecognition(processData("NoteResourceAttribute"));\r
268                                 if (reader.name().equalsIgnoreCase("NoteResourceAttribute")) \r
269                                         resource.setAttributes(processResourceAttributes());\r
270                         }\r
271                         reader.readNext();\r
272                         if (reader.name().equalsIgnoreCase("noteresource") && reader.isEndElement())\r
273                                 atEnd = true;\r
274                 }\r
275                 \r
276                 conn.getNoteTable().noteResourceTable.saveNoteResource(resource, isDirty);\r
277 \r
278                 \r
279                 return resource;\r
280         }\r
281         \r
282         private Data processData(String nodeName) {\r
283                 Data data = new Data();\r
284                 boolean atEnd = false;\r
285                 while(!atEnd) {\r
286                         if (reader.isStartElement()) {\r
287                                 if (reader.name().equalsIgnoreCase("Size")) \r
288                                         data.setSize(intValue());\r
289                                 if (reader.name().equalsIgnoreCase("Body")) {\r
290                                         byte[] b = textValue().getBytes();   // data binary\r
291                                         QByteArray hexData = new QByteArray(b);\r
292                                         QByteArray binData = new QByteArray(QByteArray.fromHex(hexData));\r
293                                         data.setBody(binData.toByteArray());\r
294                                 }\r
295                                 if (reader.name().equalsIgnoreCase("BodyHash")) {\r
296                                         byte[] b = textValue().getBytes();   // data binary\r
297                                         QByteArray hexData = new QByteArray(b);\r
298                                         QByteArray binData = new QByteArray(QByteArray.fromHex(hexData));\r
299                                         data.setBodyHash(binData.toByteArray());\r
300                                 }\r
301 \r
302                                 reader.readNext();\r
303                                 if (reader.name().equalsIgnoreCase("data") && reader.isEndElement())\r
304                                         atEnd = true;\r
305                         }\r
306                         reader.readNext();\r
307                         if (reader.name().equalsIgnoreCase(nodeName) && reader.isEndElement())\r
308                                 atEnd = true;\r
309                 }\r
310                 return data;\r
311         }\r
312 \r
313         private ResourceAttributes processResourceAttributes() {\r
314                 ResourceAttributes attributes = new ResourceAttributes();\r
315                 boolean atEnd = false;\r
316                 while(!atEnd) {\r
317                         if (reader.isStartElement()) {\r
318                                 if (reader.name().equalsIgnoreCase("CameraMake")) \r
319                                         attributes.setCameraMake(textValue());          \r
320                                 if (reader.name().equalsIgnoreCase("CameraModel")) \r
321                                         attributes.setCameraModel(textValue());         \r
322                                 if (reader.name().equalsIgnoreCase("FileName")) \r
323                                         attributes.setFileName(textValue());            \r
324                                 if (reader.name().equalsIgnoreCase("RecoType")) \r
325                                         attributes.setRecoType(textValue());            \r
326                                 if (reader.name().equalsIgnoreCase("CameraModel")) \r
327                                         attributes.setCameraMake(textValue());          \r
328                                 if (reader.name().equalsIgnoreCase("SourceURL")) \r
329                                         attributes.setSourceURL(textValue());           \r
330                                 if (reader.name().equalsIgnoreCase("Altitude")) \r
331                                         attributes.setAltitude(doubleValue());          \r
332                                 if (reader.name().equalsIgnoreCase("Longitude")) \r
333                                         attributes.setLongitude(doubleValue());         \r
334                                 if (reader.name().equalsIgnoreCase("Latitude")) \r
335                                         attributes.setLatitude(doubleValue());          \r
336                                 if (reader.name().equalsIgnoreCase("Timestamp")) \r
337                                         attributes.setTimestamp(longValue());           \r
338                                 if (reader.name().equalsIgnoreCase("Attachment")) \r
339                                         attributes.setAttachment(booleanValue());               \r
340                                 if (reader.name().equalsIgnoreCase("ClientWillIndex")) \r
341                                         attributes.setClientWillIndex(booleanValue());          \r
342                         }\r
343                         reader.readNext();\r
344                         if (reader.name().equalsIgnoreCase("noteresourceattribute") && reader.isEndElement())\r
345                                 atEnd = true;\r
346                 }\r
347                 \r
348                 return attributes;\r
349         }\r
350 \r
351         \r
352         private List<String> processNoteTagList() {\r
353                 List<String> guidList = new ArrayList<String>();\r
354         \r
355 \r
356                 boolean atEnd = false;\r
357                 while(!atEnd) {                 \r
358                         if (reader.isStartElement()) {\r
359                                 if (reader.name().equalsIgnoreCase("guid")) \r
360                                         guidList.add(textValue());\r
361                         }\r
362                         reader.readNext();\r
363                         if (reader.name().equalsIgnoreCase("notetags") && reader.isEndElement())\r
364                                 atEnd = true;\r
365                 }\r
366                         return guidList;\r
367         }\r
368 \r
369 \r
370 \r
371         private NoteAttributes processNoteAttributes() {\r
372         NoteAttributes attributes = new NoteAttributes();\r
373         \r
374         boolean atEnd = false;\r
375         while(!atEnd) {\r
376                 if (reader.isStartElement()) {\r
377                         if (reader.name().equalsIgnoreCase("Author")) \r
378                                 attributes.setAuthor(textValue());\r
379                         if (reader.name().equalsIgnoreCase("SourceURL")) \r
380                                 attributes.setSourceURL(textValue());\r
381                         if (reader.name().equalsIgnoreCase("Source")) \r
382                                 attributes.setSource(textValue());\r
383                         if (reader.name().equalsIgnoreCase("SourceApplication")) \r
384                                 attributes.setSourceApplication(textValue());\r
385                         if (reader.name().equalsIgnoreCase("Altitude")) \r
386                                 attributes.setAltitude(doubleValue());\r
387                         if (reader.name().equalsIgnoreCase("Longitude")) \r
388                                 attributes.setLongitude(doubleValue());\r
389                         if (reader.name().equalsIgnoreCase("Latitude")) \r
390                                 attributes.setLatitude(doubleValue());\r
391                         if (reader.name().equalsIgnoreCase("SubjectDate")) \r
392                                 attributes.setSubjectDate(longValue());\r
393                 }\r
394                 reader.readNext();\r
395                 if (reader.name().equalsIgnoreCase("noteattributes") && reader.isEndElement())\r
396                         atEnd = true;\r
397         }\r
398         \r
399         return attributes;\r
400 }\r
401 \r
402         \r
403         private void processSynchronizationNode() {\r
404                 boolean atEnd = false;\r
405                 while(!atEnd) {\r
406                         if (reader.isStartElement()) {\r
407                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber"))     \r
408                                         highUpdateSequenceNumber = intValue();\r
409                                 if (reader.name().equalsIgnoreCase("LastSequenceDate"))         \r
410                                         lastSequenceDate = longValue();\r
411                         }\r
412                         reader.readNext();\r
413                         if (reader.name().equalsIgnoreCase("synchronization") && reader.isEndElement())\r
414                                 atEnd = true;\r
415                 }               \r
416         }\r
417         \r
418         \r
419         private void processSavedSearchNode() {\r
420                 search = new SavedSearch();\r
421                 searchIsDirty = false;\r
422                 \r
423                 boolean atEnd = false;\r
424                 while(!atEnd) {\r
425                         if (reader.isStartElement()) {\r
426                                 if (reader.name().equalsIgnoreCase("Guid")) \r
427                                         search.setGuid(textValue());\r
428                                 if (reader.name().equalsIgnoreCase("Name")) \r
429                                         search.setName(textValue());\r
430                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber")) \r
431                                         search.setUpdateSequenceNum(intValue());\r
432                                 if (reader.name().equalsIgnoreCase("Query")) \r
433                                         search.setQuery(textValue());\r
434                                 if (reader.name().equalsIgnoreCase("Dirty")) {\r
435                                         if (booleanValue())\r
436                                                 searchIsDirty = true;\r
437                                 }\r
438                         }\r
439                         reader.readNext();\r
440                         if (reader.name().equalsIgnoreCase("savedsearch") && reader.isEndElement())\r
441                                 atEnd = true;           }       \r
442                 return;\r
443         }\r
444 \r
445 \r
446         \r
447         private void processNotebookNode() {\r
448                 notebook = new Notebook();\r
449                 notebookIsDirty = false;\r
450                 notebookIsLocal = false;\r
451                 boolean atEnd = false;\r
452                 while(!atEnd) {\r
453                         if (reader.isStartElement()) {\r
454                                 if (reader.name().equalsIgnoreCase("Guid")) \r
455                                         notebook.setGuid(textValue());\r
456                                 if (reader.name().equalsIgnoreCase("Name")) \r
457                                         notebook.setName(textValue());\r
458                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber")) \r
459                                         notebook.setUpdateSequenceNum(intValue());\r
460                                 if (reader.name().equalsIgnoreCase("ServiceCreated")) \r
461                                         notebook.setServiceCreated(longValue());\r
462                                 if (reader.name().equalsIgnoreCase("ServiceUpdated")) \r
463                                         notebook.setServiceUpdated(longValue());\r
464                                 if (reader.name().equalsIgnoreCase("DefaultNotebook")) {\r
465                                         notebook.setDefaultNotebook(booleanValue());\r
466                                 }\r
467                                 if (reader.name().equalsIgnoreCase("Dirty")) {\r
468                                         if (booleanValue())\r
469                                                 notebookIsDirty = true;\r
470                                 }\r
471                                 if (reader.name().equalsIgnoreCase("LocalNotebook")) {\r
472                                         if (booleanValue())\r
473                                                 notebookIsLocal = true;\r
474                                 }       \r
475                         }\r
476                         reader.readNext();\r
477                         if (reader.name().equalsIgnoreCase("notebook") && reader.isEndElement())\r
478                                 atEnd = true;\r
479                 }\r
480                 return;\r
481         }\r
482 \r
483         \r
484         \r
485         private void processTagNode() {\r
486                 tag = new Tag();\r
487                 tagIsDirty = false;\r
488                 boolean atEnd = false;\r
489                 while(!atEnd) {\r
490                         if (reader.isStartElement()) {                  \r
491                                 if (reader.name().equalsIgnoreCase("Guid")) \r
492                                         tag.setGuid(textValue());\r
493                                 if (reader.name().equalsIgnoreCase("Name")) \r
494                                         tag.setName(textValue());\r
495                                 if (reader.name().equalsIgnoreCase("UpdateSequenceNumber")) \r
496                                         tag.setUpdateSequenceNum(intValue());\r
497                                 if (reader.name().equalsIgnoreCase("ParentGuid")) \r
498                                         tag.setParentGuid(textValue());\r
499                                 if (reader.name().equalsIgnoreCase("Dirty")) {\r
500                                         if (booleanValue())\r
501                                                 tagIsDirty = true;\r
502                                 }\r
503                         }\r
504                         reader.readNext();\r
505                         if (reader.name().equalsIgnoreCase("tag") && reader.isEndElement())\r
506                                 atEnd = true;\r
507                 }\r
508                 return;\r
509         }\r
510         \r
511         \r
512         \r
513         \r
514         private String textValue() {\r
515                 return reader.readElementText();\r
516         }\r
517         private int intValue() {\r
518                 return new Integer(textValue());\r
519         }\r
520         private long longValue() {\r
521                 return new Long(textValue());\r
522         }\r
523         private double doubleValue() {\r
524                 return new Double(textValue());\r
525         }\r
526         private boolean booleanValue() {\r
527                 String value = textValue();\r
528                 if (value.equalsIgnoreCase("true"))\r
529                         return true;\r
530                 else\r
531                         return false;\r
532         }\r
533         private short shortValue() {\r
534                 return new Short(textValue());\r
535         }\r
536         \r
537         public void setNotebookGuid(String g) {\r
538                 notebookGuid = g;\r
539         }\r
540         \r
541         public String getErrorMessage() {\r
542                 return errorMessage;\r
543         }\r
544 }\r