+\r
+ // Extract metadata from a note's Note.attributes.sourceApplication\r
+ private NoteMetadata extractMetadata(String sourceApplication) {\r
+ String consumerKey = "baumgarte:{";\r
+ int startPos = sourceApplication.indexOf(consumerKey);\r
+ if (startPos < 0 )\r
+ return null;\r
+ \r
+ NoteMetadata meta = new NoteMetadata();\r
+ startPos = startPos+consumerKey.length();\r
+ \r
+// String startString = sourceApplication.substring(0,startPos);\r
+ String metaString = sourceApplication.substring(startPos);\r
+// String endString = metaString.substring(metaString.indexOf("};"));\r
+ int endPos = metaString.indexOf("};");\r
+ if (endPos > 0)\r
+ metaString = metaString.substring(0,endPos);\r
+ \r
+ String value = parseMetaString(metaString, "titleColor");\r
+ if (value != null)\r
+ meta.setColor(Integer.parseInt(value));\r
+ \r
+ value = parseMetaString(metaString, "pinned");\r
+ if (value != null && value.equals(true))\r
+ meta.setPinned(true);\r
+ \r
+ return meta;\r
+ }\r
+ \r
+ // Given a metadata string from attribute.sourceApplication, we\r
+ // extract the information for a given key.\r
+ private String parseMetaString(String metaString, String key) {\r
+ int startPos = metaString.indexOf(key);\r
+ if (startPos < 0)\r
+ return null;\r
+ \r
+ String value = metaString.substring(startPos+key.length()+1);\r
+ int endPos = value.indexOf(";");\r
+ if (endPos > 0)\r
+ value = value.substring(0,endPos);\r
+ \r
+ return value;\r
+ }\r
+ \r
+ // Given a set of metadata, we build a string that can be inserted\r
+ // into the attribute.sourceApplication string.\r
+ private String buildMetadataString(NoteMetadata meta) {\r
+ StringBuffer value = new StringBuffer(removeExistingMetaString(meta.getGuid()));\r
+ StringBuffer metaString = new StringBuffer();\r
+ \r
+ if (meta.isPinned()) {\r
+ metaString.append("pinned=true;");\r
+ }\r
+ if (meta.getColor() != -1) {\r
+ metaString.append("titleColor=" +new Integer(meta.getColor()).toString()+";");\r
+ }\r
+ if (metaString.length()>0) {\r
+ \r
+ // Adda any missing ";" or " " at the end of the existing \r
+ // string.\r
+ if (value.length()>1 && (!value.toString().trim().endsWith(";") || !value.toString().trim().endsWith(";"))) \r
+ value.append("; ");\r
+ \r
+ value.append("baumgarte:{");\r
+ value.append(metaString);\r
+ value.append("};");\r
+ return value.toString();\r
+ }\r
+ return null;\r
+ }\r
+\r
+ // This will remove the existing metadata string from the attribute.sourceApplication string.\r
+ private String removeExistingMetaString(String guid) {\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ if (!query.prepare("Select attributeSourceApplication from Note where guid=:guid")) {\r
+ logger.log(logger.EXTREME, "Note SQL retrieve has failed in removeExistingMetaString.");\r
+ return null;\r
+ }\r
+ query.bindValue(":guid", guid);\r
+ query.exec();\r
+\r
+ // Get the application source string\r
+ String sourceApplication = null;\r
+ while (query.next()) {\r
+ sourceApplication = query.valueString(0);\r
+ }\r
+ if (sourceApplication == null) \r
+ return "";\r
+ \r
+ String consumerKey = "baumgarte:{";\r
+ int startPos = sourceApplication.indexOf(consumerKey);\r
+ if (startPos < 0 )\r
+ return sourceApplication;\r
+ String startString = sourceApplication.substring(0,startPos);\r
+ String metaString = sourceApplication.substring(startPos);\r
+ String endString = metaString.substring(metaString.indexOf("};")+2);\r
+\r
+ return startString+endString;\r
+ }\r
+\r